From 2e016de9e5d8270542da9fab4a9f1b75998a6925 Mon Sep 17 00:00:00 2001 From: fooify Date: Mon, 24 Aug 2015 14:07:21 -0700 Subject: [PATCH 001/223] Fixed ignore command, now works --- .../Mineplex.Core/src/mineplex/core/ignore/command/Ignore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/ignore/command/Ignore.java b/Plugins/Mineplex.Core/src/mineplex/core/ignore/command/Ignore.java index 40c975cc6..48bf63e65 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/ignore/command/Ignore.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/ignore/command/Ignore.java @@ -17,7 +17,7 @@ public class Ignore extends CommandBase @Override public void Execute(final Player caller, final String[] args) { - if (args == null) + if (args == null || args.length < 1) { Plugin.showIgnores(caller); } From 1952ee7824191e38b194bbdcc95700be33a85d9d Mon Sep 17 00:00:00 2001 From: fooify Date: Tue, 25 Aug 2015 08:19:09 -0700 Subject: [PATCH 002/223] fix some strings mentioning "admin" in MPS --- .../game/arcade/gui/privateServer/page/GiveAdminPage.java | 6 +++--- .../game/arcade/gui/privateServer/page/RemoveAdminPage.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java index 46dda25d4..251fb34fb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java @@ -11,7 +11,7 @@ public class GiveAdminPage extends PlayerPage { public GiveAdminPage(ArcadeManager plugin, PrivateServerShop shop, Player player) { - super(plugin, shop, "Give Admin", player); + super(plugin, shop, "Give Co-host", player); buildPage(); } @@ -26,12 +26,12 @@ public class GiveAdminPage extends PlayerPage { removeButton(slot); _manager.giveAdmin(player); - UtilPlayer.message(getPlayer(), F.main("Server", "You gave " + F.name(player.getName()) + " admin power.")); + UtilPlayer.message(getPlayer(), F.main("Server", "You gave " + F.name(player.getName()) + " Co-Host power.")); } @Override public String getDisplayString(Player player) { - return "Click to Make Admin"; + return "Click to Make Co-Host"; } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/RemoveAdminPage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/RemoveAdminPage.java index f96f4198c..34730259e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/RemoveAdminPage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/RemoveAdminPage.java @@ -19,7 +19,7 @@ public class RemoveAdminPage extends BasePage { public RemoveAdminPage(ArcadeManager plugin, PrivateServerShop shop, Player player) { - super(plugin, shop, "Remove Admin", player); + super(plugin, shop, "Remove Co-Host", player); buildPage(); } @@ -36,7 +36,7 @@ public class RemoveAdminPage extends BasePage while (iterator.hasNext()) { String name = iterator.next(); - ItemStack head = getPlayerHead(name, C.cGreen + C.Bold + name, new String[] {ChatColor.RESET + C.cGray + "Click to Remove Admin"}); + ItemStack head = getPlayerHead(name, C.cGreen + C.Bold + name, new String[] {ChatColor.RESET + C.cGray + "Click to Remove Co-Host"}); addButton(slot, head, getRemoveAdminButton(slot, name)); slot++; @@ -52,7 +52,7 @@ public class RemoveAdminPage extends BasePage { _manager.removeAdmin(playerName); removeButton(slot); - UtilPlayer.message(getPlayer(), F.main("Server", "You removed admin power from " + F.name(playerName) + ".")); + UtilPlayer.message(getPlayer(), F.main("Server", "You removed Co-Host power from " + F.name(playerName) + ".")); } }; } From e9bc0d3a5f34080e7a82c466ac9e4499ffe6e44b Mon Sep 17 00:00:00 2001 From: fooify Date: Tue, 25 Aug 2015 08:23:22 -0700 Subject: [PATCH 003/223] capitalize h --- .../game/arcade/gui/privateServer/page/GiveAdminPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java index 251fb34fb..75e6cbfb2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java @@ -11,7 +11,7 @@ public class GiveAdminPage extends PlayerPage { public GiveAdminPage(ArcadeManager plugin, PrivateServerShop shop, Player player) { - super(plugin, shop, "Give Co-host", player); + super(plugin, shop, "Give Co-Host", player); buildPage(); } From f0e4416644b93b043ba4ea4edfd3d42c406762d0 Mon Sep 17 00:00:00 2001 From: fooify Date: Sun, 25 Oct 2015 10:52:56 -0700 Subject: [PATCH 004/223] Fixed tnt bug (SG) --- .../game/arcade/game/games/survivalgames/SurvivalGames.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java index a7699db24..edb48709e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java @@ -1911,6 +1911,9 @@ public abstract class SurvivalGames extends Game if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) return; + + if(!IsAlive(player)) + return; event.setCancelled(true); From 7024084ce398de2cffc4d3d30a945163073c0a83 Mon Sep 17 00:00:00 2001 From: fooify Date: Sun, 25 Oct 2015 11:29:06 -0700 Subject: [PATCH 005/223] Update achievement kit reference text --- .../src/mineplex/core/achievement/AchievementCategory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 6ce3d8025..85ed3540b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -105,7 +105,7 @@ public enum AchievementCategory ONE_IN_THE_QUIVER("One in the Quiver", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, - Material.BOW, 0, GameCategory.ARCADE, "Slam Shooter Kit"), + Material.BOW, 0, GameCategory.ARCADE, "Ninja Kit"), SUPER_PAINTBALL("Super Paintball", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, From cbe147d7057abdb7839e97c80195a23fccceae5d Mon Sep 17 00:00:00 2001 From: fooify Date: Sun, 25 Oct 2015 12:32:27 -0700 Subject: [PATCH 006/223] typo fix in legendary aura description --- .../src/mineplex/core/gadget/gadgets/ParticleLegend.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java index ac5c3aaa8..af5d32cfc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java @@ -21,7 +21,7 @@ public class ParticleLegend extends ParticleGadget { super(manager, "Legendary Aura", new String[] { - C.cWhite + "These mystic particle attach to", + C.cWhite + "This mystic particle attaches to", C.cWhite + "only the most legendary of players!", " ", C.cGreen + "Unlocked with Legend Rank", From ac4a276affc8ca2fea39c3efa90da42a332fc528 Mon Sep 17 00:00:00 2001 From: fooify Date: Wed, 11 Nov 2015 20:38:36 -0800 Subject: [PATCH 007/223] fixed bridge bug "Death Bomber counts suicides as well" --- .../nautilus/game/arcade/stats/DeathBomberStatTracker.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/DeathBomberStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/DeathBomberStatTracker.java index 9d4ac4865..90316be6e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/DeathBomberStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/DeathBomberStatTracker.java @@ -46,6 +46,11 @@ public class DeathBomberStatTracker extends StatTracker if (!event.GetLog().GetPlayer().IsPlayer()) return; + + Player killed = UtilPlayer.searchExact(event.GetLog().GetPlayer().GetName()); + + if(killer.equals(killed)) + return; if (event.GetLog().GetKiller() != null && event.GetLog().GetKiller().GetReason().contains("Throwing TNT")) { From a0c0f6b8911855db14e09f26e8492b4ad472a956 Mon Sep 17 00:00:00 2001 From: fooify Date: Thu, 12 Nov 2015 16:19:33 -0800 Subject: [PATCH 008/223] Slightly bumped Monster Maze jump time value --- .../game/games/monstermaze/MonsterMaze.java | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java index 550c5a669..f5d9011b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java @@ -225,7 +225,7 @@ public class MonsterMaze extends SoloGame p.playSound(p.getLocation(), Sound.CHICKEN_EGG_POP, 1.0f, 1.0f); - Recharge.Instance.useForce(p, "MM Player Jump", 750); + Recharge.Instance.useForce(p, "MM Player Jump", 900); //Find blocks below a player for (int i = 0 ; i < 3 ; i++) @@ -358,27 +358,6 @@ public class MonsterMaze extends SoloGame } } - private boolean _announced = false; - @EventHandler - public void sendF5Message(UpdateEvent event) - { - if (event.getType() != UpdateType.FASTEST) - return; - - if (GetState() != GameState.Prepare) - return; - - if (_announced) - return; - - if (!UtilTime.elapsed(GetStateTime(), 4000)) - return; - - _announced = true; - UtilTextMiddle.display(C.cYellow + C.Bold + "Press F5", C.cAqua + C.Bold + "Monster Maze is best in 3rd person!"); - Announce(C.cYellow + C.Scramble + "@@" + C.cAqua + C.Bold + " Monster Maze is best played in 3rd Person! (Push F5) " + C.cYellow + C.Scramble + "@@"); - } - @Override @EventHandler public void ScoreboardUpdate(UpdateEvent event) From f9f4c2addc50785f9cec94ba0436d0c2a6835c59 Mon Sep 17 00:00:00 2001 From: fooify Date: Fri, 13 Nov 2015 17:28:25 -0800 Subject: [PATCH 009/223] fixed several smash bugs and one global issue --- .../game/arcade/game/games/monstermaze/MonsterMaze.java | 2 +- .../nautilus/game/arcade/game/games/smash/kits/KitCreeper.java | 2 +- .../src/nautilus/game/arcade/kit/perks/PerkDoubleJump.java | 2 +- .../src/nautilus/game/arcade/kit/perks/PerkWitchPotion.java | 3 +++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java index f5d9011b6..1a7128081 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java @@ -225,7 +225,7 @@ public class MonsterMaze extends SoloGame p.playSound(p.getLocation(), Sound.CHICKEN_EGG_POP, 1.0f, 1.0f); - Recharge.Instance.useForce(p, "MM Player Jump", 900); + Recharge.Instance.useForce(p, "MM Player Jump", 750); //Find blocks below a player for (int i = 0 ; i < 3 ; i++) 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 b73d68ad3..444b0aaeb 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 @@ -61,7 +61,7 @@ public class KitCreeper extends SmashKit })); player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.IRON_SPADE, (byte)0, 1, - C.cYellow + C.Bold + "Right-Click" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Explosive Leap", + C.cYellow + C.Bold + "Right-Click" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Explode", new String[] { ChatColor.RESET + "You freeze in location and charge up", 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 018522154..a308fa524 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 @@ -120,7 +120,7 @@ public class PerkDoubleJump extends Perk if (_recharge > 0 && !Recharge.Instance.usable(player, GetName())) continue; - if (UtilEnt.isGrounded(player) || UtilBlock.solid(player.getLocation().getBlock().getRelative(BlockFace.DOWN))) + if (player.isOnGround() || (UtilBlock.solid(player.getLocation().getBlock().getRelative(BlockFace.DOWN)) && UtilBlock.solid(player.getLocation().getBlock()))) player.setAllowFlight(true); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitchPotion.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitchPotion.java index d6d70875b..7baa5eb0a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitchPotion.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitchPotion.java @@ -109,6 +109,8 @@ public class PerkWitchPotion extends SmashPerk Manager.GetDamage().NewDamageEvent(player, thrower, null, DamageCause.CUSTOM, 5, true, true, false, UtilEnt.getName((LivingEntity)event.getEntity().getShooter()), GetName()); + + Manager.GetCondition().Factory().Slow("Witch Potion", player, null, 3, 1, true, false, false, false); } //Super Effect else @@ -121,6 +123,7 @@ public class PerkWitchPotion extends SmashPerk DamageCause.CUSTOM, 5 + bonus, true, true, false, UtilEnt.getName((LivingEntity)event.getEntity().getShooter()), GetName()); + Manager.GetCondition().Factory().Slow("Witch Potion", player, null, 7, 2, true, false, false, false); //Manager.GetCondition().Factory().Confuse(reason, ent, source, duration, mult, extend, showIndicator, ambient) } } From 5767d4e2db2acd2d2bcff133ebf4e79bcc5cd207 Mon Sep 17 00:00:00 2001 From: fooify Date: Sat, 14 Nov 2015 16:08:14 -0800 Subject: [PATCH 010/223] SSM bug fix: magma cube flame dash doesn't make player invisible --- .../src/nautilus/game/arcade/kit/perks/PerkFlameDash.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFlameDash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFlameDash.java index 041bae71c..94b7376bd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFlameDash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkFlameDash.java @@ -93,7 +93,8 @@ public class PerkFlameDash extends Perk _data.add(new FireflyData(player)); - Manager.GetCondition().Factory().Invisible(GetName(), player, player, 2.5, 0, false, false, true); + Manager.GetCondition().Factory().Cloak(GetName(), player, player, 2.5, false, false); + //Manager.GetCondition().Factory().Invisible(GetName(), player, player, 2.5, 0, false, false, true); UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); } From 4198e73120d0e694876ab19c6d50e35147ab75b8 Mon Sep 17 00:00:00 2001 From: fooify Date: Tue, 17 Nov 2015 16:05:49 -0800 Subject: [PATCH 011/223] Fixed SG Barbarian bug --- .../src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java | 4 ++++ .../src/nautilus/game/arcade/kit/perks/PerkCleave.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java index 66292d9d7..f07e50acb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java @@ -53,6 +53,10 @@ public class PerkBladeVortex extends Perk if (!UtilGear.isWeapon(event.getPlayer().getItemInHand())) return; + + //Dont allow usage in early game + if (!UtilTime.elapsed(Manager.GetGame().GetStateTime(), 30000)) + return; final Player player = event.getPlayer(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java index 0b38a3a0b..f64a380d8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java @@ -40,7 +40,7 @@ public class PerkCleave extends Perk return; //Dont allow usage in early game - if (UtilTime.elapsed(Manager.GetGame().GetStateTime(), 30000)) + if (!UtilTime.elapsed(Manager.GetGame().GetStateTime(), 30000)) return; //Damager From 6d0879a175a01e4db56b6b4df85634e4f21832a3 Mon Sep 17 00:00:00 2001 From: fooify Date: Wed, 18 Nov 2015 17:31:28 -0800 Subject: [PATCH 012/223] Re-fixed Barbarian bug --- .../src/nautilus/game/arcade/kit/perks/PerkCleave.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java index f64a380d8..0b38a3a0b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkCleave.java @@ -40,7 +40,7 @@ public class PerkCleave extends Perk return; //Dont allow usage in early game - if (!UtilTime.elapsed(Manager.GetGame().GetStateTime(), 30000)) + if (UtilTime.elapsed(Manager.GetGame().GetStateTime(), 30000)) return; //Damager From 97471b0d9cde69ff67b67d04b5af2867b1ef8869 Mon Sep 17 00:00:00 2001 From: Sarah Date: Fri, 20 Nov 2015 23:38:02 +0100 Subject: [PATCH 013/223] Finalizing Game Tutorials. --- .../src/nautilus/game/arcade/game/Game.java | 5 + .../nautilus/game/arcade/game/GameTeam.java | 14 ++ .../arcade/gametutorial/GameTutorial.java | 167 +++++++++++++++ .../arcade/gametutorial/TutorialPhase.java | 193 ++++++++++++++++++ .../arcade/gametutorial/TutorialText.java | 38 ++++ .../events/GameTutorialEndEvent.java | 32 +++ .../events/GameTutorialStartEvent.java | 32 +++ .../game/arcade/managers/GameManager.java | 73 +++++++ 8 files changed, 554 insertions(+) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialEndEvent.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialStartEvent.java 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 23dc523e1..d09ecb8fc 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 @@ -72,6 +72,7 @@ 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.gametutorial.GameTutorial; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; @@ -299,6 +300,8 @@ public abstract class Game implements Listener public boolean DeadBodiesQuit = true; public boolean DeadBodiesDeath = true; public int DeadBodiesExpire = -1; + + public boolean EnableTutorials = false; private IPacketHandler _useEntityPacketHandler; private int _deadBodyCount; @@ -1719,4 +1722,6 @@ public abstract class Game implements Listener } } } + + public void addTutorials(){} } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java index 6527ec0ea..528d01aa1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java @@ -14,6 +14,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.visibility.VisibilityManager; import nautilus.game.arcade.game.GameTeam.PlayerState; +import nautilus.game.arcade.gametutorial.GameTutorial; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; @@ -58,6 +59,8 @@ public class GameTeam private String _name; private String _displayName; private ChatColor _color; + + private GameTutorial _tutorial; private HashMap _players = new HashMap(); @@ -441,4 +444,15 @@ public class GameTeam return _places; } + + public GameTutorial getTutorial() + { + return _tutorial; + } + + public void setTutorial(GameTutorial tutorial) + { + _tutorial = tutorial; + } + } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java new file mode 100644 index 000000000..65d129eb3 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -0,0 +1,167 @@ +package nautilus.game.arcade.gametutorial; + +import java.util.ArrayList; +import java.util.HashMap; + +import mineplex.core.common.util.UtilServer; +import mineplex.core.visibility.VisibilityManager; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.GameTeam; +import nautilus.game.arcade.gametutorial.events.GameTutorialEndEvent; +import nautilus.game.arcade.gametutorial.events.GameTutorialStartEvent; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public abstract class GameTutorial +{ + + public ArcadeManager Manager; + + private TutorialPhase[] _phases; + private GameTeam _team; + private HashMap _players; + + private TutorialPhase _currentPhase; + + private boolean _hasEnded; + private boolean _hasStarted; + + private int _tick; + + public GameTutorial(ArcadeManager manager, TutorialPhase[] phases) + { + Manager = manager; + _phases = phases; + _players = new HashMap<>(); + } + + final public void start() + { + _hasStarted = true; + _tick = 0; + for(TutorialPhase phase : _phases) + phase.setTutorial(this); + + Manager.GetGame().PrepareTime = 60000; + Manager.GetChat().Silence(60000, false); + Manager.getPluginManager().callEvent(new GameTutorialStartEvent(this)); + onStart(); + preparePlayers(); + nextPhase(); + } + + protected void nextPhase() + { + _currentPhase = getNextPhase(); + if(_currentPhase == null) + { + onEnd(); + endTutorial(); + _hasEnded = true; + Manager.getPluginManager().callEvent(new GameTutorialEndEvent(this)); + } + else + { + Manager.GetChat().Silence((System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 7000, false); + onPhaseChange(_currentPhase); + _currentPhase.start(); + } + } + + public void setTeam(GameTeam team) + { + _team = team; + } + + private void endTutorial() + { + Manager.runSync(new Runnable() + { + @Override + public void run() + { + for(Player player : _players.keySet()) + { + VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); + player.setAllowFlight(false); + player.setFlying(false); + player.teleport(_players.get(player)); + } + } + }); + Manager.GetChat().Silence((System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000, false); + Manager.GetGame().PrepareTime = (System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000; + } + + protected TutorialPhase getNextPhase() + { + for(TutorialPhase phase : _phases) + { + if(_currentPhase == null && phase.ID() == 1) + { + return phase; + } + else if(_currentPhase != null && _currentPhase.ID() + 1 == phase.ID()) + { + return phase; + } + } + return null; + } + + private void preparePlayers() + { + for(Player player : UtilServer.getPlayers()) + { + int i = 0; + if(Manager.GetGame().GetTeam(player) == _team) + { + _players.put(player, Manager.GetGame().GetTeam(player).GetSpawns().get(i)); + player.setAllowFlight(true); + player.setFlying(true); + VisibilityManager.Instance.setVisibility(player, false, UtilServer.getPlayers()); + i++; + } + } + } + + public TutorialPhase getPhase(int index) + { + for(TutorialPhase phase : _phases) + { + if(phase.ID() == index) + return phase; + } + return null; + } + + public boolean hasEnded() + { + return _hasEnded; + } + + public boolean hasStarted() + { + return _hasStarted; + } + + public HashMap getPlayers() + { + return _players; + } + + public void onTick(int tick){} + + public void onStart(){} + + public void onPhaseChange(TutorialPhase phase){} + + public void onEnd(){} + + public int tick() + { + _tick++; + return _tick; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java new file mode 100644 index 000000000..f64c9aed3 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -0,0 +1,193 @@ +package nautilus.game.arcade.gametutorial; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilTextMiddle; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public abstract class TutorialPhase +{ + + public abstract int ID(); + + private GameTutorial _tutorial; + private TutorialText[] _text; + private Location _location; + private Location _target; + private boolean _hasEnded; + + private TutorialText _currentText; + + public TutorialPhase(TutorialText[] text) + { + _text = text; + } + + public TutorialText[] getText() + { + return _text; + } + + public Location getLocation() + { + return _location; + } + + final public void start() + { + _hasEnded = false; + onStart(); + if(_location != null && _target != null) + { + prepareLocations(); + updatePlayers(); + } + displayText(); + } + + private void prepareLocations() + { + Vector vector = new Vector(_target.getBlockX() - _location.getBlockX(), _target.getBlockY() - _location.getBlockY(), _target.getBlockZ() - _location.getBlockZ()); + float pitch = UtilAlg.GetPitch(vector); + float yaw = UtilAlg.GetYaw(vector); + _location.setPitch(pitch); + _location.setYaw(yaw); + } + + private void updatePlayers() + { + new Thread(new Runnable() + { + @Override + public void run() + { + while(!_hasEnded) + { + _tutorial.Manager.runSync(new Runnable() + { + @Override + public void run() + { + for(Player player : _tutorial.getPlayers().keySet()) + { + player.setAllowFlight(true); + player.setFlying(true); + player.teleport(_location); + } + } + }); + try + { + Thread.sleep(50); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + } + } + }).start(); + } + + public void displayText() + { + new Thread(new Runnable() + { + @Override + public void run() + { + while(true) + { + TutorialText text = getNextMessage(); + if(text == null) + { + _tutorial.Manager.runSync(new Runnable() + { + @Override + public void run() + { + _hasEnded = true; + _tutorial.nextPhase(); + onEnd(); + } + }); + break; + } + else + { + Player[] players = new Player[_tutorial.getPlayers().keySet().size()]; + int i = 0; + for(Player player : _tutorial.getPlayers().keySet()) + { + players[i] = player; + i++; + } + UtilTextMiddle.display("", text.getText(), 0, text.getStayTime(), 0, players); + displayMessage(text); + try + { + Thread.sleep(text.getStayTime() * 50); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + } + } + + } + }).start(); + } + + private void displayMessage(final TutorialText text) + { + _tutorial.Manager.runSync(new Runnable() + { + @Override + public void run() + { + onMessageDisplay(text); + } + }); + } + + protected TutorialText getNextMessage() + { + for(TutorialText text : _text) + { + if(_currentText == null && text.ID() == 1) + { + _currentText = text; + return text; + } + else if(_currentText != null && _currentText.ID() + 1 == text.ID()) + { + _currentText = text; + return text; + } + } + return null; + } + + public void setTutorial(GameTutorial tutorial) + { + _tutorial = tutorial; + } + + public void setLocation(Location location) + { + _location = location; + } + + public void setTarget(Location target) + { + _target = target; + } + + public void onStart(){} + + public void onMessageDisplay(TutorialText text){} + + public void onEnd(){} + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java new file mode 100644 index 000000000..dd278faec --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -0,0 +1,38 @@ +package nautilus.game.arcade.gametutorial; + + +public class TutorialText +{ + + private String _text; + private int _stayTime; + private int _id; + + public TutorialText(String text, int stayTime, int id) + { + _text = text; + _id = id; + _stayTime = stayTime; + } + + public TutorialText(String text, int id) + { + this(text, text.length() + 20, id); + } + + public String getText() + { + return _text; + } + + public int ID() + { + return _id; + } + + public int getStayTime() + { + return _stayTime; + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialEndEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialEndEvent.java new file mode 100644 index 000000000..10a540759 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialEndEvent.java @@ -0,0 +1,32 @@ +package nautilus.game.arcade.gametutorial.events; + +import nautilus.game.arcade.gametutorial.GameTutorial; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class GameTutorialEndEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + private GameTutorial _tutorial; + + public GameTutorialEndEvent(GameTutorial tutorial) + { + _tutorial = tutorial; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public GameTutorial getTutorial() + { + return _tutorial; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialStartEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialStartEvent.java new file mode 100644 index 000000000..38b93f2ca --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialStartEvent.java @@ -0,0 +1,32 @@ +package nautilus.game.arcade.gametutorial.events; + +import nautilus.game.arcade.gametutorial.GameTutorial; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class GameTutorialStartEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + private GameTutorial _tutorial; + + public GameTutorialStartEvent(GameTutorial tutorial) + { + _tutorial = tutorial; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public GameTutorial getTutorial() + { + return _tutorial; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 21d8c6501..e720636be 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -35,6 +35,7 @@ import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.uhc.UHC; +import nautilus.game.arcade.gametutorial.GameTutorial; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -131,6 +132,35 @@ public class GameManager implements Listener return; Game game = Manager.GetGame(); + + boolean tutorialSet = false; + for(GameTeam team : game.GetTeamList()) + { + if(team.getTutorial() != null) + tutorialSet = true; + } + if(!tutorialSet) + { + game.addTutorials(); + } + if(game.EnableTutorials) + { + for(GameTeam team : game.GetTeamList()) + { + if(team.getTutorial() != null) + { + if(!team.getTutorial().hasStarted()) + { + team.getTutorial().setTeam(team); + team.getTutorial().start(); + } + if(!team.getTutorial().hasEnded()) + { + return; + } + } + } + } double percentage = (double) (System.currentTimeMillis() - game.GetStateTime()) / game.PrepareTime; @@ -138,6 +168,36 @@ public class GameManager implements Listener UtilTextBottom.displayProgress("Game Start", percentage, UtilTime.MakeStr(Math.max(0, game.PrepareTime - (System.currentTimeMillis() - game.GetStateTime()))), player); } + + @EventHandler + public void updateGameTutorials(UpdateEvent event) + { + if(event.getType() != UpdateType.TICK) + return; + + Game game = Manager.GetGame(); + + if(game == null) + return; + + if(game.GetState() != GameState.Prepare) + return; + + + if(game.EnableTutorials) + { + for(GameTeam team : game.GetTeamList()) + { + if(team.getTutorial() != null) + { + if(!team.getTutorial().hasEnded() && team.getTutorial().hasStarted()) + { + team.getTutorial().onTick(team.getTutorial().tick()); + } + } + } + } + } @EventHandler public void StateUpdate(UpdateEvent event) @@ -185,6 +245,19 @@ public class GameManager implements Listener } else if (game.GetState() == GameState.Prepare) { + if(game.EnableTutorials) + { + for(GameTeam team : game.GetTeamList()) + { + if(team.getTutorial() != null) + { + if(!team.getTutorial().hasEnded()) + { + return; + } + } + } + } if (game.CanStartPrepareCountdown()) { if (UtilTime.elapsed(game.GetStateTime(), game.PrepareTime)) From 6a29d2a2d6a2ee91bb920aa3e712e496da37dd57 Mon Sep 17 00:00:00 2001 From: Sarah Date: Sat, 21 Nov 2015 17:01:17 +0100 Subject: [PATCH 014/223] adding some getters. --- .../arcade/gametutorial/GameTutorial.java | 6 +++- .../arcade/gametutorial/TutorialPhase.java | 30 ++++++++++++------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 65d129eb3..38118c99c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -1,6 +1,5 @@ package nautilus.game.arcade.gametutorial; -import java.util.ArrayList; import java.util.HashMap; import mineplex.core.common.util.UtilServer; @@ -151,6 +150,11 @@ public abstract class GameTutorial return _players; } + public GameTeam getTeam() + { + return _team; + } + public void onTick(int tick){} public void onStart(){} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index f64c9aed3..1082fe6db 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -25,16 +25,6 @@ public abstract class TutorialPhase _text = text; } - public TutorialText[] getText() - { - return _text; - } - - public Location getLocation() - { - return _location; - } - final public void start() { _hasEnded = false; @@ -169,6 +159,16 @@ public abstract class TutorialPhase return null; } + public TutorialText[] getText() + { + return _text; + } + + public Location getLocation() + { + return _location; + } + public void setTutorial(GameTutorial tutorial) { _tutorial = tutorial; @@ -184,6 +184,16 @@ public abstract class TutorialPhase _target = target; } + public GameTutorial getTutorial() + { + return _tutorial; + } + + public Location getTarget() + { + return _target; + } + public void onStart(){} public void onMessageDisplay(TutorialText text){} From cba5aef9f1ffa922c995bbcb855ed2ec45dec085 Mon Sep 17 00:00:00 2001 From: Sarah Date: Sat, 21 Nov 2015 18:18:13 +0100 Subject: [PATCH 015/223] small fix --- .../src/nautilus/game/arcade/managers/GameManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index e720636be..8618525f4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -143,6 +143,7 @@ public class GameManager implements Listener { game.addTutorials(); } + boolean finished = true; if(game.EnableTutorials) { for(GameTeam team : game.GetTeamList()) @@ -156,10 +157,12 @@ public class GameManager implements Listener } if(!team.getTutorial().hasEnded()) { - return; + finished = false; } } } + if(!finished) + return; } double percentage = (double) (System.currentTimeMillis() - game.GetStateTime()) / game.PrepareTime; From 205643028ed7316255b749b43a470e3b23876e28 Mon Sep 17 00:00:00 2001 From: fooify Date: Sat, 21 Nov 2015 11:00:51 -0800 Subject: [PATCH 016/223] fixed slab issue with Assassin's Flash --- .../classcombat/Skill/Assassin/Flash.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java index dbad68ca0..6223c6b33 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java @@ -125,9 +125,30 @@ public class Flash extends SkillActive while (curRange <= maxRange) { Location newTarget = player.getLocation().add(new Vector(0,0.2,0)).add(player.getLocation().getDirection().multiply(curRange)); - - if (!UtilBlock.airFoliage(newTarget.getBlock()) || - !UtilBlock.airFoliage(newTarget.getBlock().getRelative(BlockFace.UP))) + Location aboveTarget = newTarget.getBlock().getRelative(BlockFace.UP).getLocation(); + + // half-slab + boolean newTargetIsSlab = newTarget.getBlock().getType() == Material.STEP || newTarget.getBlock().getType() == Material.WOOD_STEP; + boolean aboveTargetIsSlab = aboveTarget.getBlock().getType() == Material.STEP || aboveTarget.getBlock().getType() == Material.WOOD_STEP; + + boolean newTargetSlabIsBottom = false; + boolean aboveTargetSlabIsBottom = false; + + if(newTargetIsSlab && curRange < 0.5) + { + int newTargetData = (int) newTarget.getBlock().getData(); + + if(newTargetData <= 7) newTargetSlabIsBottom = true; + } + + if(aboveTargetIsSlab && curRange < 0.25) + { + int aboveTargetData = (int) aboveTarget.getBlock().getData(); + + if(aboveTargetData <= 7) aboveTargetSlabIsBottom = true; + } + + if ((!newTargetSlabIsBottom && UtilBlock.fullSolid(newTarget.getBlock())) || (!aboveTargetSlabIsBottom && UtilBlock.fullSolid(aboveTarget.getBlock()))) break; //Progress Forwards From 66598ce97e7f91e542d665536d526548f4a0a78b Mon Sep 17 00:00:00 2001 From: Sarah Date: Mon, 23 Nov 2015 16:16:33 +0100 Subject: [PATCH 017/223] adding teleport flag. --- .../arcade/gametutorial/GameTutorial.java | 22 ++++------ .../arcade/gametutorial/TutorialPhase.java | 4 +- .../game/arcade/managers/GameManager.java | 43 ++++++++++--------- 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 38118c99c..d90a83e6a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -28,6 +28,8 @@ public abstract class GameTutorial private int _tick; + public boolean TeleportOnEnd = true; + public GameTutorial(ArcadeManager manager, TutorialPhase[] phases) { Manager = manager; @@ -75,20 +77,14 @@ public abstract class GameTutorial private void endTutorial() { - Manager.runSync(new Runnable() + for(Player player : _players.keySet()) { - @Override - public void run() - { - for(Player player : _players.keySet()) - { - VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); - player.setAllowFlight(false); - player.setFlying(false); - player.teleport(_players.get(player)); - } - } - }); + VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); + player.setAllowFlight(false); + player.setFlying(false); + if(TeleportOnEnd) + _team.SpawnTeleport(); + } Manager.GetChat().Silence((System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000, false); Manager.GetGame().PrepareTime = (System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 1082fe6db..d10bd6427 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -98,8 +98,8 @@ public abstract class TutorialPhase public void run() { _hasEnded = true; - _tutorial.nextPhase(); - onEnd(); + onEnd(); + _tutorial.nextPhase(); } }); break; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 8618525f4..39c84e3d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -122,14 +122,10 @@ public class GameManager implements Listener } } - @EventHandler - public void DisplayPrepareTime(UpdateEvent event) + public boolean isInTutorial() { - if (event.getType() != UpdateType.TICK) - return; - if (Manager.GetGame() == null || Manager.GetGame().GetState() != GameState.Prepare) - return; + return false; Game game = Manager.GetGame(); @@ -162,8 +158,24 @@ public class GameManager implements Listener } } if(!finished) - return; + return true; } + return false; + } + + @EventHandler + public void DisplayPrepareTime(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + if (Manager.GetGame() == null || Manager.GetGame().GetState() != GameState.Prepare) + return; + + Game game = Manager.GetGame(); + + if(isInTutorial()) + return; double percentage = (double) (System.currentTimeMillis() - game.GetStateTime()) / game.PrepareTime; @@ -186,7 +198,6 @@ public class GameManager implements Listener if(game.GetState() != GameState.Prepare) return; - if(game.EnableTutorials) { for(GameTeam team : game.GetTeamList()) @@ -248,19 +259,9 @@ public class GameManager implements Listener } else if (game.GetState() == GameState.Prepare) { - if(game.EnableTutorials) - { - for(GameTeam team : game.GetTeamList()) - { - if(team.getTutorial() != null) - { - if(!team.getTutorial().hasEnded()) - { - return; - } - } - } - } + if(isInTutorial()) + return; + if (game.CanStartPrepareCountdown()) { if (UtilTime.elapsed(game.GetStateTime(), game.PrepareTime)) From f8401e0eeb37abfa2aedb27f3039be7d2baf36b5 Mon Sep 17 00:00:00 2001 From: fooify Date: Mon, 23 Nov 2015 17:08:24 -0800 Subject: [PATCH 018/223] fixed shield smash and fissure affecting spectators --- .../game/classcombat/Skill/Knight/ShieldSmash.java | 3 +++ .../game/classcombat/Skill/Mage/FissureData.java | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/ShieldSmash.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/ShieldSmash.java index 74c32eca4..8a2a4875b 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/ShieldSmash.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/ShieldSmash.java @@ -84,6 +84,9 @@ public class ShieldSmash extends SkillActive if (cur.equals(player)) continue; + + if (UtilPlayer.isSpectator(cur)) + continue; if (UtilMath.offset(loc, cur.getLocation()) > 2.5) continue; diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FissureData.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FissureData.java index 6f4353598..6f3ac3d64 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FissureData.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FissureData.java @@ -94,13 +94,16 @@ public class FissureData _loc.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId()); //Slow - for (Player cur : block.getWorld().getPlayers()) + for (Player cur : block.getWorld().getPlayers()) { + if(UtilPlayer.isSpectator(cur)) continue; + if (!cur.equals(_player)) if (UtilMath.offset(block.getLocation().add(0.5, 0.5, 0.5), cur.getLocation()) < 1.5) { //Condition Host.Factory.Condition().Factory().Slow("Fissure", cur, _player, 1 + _level, 1, false, true, true, true); } + } } } @@ -142,7 +145,10 @@ public class FissureData up.getWorld().playEffect(up.getLocation(), Effect.STEP_SOUND, block.getTypeId()); //Damage - for (Player cur : up.getWorld().getPlayers()) + for (Player cur : up.getWorld().getPlayers()) { + if (UtilPlayer.isSpectator(cur)) + continue; + if (!cur.equals(_player)) { //Teleport @@ -168,7 +174,7 @@ public class FissureData UtilPlayer.message(cur, F.main(Host.GetClassType().name(), F.name(_player.getName()) +" hit you with " + F.skill(Host.GetName(_level)) + ".")); } } - + } //Next Column if (_height >= Math.min(3, _handled/2 + 1)) { From 95b4ad74e845119b1705869dfd980d51378200c3 Mon Sep 17 00:00:00 2001 From: Sarah Date: Tue, 24 Nov 2015 16:23:03 +0100 Subject: [PATCH 019/223] fixed silencing and adding possibilty to change text. --- .../src/nautilus/game/arcade/gametutorial/GameTutorial.java | 4 ++-- .../src/nautilus/game/arcade/gametutorial/TutorialPhase.java | 2 +- .../src/nautilus/game/arcade/gametutorial/TutorialText.java | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index d90a83e6a..35f58dd0a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -64,7 +64,7 @@ public abstract class GameTutorial } else { - Manager.GetChat().Silence((System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 7000, false); + Manager.GetChat().Silence(7000, false); onPhaseChange(_currentPhase); _currentPhase.start(); } @@ -85,7 +85,7 @@ public abstract class GameTutorial if(TeleportOnEnd) _team.SpawnTeleport(); } - Manager.GetChat().Silence((System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000, false); + Manager.GetChat().Silence(5000, false); Manager.GetGame().PrepareTime = (System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index d10bd6427..65c4f4e4b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -113,8 +113,8 @@ public abstract class TutorialPhase players[i] = player; i++; } - UtilTextMiddle.display("", text.getText(), 0, text.getStayTime(), 0, players); displayMessage(text); + UtilTextMiddle.display("", text.getText(), 0, text.getStayTime(), 0, players); try { Thread.sleep(text.getStayTime() * 50); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java index dd278faec..03729af65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -35,4 +35,9 @@ public class TutorialText return _stayTime; } + public void setText(String text) + { + _text = text; + } + } From 809faf3098ce463c025cde1f88beec9015f08d9b Mon Sep 17 00:00:00 2001 From: Sarah Date: Thu, 26 Nov 2015 00:14:15 +0100 Subject: [PATCH 020/223] changing teleport mechanic. --- .../src/nautilus/game/arcade/managers/GameManager.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 39c84e3d0..43759a930 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -142,6 +142,11 @@ public class GameManager implements Listener boolean finished = true; if(game.EnableTutorials) { + for(Player player : UtilServer.getPlayers()) + { + if(player.getWorld() == Manager.GetLobby().GetSpawn().getWorld()) + return true; + } for(GameTeam team : game.GetTeamList()) { if(team.getTutorial() != null) From eddbde5ebdd9e454db393993e3c25c9cfdd26fc4 Mon Sep 17 00:00:00 2001 From: Sarah Date: Thu, 26 Nov 2015 16:06:15 +0100 Subject: [PATCH 021/223] Changing length formula. --- .../src/nautilus/game/arcade/gametutorial/TutorialText.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java index 03729af65..9abdf6c9b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -17,7 +17,7 @@ public class TutorialText public TutorialText(String text, int id) { - this(text, text.length() + 20, id); + this(text, (int) (Math.round(1.5 * text.length()) + 25), id); } public String getText() From a653f053a5bb11b67473579bb6fe07a76ad3d2ba Mon Sep 17 00:00:00 2001 From: Sarah Date: Thu, 26 Nov 2015 16:12:13 +0100 Subject: [PATCH 022/223] Adding 2 Seconds delay. --- .../nautilus/game/arcade/gametutorial/GameTutorial.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 35f58dd0a..a4f0e170a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -49,7 +49,14 @@ public abstract class GameTutorial Manager.getPluginManager().callEvent(new GameTutorialStartEvent(this)); onStart(); preparePlayers(); - nextPhase(); + Manager.runSyncLater(new Runnable() + { + @Override + public void run() + { + nextPhase(); + } + }, 40); } protected void nextPhase() From 21f859f57907cf73d734e6503236a29e8574b23f Mon Sep 17 00:00:00 2001 From: Sarah Date: Thu, 26 Nov 2015 16:26:49 +0100 Subject: [PATCH 023/223] fixing 2 seconds delay. --- .../game/arcade/gametutorial/GameTutorial.java | 9 +++++---- .../game/arcade/gametutorial/TutorialPhase.java | 14 +++++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index a4f0e170a..5f425ba55 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -53,13 +53,14 @@ public abstract class GameTutorial { @Override public void run() - { - nextPhase(); + { + nextPhase(true); } }, 40); + _currentPhase.teleport(); } - protected void nextPhase() + protected void nextPhase(boolean phaseOne) { _currentPhase = getNextPhase(); if(_currentPhase == null) @@ -73,7 +74,7 @@ public abstract class GameTutorial { Manager.GetChat().Silence(7000, false); onPhaseChange(_currentPhase); - _currentPhase.start(); + _currentPhase.start(phaseOne); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 65c4f4e4b..ed16a0e20 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -25,16 +25,24 @@ public abstract class TutorialPhase _text = text; } - final public void start() + final public void start(boolean phaseOne) { _hasEnded = false; onStart(); + if(!phaseOne) + { + teleport(); + } + displayText(); + } + + final public void teleport() + { if(_location != null && _target != null) { prepareLocations(); updatePlayers(); } - displayText(); } private void prepareLocations() @@ -99,7 +107,7 @@ public abstract class TutorialPhase { _hasEnded = true; onEnd(); - _tutorial.nextPhase(); + _tutorial.nextPhase(false); } }); break; From c74732af39afd11c6425eb1a5d1b2cf332431410 Mon Sep 17 00:00:00 2001 From: Sarah Date: Thu, 26 Nov 2015 16:37:18 +0100 Subject: [PATCH 024/223] One more fix. --- .../src/nautilus/game/arcade/gametutorial/GameTutorial.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 5f425ba55..c591220e1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -49,6 +49,7 @@ public abstract class GameTutorial Manager.getPluginManager().callEvent(new GameTutorialStartEvent(this)); onStart(); preparePlayers(); + _currentPhase = getNextPhase(); Manager.runSyncLater(new Runnable() { @Override @@ -62,7 +63,9 @@ public abstract class GameTutorial protected void nextPhase(boolean phaseOne) { - _currentPhase = getNextPhase(); + if(!phaseOne) + _currentPhase = getNextPhase(); + if(_currentPhase == null) { onEnd(); From fd0c5cf27367d3454352e63c0ad6ad6114418c7f Mon Sep 17 00:00:00 2001 From: Sarah Date: Fri, 27 Nov 2015 20:47:57 +0100 Subject: [PATCH 025/223] Adding some more flags. --- .../nautilus/game/arcade/gametutorial/GameTutorial.java | 9 ++++++--- .../nautilus/game/arcade/gametutorial/TutorialPhase.java | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index c591220e1..dc157fa3e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -27,8 +27,11 @@ public abstract class GameTutorial private boolean _hasStarted; private int _tick; - + + public boolean SetTutorialPositions = true; public boolean TeleportOnEnd = true; + + public long StartAfterTutorial = 5000; public GameTutorial(ArcadeManager manager, TutorialPhase[] phases) { @@ -96,8 +99,8 @@ public abstract class GameTutorial if(TeleportOnEnd) _team.SpawnTeleport(); } - Manager.GetChat().Silence(5000, false); - Manager.GetGame().PrepareTime = (System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + 5000; + Manager.GetChat().Silence(StartAfterTutorial, false); + Manager.GetGame().PrepareTime = (System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + StartAfterTutorial; } protected TutorialPhase getNextPhase() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index ed16a0e20..76445fe42 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -38,6 +38,9 @@ public abstract class TutorialPhase final public void teleport() { + if(!getTutorial().SetTutorialPositions) + return; + if(_location != null && _target != null) { prepareLocations(); From ad54d28b0d42d035bf7cc6310af0c9048aaa3382 Mon Sep 17 00:00:00 2001 From: Sarah Date: Fri, 27 Nov 2015 22:29:29 +0100 Subject: [PATCH 026/223] fixing teleportation issues. --- .../game/arcade/gametutorial/GameTutorial.java | 13 +++++++++++-- .../game/arcade/gametutorial/TutorialPhase.java | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index dc157fa3e..770898720 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -72,8 +72,8 @@ public abstract class GameTutorial if(_currentPhase == null) { onEnd(); - endTutorial(); _hasEnded = true; + endTutorial(); Manager.getPluginManager().callEvent(new GameTutorialEndEvent(this)); } else @@ -97,7 +97,16 @@ public abstract class GameTutorial player.setAllowFlight(false); player.setFlying(false); if(TeleportOnEnd) - _team.SpawnTeleport(); + { + Manager.runSyncLater(new Runnable() + { + @Override + public void run() + { + _team.SpawnTeleport(); + } + }, 5); + } } Manager.GetChat().Silence(StartAfterTutorial, false); Manager.GetGame().PrepareTime = (System.currentTimeMillis() - Manager.GetGame().GetStateTime()) + StartAfterTutorial; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 76445fe42..18b1b513b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -64,7 +64,7 @@ public abstract class TutorialPhase @Override public void run() { - while(!_hasEnded) + while(!_hasEnded && !getTutorial().hasEnded()) { _tutorial.Manager.runSync(new Runnable() { From 0dff0ffe1d27574fbab9703bbae857b663a48ec4 Mon Sep 17 00:00:00 2001 From: fooify Date: Sat, 28 Nov 2015 09:31:57 -0800 Subject: [PATCH 027/223] fixed bacon blast exloding blocks fixed sg compass pointing to teammates --- .../game/arcade/game/games/survivalgames/SurvivalGames.java | 4 ++-- .../src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java index 536983bca..89564c4e7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java @@ -941,7 +941,7 @@ public abstract class SurvivalGames extends Game for (Player alive : GetPlayers(true)) { - if (alive != player) + if (alive != player && getArcadeManager().canHurt(player, alive)) { double distance = alive.getLocation().distance( player.getLocation()); @@ -1546,7 +1546,7 @@ public abstract class SurvivalGames extends Game // Misc _baseLoot.addLoot(new RandomItem(Material.EXP_BOTTLE, 30, 1, 2)); - _baseLoot.addLoot(new RandomItem(Material.COMPASS, 20)); + _baseLoot.addLoot(new RandomItem(Material.COMPASS, 1000));//20 _baseLoot.addLoot(new RandomItem(Material.STICK, 30, 1, 2)); _baseLoot.addLoot(new RandomItem(Material.BOAT, 15)); _baseLoot.addLoot(new RandomItem(Material.FLINT, 30, 1, 2)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java index d69147917..c190beadc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.kit.perks; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -109,7 +110,9 @@ public class PerkBaconBlast extends Perk implements IThrown public void Explode(ProjectileUser data) { - data.GetThrown().getWorld().createExplosion(data.GetThrown().getLocation(), 0.5f); + // for whatever reason, you can't put a location in createExplosion if you don't want it to break blocks >.> + Location loc = data.GetThrown().getLocation(); + data.GetThrown().getWorld().createExplosion(loc.getX(), loc.getY(), loc.getZ(), 0.5f, false, false); data.GetThrown().remove(); } } From 66fd85af1f237b0b146491bfa9e5df67ff954667 Mon Sep 17 00:00:00 2001 From: Sarah Date: Sat, 28 Nov 2015 23:32:09 +0100 Subject: [PATCH 028/223] Adding Phase Event. --- .../arcade/gametutorial/GameTutorial.java | 3 ++ .../events/GameTutorialPhaseEvent.java | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialPhaseEvent.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 770898720..a6e8f0dc5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -7,6 +7,7 @@ import mineplex.core.visibility.VisibilityManager; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.gametutorial.events.GameTutorialEndEvent; +import nautilus.game.arcade.gametutorial.events.GameTutorialPhaseEvent; import nautilus.game.arcade.gametutorial.events.GameTutorialStartEvent; import org.bukkit.Location; @@ -66,6 +67,7 @@ public abstract class GameTutorial protected void nextPhase(boolean phaseOne) { + TutorialPhase from = _currentPhase; if(!phaseOne) _currentPhase = getNextPhase(); @@ -80,6 +82,7 @@ public abstract class GameTutorial { Manager.GetChat().Silence(7000, false); onPhaseChange(_currentPhase); + Manager.getPluginManager().callEvent(new GameTutorialPhaseEvent(this, from, _currentPhase)); _currentPhase.start(phaseOne); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialPhaseEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialPhaseEvent.java new file mode 100644 index 000000000..6d9bbf631 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/events/GameTutorialPhaseEvent.java @@ -0,0 +1,49 @@ +package nautilus.game.arcade.gametutorial.events; + +import nautilus.game.arcade.gametutorial.GameTutorial; +import nautilus.game.arcade.gametutorial.TutorialPhase; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class GameTutorialPhaseEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + private GameTutorial _tutorial; + + private TutorialPhase _from; + private TutorialPhase _to; + + public GameTutorialPhaseEvent(GameTutorial tutorial, TutorialPhase from, TutorialPhase to) + { + _tutorial = tutorial; + _from = from; + _to = to; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public GameTutorial getTutorial() + { + return _tutorial; + } + + public TutorialPhase getFrom() + { + return _from; + } + + public TutorialPhase getTo() + { + return _to; + } + +} From dc68375ec8a32d5a47d1434b1846b576eded5381 Mon Sep 17 00:00:00 2001 From: Sarah Date: Sun, 29 Nov 2015 21:48:39 +0100 Subject: [PATCH 029/223] TimeBetweenPhase Flag. --- .../src/nautilus/game/arcade/gametutorial/GameTutorial.java | 1 + .../src/nautilus/game/arcade/gametutorial/TutorialPhase.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index a6e8f0dc5..edfef5c0d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -32,6 +32,7 @@ public abstract class GameTutorial public boolean SetTutorialPositions = true; public boolean TeleportOnEnd = true; + public long TimeBetweenPhase = 0; public long StartAfterTutorial = 5000; public GameTutorial(ArcadeManager manager, TutorialPhase[] phases) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 18b1b513b..5b1eab19c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -103,7 +103,7 @@ public abstract class TutorialPhase TutorialText text = getNextMessage(); if(text == null) { - _tutorial.Manager.runSync(new Runnable() + _tutorial.Manager.runSyncLater(new Runnable() { @Override public void run() @@ -112,7 +112,7 @@ public abstract class TutorialPhase onEnd(); _tutorial.nextPhase(false); } - }); + }, getTutorial().TimeBetweenPhase); break; } else From e2cfcef55b6f86cd08ae118d39e5c8dde7e1b8c7 Mon Sep 17 00:00:00 2001 From: Sarah Date: Mon, 30 Nov 2015 16:58:41 +0100 Subject: [PATCH 030/223] RunTasksSync Flag. --- .../arcade/gametutorial/GameTutorial.java | 3 ++- .../arcade/gametutorial/TutorialPhase.java | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index edfef5c0d..7809a561e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -31,7 +31,8 @@ public abstract class GameTutorial public boolean SetTutorialPositions = true; public boolean TeleportOnEnd = true; - + public boolean RunTasksSync = true; + public long TimeBetweenPhase = 0; public long StartAfterTutorial = 5000; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 5b1eab19c..978a75928 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -142,14 +142,21 @@ public abstract class TutorialPhase private void displayMessage(final TutorialText text) { - _tutorial.Manager.runSync(new Runnable() + if(_tutorial.RunTasksSync) { - @Override - public void run() + _tutorial.Manager.runSync(new Runnable() { - onMessageDisplay(text); - } - }); + @Override + public void run() + { + onMessageDisplay(text); + } + }); + } + else + { + onMessageDisplay(text); + } } protected TutorialText getNextMessage() From ed96c8e3b34810fbd63a2e38b89333ca44b70aa7 Mon Sep 17 00:00:00 2001 From: fooify Date: Mon, 30 Nov 2015 19:27:34 -0800 Subject: [PATCH 031/223] fixed ssm enderman always facing south on teleport --- .../game/games/smash/perks/PerkEndermanTeleport.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkEndermanTeleport.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkEndermanTeleport.java index c55aa293f..7a0bf6059 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkEndermanTeleport.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkEndermanTeleport.java @@ -13,10 +13,10 @@ import org.bukkit.event.player.PlayerQuitEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTextMiddle; 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.UtilTextMiddle; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -37,10 +37,13 @@ public class PerkEndermanTeleport extends SmashPerk @EventHandler public void update(UpdateEvent event) - { + { if (event.getType() != UpdateType.TICK) return; + if(!Manager.GetGame().IsLive()) + return; + for (Player player : UtilServer.getPlayers()) { if (!Kit.HasKit(player)) @@ -88,7 +91,7 @@ public class PerkEndermanTeleport extends SmashPerk } player.playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 1f, 0.5f); - player.teleport(block.getLocation().add(0.5, 1, 0.5)); + player.teleport(block.getLocation().add(0.5, 1, 0.5).setDirection(player.getLocation().getDirection())); player.playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 1f, 0.5f); UtilParticle.PlayParticle(ParticleType.WITCH_MAGIC, player.getLocation().add(0, 1, 0), 1f, 1f, 1f, 0.1f, 100, ViewDist.LONG, UtilServer.getPlayers()); From 06ef9640008b23dbe7c52eea9564e108567ed442 Mon Sep 17 00:00:00 2001 From: fooify Date: Mon, 30 Nov 2015 19:33:03 -0800 Subject: [PATCH 032/223] removed important debug thing --- .../game/arcade/game/games/survivalgames/SurvivalGames.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java index 89564c4e7..b0c034a8f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java @@ -1546,7 +1546,7 @@ public abstract class SurvivalGames extends Game // Misc _baseLoot.addLoot(new RandomItem(Material.EXP_BOTTLE, 30, 1, 2)); - _baseLoot.addLoot(new RandomItem(Material.COMPASS, 1000));//20 + _baseLoot.addLoot(new RandomItem(Material.COMPASS, 20)); _baseLoot.addLoot(new RandomItem(Material.STICK, 30, 1, 2)); _baseLoot.addLoot(new RandomItem(Material.BOAT, 15)); _baseLoot.addLoot(new RandomItem(Material.FLINT, 30, 1, 2)); From 48ae23ebffa9b9cc0d4160dbf1d4af59ab5709f1 Mon Sep 17 00:00:00 2001 From: fooify Date: Mon, 30 Nov 2015 19:58:41 -0800 Subject: [PATCH 033/223] changed reference to premium ranks --- .../Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java index 8208dcba5..83940a3bb 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java @@ -108,7 +108,7 @@ public class ServerNpcPage extends ShopPageInventory Date: Tue, 1 Dec 2015 16:23:07 -0800 Subject: [PATCH 034/223] fixed naming pets non-alphanumeric characters --- .../mineplex/core/cosmetic/ui/page/PetTagPage.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java index 84da7d074..2846f791e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java @@ -64,7 +64,16 @@ public class PetTagPage extends ShopPageBase { _tagName = ChatColor.stripColor(_tagName); _tagName = _tagName.replaceAll("[^A-Za-z0-9]", ""); - + System.out.println("Pet name: " + _tagName + "."); + if (_tagName.length() == 0) + { + UtilPlayer.message(getPlayer(), F.main(getPlugin().getName(), ChatColor.RED + "Supplied pet name contains invalid characters.")); + playDenySound(getPlayer()); + + getShop().openPageForPlayer(getPlayer(), new PetPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Pets", getPlayer())); + return; + } + if (_tagName.length() > 16) { UtilPlayer.message(getPlayer(), F.main(getPlugin().getName(), ChatColor.RED + "Pet name cannot be longer than 16 characters.")); From b04f139883e84633c381fe163f76033f3593eb4c Mon Sep 17 00:00:00 2001 From: fooify Date: Tue, 1 Dec 2015 19:26:52 -0800 Subject: [PATCH 035/223] Fixed advertisement being able to be bypassed by spec and instant join --- .../mineplex/hub/server/ui/ServerNpcPage.java | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java index 83940a3bb..5bc9aa8fa 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerNpcPage.java @@ -15,7 +15,9 @@ import org.bukkit.inventory.meta.SkullMeta; import mineplex.core.account.CoreClientManager; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.F; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.donation.DonationManager; import mineplex.core.game.GameDisplay; @@ -78,17 +80,8 @@ public class ServerNpcPage extends ShopPageInventory 64 ? 64 : yellowCount, false), new IButton() - { - @Override - public void onClick(Player player, ClickType clickType) + if(showGreen) { + addButton(40, new ShopItem(Material.GOLD_BLOCK, C.cAqua + yellowCount + " Game" + (yellowCount == 1 ? "" : "s") + " In Progress", new String[]{MESSAGE_SPECTATE}, yellowCount > 64 ? 64 : yellowCount, false), new IButton() { - _onMainPage = false; - } - }); - + @Override + public void onClick(Player player, ClickType clickType) + { + _onMainPage = false; + } + }); + + addButton(4, ItemStackFactory.Instance.CreateStack(Material.DIAMOND_BLOCK, (byte) 0, 1, C.cGreen + "Click to join instantly!"), new IButton() { + + @Override + public void onClick(Player player, ClickType clickType) { + getPlugin().selectServer(player, _serverGroupName); + } + }); + } + // Clear empty slots if (showGreen) { From 27f335779abb3399504d5ba006ae232ef2db9d96 Mon Sep 17 00:00:00 2001 From: Sarah Date: Wed, 2 Dec 2015 19:39:44 +0100 Subject: [PATCH 036/223] adding tutorial sounds and flag for it. --- .../arcade/gametutorial/GameTutorial.java | 1 + .../arcade/gametutorial/TutorialPhase.java | 6 +++++ .../arcade/gametutorial/TutorialText.java | 23 +++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 7809a561e..151cbf02f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -32,6 +32,7 @@ public abstract class GameTutorial public boolean SetTutorialPositions = true; public boolean TeleportOnEnd = true; public boolean RunTasksSync = true; + public boolean PlayTutorialSounds = false; public long TimeBetweenPhase = 0; public long StartAfterTutorial = 5000; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 978a75928..f6858e2d2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -4,6 +4,7 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilTextMiddle; import org.bukkit.Location; +import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -121,6 +122,11 @@ public abstract class TutorialPhase int i = 0; for(Player player : _tutorial.getPlayers().keySet()) { + if(_tutorial.PlayTutorialSounds) + { + if(text.getSound() != null) + player.playSound(player.getLocation(), text.getSound(), 2f, 2f); + } players[i] = player; i++; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java index 9abdf6c9b..dba1d39a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -1,5 +1,7 @@ package nautilus.game.arcade.gametutorial; +import org.bukkit.Sound; + public class TutorialText { @@ -7,17 +9,29 @@ public class TutorialText private String _text; private int _stayTime; private int _id; + private Sound _sound; - public TutorialText(String text, int stayTime, int id) + public TutorialText(String text, int stayTime, int id, Sound sound) { _text = text; _id = id; _stayTime = stayTime; + _sound = sound; } public TutorialText(String text, int id) { - this(text, (int) (Math.round(1.5 * text.length()) + 25), id); + this(text, (int) (Math.round(1.5 * text.length()) + 25), id, Sound.NOTE_PLING); + } + + public TutorialText(String text, int id, Sound sound) + { + this(text, (int) (Math.round(1.5 * text.length()) + 25), id, sound); + } + + public TutorialText(String text, int stayTime, int id) + { + this(text, stayTime, id, Sound.NOTE_PLING); } public String getText() @@ -30,6 +44,11 @@ public class TutorialText return _id; } + public Sound getSound() + { + return _sound; + } + public int getStayTime() { return _stayTime; From 584a02ae3e5b80414e6be18a72de5440e829100d Mon Sep 17 00:00:00 2001 From: NewGarbo Date: Thu, 3 Dec 2015 10:30:06 +0000 Subject: [PATCH 037/223] fixed infinite claims --- .../mineplex/core/common/util/UtilText.java | 25 +++++++++++++ .../game/clans/clans/ClansUtility.java | 20 +++++----- .../game/clans/tutorials/Tutorial.java | 1 + .../game/clans/tutorials/TutorialClient.java | 2 + .../game/clans/tutorials/TutorialTask.java | 37 +++++++++++++++++++ .../tutorials/gettingstarted/TaskClaim.java | 2 +- .../gettingstarted/TaskEquipClass.java | 6 +++ .../gettingstarted/TaskMakingMoney.java | 4 +- 8 files changed, 84 insertions(+), 13 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index 8bbac15bc..771b1ec52 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -110,4 +110,29 @@ public class UtilText { return s.length() <= maxLength ? s : s.substring(0, maxLength); } + public static String arrayToString(X[] array, String delimiter) + { + StringBuilder string = new StringBuilder(); + + int index = 0; + for (X x : array) + { + string.append(x.toString()); + + if (index != array.length - 1) + { + string.append(delimiter); + } + + index++; + } + + return string.toString(); + } + + public static String arrayToString(X[] array) + { + return arrayToString(array, null); + } + } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java index c30741532..dd2378752 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java @@ -717,11 +717,11 @@ public class ClansUtility return false; } -// if (clan.getEnergy() == 0) -// { -// Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You must purchase energy at a shop before you can claim land.")); -// return false; -// } + if (clan.getEnergy() == 0) + { + Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You must purchase energy at a shop before you can claim land.")); + return false; + } String chunk = UtilWorld.chunkToStr(caller.getLocation().getChunk()); ClanInfo ownerClan = getOwner(caller.getLocation()); @@ -740,11 +740,11 @@ public class ClansUtility } } -// if (clan.getClaims() >= clan.getClaimsMax()) -// { -// Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "Your Clan cannot claim more Territory.")); -// return false; -// } + if (clan.getClaims() >= clan.getClaimsMax()) + { + Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "Your Clan cannot claim more Territory.")); + return false; + } // Adjacent boolean selfAdj = false; diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java index 166dbc6e8..08870a246 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java @@ -197,6 +197,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void run() { get(player).CurrentTask.startFor(player); + get(player).CurrentTaskStartTime = System.currentTimeMillis(); } }, 30L); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java index 043647117..383a09700 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java @@ -11,12 +11,14 @@ public class TutorialClient public long LastDescriptionSentTime = System.currentTimeMillis() - 3000; public boolean InClanOnStart; public boolean QueuedFinish; + public long CurrentTaskStartTime; public TutorialClient(Player player, Tutorial tutorial) { Player = player; CurrentTask = tutorial._tasks.get(1); + CurrentTaskStartTime = System.currentTimeMillis(); InClanOnStart = tutorial._clansManager.isInClan(player); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java index 0934fff08..cc6addbda 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java @@ -1,13 +1,20 @@ package mineplex.game.clans.tutorials; +import java.util.Iterator; + +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import mineplex.core.common.util.C; import mineplex.core.common.util.NautArrayList; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClansManager; public class TutorialTask implements Listener @@ -22,6 +29,8 @@ public class TutorialTask implements Listener protected String _description; protected String _finishMessage; + protected String[] _subtasks; + protected Location _taskPos; // How much time after the beginning the task/last teleport it should take to teleport back to _taskPos. @@ -92,6 +101,34 @@ public class TutorialTask implements Listener } } + @EventHandler + public void displaySubtasks(UpdateEvent event) + { + if (!event.getType().equals(UpdateType.SEC)) + { + return; + } + + if (_subtasks == null || _subtasks.length == 0) + { + return; + } + + Iterator iterator = _inTask.iterator(); + while (iterator.hasNext()) + { + Player player = Bukkit.getPlayer(iterator.next()); + + if ((System.currentTimeMillis() - _tutorial.get(player).CurrentTaskStartTime) >= 15000) + { + if (isDoing(player)) + { + UtilTextMiddle.display("", UtilText.arrayToString(_subtasks, "\n"), 1, 25, 25); + } + } + } + } + public boolean isDoing(Player player) { return _inTask != null && player != null && _inTask.contains(player.getName()); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java index a3c936754..23edfed24 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java @@ -21,7 +21,7 @@ public class TaskClaim extends TutorialTask + "Once claimed, only your Clan can break/place blocks here. " + "This is the perfect place to build a base and stash your items! " + "You can only claim in the Wilderness, and not next to other Clan's Territory. " - + "To claim some territory, go into the Clans GUI by typing {/c} and {Left-Clicking}"; + + "To claim some territory, go into the Clans GUI by typing {/c} and {Left-Clicking} the Territory button. (Looks like a flag)"; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java index 01584fd32..0dee17131 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java @@ -29,6 +29,12 @@ public class TaskEquipClass extends TutorialTask + "Purchase Iron Armor from the PvP Shop. " + "Then put on your armor to equip the Knight Class."; + _subtasks = new String[] { + "Open the PvP Shop", + "Buy Iron Armor Set", + "Equip Iron Armor" + }; + _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java index 3aefb2ab7..e7a8fff57 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java @@ -34,7 +34,7 @@ public class TaskMakingMoney extends TutorialTask @Override public void customStartFor(Player player) { - player.getInventory().addItem(new ItemStack(Material.CARROT, 1)); + player.getInventory().addItem(new ItemStack(Material.CARROT_ITEM, 1)); } @EventHandler @@ -45,7 +45,7 @@ public class TaskMakingMoney extends TutorialTask return; } - if (!event.getItem().getType().equals(Material.CARROT)) + if (!event.getItem().getType().equals(Material.CARROT_ITEM)) { return; } From 19254fc4a02a5947038e458933676a57d595df45 Mon Sep 17 00:00:00 2001 From: Sarah Date: Thu, 3 Dec 2015 18:06:27 +0100 Subject: [PATCH 038/223] Prepare Timer flag. --- .../game/arcade/gametutorial/GameTutorial.java | 1 + .../nautilus/game/arcade/managers/GameManager.java | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 151cbf02f..2583a1f65 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -33,6 +33,7 @@ public abstract class GameTutorial public boolean TeleportOnEnd = true; public boolean RunTasksSync = true; public boolean PlayTutorialSounds = false; + public boolean ShowPrepareTimer = false; public long TimeBetweenPhase = 0; public long StartAfterTutorial = 5000; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 43759a930..9c60cc850 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -122,7 +122,7 @@ public class GameManager implements Listener } } - public boolean isInTutorial() + public boolean isInTutorial(boolean checkForTimer) { if (Manager.GetGame() == null || Manager.GetGame().GetState() != GameState.Prepare) return false; @@ -160,6 +160,13 @@ public class GameManager implements Listener { finished = false; } + if(checkForTimer) + { + if(team.getTutorial().ShowPrepareTimer) + finished = false; + else + finished = true; + } } } if(!finished) @@ -179,7 +186,7 @@ public class GameManager implements Listener Game game = Manager.GetGame(); - if(isInTutorial()) + if(isInTutorial(true)) return; double percentage = (double) (System.currentTimeMillis() - game.GetStateTime()) / game.PrepareTime; @@ -264,7 +271,7 @@ public class GameManager implements Listener } else if (game.GetState() == GameState.Prepare) { - if(isInTutorial()) + if(isInTutorial(false)) return; if (game.CanStartPrepareCountdown()) From 39daf969fd213d93fe8d32575c962f99bd5c42cf Mon Sep 17 00:00:00 2001 From: NewGarbo Date: Thu, 3 Dec 2015 22:29:36 +0000 Subject: [PATCH 039/223] clan claim visualizer --- .../clans/clans/ClansDataAccessLayer.java | 22 +- .../game/clans/clans/ClansManager.java | 7 +- .../game/clans/clans/ClansUtility.java | 2 +- .../clans/claimview/ClaimVisualizer.java | 328 ++++++++++++++++++ .../clans/claimview/VisualizedChunkData.java | 48 +++ .../commands/ClaimVisualizeCommand.java | 22 ++ .../clans/commands/ClanManagementCommand.java | 1 - .../clans/commands/RestartTutCommand.java | 3 +- .../clans/clans/event/ClanLeaveEvent.java | 56 +++ .../event/PlayerUnClaimTerritoryEvent.java | 11 +- .../game/clans/tutorials/TutorialTask.java | 3 +- .../gettingstarted/TaskMakingMoney.java | 5 - 12 files changed, 495 insertions(+), 13 deletions(-) create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java index 7cfea3b08..eea8309b6 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java @@ -17,13 +17,15 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilWorld; import mineplex.game.clans.clans.event.ClanCreatedEvent; import mineplex.game.clans.clans.event.ClanDeleteEvent; +import mineplex.game.clans.clans.event.ClanJoinEvent; +import mineplex.game.clans.clans.event.ClanLeaveEvent; import mineplex.game.clans.clans.event.ClanSetHomeEvent; import mineplex.game.clans.clans.scoreboard.ClansScoreboardManager; import mineplex.game.clans.clans.tntGenerator.TntGenerator; -import mineplex.game.clans.core.war.ClanWarData; import mineplex.game.clans.core.repository.ClanRepository; import mineplex.game.clans.core.repository.ClanTerritory; import mineplex.game.clans.core.repository.tokens.ClanToken; +import mineplex.game.clans.core.war.ClanWarData; public class ClansDataAccessLayer { @@ -201,6 +203,15 @@ public class ClansDataAccessLayer public void join(final ClanInfo clan, final Player player, final ClanRole role, final Callback callback) { + ClanJoinEvent event = new ClanJoinEvent(clan, player); + + UtilServer.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + runAsync(new Runnable() { @Override @@ -259,6 +270,15 @@ public class ClansDataAccessLayer { if (clan == null) return; + ClanLeaveEvent event = new ClanLeaveEvent(clan, clansPlayer); + + UtilServer.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + runAsync(new Runnable() { @Override diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java index aa8efa0bb..8b09f8db2 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java @@ -66,6 +66,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClanTips.TipType; import mineplex.game.clans.clans.ClansUtility.ClanRelation; +import mineplex.game.clans.clans.claimview.ClaimVisualizer; import mineplex.game.clans.clans.commands.ClanManagementCommand; import mineplex.game.clans.clans.commands.ClansAllyChatCommand; import mineplex.game.clans.clans.commands.ClansChatCommand; @@ -304,6 +305,8 @@ public class ClansManager extends MiniClientPluginimplements IRelati loadClan(token); } + new ClaimVisualizer(plugin, this); + // RedisDataRepository(ConnectionData writeConn, ConnectionData // readConn, Region region, Class elementType, String elementLabel) // Initialize default region factions and territory @@ -672,7 +675,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati if (clan == null) { event.setFormat(rank + C.cYellow + "%1$s " + C.cWhite + "%2$s"); - System.out.println(_clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : " ") + event.getMessage()); + System.out.println(_clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + event.getMessage()); return; } @@ -692,7 +695,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati String message = event.getMessage(); message = _chat.getFilteredMessage(event.getPlayer(), message); ClanRelation rel = _clanUtility.rel(clan, otherClan); - String formatted = rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : " ") + C.cWhite + message; + String formatted = rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + C.cWhite + message; other.sendMessage(formatted); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java index dd2378752..c27bcf57a 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java @@ -1084,7 +1084,7 @@ public class ClansUtility } // Event - PlayerUnClaimTerritoryEvent event = new PlayerUnClaimTerritoryEvent(caller, caller.getLocation().getChunk()); + PlayerUnClaimTerritoryEvent event = new PlayerUnClaimTerritoryEvent(caller, caller.getLocation().getChunk(), ownerClan); UtilServer.getServer().getPluginManager().callEvent(event); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java new file mode 100644 index 000000000..d0bb23eaa --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java @@ -0,0 +1,328 @@ +package mineplex.game.clans.clans.claimview; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.Vector; + +import mineplex.core.MiniPlugin; +import mineplex.core.common.util.F; +import mineplex.core.common.util.NautHashMap; +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.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilWorld; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.game.clans.clans.ClanInfo; +import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.clans.claimview.commands.ClaimVisualizeCommand; +import mineplex.game.clans.clans.event.ClanDisbandedEvent; +import mineplex.game.clans.clans.event.ClanLeaveEvent; +import mineplex.game.clans.clans.event.PlayerClaimTerritoryEvent; +import mineplex.game.clans.clans.event.PlayerUnClaimTerritoryEvent; +import net.minecraft.server.v1_8_R3.EnumDirection; + +public class ClaimVisualizer extends MiniPlugin +{ + private ClansManager _clansManager; + + private List _visualizing; + + private NautHashMap> _calculated; + + public ClaimVisualizer(JavaPlugin plugin, ClansManager clansManager) + { + super("Claim Visualizer", plugin); + + _clansManager = clansManager; + _visualizing = new ArrayList<>(); + _calculated = new NautHashMap<>(); + + for (ClanInfo clan : _clansManager.getClanMap().values()) + { + _calculated.put(clan, new NautHashMap()); + } + } + + @Override + public void addCommands() + { + addCommand(new ClaimVisualizeCommand(this)); + } + + + @EventHandler + public void cleanup(UpdateEvent event) + { + if (event.getType() != UpdateType.SLOWER) + { + return; + } + } + + @EventHandler + public void runVisualization(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + { + return; + } + + for (String name : _visualizing) + { + Player player = Bukkit.getPlayer(name); + + if (player != null && _clansManager.isInClan(player)) + { + visualize(player); + } + } + } + + private void visualize(Player player) + { + for (String serialized : _clansManager.getClan(player).getClaimSet()) + { + if (!_calculated.get(_clansManager.getClan(player)).containsKey(serialized)) + { + calculate(_clansManager.getClan(player), serialized); + } + } + + draw(player, _calculated.get(_clansManager.getClan(player)).values()); + } + + private void draw(Player player, Collection chunks) + { + for (VisualizedChunkData chunk : chunks) + { + if (!chunk.getChunk().getWorld().equals(player.getWorld())) + { + // return not break because a clan can't have claims in different worlds. + return; + } + + if (UtilMath.offset2d(chunk.getChunk().getBlock(0, 0, 0).getLocation(), player.getLocation()) > 36) + { + break; + } + + for (int x = 0; x < 16; x++) + { + for (int z = 0; z < 16; z++) + { + if (z == 0 || z == 15 || x == 0 || x == 15) + { + if (!chunk.shouldDisplay(x, z)) + { + continue; + } + + Block block = chunk.getChunk().getBlock(x, 0, z); + + UtilParticle.PlayParticle(ParticleType.HAPPY_VILLAGER, + new Location( + chunk.getChunk().getWorld(), + block.getX() + .5, + Math.max(UtilBlock.getHighest(player.getWorld(), block.getX(), block.getZ()).getY(), player.getLocation().getY()) + .5, + block.getZ() + .5), + new Vector(0f, 0f, 0f), 0f, 1, ViewDist.NORMAL, player); + } + } + } + } + } + + private void calculate(ClanInfo clan, String serialized) + { + Chunk chunk = UtilWorld.strToChunk(serialized); + + List dirs = new ArrayList<>(); + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX(), chunk.getZ() - 1)))) + { + dirs.add(EnumDirection.NORTH); + } + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX() + 1, chunk.getZ())))) + { + dirs.add(EnumDirection.EAST); + } + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX(), chunk.getZ() + 1)))) + { + dirs.add(EnumDirection.SOUTH); + } + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX() - 1, chunk.getZ())))) + { + dirs.add(EnumDirection.WEST); + } + + VisualizedChunkData cached = new VisualizedChunkData(chunk, dirs); + + _calculated.get(clan).put(serialized, cached); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) + { + if (isVisualizing(event.getPlayer())) + { + disableVisualizer(event.getPlayer()); + } + } + + @EventHandler + public void onKick(PlayerKickEvent event) + { + if (isVisualizing(event.getPlayer())) + { + disableVisualizer(event.getPlayer()); + } + } + + @EventHandler + public void onLeave(ClanLeaveEvent event) + { + if (isVisualizing(event.getPlayer().getPlayerName())) + { + disableVisualizer(event.getPlayer().getPlayerName()); + } + } + + @EventHandler + public void onClanDisband(ClanDisbandedEvent event) + { + for (Player player : event.getClan().getOnlinePlayers()) + { + if (isVisualizing(player)) + { + disableVisualizer(player); + } + } + } + + @EventHandler + public void onUnclaim(PlayerUnClaimTerritoryEvent event) + { + _calculated.clear(); + + for (String serialized : event.getClan().getClaimSet()) + { + calculate(event.getClan(), serialized); + } + + if (event.getClan().getClaimCount() == 1) + { + for (Player player : event.getClan().getOnlinePlayers()) + { + if (isVisualizing(player)) + { + disableVisualizer(player); + } + } + } + } + + @EventHandler + public void onClaim(PlayerClaimTerritoryEvent event) + { + _calculated.clear(); + + for (String serialized : event.getClan().getClaimSet()) + { + calculate(event.getClan(), serialized); + } + } + + public boolean isVisualizing(Player player) + { + return _visualizing.contains(player.getName()); + } + + public boolean isVisualizing(String name) + { + return _visualizing.contains(name); + } + + public void enableVisualizer(String name) + { + enableVisualizer(UtilServer.getServer().getPlayer(name)); + } + + public void disableVisualizer(String name) + { + disableVisualizer(UtilServer.getServer().getPlayer(name)); + } + + public void toggleVisualizer(Player player) + { + if (_visualizing.contains(player.getName())) + { + disableVisualizer(player); + } + else + { + enableVisualizer(player); + } + } + + public void enableVisualizer(Player player) + { + if (player == null) + { + return; + } + + if (!_clansManager.isInClan(player)) + { + UtilPlayer.message(player, F.main("Clans", "You must be in a clan to visualize claims.")); + return; + } + + ClanInfo clan = _clansManager.getClan(player); + + if (clan.getClaimCount() == 0) + { + UtilPlayer.message(player, F.main("Clans", "Your Clan does not have any claims!")); + return; + } + + _visualizing.add(player.getName()); + UtilPlayer.message(player, F.main("Clans", "You are now visualizing your claims.")); + } + + public void disableVisualizer(Player player) + { + if (player == null) + { + return; + } + + if (!_visualizing.contains(player.getName())) + { + UtilPlayer.message(player, F.main("Clans", "You are anot visualizing your claims.")); + return; + } + + _visualizing.remove(player.getName()); + UtilPlayer.message(player, F.main("Clans", "You are no longer visualizing your claims.")); + } + +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java new file mode 100644 index 000000000..12bdb8962 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java @@ -0,0 +1,48 @@ +package mineplex.game.clans.clans.claimview; + +import java.util.List; + +import org.bukkit.Chunk; + +import net.minecraft.server.v1_8_R3.EnumDirection; + +public class VisualizedChunkData +{ + private List _displayable; + private Chunk _chunk; + + public VisualizedChunkData(Chunk chunk, List dir) + { + _chunk = chunk; + _displayable = dir; + } + + public boolean shouldDisplay(int x, int z) + { + if (z == 15 && !_displayable.contains(EnumDirection.SOUTH)) + { + return false; + } + + if (x == 15 && !_displayable.contains(EnumDirection.EAST)) + { + return false; + } + + if (x == 0 && !_displayable.contains(EnumDirection.WEST)) + { + return false; + } + + if (z == 0 && !_displayable.contains(EnumDirection.NORTH)) + { + return false; + } + + return true; + } + + public Chunk getChunk() { + return _chunk; + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java new file mode 100644 index 000000000..dcfa074c9 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java @@ -0,0 +1,22 @@ +package mineplex.game.clans.clans.claimview.commands; + +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.game.clans.clans.claimview.ClaimVisualizer; + +public class ClaimVisualizeCommand extends CommandBase +{ + public ClaimVisualizeCommand(ClaimVisualizer plugin) + { + super(plugin, Rank.ALL, "showclaims"); + } + + @Override + public void Execute(Player caller, String[] args) + { + Plugin.toggleVisualizer(caller); + } + +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java index 546c63774..cda7ab480 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java @@ -38,7 +38,6 @@ import mineplex.game.clans.items.legendaries.WindBlade; public class ClanManagementCommand extends CommandBase { - private ClansManager _clansManager; public ClanManagementCommand(ClansManager plugin) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java index be19befc8..7874915cb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import mineplex.core.command.CommandBase; import mineplex.core.common.Rank; +import mineplex.core.common.util.F; import mineplex.core.task.TaskManager; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.tutorials.Tutorial; @@ -43,7 +44,7 @@ public class RestartTutCommand extends CommandBase } else { - TutorialManager.Instance.sendTutorialMsg(caller, "You must be in a safezone to restart the tutorial."); + TutorialManager.Instance.sendTutorialMsg(caller, F.main("Clans", "You must be in a safezone to restart the tutorial.")); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java new file mode 100644 index 000000000..3c5f6156d --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java @@ -0,0 +1,56 @@ +package mineplex.game.clans.clans.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import mineplex.game.clans.clans.ClanInfo; +import mineplex.game.clans.clans.ClansPlayer; + +public class ClanLeaveEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + + private ClansPlayer _player; + + private ClanInfo _clan; + + private boolean _cancelled; + + public ClanLeaveEvent(ClanInfo clan, ClansPlayer clansPlayer) + { + _player = clansPlayer; + + _clan = clan; + } + + public ClansPlayer getPlayer() + { + return _player; + } + + public ClanInfo getClan() + { + return _clan; + } + + public void setCancelled(boolean cancelled) + { + _cancelled = cancelled; + } + + public boolean isCancelled() + { + return _cancelled; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java index 41ef2e8b1..8d83363d6 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java @@ -5,19 +5,23 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import mineplex.game.clans.clans.ClanInfo; + public class PlayerUnClaimTerritoryEvent extends Event { private static final HandlerList handlers = new HandlerList(); private Player _unClaimer; private Chunk _unClaimedChunk; + private ClanInfo _clan; private boolean _cancelled; - public PlayerUnClaimTerritoryEvent(Player unClaimer, Chunk unClaimedChunk) + public PlayerUnClaimTerritoryEvent(Player unClaimer, Chunk unClaimedChunk, ClanInfo clan) { _unClaimer = unClaimer; _unClaimedChunk = unClaimedChunk; + _clan = clan; } public Player getUnClaimer() @@ -35,6 +39,11 @@ public class PlayerUnClaimTerritoryEvent extends Event _cancelled = cancelled; } + public ClanInfo getClan() + { + return _clan; + } + public boolean isCancelled() { return _cancelled; diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java index cc6addbda..7714a0104 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java @@ -101,7 +101,8 @@ public class TutorialTask implements Listener } } - @EventHandler + //@EventHandler + //todo: fix the multiline subtitles public void displaySubtasks(UpdateEvent event) { if (!event.getType().equals(UpdateType.SEC)) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java index e7a8fff57..db12bda02 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java @@ -61,11 +61,6 @@ public class TaskMakingMoney extends TutorialTask return; } - if (!ClansManager.getInstance().isInClan(event.getPlayer())) - { - return; - } - if (!event.getItem().getType().equals(Material.CARROT_ITEM)) { return; From 91aaf5f2fbe9c7918202df386c6a2d2dab68860c Mon Sep 17 00:00:00 2001 From: fooify Date: Thu, 3 Dec 2015 16:45:30 -0800 Subject: [PATCH 040/223] world's smallest bugfix - admin->co-host --- .../src/nautilus/game/arcade/managers/GameHostManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java index e5be1cdbc..50a838155 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java @@ -396,7 +396,7 @@ public class GameHostManager implements Listener if (!isAdmin(event.getPlayer(), true)) { - event.getPlayer().sendMessage(F.main("Broadcast", "Only MPS admins can use this command.")); + event.getPlayer().sendMessage(F.main("Broadcast", "Only Co-Hosts can use this command.")); event.setCancelled(true); return; } From b1bd2ff5ac824594d724e449c88eaf0a052cd02c Mon Sep 17 00:00:00 2001 From: fooify Date: Thu, 3 Dec 2015 16:50:27 -0800 Subject: [PATCH 041/223] Gravity's icon changed to ENDER_PORTAL_FRAME --- Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index c1603431f..c2cb60272 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -22,7 +22,7 @@ public enum GameDisplay DragonsTeams("Dragons Teams", Material.ENDER_STONE, (byte)0, GameCategory.TEAM_VARIANT, 14), Draw("Draw My Thing", Material.BOOK_AND_QUILL, (byte)0, GameCategory.CLASSICS, 15), Evolution("Evolution", Material.EMERALD, (byte)0, GameCategory.ARCADE, 16), - Gravity("Gravity", Material.ENDER_PORTAL, (byte)0, GameCategory.EXTRA, 18), + Gravity("Gravity", Material.ENDER_PORTAL_FRAME, (byte)0, GameCategory.EXTRA, 18), Halloween("Halloween Horror", Material.PUMPKIN, (byte)0, GameCategory.CLASSICS, 19), HideSeek("Block Hunt", Material.GRASS, (byte)0, GameCategory.CLASSICS, 20), HoleInTheWall("Hole in the Wall", Material.STAINED_GLASS, (byte) 2, GameCategory.ARCADE, 52), From 5c575b41fc8a665592b8ce46bed5205286c2978e Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Fri, 4 Dec 2015 05:15:28 -0500 Subject: [PATCH 042/223] Clans alpha 0.17 --- .../core/portal/Commands/ServerCommand.java | 13 --- .../core/scoreboard/PlayerScoreboard.java | 4 + .../src/mineplex/game/clans/Clans.java | 2 +- .../game/clans/clans/ClansManager.java | 4 +- .../clans/clans/commands/ClansCommand.java | 6 + .../clans/commands/RestartTutCommand.java | 10 +- .../scoreboard/ClansScoreboardManager.java | 12 +- .../elements/ScoreboardElementClan.java | 3 +- .../elements/ScoreboardElementPlayer.java | 3 +- .../ScoreboardElementPlayerCount.java | 2 +- .../game/clans/clans/war/WarManager.java | 31 ++++-- .../game/clans/tutorials/Tutorial.java | 105 +++++++++++++----- .../game/clans/tutorials/TutorialClient.java | 6 +- .../game/clans/tutorials/TutorialManager.java | 15 ++- .../game/clans/tutorials/TutorialTask.java | 41 ++++--- .../gettingstarted/TaskCustomizeClass.java | 7 ++ .../gettingstarted/TaskDisbandClan.java | 14 +-- .../gettingstarted/TaskEquipClass.java | 5 + .../gettingstarted/TaskExploreShops.java | 10 +- .../gettingstarted/TaskLeaveSpawn.java | 12 +- .../gettingstarted/TaskMakingMoney.java | 2 + .../gettingstarted/TaskUseAbility.java | 29 ++++- .../gettingstarted/TaskViewClanDetails.java | 2 +- .../TutorialGettingStarted.java | 14 ++- 24 files changed, 244 insertions(+), 108 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java index b4ac74e62..ef2a4da64 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java @@ -84,19 +84,6 @@ public class ServerCommand extends CommandBase else deniedAccess = true; } - else if (servUp.contains("CLANS-")) - { - if (playerRank.has(Rank.MODERATOR)) - { - Plugin.sendPlayerToServer(player, args[0]); - } - else - { - UtilPlayer.message(player, - F.main(Plugin.getName(), C.cRed + "You must join clans through the hub! Join " + C.cGold + "ClansHub-1" - + C.cRed + "!")); - } - } else { Plugin.sendPlayerToServer(player, args[0]); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/scoreboard/PlayerScoreboard.java b/Plugins/Mineplex.Core/src/mineplex/core/scoreboard/PlayerScoreboard.java index ef8e05796..33fd0a308 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/scoreboard/PlayerScoreboard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/scoreboard/PlayerScoreboard.java @@ -106,6 +106,10 @@ public class PlayerScoreboard continue; } + // Ignore extra lines + if (i >= _teamNames.length) + continue; + //Update Team team = _scoreboard.getTeam(_teamNames[i]); if (team == null) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java index 0e35252e8..214707cd7 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -49,7 +49,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer; public class Clans extends JavaPlugin { - public static final String VERSION = "0.16"; + public static final String VERSION = "0.17"; private String WEB_CONFIG = "webServer"; // Modules diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java index aa8efa0bb..7827abaea 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java @@ -672,7 +672,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati if (clan == null) { event.setFormat(rank + C.cYellow + "%1$s " + C.cWhite + "%2$s"); - System.out.println(_clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : " ") + event.getMessage()); + System.out.println(_clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : "") + event.getMessage()); return; } @@ -692,7 +692,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati String message = event.getMessage(); message = _chat.getFilteredMessage(event.getPlayer(), message); ClanRelation rel = _clanUtility.rel(clan, otherClan); - String formatted = rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : " ") + C.cWhite + message; + String formatted = rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : "") + C.cWhite + message; other.sendMessage(formatted); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java index b956eedfe..f9bab36a5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java @@ -1,5 +1,6 @@ package mineplex.game.clans.clans.commands; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; @@ -24,6 +25,7 @@ import mineplex.game.clans.clans.ClanTips.TipType; import mineplex.game.clans.clans.ClansBlacklist; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.ClientClan; +import mineplex.game.clans.clans.event.ClanJoinEvent; import mineplex.game.clans.clans.event.ClansCommandExecutedEvent; import mineplex.game.clans.tutorials.Tutorial; import mineplex.game.clans.tutorials.TutorialManager; @@ -382,6 +384,10 @@ public class ClansCommand extends CommandBase _manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "The clan " + F.elem("Clan " + clan.getName()) + " is full and cannot be joined!")); return; } + + ClanJoinEvent event = new ClanJoinEvent(clan, caller); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; // Task Plugin.getClanDataAccess().join(clan, caller, ClanRole.RECRUIT, new Callback() diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java index be19befc8..d0983745c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java @@ -6,6 +6,8 @@ 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.task.TaskManager; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.tutorials.Tutorial; @@ -22,6 +24,12 @@ public class RestartTutCommand extends CommandBase @Override public void Execute(Player caller, String[] args) { + if (ClansManager.getInstance().getClan(caller) != null) + { + UtilPlayer.message(caller, F.main("Tutorial", "You cannot restart the tutorial while in a clan")); + return; + } + if (ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null && ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).isSafe(caller.getLocation())) { @@ -43,7 +51,7 @@ public class RestartTutCommand extends CommandBase } else { - TutorialManager.Instance.sendTutorialMsg(caller, "You must be in a safezone to restart the tutorial."); + TutorialManager.Instance.sendTutorialMsg(caller, "You must be in a Safe Zone to restart the tutorial."); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java index dcefd85aa..c337f063f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java @@ -42,19 +42,17 @@ public class ClansScoreboardManager extends ScoreboardManager private void init(TutorialManager tutorialManager) { - setTitle(" MINEPLEX CLANS "); + setTitle("Clans Alpha " + Clans.VERSION); ScoreboardData data = getData("default", true); - data.write(C.cGreen + "Clans Alpha " + Clans.VERSION); - data.writeEmpty(); data.writeElement(new ScoreboardElementClan(_clansManager)); data.writeElement(new ScoreboardElementPlayer(_clansManager)); - data.writeElement(new ScoreboardElementPlayerCount(_clansManager)); - - data.writeElement(_worldEvent); +// data.writeElement(new ScoreboardElementPlayerCount(_clansManager)); + data.writeElement(_warManager); - + data.writeElement(_worldEvent); + for (Tutorial tutorial : tutorialManager.getTutorials().values()) { data.writeElement(tutorial); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java index d27d2c34b..5252cb23d 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java @@ -35,8 +35,7 @@ public class ScoreboardElementClan implements ScoreboardElement // Energy if (clanInfo.getEnergyCostPerMinute() > 0) - output.add(C.cYellow + "Energy " + C.cWhite + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT)); - output.add(C.cYellow + "Home " + C.cWhite + clanInfo.getBedStatusStr()); + output.add(C.cYellow + "Energy " + C.cWhite + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT)); } else { diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java index 36d4ac271..d0d710721 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java @@ -27,10 +27,9 @@ public class ScoreboardElementPlayer implements ScoreboardElement { List output = new ArrayList(); output.add(C.cYellow + "Gold " + C.cWhite + manager.getDonation().Get(player).GetBalance(CurrencyType.Gold) + ""); - output.add(""); - String regionString = C.xWilderness + "Wilderness"; + output.add(" "); ClanTerritory claim = _clansManager.getClanUtility().getClaim(player.getLocation()); if (claim != null) { diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java index be56178a3..0c6fb35d5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java @@ -29,7 +29,7 @@ public class ScoreboardElementPlayerCount implements ScoreboardElement List output = new ArrayList(); output.add(""); - output.add(C.cYellow + "Players Online " + UtilServer.getPlayers().length + "/100"); + output.add(C.cYellow + "Players " + C.cWhite + UtilServer.getPlayers().length + "/100"); return output; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java index cc017df55..166693db2 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java @@ -97,7 +97,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement { for (WarInvasion invasion : invasions) { - if (invasion.getInvaderClan().equals(playerClan)) + if (invasion.getInvaderClan().equals(playerClan.getName())) return true; } } @@ -125,15 +125,24 @@ public class WarManager extends MiniPlugin implements ScoreboardElement final ClanInfo killerClan = event.getKiller().getClan(); ClanWarData war = clan.getWarData(killerClan); - if (war != null && !war.isOnCooldown()) + if (war != null) { + if (war.isOnCooldown()) + { + // Ignore! + return; + } + + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); + // War already exists + war.increment(killerClan.getName()); ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan); _clansManager.messageClan(killerClan, F.main("Clans", "Your clan gained 1 War Point against " + rel.getColor(false) + clan.getName() + " " + C.Reset + "(" + killerClan.getFormattedWarPoints(clan) + C.Reset + ")")); _clansManager.messageClan(clan, F.main("Clans", "Your clan lost 1 War Point against " + rel.getColor(false) + killerClan.getName() + " " + C.Reset + "(" + clan.getFormattedWarPoints(killerClan) + C.Reset + ")")); - war.increment(killerClan.getName()); checkWarComplete(war); ClanInfo clanA = clan.getName().equals(war.getClanA()) ? clan : killerClan; @@ -142,9 +151,6 @@ public class WarManager extends MiniPlugin implements ScoreboardElement _clansManager.getScoreboard().refresh(killerClan); _clansManager.getScoreboard().refresh(clan); - - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); } else { @@ -155,14 +161,13 @@ public class WarManager extends MiniPlugin implements ScoreboardElement public void run(ClanWarData data) { ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan); + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); _clansManager.messageClan(killerClan, F.main("Clans", "Your clan gained 1 War Point against " + rel.getColor(false) + clan.getName())); _clansManager.messageClan(clan, F.main("Clans", "Your clan lost 1 War Point against " + rel.getColor(false) + killerClan.getName())); _clansManager.getScoreboard().refresh(killerClan); _clansManager.getScoreboard().refresh(clan); - - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); } }); } @@ -271,7 +276,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement @EventHandler public void onInvasionEnd(WarInvasionEndEvent event) { - Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + "'s invasion against " + F.elem(event.getWarInvasion().getInvaderClan() + " has ended."))); + Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + "'s invasion against " + F.elem(event.getWarInvasion().getInvadedClan()) + " has ended.")); } @@ -301,13 +306,14 @@ public class WarManager extends MiniPlugin implements ScoreboardElement if (clan != null) { - List invadedList = _invadedMap.get(clan); - List invaderList = _invaderMap.get(clan); + List invadedList = _invadedMap.get(clan.getName()); + List invaderList = _invaderMap.get(clan.getName()); if (invaderList != null && !invaderList.isEmpty()) { for (WarInvasion invasion : invaderList) { + element.add(" "); element.add(C.cPurpleB + "Invading"); element.add(" " + invasion.getInvadedClan()); element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); @@ -318,6 +324,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement { for (WarInvasion invasion : invadedList) { + element.add(" "); element.add(C.cRedB + "Invaded"); element.add(" " + invasion.getInvaderClan()); element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java index 08870a246..a9e3afc57 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java @@ -8,6 +8,7 @@ import java.util.Map; import org.bukkit.Color; import org.bukkit.FireworkEffect.Type; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -19,6 +20,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import mineplex.core.common.jsonchat.ClickEvent; @@ -27,6 +29,8 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextMiddle; @@ -40,6 +44,7 @@ import mineplex.core.task.TaskManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.clans.event.ClanJoinEvent; import mineplex.game.clans.clans.event.ClanTipEvent; import mineplex.game.clans.economy.GoldManager; import net.minecraft.server.v1_8_R3.PacketPlayOutChat; @@ -66,7 +71,8 @@ public abstract class Tutorial implements ScoreboardElement, Listener protected final TaskManager _taskManager; protected final DonationManager _donationManager; - protected final LinkedHashMap> _tasks; +// protected final LinkedHashMap> _tasks; + private final ArrayList> _tasks; protected final LinkedHashMap> _nameToTask; protected final LinkedHashMap _inTutorial; @@ -89,7 +95,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener _donationManager = donationManager; _taskManager = taskManager; _manager = manager; - _tasks = new LinkedHashMap<>(); + _tasks = new ArrayList>(); _inTutorial = new LinkedHashMap<>(); _nameToTask = new LinkedHashMap<>(); @@ -122,7 +128,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener lines.add(C.cAqua + "Tutorial"); - for (final TutorialTask task : _tasks.values()) + for (final TutorialTask task : _tasks) { if (get(player).CurrentTask.equals(task)) { @@ -142,10 +148,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener return lines; } + + public TutorialTask getTask(int index) + { + return _tasks.get(index); + } protected void addTask(TutorialTask task) { - _tasks.put(_tasks.size() + 1, task); + _tasks.add(task); _nameToTask.put(task.getTechnicalName(), task); } @@ -158,6 +169,11 @@ public abstract class Tutorial implements ScoreboardElement, Listener return get(player).CurrentTask.getID() < task.getID(); } + + private TutorialTask getLastTask() + { + return _tasks.get(_tasks.size() - 1); + } protected void finishTask(final Player player, final TutorialTask task) { @@ -175,8 +191,10 @@ public abstract class Tutorial implements ScoreboardElement, Listener { public void run() { + final TutorialTask lastTask = getLastTask(); // Cycle to next task, or null if last task. - get(player).CurrentTask = task.equals(_tasks.get(_tasks.size())) ? null : _tasks.get(task.getID() + 1); + get(player).CurrentTask = task.equals(lastTask) ? null : _tasks.get(task.getDataId() + 1); + System.out.println("Next Task: " + get(player).CurrentTask); if (!_taskManager.hasCompletedTask(player, String.format(TASK_COMPLETE_TASK, _technicalName, task.getTechnicalName()))) { @@ -185,7 +203,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void run(final Boolean completed) { // If last task, end tutorial. - if (task.equals(_tasks.get(_tasks.size()))) + if (task.equals(lastTask)) { finishFor(player); } @@ -196,6 +214,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener { public void run() { + System.out.println("STARTING NEXT TASK!"); get(player).CurrentTask.startFor(player); get(player).CurrentTaskStartTime = System.currentTimeMillis(); } @@ -253,23 +272,22 @@ public abstract class Tutorial implements ScoreboardElement, Listener private void finishFor(final Player player) { - if (player.getOpenInventory() != null) - { - _inTutorial.get(player.getName()).QueuedFinish = true; - return; - } - +// if (player.getOpenInventory() != null) +// { +// _inTutorial.get(player.getName()).QueuedFinish = true; +// return; +// } + _manager.finishTutorial(player); _inTutorial.remove(player.getName()); - - UtilTextMiddle.display(C.cWhite + "Clans Tutorial", C.cGreen + "You have completed the Clans Tutorial!", 20, 20 * 3, 20); + onFinished(player); _manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable() { public void run() { - // Custom Finish Method (usually messages) - onFinished(player); - + UtilTextMiddle.display(C.cWhite + "Clans Tutorial", C.cGreen + "You have completed the Clans Tutorial!", 20, 20 * 3, 20, player); + onFinishedDelay(player); + // Do Reward if (!_taskManager.hasCompletedTask(player, String.format(TUTORIAL_REWARD_TASK, _technicalName))) { @@ -306,6 +324,25 @@ public abstract class Tutorial implements ScoreboardElement, Listener } }, player, String.format(TUTORIAL_REWARD_TASK, _technicalName)); } + else + { + UtilInv.remove(player, Material.IRON_AXE, (byte) 0, 1); + + UtilInv.remove(player, Material.IRON_HELMET, (byte) 0, 1); + UtilInv.remove(player, Material.IRON_CHESTPLATE, (byte) 0, 1); + UtilInv.remove(player, Material.IRON_LEGGINGS, (byte) 0, 1); + UtilInv.remove(player, Material.IRON_BOOTS, (byte) 0, 1); + + ItemStack[] armor = player.getInventory().getArmorContents(); + for (int i = 0 ; i < armor.length; i++) + { + if (UtilItem.isIronProduct(armor[i])) + { + armor[i] = null; + } + } + player.getInventory().setArmorContents(armor); + } _manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable() { @@ -341,13 +378,17 @@ public abstract class Tutorial implements ScoreboardElement, Listener } }, 20 * 2); } - }, 20 * 4); + }, 20 * 2); } // Implementation left to sub classes. protected void onFinished(final Player player) { } + + protected void onFinishedDelay(final Player player) + { + } // Implementation left to sub classes. protected void onBegin(final Player player) @@ -358,7 +399,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener { if (!_manager.isInTutorial(player)) { - _manager._playerTutorials.put(player.getName(), this); + _manager.setTutorial(player, this); } _inTutorial.put(player.getName(), new TutorialClient(player, this)); @@ -403,11 +444,6 @@ public abstract class Tutorial implements ScoreboardElement, Listener return _inTutorial.containsKey(player); } - public Map> getTasks() - { - return _tasks; - } - public boolean hasCompleted(final Player player) { return _taskManager.hasCompletedTask(player, String.format(TUTORIAL_COMPLETE_TASK, _technicalName)); @@ -507,7 +543,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener } } - get(player).CurrentTask.trySendDescription(player); + get(player).CurrentTask.trySendDescription(player, false); } } } @@ -533,6 +569,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener evt.setCancelled(true); } + @EventHandler + public void onJoinClan(ClanJoinEvent event) + { + if (isInTutorial(event.getPlayer())) + { + event.setCancelled(true); + } + } + @EventHandler public void onPlayerJoin(final PlayerJoinEvent evt) { @@ -553,9 +598,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void cleanup(Player player) { - if (get(player) != null && get(player).CurrentTask != null) + System.out.println("Cleaning up Player in " + getClass().getName()); + + if (get(player) != null && get(player).CurrentTask != null) + { + System.out.println("Cleaning up current task: " + get(player).CurrentTask.getClass().getName()); get(player).CurrentTask.cleanup(player); - + } + + System.out.println("removing from in tutorial"); _inTutorial.remove(player.getName()); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java index 383a09700..ac44d52a1 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java @@ -17,11 +17,12 @@ public class TutorialClient { Player = player; - CurrentTask = tutorial._tasks.get(1); + CurrentTask = tutorial.getTask(0); CurrentTaskStartTime = System.currentTimeMillis(); InClanOnStart = tutorial._clansManager.isInClan(player); - + + /* for (TutorialTask task : tutorial._tasks.values()) { if (TaskManager.Instance.hasCompletedTask(player, String.format( @@ -36,5 +37,6 @@ public class TutorialClient } } } + */ } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java index 7a637f7ba..58d509c1b 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java @@ -32,7 +32,7 @@ public class TutorialManager extends MiniPlugin public static TutorialManager Instance; private final Map, Tutorial> _tutorials = new HashMap<>(); - protected final Map _playerTutorials = new HashMap<>(); + private final Map _playerTutorials = new HashMap<>(); private final TaskManager _taskManager; @@ -138,10 +138,13 @@ public class TutorialManager extends MiniPlugin @EventHandler public void quit(PlayerQuitEvent event) { + System.out.println("Player Quit. In Tutorial: " + isInTutorial(event.getPlayer())); + if (!isInTutorial(event.getPlayer())) return; getTutorial(event.getPlayer()).cleanup(event.getPlayer()); + _playerTutorials.remove(event.getPlayer().getName()); } public void sendTutorialMsg(Player player, String message) @@ -156,6 +159,16 @@ public class TutorialManager extends MiniPlugin sendTutorialMsg(player, message); } } + + public void finishTutorial(Player player) + { + _playerTutorials.remove(player.getName()); + } + + public void setTutorial(Player player, Tutorial tutorial) + { + _playerTutorials.put(player.getName(), tutorial); + } public Tutorial getTutorial(final Player player) { diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java index cc6addbda..153668e0e 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java @@ -15,6 +15,7 @@ import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansManager; public class TutorialTask implements Listener @@ -38,7 +39,6 @@ public class TutorialTask implements Listener protected long _descriptionWaitTime = 30000; - protected NautArrayList _playersFinished = new NautArrayList<>(); protected NautArrayList _inTask = new NautArrayList<>(); private long _lastTaskTp; @@ -64,7 +64,7 @@ public class TutorialTask implements Listener { _inTask.add(player.getName()); - trySendDescription(player); + trySendDescription(player, true); customStartFor(player); @@ -123,7 +123,7 @@ public class TutorialTask implements Listener { if (isDoing(player)) { - UtilTextMiddle.display("", UtilText.arrayToString(_subtasks, "\n"), 1, 25, 25); + UtilTextMiddle.display("", UtilText.arrayToString(_subtasks, "\n"), 1, 25, 25, player); } } } @@ -134,7 +134,7 @@ public class TutorialTask implements Listener return _inTask != null && player != null && _inTask.contains(player.getName()); } - public void trySendDescription(Player player) + public void trySendDescription(Player player, boolean force) { if (!_tutorial.isInTutorial(player)) { @@ -148,19 +148,24 @@ public class TutorialTask implements Listener return; } - if (System.currentTimeMillis() - client.LastDescriptionSentTime > client.CurrentTask.getDescriptionWaitTime()) + if (force || System.currentTimeMillis() - client.LastDescriptionSentTime > client.CurrentTask.getDescriptionWaitTime()) { + String description = _description; + ClanInfo clan = getClans().getClan(player); + if (clan != null) description = description.replace("(clan)", clan.getName()); + description = description.replace("{", C.cAqua).replace("}", C.cWhite); + _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, " "); - _tutorial._manager.sendTutorialMsg(player, C.cYellowB + "Part " + _id + ": " + _displayName); - _tutorial._manager.sendTutorialMsg(player, C.cWhite + " " + _description.replace("{", C.cAqua).replace("}", C.cWhite)); + _tutorial._manager.sendTutorialMsg(player, C.cYellowB + "Part " + (_id + 1) + ": " + _displayName); + _tutorial._manager.sendTutorialMsg(player, C.cWhite + " " + description); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); - UtilTextMiddle.display("", getDisplayName()); + UtilTextMiddle.display("", getDisplayName(), player); client.LastDescriptionSentTime = System.currentTimeMillis(); } @@ -206,30 +211,39 @@ public class TutorialTask implements Listener { return _tutorial._clansManager; } - - public int getID() + + public int getDataId() { return _id; } + public int getID() + { + return _id + 1; + } + public void finishFor(Player player) { customEndFor(player); + cleanup(player); _tutorial.finishTask(player, this); } public void visibleFinish(Player player) { - _inTask.remove(player.getName()); - if (_finishMessage != null) { + String finishMessage = _finishMessage; + ClanInfo clan = getClans().getClan(player); + if (clan != null) finishMessage = finishMessage.replace("(clan)", clan.getName()); + finishMessage = finishMessage.replace("{", C.cAqua).replace("}", C.cWhite); + _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, " "); - _tutorial._manager.sendTutorialMsg(player, C.cWhite + _finishMessage.replace("{", C.cAqua).replace("}", C.cWhite)); + _tutorial._manager.sendTutorialMsg(player, C.cWhite + finishMessage); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); } @@ -238,7 +252,6 @@ public class TutorialTask implements Listener public void cleanup(Player player) { _inTask.remove(player.getName()); - _playersFinished.remove(player.getName()); } public long getDescriptionWaitTime() diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java index ea7d0c3a6..91f065320 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java @@ -48,7 +48,14 @@ public class TaskCustomizeClass extends TutorialTask if (clientclass != null && clientclass.GetSavingCustomBuild() != null && clientclass.GetSavingCustomBuild().AxeSkill != null) { finishFor(player); + iterator.remove(); } } } + + @Override + public void cleanup(Player player) + { + // handled in onUpdate + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java index 69ca5de33..a294434cb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java @@ -25,18 +25,6 @@ public class TaskDisbandClan extends TutorialTask @Override public void customStartFor(final Player player) { - if (_tutorial.get(player).InClanOnStart) - { - UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(getManager().getPlugin(), new Runnable(){ - public void run() - { - if (isDoing(player)) - { - finishFor(player); - } - } - }, 6 * 20); - } } @EventHandler @@ -46,6 +34,8 @@ public class TaskDisbandClan extends TutorialTask { return; } + + System.out.println("COMPLETE DISBAND CLAN!"); finishFor(event.getDisbander()); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java index 0dee17131..924a90eed 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java @@ -62,6 +62,11 @@ public class TaskEquipClass extends TutorialTask public void customStartFor(Player player) { _bought.put(player.getName(), new NautArrayList()); + + if (getClans().getClassManager().Get(player).GetGameClass() != null) + { + finishFor(player); + } } @EventHandler diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java index 39ddfd126..d34c2129e 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java @@ -57,12 +57,19 @@ public class TaskExploreShops extends TutorialTask if (ClansManager.getInstance().getClan(event.getPlayer()).getEnergyPurchasable() == 0) { finishFor(event.getPlayer()); + _inTask.remove(event.getPlayer().getName()); return; } event.setFree(true); } - + + @Override + public void cleanup(Player player) + { + // handled in on update + } + @EventHandler public void onUpdate(UpdateEvent event) { @@ -78,6 +85,7 @@ public class TaskExploreShops extends TutorialTask if (ClansManager.getInstance().getClan(player).getEnergy() == ClansManager.getInstance().getClan(player).getEnergyMax()) { finishFor(player); + iterator.remove(); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java index 71a8155da..37bea2964 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java @@ -6,6 +6,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.tutorials.TutorialTask; @@ -45,12 +47,20 @@ public class TaskLeaveSpawn extends TutorialTask Iterator iterator = _inTask.iterator(); while (iterator.hasNext()) { - Player player = Bukkit.getPlayer(iterator.next()); + String playerName = iterator.next(); + Player player = UtilPlayer.searchExact(playerName); if (player.getLocation().getY() < 100 && getClans().getClanUtility().getClaim(player.getLocation()) == null) { finishFor(player); + iterator.remove(); } } } + + @Override + public void cleanup(Player player) + { + // We handle this in update() to avoid ConcurrentModificationException + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java index e7a8fff57..66c5fb36f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java @@ -70,6 +70,8 @@ public class TaskMakingMoney extends TutorialTask { return; } + + System.out.println("FINISH CARROT"); finishFor(event.getPlayer()); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java index 58c9bb58d..ee85950da 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java @@ -9,14 +9,18 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.CraftingInventory; +import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import mineplex.core.common.util.Callback; import mineplex.core.common.util.NautArrayList; import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilServer; import mineplex.core.task.TaskManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -39,7 +43,7 @@ public class TaskUseAbility extends TutorialTask + "Purchase an Iron Axe from the PvP Shop. " + "Right-Click with your Iron Axe to use your Axe Ability!"; - _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); +// _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); } private NautHashMap> _bought = new NautHashMap<>(); @@ -49,7 +53,6 @@ public class TaskUseAbility extends TutorialTask public void customStartFor(Player player) { _bought.put(player.getName(), new NautArrayList()); - _teleported.put(player.getName(), false); } @Override @@ -70,7 +73,7 @@ public class TaskUseAbility extends TutorialTask { Player _player = Bukkit.getPlayer(iterator.next()); - if (!_teleported.get(_player.getName()) && _player != null && _player.isOnline() && _player.getOpenInventory().getType() == InventoryType.CRAFTING) + if (!_teleported.containsKey(_player.getName()) && _player != null && _player.isOnline() && _player.getOpenInventory().getType() == InventoryType.CRAFTING) { _player.teleport(new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f)); _teleported.put(_player.getName(), true); @@ -78,6 +81,7 @@ public class TaskUseAbility extends TutorialTask } } + /* @EventHandler public void onAbilityUesd(SkillTriggerEvent event) { @@ -88,6 +92,25 @@ public class TaskUseAbility extends TutorialTask finishFor(event.GetPlayer()); } + */ + + @EventHandler + public void onRightClick(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!isDoing(player)) + return; + + if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) + { + ItemStack item = player.getItemInHand(); + if (item != null && item.getType() == Material.IRON_AXE) + { + finishFor(player); + } + } + } @EventHandler public void button(ClansShopAddButtonEvent event) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java index 60e732340..9ece47104 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java @@ -16,7 +16,7 @@ public class TaskViewClanDetails extends TutorialTask _technicalName = "CommandClanX"; _description = "Now you can view information about your clan. " - + "To do this type {/c [clan name]}! " + + "To do this type {/c (clan)}! " + "You can also use any clan's name to get some information about them as well."; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java index 0fe1fc7fd..fe2dde3df 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java @@ -25,7 +25,7 @@ public class TutorialGettingStarted extends Tutorial // addTask(new TaskWelcome(this, 1)); - int id = 0; + int id = -1; addTask(new TaskCreateClan(this, ++id)); addTask(new TaskViewClanDetails(this, ++id)); addTask(new TaskLeaveSpawn(this, ++id)); @@ -49,6 +49,13 @@ public class TutorialGettingStarted extends Tutorial @Override public void onFinished(final Player player) + { + player.resetPlayerTime(); + player.teleport(Spawn.getEastSpawn()); + } + + @Override + protected void onFinishedDelay(Player player) { _manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _manager.sendTutorialMsg(player, C.cYellowB + "CONGRATULATIONS"); @@ -56,11 +63,8 @@ public class TutorialGettingStarted extends Tutorial _manager.sendTutorialMsg(player, C.cWhite + "You have completed the Clans basic tutorial and have been awarded " + C.cAqua + "30,000 Gold"); _manager.sendTutorialMsg(player, C.cWhite + "You can now begin your adventure, but do take a moment to read the signs around spawn for more information!"); _manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); - - player.resetPlayerTime(); - player.teleport(Spawn.getEastSpawn()); } - + @Override public void onBegin(final Player player) { From 2435ebba1356b5bbf0bea310a96857590d68e190 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Fri, 4 Dec 2015 05:16:14 -0500 Subject: [PATCH 043/223] Disable subtasks for now --- .../clans/tutorials/gettingstarted/TaskEquipClass.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java index 924a90eed..458e04bb4 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java @@ -29,11 +29,11 @@ public class TaskEquipClass extends TutorialTask + "Purchase Iron Armor from the PvP Shop. " + "Then put on your armor to equip the Knight Class."; - _subtasks = new String[] { - "Open the PvP Shop", - "Buy Iron Armor Set", - "Equip Iron Armor" - }; +// _subtasks = new String[] { +// "Open the PvP Shop", +// "Buy Iron Armor Set", +// "Equip Iron Armor" +// }; _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); } From bb382a969c367afe6ce0e4fc2c9f091971af001a Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Fri, 4 Dec 2015 08:02:38 -0500 Subject: [PATCH 044/223] Fix heavy attribute, disable claim visualizer --- .../src/mineplex/game/clans/clans/ClansManager.java | 2 +- .../game/clans/items/attributes/bow/HeavyArrowsAttribute.java | 3 ++- .../src/mineplex/game/clans/spawn/Spawn.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java index 8b09f8db2..d97ad7c78 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java @@ -305,7 +305,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati loadClan(token); } - new ClaimVisualizer(plugin, this); +// new ClaimVisualizer(plugin, this); // RedisDataRepository(ConnectionData writeConn, ConnectionData // readConn, Region region, Class elementType, String elementLabel) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java index 16aa30a21..f5e55d42c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java @@ -35,6 +35,7 @@ public class HeavyArrowsAttribute extends ItemAttribute @Override public void onAttack(CustomDamageEvent event) { - event.AddKnockback("HeavyAttribute", _knockbackPercent); + double knockback = (_knockbackPercent / 100d) * 6; + event.AddKnockback("Heavy Attribute", knockback); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java index dfca12bb5..50a251707 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java @@ -248,7 +248,7 @@ public class Spawn extends MiniPlugin if (isInSpawn(player)) { - UtilPlayer.message(event.GetPlayer(), F.main("Safe Zone", "You cannot use " + F.skill(event.GetSkillName() + " in " + F.elem("Safe Zone") + "."))); + UtilPlayer.message(event.GetPlayer(), F.main("Safe Zone", "You cannot use " + F.skill(event.GetSkillName()) + " in " + F.elem("Safe Zone") + ".")); event.SetCancelled(true); } } From e158704534a428cd9ddff068c862d848e12f1690 Mon Sep 17 00:00:00 2001 From: NewGarbo Date: Fri, 4 Dec 2015 14:56:43 +0000 Subject: [PATCH 045/223] fixed /skiptutorial not working, and fixed tutorial thinking you're still in tutorial after finishing/cancelling/skipping --- .../game/clans/tutorials/Tutorial.java | 11 +-- .../game/clans/tutorials/TutorialManager.java | 71 ++++++++++++++++++- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java index a9e3afc57..ab0462f86 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java @@ -64,6 +64,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public static String SKIPPED_TASK = "tatatatata%sSkip"; public static String AllowedMessage = C.cGold + "TutorialAllowedMessage" + C.Reset; + public static String AllowedBypass = C.cBlue + "Tutorial>"; protected final TutorialManager _manager; protected final GoldManager _goldManager; @@ -424,6 +425,8 @@ public abstract class Tutorial implements ScoreboardElement, Listener { _inTutorial.remove(player.getName()); + _manager.finishTutorial(player); + if (_ghostMode) { for (Player other : UtilServer.getPlayers()) @@ -456,9 +459,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void skip(final Player player) { - new JsonMessage( - AllowedMessage - ) + new JsonMessage("") .extra( F.main( "Tutorial", @@ -472,9 +473,11 @@ public abstract class Tutorial implements ScoreboardElement, Listener .color("yellow") .extra("!") .color("gray") + .sendToPlayer(player); - new JsonMessage( + new JsonMessage("") + .extra( F.main( "Tutorial", "Click " diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java index 58d509c1b..7468ff139 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java @@ -25,6 +25,7 @@ import mineplex.game.clans.tutorials.commands.DoSkipTutorialCommand; import mineplex.game.clans.tutorials.commands.SkipTutorialCommand; import mineplex.game.clans.tutorials.gettingstarted.TutorialGettingStarted; import net.md_5.bungee.api.ChatColor; +import net.minecraft.server.v1_8_R3.IChatBaseComponent; import net.minecraft.server.v1_8_R3.PacketPlayOutChat; public class TutorialManager extends MiniPlugin @@ -64,7 +65,7 @@ public class TutorialManager extends MiniPlugin { chat.a.a().remove(0); } - else + else if (!chat.a.a().get(0).c().contains(Tutorial.AllowedBypass)) { if (isInTutorial(packet.getPlayer())) { @@ -184,4 +185,72 @@ public class TutorialManager extends MiniPlugin { return _taskManager; } + + // Stolen from UtilTabTitle + private static class TextConverter + { + public static String convert(String text) + { + if (text == null || text.length() == 0) + { + return "\"\""; + } + + char c; + int i; + int len = text.length(); + StringBuilder sb = new StringBuilder(len + 4); + String t; + sb.append('"'); + + for (i = 0; i < len; i += 1) + { + c = text.charAt(i); + switch (c) + { + case '\\': + case '"': + sb.append('\\'); + sb.append(c); + break; + case '/': + sb.append('\\'); + sb.append(c); + break; + case '\b': + sb.append("\\b"); + break; + case '\t': + sb.append("\\t"); + break; + case '\n': + sb.append("\\n"); + break; + case '\f': + sb.append("\\f"); + break; + case '\r': + sb.append("\\r"); + break; + default: + if (c < ' ') + { + t = "000" + Integer.toHexString(c); + sb.append("\\u").append(t.substring(t.length() - 4)); + } + else + { + sb.append(c); + } + } + } + sb.append('"'); + return sb.toString(); + } + + public static String setPlayerName(Player player, String text) + { + return text.replaceAll("(?i)\\{PLAYER\\}", player.getName()); + } + } } From bca65116abee1f26b17251dd2f50a94fd1404116 Mon Sep 17 00:00:00 2001 From: NewGarbo Date: Fri, 4 Dec 2015 18:23:23 +0000 Subject: [PATCH 046/223] fixed task not getting cleanup up after /skiptutorial --- .../src/mineplex/game/clans/tutorials/Tutorial.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java index ab0462f86..4d6ae6cc3 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java @@ -423,6 +423,8 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void cancelFor(final Player player) { + get(player).CurrentTask.cleanup(player); + get(player).CurrentTaskStartTime = -1; _inTutorial.remove(player.getName()); _manager.finishTutorial(player); From 5d59b1a01558be422c833f913b37077b3ffc5ca7 Mon Sep 17 00:00:00 2001 From: NewGarbo Date: Fri, 4 Dec 2015 18:32:46 +0000 Subject: [PATCH 047/223] fixed tnt blowing up in claims when offline --- .../src/mineplex/game/clans/clans/ClanInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java index dc53b6069..5e82714fe 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java @@ -462,7 +462,7 @@ public class ClanInfo public boolean isOnline() { - return isOnlineNow() || System.currentTimeMillis() - _lastOnline.getTime() < Clans.getOnlineTime(); + return isOnlineNow();// || System.currentTimeMillis() - _lastOnline.getTime() < Clans.getOnlineTime(); } public String getProtected() From 1bb40b21d3cf9a71dd56b4880ef197de95338dfa Mon Sep 17 00:00:00 2001 From: Sarah Date: Fri, 4 Dec 2015 19:49:28 +0100 Subject: [PATCH 048/223] Tutorial/Phase Time. --- .../game/arcade/gametutorial/GameTutorial.java | 13 +++++++++++++ .../game/arcade/gametutorial/TutorialPhase.java | 9 ++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 2583a1f65..4a9868134 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -28,6 +28,8 @@ public abstract class GameTutorial private boolean _hasStarted; private int _tick; + + private long _started; public boolean SetTutorialPositions = true; public boolean TeleportOnEnd = true; @@ -54,6 +56,7 @@ public abstract class GameTutorial Manager.GetGame().PrepareTime = 60000; Manager.GetChat().Silence(60000, false); + _started = System.currentTimeMillis(); Manager.getPluginManager().callEvent(new GameTutorialStartEvent(this)); onStart(); preparePlayers(); @@ -194,4 +197,14 @@ public abstract class GameTutorial _tick++; return _tick; } + + public long getTutorialStart() + { + return _started; + } + + public long getPhaseTime() + { + return _currentPhase.getPhaseTime(); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index f6858e2d2..d583f5014 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -4,7 +4,6 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilTextMiddle; import org.bukkit.Location; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -19,6 +18,8 @@ public abstract class TutorialPhase private Location _target; private boolean _hasEnded; + private long _started; + private TutorialText _currentText; public TutorialPhase(TutorialText[] text) @@ -29,6 +30,7 @@ public abstract class TutorialPhase final public void start(boolean phaseOne) { _hasEnded = false; + _started = System.currentTimeMillis(); onStart(); if(!phaseOne) { @@ -218,6 +220,11 @@ public abstract class TutorialPhase return _target; } + public long getPhaseTime() + { + return _started; + } + public void onStart(){} public void onMessageDisplay(TutorialText text){} From 35534afd4a02270e49e9031835e420ba1dda238f Mon Sep 17 00:00:00 2001 From: Sarah Date: Fri, 4 Dec 2015 19:54:02 +0100 Subject: [PATCH 049/223] overall runtime. --- .../src/nautilus/game/arcade/gametutorial/GameTutorial.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 4a9868134..ac63bc328 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -203,6 +203,11 @@ public abstract class GameTutorial return _started; } + public long getRunning() + { + return System.currentTimeMillis() - _started; + } + public long getPhaseTime() { return _currentPhase.getPhaseTime(); From 4a5366753996d33d5276a46d870347c55d0e2551 Mon Sep 17 00:00:00 2001 From: Cheese Date: Sat, 5 Dec 2015 10:22:00 +1100 Subject: [PATCH 050/223] gadget restructure converted frost lord and titan particles into 4 subcategories. --- .../core/cosmetic/CosmeticManager.java | 2 +- .../core/cosmetic/ui/page/GadgetPage.java | 4 +- .../mineplex/core/gadget/GadgetManager.java | 61 ++++------ .../core/gadget/gadgets/ItemKothSword.java | 5 - .../arrowtrail/ArrowTrailFrostLord.java | 43 +++++++ .../gadgets/arrowtrail/ArrowTrailTitan.java | 55 +++++++++ .../gadget/gadgets/death/DeathFrostLord.java | 41 +++++++ .../core/gadget/gadgets/death/DeathTitan.java | 52 +++++++++ .../doublejump/DoubleJumpFrostLord.java | 38 ++++++ .../gadgets/doublejump/DoubleJumpTitan.java | 63 ++++++++++ .../gadget/gadgets/{ => item}/ItemBatGun.java | 3 +- .../gadgets/{ => item}/ItemCoinBomb.java | 3 +- .../gadgets/{ => item}/ItemDuelingSword.java | 3 +- .../gadgets/{ => item}/ItemEtherealPearl.java | 3 +- .../gadgets/{ => item}/ItemFirework.java | 3 +- .../gadgets/{ => item}/ItemFleshHook.java | 3 +- .../gadgets/{ => item}/ItemFootball.java | 3 +- .../gadgets/{ => item}/ItemGemBomb.java | 3 +- .../gadget/gadgets/item/ItemKothSword.java | 5 + .../gadgets/{ => item}/ItemMelonLauncher.java | 3 +- .../gadgets/{ => item}/ItemPaintballGun.java | 3 +- .../gadgets/{ => item}/ItemPaintbrush.java | 3 +- .../gadget/gadgets/{ => item}/ItemTNT.java | 3 +- .../gadget/gadgets/{ => morph}/BlockForm.java | 2 +- .../gadget/gadgets/{ => morph}/MorphBat.java | 2 +- .../gadgets/{ => morph}/MorphBlaze.java | 2 +- .../gadgets/{ => morph}/MorphBlock.java | 2 +- .../gadgets/{ => morph}/MorphBunny.java | 2 +- .../gadgets/{ => morph}/MorphChicken.java | 2 +- .../gadget/gadgets/{ => morph}/MorphCow.java | 2 +- .../gadgets/{ => morph}/MorphCreeper.java | 2 +- .../gadgets/{ => morph}/MorphEnderman.java | 2 +- .../gadget/gadgets/{ => morph}/MorphGeno.java | 2 +- .../gadgets/{ => morph}/MorphNotch.java | 2 +- .../gadget/gadgets/{ => morph}/MorphPig.java | 2 +- .../gadgets/{ => morph}/MorphPumpkinKing.java | 2 +- .../gadgets/{ => morph}/MorphSlime.java | 2 +- .../gadgets/{ => morph}/MorphTitan.java | 2 +- .../gadgets/{ => morph}/MorphVillager.java | 2 +- .../gadgets/{ => morph}/MorphWither.java | 2 +- .../gadgets/{ => outfit}/OutfitRaveSuit.java | 2 +- .../gadgets/{ => outfit}/OutfitSpaceSuit.java | 2 +- .../gadgets/{ => outfit}/OutfitTeam.java | 2 +- .../{ => particle}/ParticleEnchant.java | 2 +- .../gadgets/{ => particle}/ParticleFairy.java | 2 +- .../{ => particle}/ParticleFairyData.java | 2 +- .../{ => particle}/ParticleFireRings.java | 2 +- .../gadgets/{ => particle}/ParticleFoot.java | 2 +- .../ParticleFrostLord.java} | 83 +------------ .../gadgets/{ => particle}/ParticleGreen.java | 2 +- .../gadgets/{ => particle}/ParticleHeart.java | 2 +- .../gadgets/{ => particle}/ParticleHelix.java | 2 +- .../{ => particle}/ParticleKronos.java | 2 +- .../{ => particle}/ParticleKronosData.java | 2 +- .../{ => particle}/ParticleLegend.java | 2 +- .../gadgets/{ => particle}/ParticleRain.java | 2 +- .../gadgets/{ => particle}/ParticleTitan.java | 96 +-------------- .../core/gadget/types/ArrowEffectGadget.java | 110 ++++++++++++++++++ .../core/gadget/types/DeathEffectGadget.java | 44 +++++++ .../gadget/types/DoubleJumpEffectGadget.java | 65 +++++++++++ .../core/gadget/types/GadgetType.java | 3 + .../src/mineplex/hub/modules/KothManager.java | 4 +- .../src/mineplex/hub/modules/NewsManager.java | 2 +- .../mineplex/hub/modules/SoccerManager.java | 2 +- .../mineplex/hub/modules/StackerManager.java | 2 +- .../arcade/game/games/event/EventModule.java | 2 +- .../game/arcade/managers/GameManager.java | 2 +- 67 files changed, 612 insertions(+), 272 deletions(-) delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemKothSword.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemBatGun.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemCoinBomb.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemDuelingSword.java (93%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemEtherealPearl.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemFirework.java (96%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemFleshHook.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemFootball.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemGemBomb.java (98%) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemMelonLauncher.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemPaintballGun.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemPaintbrush.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => item}/ItemTNT.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/BlockForm.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphBat.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphBlaze.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphBlock.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphBunny.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphChicken.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphCow.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphCreeper.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphEnderman.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphGeno.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphNotch.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphPig.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphPumpkinKing.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphSlime.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphTitan.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphVillager.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => morph}/MorphWither.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => outfit}/OutfitRaveSuit.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => outfit}/OutfitSpaceSuit.java (94%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => outfit}/OutfitTeam.java (99%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleEnchant.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleFairy.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleFairyData.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleFireRings.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleFoot.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ParticleBlizzard.java => particle/ParticleFrostLord.java} (57%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleGreen.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleHeart.java (95%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleHelix.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleKronos.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleKronosData.java (98%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleLegend.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleRain.java (97%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/{ => particle}/ParticleTitan.java (55%) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java index 48e7d35f2..9394628ae 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java @@ -19,7 +19,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.gadgets.OutfitTeam; +import mineplex.core.gadget.gadgets.outfit.OutfitTeam; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.inventory.InventoryManager; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 6a75916e6..cebfad6bd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -19,8 +19,8 @@ import mineplex.core.cosmetic.ui.button.ActivateGadgetButton; import mineplex.core.cosmetic.ui.button.DeactivateGadgetButton; import mineplex.core.cosmetic.ui.button.GadgetButton; import mineplex.core.donation.DonationManager; -import mineplex.core.gadget.gadgets.MorphBlock; -import mineplex.core.gadget.gadgets.MorphNotch; +import mineplex.core.gadget.gadgets.morph.MorphBlock; +import mineplex.core.gadget.gadgets.morph.MorphNotch; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 7494e9fa6..e612c3350 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -15,44 +15,13 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.DisguiseManager; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.event.GadgetCollideEntityEvent; -import mineplex.core.gadget.gadgets.ItemBatGun; -import mineplex.core.gadget.gadgets.ItemCoinBomb; -import mineplex.core.gadget.gadgets.ItemDuelingSword; -import mineplex.core.gadget.gadgets.ItemEtherealPearl; -import mineplex.core.gadget.gadgets.ItemFirework; -import mineplex.core.gadget.gadgets.ItemFleshHook; -import mineplex.core.gadget.gadgets.ItemMelonLauncher; -import mineplex.core.gadget.gadgets.ItemPaintballGun; -import mineplex.core.gadget.gadgets.ItemPaintbrush; -import mineplex.core.gadget.gadgets.ItemTNT; -import mineplex.core.gadget.gadgets.MorphBat; -import mineplex.core.gadget.gadgets.MorphBlaze; -import mineplex.core.gadget.gadgets.MorphBlock; -import mineplex.core.gadget.gadgets.MorphBunny; -import mineplex.core.gadget.gadgets.MorphChicken; -import mineplex.core.gadget.gadgets.MorphCow; -import mineplex.core.gadget.gadgets.MorphCreeper; -import mineplex.core.gadget.gadgets.MorphEnderman; -import mineplex.core.gadget.gadgets.MorphPig; -import mineplex.core.gadget.gadgets.MorphPumpkinKing; -import mineplex.core.gadget.gadgets.MorphSlime; -import mineplex.core.gadget.gadgets.MorphTitan; -import mineplex.core.gadget.gadgets.MorphVillager; -import mineplex.core.gadget.gadgets.MorphWither; -import mineplex.core.gadget.gadgets.OutfitRaveSuit; -import mineplex.core.gadget.gadgets.OutfitSpaceSuit; -import mineplex.core.gadget.gadgets.OutfitTeam; -import mineplex.core.gadget.gadgets.ParticleBlizzard; -import mineplex.core.gadget.gadgets.ParticleEnchant; -import mineplex.core.gadget.gadgets.ParticleFairy; -import mineplex.core.gadget.gadgets.ParticleFireRings; -import mineplex.core.gadget.gadgets.ParticleFoot; -import mineplex.core.gadget.gadgets.ParticleGreen; -import mineplex.core.gadget.gadgets.ParticleHeart; -import mineplex.core.gadget.gadgets.ParticleHelix; -import mineplex.core.gadget.gadgets.ParticleLegend; -import mineplex.core.gadget.gadgets.ParticleRain; -import mineplex.core.gadget.gadgets.ParticleTitan; +import mineplex.core.gadget.gadgets.arrowtrail.*; +import mineplex.core.gadget.gadgets.death.*; +import mineplex.core.gadget.gadgets.doublejump.*; +import mineplex.core.gadget.gadgets.item.*; +import mineplex.core.gadget.gadgets.morph.*; +import mineplex.core.gadget.gadgets.outfit.*; +import mineplex.core.gadget.gadgets.particle.*; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; @@ -177,9 +146,21 @@ public class GadgetManager extends MiniPlugin addGadget(new ParticleHeart(this)); addGadget(new ParticleFairy(this)); addGadget(new ParticleLegend(this)); - addGadget(new ParticleBlizzard(this)); + addGadget(new ParticleFrostLord(this)); addGadget(new ParticleTitan(this)); - //addGadget(new ParticleKronos(this)); + + // Arrow Trails + addGadget(new ArrowTrailFrostLord(this)); + addGadget(new ArrowTrailTitan(this)); + + // Death Effect + addGadget(new DeathFrostLord(this)); + addGadget(new DeathTitan(this)); + + // Double Jump + addGadget(new DoubleJumpFrostLord(this)); + addGadget(new DoubleJumpTitan(this)); + // Music addGadget(new MusicGadget(this, "13 Disc", new String[] {""}, -2, 2256, 178000)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemKothSword.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemKothSword.java deleted file mode 100644 index 6bb5d66a0..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemKothSword.java +++ /dev/null @@ -1,5 +0,0 @@ -package mineplex.core.gadget.gadgets; - -public class ItemKothSword { - -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java new file mode 100644 index 000000000..90659d76e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java @@ -0,0 +1,43 @@ +package mineplex.core.gadget.gadgets.arrowtrail; + +import org.bukkit.Material; +import org.bukkit.entity.Arrow; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.types.ArrowEffectGadget; +import mineplex.core.gadget.GadgetManager; + +public class ArrowTrailFrostLord extends ArrowEffectGadget +{ + public ArrowTrailFrostLord(GadgetManager manager) + { + super(manager, "Frost Lord", new String[] + { + C.cWhite + "You are a mighty frost lord.", + C.cWhite + "Your double jumps and arrows", + C.cWhite + "are enchanted with snow powers.", + " ", + C.cPurple + "No longer available", + }, + -1, + Material.SNOW_BALL, (byte)0); + } + + @Override + public void doTrail(Arrow arrow) + { + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, arrow.getLocation(), 0f, 0f, 0f, 0f, 1, + ViewDist.LONGER, UtilServer.getPlayers()); + } + + @Override + public void doHitEffect(Arrow arrow) + { + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, arrow.getLocation(), 0f, 0f, 0f, 0.4f, 12, + ViewDist.LONGER, UtilServer.getPlayers()); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java new file mode 100644 index 000000000..534d7f3b0 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java @@ -0,0 +1,55 @@ +package mineplex.core.gadget.gadgets.arrowtrail; + +import org.bukkit.Material; +import org.bukkit.entity.Arrow; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +import mineplex.core.common.Rank; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.ArrowEffectGadget; + +public class ArrowTrailTitan extends ArrowEffectGadget +{ + public ArrowTrailTitan(GadgetManager manager) + { + super(manager, "Arrows of the Titans", new String[] + { + C.cWhite + "These flames are said to be the", + C.cWhite + "souls of a lost civilisation of", + C.cWhite + "Titans, forgotten by time.", + " ", + C.cRed + "Unlocked with Titan Rank", + }, + -3, + Material.FIREBALL, (byte)0); + } + + @Override + public void doTrail(Arrow arrow) + { + UtilParticle.PlayParticle(ParticleType.FLAME, arrow.getLocation(), 0f, 0f, 0f, 0f, 1, + ViewDist.LONGER, UtilServer.getPlayers()); + } + + @Override + public void doHitEffect(Arrow arrow) + { + UtilParticle.PlayParticle(ParticleType.LAVA, arrow.getLocation(), 0f, 0f, 0f, 0f, 24, + ViewDist.LONGER, UtilServer.getPlayers()); + } + + @EventHandler + public void titanOwner(PlayerJoinEvent event) + { + if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) + { + Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); + } + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java new file mode 100644 index 000000000..a0ec45f09 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java @@ -0,0 +1,41 @@ +package mineplex.core.gadget.gadgets.death; + +import org.bukkit.Material; +import org.bukkit.event.EventHandler; + +import mineplex.core.blood.BloodEvent; +import mineplex.core.common.util.C; +import mineplex.core.gadget.types.DeathEffectGadget; +import mineplex.core.gadget.GadgetManager; + +public class DeathFrostLord extends DeathEffectGadget +{ + public DeathFrostLord(GadgetManager manager) + { + super(manager, "Frost Lord", new String[] + { + C.cWhite + "You are a mighty frost lord.", + C.cWhite + "Your double jumps and arrows", + C.cWhite + "are enchanted with snow powers.", + " ", + C.cPurple + "No longer available", + }, + -1, + Material.SNOW_BALL, (byte)0); + } + + @EventHandler + public void death(BloodEvent event) + { + if (event.getPlayer() == null) + return; + + if (!IsActive(event.getPlayer())) + return; + + if (!shouldDisplay(event.getPlayer())) + return; + + event.setItem(Material.SNOW_BALL, (byte)0); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java new file mode 100644 index 000000000..e7f205cf6 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java @@ -0,0 +1,52 @@ +package mineplex.core.gadget.gadgets.death; + +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +import mineplex.core.blood.BloodEvent; +import mineplex.core.common.Rank; +import mineplex.core.common.util.C; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.DeathEffectGadget; + +public class DeathTitan extends DeathEffectGadget +{ + public DeathTitan(GadgetManager manager) + { + super(manager, "Ashes of the Titans", new String[] + { + C.cWhite + "These flames are said to be the", + C.cWhite + "souls of a lost civilisation of", + C.cWhite + "Titans, forgotten by time.", + " ", + C.cRed + "Unlocked with Titan Rank", + }, + -3, + Material.FIREBALL, (byte)0); + } + + @EventHandler + public void death(BloodEvent event) + { + if (event.getPlayer() == null) + return; + + if (!IsActive(event.getPlayer())) + return; + + if (!shouldDisplay(event.getPlayer())) + return; + + event.setItem(Material.FIREBALL, (byte)0); + } + + @EventHandler + public void titanOwner(PlayerJoinEvent event) + { + if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) + { + Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); + } + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java new file mode 100644 index 000000000..9c7cdc726 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java @@ -0,0 +1,38 @@ +package mineplex.core.gadget.gadgets.doublejump; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerToggleFlightEvent; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.types.DoubleJumpEffectGadget; +import mineplex.core.gadget.GadgetManager; + +public class DoubleJumpFrostLord extends DoubleJumpEffectGadget +{ + public DoubleJumpFrostLord(GadgetManager manager) + { + super(manager, "Frost Lord", new String[] + { + C.cWhite + "You are a mighty frost lord.", + C.cWhite + "Your double jumps and arrows", + C.cWhite + "are enchanted with snow powers.", + " ", + C.cPurple + "No longer available", + }, + -1, + Material.SNOW_BALL, (byte)0); + } + + @Override + public void doEffect(Player player) + { + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, player.getLocation(), 0f, 0f, 0f, 0.6f, 100, + ViewDist.LONGER, UtilServer.getPlayers()); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java new file mode 100644 index 000000000..f0ecce644 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -0,0 +1,63 @@ +package mineplex.core.gadget.gadgets.doublejump; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerToggleFlightEvent; + +import mineplex.core.common.Rank; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.DoubleJumpEffectGadget; + +public class DoubleJumpTitan extends DoubleJumpEffectGadget +{ + public DoubleJumpTitan(GadgetManager manager) + { + super(manager, "Leap of the Titans", new String[] + { + C.cWhite + "These flames are said to be the", + C.cWhite + "souls of a lost civilisation of", + C.cWhite + "Titans, forgotten by time.", + " ", + C.cRed + "Unlocked with Titan Rank", + }, + -3, + Material.FIREBALL, (byte)0); + } + + @Override + public void doEffect(Player player) + { + UtilParticle.PlayParticle(ParticleType.LAVA, player.getLocation(), 0f, 0f, 0f, 0.2f, 40, + ViewDist.NORMAL, UtilServer.getPlayers()); + } + + @EventHandler + public void jump(PlayerToggleFlightEvent event) + { + if (!shouldDisplay(event.getPlayer())) + return; + + if (!event.getPlayer().isFlying()) + if (IsActive(event.getPlayer())) + { + UtilParticle.PlayParticle(ParticleType.LAVA, event.getPlayer().getLocation(), 0f, 0f, 0f, 0.2f, 40, + ViewDist.NORMAL, UtilServer.getPlayers()); + } + } + + @EventHandler + public void titanOwner(PlayerJoinEvent event) + { + if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) + { + Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); + } + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemBatGun.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemBatGun.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java index 990221e3c..8cfcae673 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemBatGun.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.ArrayList; import java.util.HashMap; @@ -23,6 +23,7 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemCoinBomb.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemCoinBomb.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java index ce4f2e781..e68345215 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemCoinBomb.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.HashMap; import java.util.HashSet; @@ -23,6 +23,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemDuelingSword.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java similarity index 93% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemDuelingSword.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java index 94d4bfea3..07456110c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemDuelingSword.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -7,6 +7,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import mineplex.core.common.util.C; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemEtherealPearl.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemEtherealPearl.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java index bb7ef9c8f..2c07ba486 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemEtherealPearl.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.ArrayList; import java.util.HashSet; @@ -24,6 +24,7 @@ import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFirework.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java similarity index 96% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFirework.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java index 114fbeeff..0462dd311 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFirework.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import org.bukkit.Color; import org.bukkit.FireworkEffect; @@ -15,6 +15,7 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.recharge.Recharge; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java index a439aca63..e4bd3554a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import org.bukkit.EntityEffect; import org.bukkit.Material; @@ -16,6 +16,7 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.projectile.IThrown; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFootball.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFootball.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFootball.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFootball.java index 12537a599..b44dfd504 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFootball.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFootball.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.HashSet; @@ -23,6 +23,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemGemBomb.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemGemBomb.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java index 0c2e75b77..0510dbf11 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemGemBomb.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +36,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java new file mode 100644 index 000000000..6c694ba4c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java @@ -0,0 +1,5 @@ +package mineplex.core.gadget.gadgets.item; + +public class ItemKothSword { + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java index 0692aa661..ebe4d779e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.ArrayList; import java.util.Iterator; @@ -25,6 +25,7 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.projectile.IThrown; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java index 68fba27a0..ce6f5d28e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.ArrayList; import java.util.HashSet; @@ -29,6 +29,7 @@ import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetBlockEvent; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintbrush.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintbrush.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java index ba0fd0d76..93070d3ad 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintbrush.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.ArrayList; import java.util.Arrays; @@ -27,6 +27,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java index 0bf3531b7..0bf4a04d3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.item; import java.util.HashMap; import java.util.HashSet; @@ -20,6 +20,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/BlockForm.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/BlockForm.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/BlockForm.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/BlockForm.java index 7fb434ae2..4a4be4ccd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/BlockForm.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/BlockForm.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.ArrayList; import java.util.List; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java index 22cf5855e..77e253f93 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.EntityEffect; import org.bukkit.GameMode; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBlaze.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBlaze.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java index d7b73309d..67afa8bcb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBlaze.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBlock.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBlock.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java index dd5e22071..208618c10 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBlock.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBunny.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBunny.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java index 78e502bc5..056f1e33a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBunny.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.HashMap; import java.util.HashSet; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphChicken.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphChicken.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java index 6e3be5fce..dcf03e51c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphChicken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.ChatColor; import org.bukkit.EntityEffect; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphCow.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphCow.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java index 96dcda738..f16a35bce 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphCow.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.Material; import org.bukkit.Sound; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphCreeper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphCreeper.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java index 8c9419476..d2d5b0954 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphCreeper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphEnderman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphEnderman.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java index 72c6518d6..e6341e98b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphEnderman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.Color; import org.bukkit.Effect; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphGeno.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphGeno.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java index 628531f40..0eb48894d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphGeno.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphNotch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphNotch.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java index a262c149e..7671cd11c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphNotch.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPig.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPig.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java index d42b43023..5a44e8322 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPig.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.HashSet; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java index 13c83e5d9..1e155f20c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphSlime.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java index 4737cf7ad..6813bbcb3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import org.bukkit.Material; import org.bukkit.Sound; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java index ed61f6511..1e36b454e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.HashMap; import java.util.HashSet; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java index 985247b53..def1ee383 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.HashSet; import java.util.Iterator; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java index 506ffc717..1d2bde3bb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.morph; import java.util.ArrayList; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitRaveSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitRaveSuit.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java index 2834498a4..cd43be616 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitRaveSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.outfit; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitSpaceSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java similarity index 94% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitSpaceSuit.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java index fe25b7843..c634500b2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitSpaceSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.outfit; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitTeam.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java similarity index 99% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitTeam.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java index 9090eb81e..c994f299c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/OutfitTeam.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.outfit; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleEnchant.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleEnchant.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java index 1225728a4..38a505914 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleEnchant.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.GameMode; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFairy.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFairy.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java index 2c6c70091..742355fe0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFairy.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFairyData.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairyData.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFairyData.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairyData.java index 00d4cd895..424f61382 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFairyData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairyData.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFireRings.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFireRings.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java index 3537558d2..ba639675a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFireRings.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.GameMode; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFoot.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFoot.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java index 1e68a3d93..e156de492 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleFoot.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import java.util.HashMap; import java.util.Iterator; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java similarity index 57% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index b6f57d15b..1b0c142f8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import java.util.HashSet; import java.util.Iterator; @@ -24,11 +24,11 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.gadget.GadgetManager; -public class ParticleBlizzard extends ParticleGadget +public class ParticleFrostLord extends ParticleGadget { private HashSet _arrows = new HashSet(); - public ParticleBlizzard(GadgetManager manager) + public ParticleFrostLord(GadgetManager manager) { super(manager, "Frost Lord", new String[] { @@ -84,81 +84,4 @@ public class ParticleBlizzard extends ParticleGadget } } } - - @EventHandler - public void jump(PlayerToggleFlightEvent event) - { - if (!shouldDisplay(event.getPlayer())) - return; - - if (!event.getPlayer().isFlying()) - if (IsActive(event.getPlayer())) - UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, event.getPlayer().getLocation(), 0f, 0f, 0f, 0.6f, 100, - ViewDist.LONGER, UtilServer.getPlayers()); - } - - @EventHandler - public void arrow(ProjectileLaunchEvent event) - { - if (Manager.hideParticles()) - return; - - if (event.getEntity() instanceof Arrow) - { - if (event.getEntity().getShooter() != null) - { - if (GetActive().contains(event.getEntity().getShooter())) - { - _arrows.add((Arrow)event.getEntity()); - } - } - } - } - - @EventHandler - public void arrow(ProjectileHitEvent event) - { - if (!_arrows.remove(event.getEntity())) - return; - - UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, event.getEntity().getLocation(), 0f, 0f, 0f, 0.4f, 12, - ViewDist.LONGER, UtilServer.getPlayers()); - } - - @EventHandler - public void arrowClean(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; - - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Arrow arrow = arrowIterator.next(); - - if (arrow.isDead() || !arrow.isValid() || arrow.isOnGround()) - { - arrowIterator.remove(); - } - else - { - UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, arrow.getLocation(), 0f, 0f, 0f, 0f, 1, - ViewDist.LONGER, UtilServer.getPlayers()); - } - } - } - - @EventHandler - public void death(BloodEvent event) - { - if (event.getPlayer() == null) - return; - - if (!IsActive(event.getPlayer())) - return; - - if (!shouldDisplay(event.getPlayer())) - return; - - event.setItem(Material.SNOW_BALL, (byte)0); - } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleGreen.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleGreen.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java index 9a370fad1..920de097b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleGreen.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.GameMode; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java similarity index 95% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java index 61d602440..d4160c997 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import java.util.HashMap; import java.util.Iterator; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHelix.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHelix.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java index f573629ee..cc4a4882e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHelix.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.GameMode; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleKronos.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleKronos.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java index dd74addb9..02ed4ac3b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleKronos.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import java.util.HashMap; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleKronosData.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronosData.java similarity index 98% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleKronosData.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronosData.java index 5d78b2b3d..289a60099 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleKronosData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronosData.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java index 76e4d277f..6c510f664 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleLegend.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.Effect; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleRain.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java similarity index 97% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleRain.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java index 4300b5369..8d6755b3c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleRain.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.GameMode; import org.bukkit.Material; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java similarity index 55% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleTitan.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index 9ed2bbb06..8431e6f7c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -1,24 +1,15 @@ -package mineplex.core.gadget.gadgets; - -import java.util.HashSet; -import java.util.Iterator; +package mineplex.core.gadget.gadgets.particle; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.Arrow; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.util.Vector; -import mineplex.core.blood.BloodEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -28,8 +19,7 @@ import mineplex.core.updater.event.UpdateEvent; public class ParticleTitan extends ParticleGadget { - private HashSet _arrows = new HashSet(); - + private int _tick; public ParticleTitan(GadgetManager manager) @@ -112,87 +102,7 @@ public class ParticleTitan extends ParticleGadget } @EventHandler - public void jump(PlayerToggleFlightEvent event) - { - if (!shouldDisplay(event.getPlayer())) - return; - - if (!event.getPlayer().isFlying()) - if (IsActive(event.getPlayer())) - { - UtilParticle.PlayParticle(ParticleType.LAVA, event.getPlayer().getLocation(), 0f, 0f, 0f, 0.2f, 40, - ViewDist.NORMAL, UtilServer.getPlayers()); - } - - } - - @EventHandler - public void arrow(ProjectileLaunchEvent event) - { - if (Manager.hideParticles()) - return; - - if (event.getEntity() instanceof Arrow) - { - if (event.getEntity().getShooter() != null) - { - if (GetActive().contains(event.getEntity().getShooter())) - { - _arrows.add((Arrow)event.getEntity()); - } - } - } - } - - @EventHandler - public void arrow(ProjectileHitEvent event) - { - if (!_arrows.remove(event.getEntity())) - return; - - UtilParticle.PlayParticle(ParticleType.LAVA, event.getEntity().getLocation(), 0f, 0f, 0f, 0f, 24, - ViewDist.LONGER, UtilServer.getPlayers()); - } - - @EventHandler - public void arrowClean(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; - - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Arrow arrow = arrowIterator.next(); - - if (arrow.isDead() || !arrow.isValid() || arrow.isOnGround()) - { - arrowIterator.remove(); - } - else - { - UtilParticle.PlayParticle(ParticleType.FLAME, arrow.getLocation(), 0f, 0f, 0f, 0f, 1, - ViewDist.LONGER, UtilServer.getPlayers()); - } - } - } - - @EventHandler - public void death(BloodEvent event) - { - if (event.getPlayer() == null) - return; - - if (!IsActive(event.getPlayer())) - return; - - if (!shouldDisplay(event.getPlayer())) - return; - - event.setItem(Material.FIREBALL, (byte)0); - } - - @EventHandler - public void legendOwner(PlayerJoinEvent event) + public void titanOwner(PlayerJoinEvent event) { if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java new file mode 100644 index 000000000..de0705c04 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java @@ -0,0 +1,110 @@ +package mineplex.core.gadget.types; + +import java.util.HashSet; +import java.util.Iterator; + +import org.bukkit.Material; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; + +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public abstract class ArrowEffectGadget extends Gadget +{ + protected HashSet _arrows = new HashSet(); + + public ArrowEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + { + super(manager, GadgetType.ArrowTrail, name, desc, cost, mat, data); + } + + @Override + public void EnableCustom(Player player) + { + Manager.RemoveParticle(player); + + _active.add(player); + + UtilPlayer.message(player, F.main("Gadget", "You enabled " + F.elem(GetName()) + ".")); + } + + @Override + public void DisableCustom(Player player) + { + if (_active.remove(player)) + UtilPlayer.message(player, F.main("Gadget", "You disabled " + F.elem(GetName()) + ".")); + } + + public boolean shouldDisplay(Player player) + { + if (UtilPlayer.isSpectator(player)) + return false; + + if (Manager.hideParticles()) + return false; + + return true; + } + + @EventHandler + public void arrowLaunch(ProjectileLaunchEvent event) + { + if (Manager.hideParticles()) + return; + + if (event.getEntity() instanceof Arrow) + { + if (event.getEntity().getShooter() != null) + { + if (GetActive().contains(event.getEntity().getShooter())) + { + _arrows.add((Arrow)event.getEntity()); + } + } + } + } + + @EventHandler + public void clean(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) + { + Arrow arrow = arrowIterator.next(); + + if (arrow.isDead() || !arrow.isValid() || arrow.isOnGround()) + { + arrowIterator.remove(); + } + else + { + doTrail(arrow); + } + } + } + + @EventHandler + public void arrowHit(ProjectileHitEvent event) + { + if (!_arrows.remove(event.getEntity())) + return; + + doHitEffect((Arrow)event.getEntity()); + } + + public abstract void doTrail(Arrow arrow); + public abstract void doHitEffect(Arrow arrow); +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java new file mode 100644 index 000000000..fe5b96f0f --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java @@ -0,0 +1,44 @@ +package mineplex.core.gadget.types; + +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.gadget.GadgetManager; + +public abstract class DeathEffectGadget extends Gadget +{ + public DeathEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + { + super(manager, GadgetType.Death, name, desc, cost, mat, data); + } + + @Override + public void EnableCustom(Player player) + { + Manager.RemoveParticle(player); + + _active.add(player); + + UtilPlayer.message(player, F.main("Gadget", "You enabled " + F.elem(GetName()) + ".")); + } + + @Override + public void DisableCustom(Player player) + { + if (_active.remove(player)) + UtilPlayer.message(player, F.main("Gadget", "You disabled " + F.elem(GetName()) + ".")); + } + + public boolean shouldDisplay(Player player) + { + if (UtilPlayer.isSpectator(player)) + return false; + + if (Manager.hideParticles()) + return false; + + return true; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java new file mode 100644 index 000000000..a9e3ecfbf --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java @@ -0,0 +1,65 @@ +package mineplex.core.gadget.types; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerToggleFlightEvent; + +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; + +public abstract class DoubleJumpEffectGadget extends Gadget +{ + public DoubleJumpEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + { + super(manager, GadgetType.DoubleJump, name, desc, cost, mat, data); + } + + @Override + public void EnableCustom(Player player) + { + Manager.RemoveParticle(player); + + _active.add(player); + + UtilPlayer.message(player, F.main("Gadget", "You enabled " + F.elem(GetName()) + ".")); + } + + @Override + public void DisableCustom(Player player) + { + if (_active.remove(player)) + UtilPlayer.message(player, F.main("Gadget", "You disabled " + F.elem(GetName()) + ".")); + } + + public boolean shouldDisplay(Player player) + { + if (UtilPlayer.isSpectator(player)) + return false; + + if (Manager.hideParticles()) + return false; + + return true; + } + + @EventHandler + public void jump(PlayerToggleFlightEvent event) + { + if (!shouldDisplay(event.getPlayer())) + return; + + if (!event.getPlayer().isFlying()) + if (IsActive(event.getPlayer())) + { + doEffect(event.getPlayer()); + } + } + + public abstract void doEffect(Player player); +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java index 11b014b32..22de296e7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java @@ -7,4 +7,7 @@ public enum GadgetType Particle, MusicDisc, Costume, + DoubleJump, + ArrowTrail, + Death } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java index 373bb1e5d..6f69a5782 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java @@ -23,8 +23,8 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetActivateEvent; -import mineplex.core.gadget.gadgets.ItemDuelingSword; -import mineplex.core.gadget.gadgets.OutfitTeam; +import mineplex.core.gadget.gadgets.item.ItemDuelingSword; +import mineplex.core.gadget.gadgets.outfit.OutfitTeam; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.mount.event.MountActivateEvent; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java index 943acdd63..977bada57 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java @@ -15,7 +15,7 @@ import mineplex.core.common.util.UtilTextTop; import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseWither; -import mineplex.core.gadget.gadgets.MorphWither; +import mineplex.core.gadget.gadgets.morph.MorphWither; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.mount.Mount; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java index 1d55d9f03..687bf534c 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java @@ -42,7 +42,7 @@ import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetActivateEvent; -import mineplex.core.gadget.gadgets.OutfitTeam; +import mineplex.core.gadget.gadgets.outfit.OutfitTeam; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.mount.event.MountActivateEvent; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java index bf5b654ea..0fa87552c 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java @@ -28,7 +28,7 @@ import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilPlayer; import mineplex.core.event.StackerEvent; -import mineplex.core.gadget.gadgets.MorphBlock; +import mineplex.core.gadget.gadgets.morph.MorphBlock; import mineplex.core.gadget.types.GadgetType; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileManager; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java index dd31d4703..b38a8f6af 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java @@ -20,7 +20,7 @@ import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.creature.event.CreatureKillEntitiesEvent; import mineplex.core.event.StackerEvent; -import mineplex.core.gadget.gadgets.MorphBlock; +import mineplex.core.gadget.gadgets.morph.MorphBlock; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.give.Give; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 7f65cc868..dd35974de 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -16,7 +16,7 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseLiving; import mineplex.core.disguise.disguises.DisguiseWither; -import mineplex.core.gadget.gadgets.MorphWither; +import mineplex.core.gadget.gadgets.morph.MorphWither; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.minecraft.game.core.condition.Condition.ConditionType; From 49c735e43cdb8c3c269bc1bc200e2c4821c67b86 Mon Sep 17 00:00:00 2001 From: Cheese Date: Sat, 5 Dec 2015 10:34:06 +1100 Subject: [PATCH 051/223] removed duplicate code --- .../gadget/gadgets/doublejump/DoubleJumpTitan.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java index f0ecce644..618c8eff3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -38,20 +38,6 @@ public class DoubleJumpTitan extends DoubleJumpEffectGadget ViewDist.NORMAL, UtilServer.getPlayers()); } - @EventHandler - public void jump(PlayerToggleFlightEvent event) - { - if (!shouldDisplay(event.getPlayer())) - return; - - if (!event.getPlayer().isFlying()) - if (IsActive(event.getPlayer())) - { - UtilParticle.PlayParticle(ParticleType.LAVA, event.getPlayer().getLocation(), 0f, 0f, 0f, 0.2f, 40, - ViewDist.NORMAL, UtilServer.getPlayers()); - } - } - @EventHandler public void titanOwner(PlayerJoinEvent event) { From d7497ec09881047d7461630fac2c3b51bf37a06c Mon Sep 17 00:00:00 2001 From: fooify Date: Fri, 4 Dec 2015 15:56:48 -0800 Subject: [PATCH 052/223] Fixed Micro Battle icon not appearing in stats menu --- .../src/mineplex/core/achievement/AchievementCategory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index fa8e6c577..8805b3b91 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -137,7 +137,7 @@ public enum AchievementCategory MICRO_BATTLE("Micro Battle", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, - Material.LAVA, 0, GameCategory.ARCADE, null), + Material.LAVA_BUCKET, 0, GameCategory.ARCADE, null), BOMB_LOBBERS("Bomb Lobbers", null, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, From 9bd7869e2260e23a0ff981b7084ff9b4a3768b43 Mon Sep 17 00:00:00 2001 From: Keir Date: Sat, 5 Dec 2015 01:08:21 +0000 Subject: [PATCH 053/223] Fix typo, "_hubInvisibilityToggled" was checked twice, whilst "_hubIgnoreVelocityToggled" was not checked at all. This causes hub velocity changes to not be saved. --- .../mineplex/core/preferences/ui/ExclusivePreferencesPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java index 53c774a0e..272b5fe38 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java @@ -189,6 +189,6 @@ public class ExclusivePreferencesPage extends ShopPageBase Date: Sat, 5 Dec 2015 21:36:07 -0500 Subject: [PATCH 054/223] Forgot to push these changes last update! --- .../src/mineplex/game/clans/Clans.java | 2 +- .../mineplex/game/clans/clans/ClansDataAccessLayer.java | 8 ++++---- .../clans/tutorials/gettingstarted/TaskLeaveSpawn.java | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java index 214707cd7..ce3ff1b86 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -49,7 +49,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer; public class Clans extends JavaPlugin { - public static final String VERSION = "0.17"; + public static final String VERSION = "0.17b"; private String WEB_CONFIG = "webServer"; // Modules diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java index eea8309b6..9d06f8fa4 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java @@ -656,6 +656,10 @@ public class ClansDataAccessLayer { final Timestamp currentTime = new Timestamp(System.currentTimeMillis()); final ClanWarData war = new ClanWarData(clanA.getName(), clanB.getName(), score, currentTime, currentTime, 0); + + // Memory + clanA.addWar(war); + clanB.addWar(war); runAsync(new Runnable() { @@ -669,10 +673,6 @@ public class ClansDataAccessLayer @Override public void run() { - // Memory - clanA.addWar(war); - clanB.addWar(war); - _manager.log("Initiator war for [" + clanA.getName() + "] against [" + clanB.getName() + "]."); if (warCallback != null) warCallback.run(war); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java index 37bea2964..5f0f7926c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java @@ -33,6 +33,7 @@ public class TaskLeaveSpawn extends TutorialTask if (player.getLocation().getY() < 100) { finishFor(player); + _inTask.remove(player.getName()); } } @@ -50,7 +51,7 @@ public class TaskLeaveSpawn extends TutorialTask String playerName = iterator.next(); Player player = UtilPlayer.searchExact(playerName); - if (player.getLocation().getY() < 100 && getClans().getClanUtility().getClaim(player.getLocation()) == null) + if (player != null && player.getLocation().getY() < 100 && getClans().getClanUtility().getClaim(player.getLocation()) == null) { finishFor(player); iterator.remove(); From a9c7f088f34fb04fb873685348046942d87d70e7 Mon Sep 17 00:00:00 2001 From: NewGarbo Date: Sun, 6 Dec 2015 19:10:18 +0000 Subject: [PATCH 055/223] made use ability teleport player back to where they should be --- .../game/clans/tutorials/gettingstarted/TaskUseAbility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java index ee85950da..c94324660 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java @@ -43,7 +43,7 @@ public class TaskUseAbility extends TutorialTask + "Purchase an Iron Axe from the PvP Shop. " + "Right-Click with your Iron Axe to use your Axe Ability!"; -// _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); + _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); } private NautHashMap> _bought = new NautHashMap<>(); From 64f8ee728006f1cf4ec56a4fee64de49d2c7a39c Mon Sep 17 00:00:00 2001 From: Sarah Date: Sun, 6 Dec 2015 21:48:21 +0100 Subject: [PATCH 056/223] fixing some timings. --- .../arcade/gametutorial/GameTutorial.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index ac63bc328..fd28fe9de 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -83,11 +83,19 @@ public abstract class GameTutorial onEnd(); _hasEnded = true; endTutorial(); - Manager.getPluginManager().callEvent(new GameTutorialEndEvent(this)); + final GameTutorial tutorial = this; + Manager.runSyncLater(new Runnable() + { + @Override + public void run() + { + Manager.getPluginManager().callEvent(new GameTutorialEndEvent(tutorial)); + } + }, 5); } else { - Manager.GetChat().Silence(7000, false); + Manager.GetChat().Silence(70000, false); onPhaseChange(_currentPhase); Manager.getPluginManager().callEvent(new GameTutorialPhaseEvent(this, from, _currentPhase)); _currentPhase.start(phaseOne); @@ -101,11 +109,18 @@ public abstract class GameTutorial private void endTutorial() { - for(Player player : _players.keySet()) + for(final Player player : _players.keySet()) { VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); - player.setAllowFlight(false); - player.setFlying(false); + Manager.runSyncLater(new Runnable() + { + @Override + public void run() + { + player.setAllowFlight(false); + player.setFlying(false); + } + }, 5); if(TeleportOnEnd) { Manager.runSyncLater(new Runnable() From 10d26ca32ba58e8493f12c84b3fb00a98147c323 Mon Sep 17 00:00:00 2001 From: Sarah Date: Sun, 6 Dec 2015 22:41:04 +0100 Subject: [PATCH 057/223] timer fixes. --- .../game/arcade/gametutorial/GameTutorial.java | 7 ++++++- .../game/arcade/managers/GameManager.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index fd28fe9de..5a0207e30 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -54,7 +54,7 @@ public abstract class GameTutorial for(TutorialPhase phase : _phases) phase.setTutorial(this); - Manager.GetGame().PrepareTime = 60000; + //Manager.GetGame().PrepareTime = 60000; Manager.GetChat().Silence(60000, false); _started = System.currentTimeMillis(); Manager.getPluginManager().callEvent(new GameTutorialStartEvent(this)); @@ -213,6 +213,11 @@ public abstract class GameTutorial return _tick; } + public TutorialPhase[] getPhases() + { + return _phases; + } + public long getTutorialStart() { return _started; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 9c60cc850..a4fac6a32 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -36,6 +36,8 @@ import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.uhc.UHC; import nautilus.game.arcade.gametutorial.GameTutorial; +import nautilus.game.arcade.gametutorial.TutorialPhase; +import nautilus.game.arcade.gametutorial.TutorialText; import org.bukkit.ChatColor; import org.bukkit.Color; @@ -147,14 +149,25 @@ public class GameManager implements Listener if(player.getWorld() == Manager.GetLobby().GetSpawn().getWorld()) return true; } + long prepTime = 0; for(GameTeam team : game.GetTeamList()) { + long timeUsage = 0; if(team.getTutorial() != null) { if(!team.getTutorial().hasStarted()) { team.getTutorial().setTeam(team); team.getTutorial().start(); + timeUsage = team.getTutorial().StartAfterTutorial; + timeUsage = timeUsage + (team.getTutorial().TimeBetweenPhase * team.getTutorial().getPhases().length); + for(TutorialPhase phase : team.getTutorial().getPhases()) + { + for(TutorialText text : phase.getText()) + { + timeUsage = timeUsage + (text.getStayTime() * 50); + } + } } if(!team.getTutorial().hasEnded()) { @@ -168,7 +181,12 @@ public class GameManager implements Listener finished = true; } } + if(prepTime <= timeUsage) + prepTime = timeUsage; } + if(prepTime > 0) + Manager.GetGame().PrepareTime = prepTime; + if(!finished) return true; } From 072856be7ddb64cf3951b41b5b5c22cb307e553e Mon Sep 17 00:00:00 2001 From: Sarah Date: Sun, 6 Dec 2015 23:19:53 +0100 Subject: [PATCH 058/223] teleportations. --- .../game/arcade/gametutorial/TutorialPhase.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index d583f5014..b140b79bc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -74,12 +74,15 @@ public abstract class TutorialPhase @Override public void run() { - for(Player player : _tutorial.getPlayers().keySet()) + if(!_hasEnded && !getTutorial().hasEnded()) { - player.setAllowFlight(true); - player.setFlying(true); - player.teleport(_location); - } + for(Player player : _tutorial.getPlayers().keySet()) + { + player.setAllowFlight(true); + player.setFlying(true); + player.teleport(_location); + } + } } }); try From b2a595b01b1f57077a5307f5f497e1ceed12e9ee Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 12:02:53 +1100 Subject: [PATCH 059/223] snwo fight changes --- .../game/games/snowfight/SnowFight.java | 61 ++++++------ .../game/games/snowfight/kits/KitMedic.java | 94 +------------------ .../games/snowfight/kits/KitSportsman.java | 39 ++------ .../games/snowfight/kits/KitTactician.java | 77 ++------------- .../arcade/kit/perks/PerkPotionGenerator.java | 84 +++++++++++++++++ 5 files changed, 135 insertions(+), 220 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index 492f82da9..5e8be4cd6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -201,27 +201,29 @@ public class SnowFight extends TeamGame return; // Item - - if (!_tiles.containsKey(player)) - { - _tiles.put(player, 0); - } - - if (GetKit(player) instanceof KitSportsman) - UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); - - - int tiles = _tiles.get(player); - _tiles.put(player, tiles + 1); - - if (!(GetKit(player) instanceof KitSportsman)) - { - if (_tiles.get(player) == 2) - { - UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); - _tiles.put(player, 0); - } - } +// +// if (!_tiles.containsKey(player)) +// { +// _tiles.put(player, 0); +// } +// +// if (GetKit(player) instanceof KitSportsman) +// UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); +// +// +// int tiles = _tiles.get(player); +// _tiles.put(player, tiles + 1); +// +// if (!(GetKit(player) instanceof KitSportsman)) +// { +// if (_tiles.get(player) == 2) +// { +// UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); +// _tiles.put(player, 0); +// } +// } + + UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); // Snow Height SnowDecrease(event.getBlock(), 1); @@ -606,16 +608,19 @@ public class SnowFight extends TeamGame long time = 1000 * 195 - (System.currentTimeMillis() - this.GetStateTime()); - if (time > 0) + if(IsLive()) { - Scoreboard.Write(C.cYellow + C.Bold + "Meteors"); - if(IsLive()) + if (time > 0) + { + Scoreboard.Write(C.cYellow + C.Bold + "Meteors in"); Scoreboard.Write(UtilTime.MakeStr(time, 0)); + } + else + { + Scoreboard.Write(C.cGold + C.Bold + "Meteors!"); + } } - else - { - Scoreboard.Write(C.cGold + C.Bold + "Meteors!"); - } + Scoreboard.Draw(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java index efebaf42e..4c524b981 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java @@ -1,30 +1,17 @@ package nautilus.game.arcade.game.games.snowfight.kits; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; 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.PerkPotionGenerator; -import org.bukkit.Color; import org.bukkit.Material; -import org.bukkit.entity.Egg; -import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.potion.Potion; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionType; public class KitMedic extends Kit @@ -36,20 +23,12 @@ public class KitMedic extends Kit new String[] { - "To the rescue...!", - " ", - "Gets 1 Snowball every second tile.", - "Left-Click Snow to pick up Snowballs (Max. 16)", - "Right-Click Snowballs to throw them.", - " ", - "Gets 1 Healing Potion every 32 seconds [max. 1]", - "Slowness II when hit.", - " ", - "Supports all nearby allies with REGENERATION." + "Throw warmth potions to heal allies!", }, new Perk[] { + new PerkPotionGenerator("Warmth Potions", 30, 1, PotionType.INSTANT_HEAL, true, "Warmth Potion", false) }, EntityType.SKELETON, new ItemStack(Material.POTION)); @@ -62,6 +41,8 @@ public class KitMedic extends Kit { player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); } @Override @@ -72,69 +53,4 @@ public class KitMedic extends Kit ent.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); ent.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); } - - @EventHandler - public void Aura(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - for (Player player : Manager.GetGame().GetPlayers(true)) - { - if (!HasKit(player)) - continue; - - for (Player other : Manager.GetGame().GetPlayers(true)) - { - if (other.equals(player)) - continue; - - if (UtilMath.offset(player, other) > 4) - continue; - - if( Manager.GetGame().GetTeam(player).equals(Manager.GetGame().GetTeam(other))) - Manager.GetCondition().Factory().Regen("Aura", other, player, 1.9, 0, false, false, false); - } - } - } - - @EventHandler - public void KitItems(UpdateEvent event) - { - if(!Manager.GetGame().IsLive()) - return; - - if (event.getType() == UpdateType.SLOWEST) - { - for (Player player : Manager.GetGame().GetPlayers(true)) - { - if (!HasKit(player)) - continue; - - Potion potion = new Potion(PotionType.INSTANT_HEAL); - potion.setSplash(true); - player.getInventory().setItem(1, potion.toItemStack(1)); - } - } - } - - @EventHandler - public void Splash(PotionSplashEvent event) - { - if(event.getEntity().getShooter() instanceof Player) - { - if(!HasKit((Player) event.getEntity().getShooter())) - return; - - for(Entity entity : event.getAffectedEntities()) - { - if(entity instanceof Player) - { - Manager.GetCondition().Factory().Slow("Heal Potion", (Player)entity, (Player)event.getEntity().getShooter(), 5.0, 1, false, false, false, false); - } - } - - } - } - } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java index 43bd655e3..1bf093f0a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java @@ -19,6 +19,7 @@ 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.PerkDoubleJump; import nautilus.game.arcade.kit.perks.PerkFallDamage; public class KitSportsman extends Kit @@ -31,17 +32,13 @@ public class KitSportsman extends Kit new String[] { "Trained to be the fastest on snow and ice.", - "", - "Gets 1 Snowball every tile", - "Left-Click Snow to pick up Snowballs (Max. 16)", - "Right-Click Snowballs to throw them.", - "", - "Supports all nearby allies with SPEED." + }, new Perk[] { - new PerkFallDamage(3) + new PerkDoubleJump("Snow Jump", 1, 0.8, true, 8000, true), + new PerkFallDamage(2), }, EntityType.SKELETON, new ItemStack(Material.SNOW_BALL)); @@ -53,6 +50,8 @@ public class KitSportsman extends Kit { player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); } @Override @@ -63,30 +62,4 @@ public class KitSportsman extends Kit ent.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); ent.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); } - - @EventHandler - public void Aura(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - for (Player player : Manager.GetGame().GetPlayers(true)) - { - if (!HasKit(player)) - continue; - - for (Player other : Manager.GetGame().GetPlayers(true)) - { - if (other.equals(player)) - continue; - - if (UtilMath.offset(player, other) > 4) - continue; - - if( Manager.GetGame().GetTeam(player).equals(Manager.GetGame().GetTeam(other))) - Manager.GetCondition().Factory().Speed("Aura", other, player, 1.9, 0, false, false, false); - } - } - } - } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java index a0aec26c1..f69d290d5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java @@ -1,27 +1,18 @@ package nautilus.game.arcade.game.games.snowfight.kits; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.condition.Condition.ConditionType; 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.PerkFallDamage; +import nautilus.game.arcade.kit.perks.PerkConstructor; +import nautilus.game.arcade.kit.perks.PerkIronSkin; -import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.potion.PotionType; public class KitTactician extends Kit { @@ -32,18 +23,11 @@ public class KitTactician extends Kit new String[] { "No Snowfight is complete without a tactical game!", - " ", - "Gets 1 Snowball every second tile.", - "Left-Click Snow to pick up Snowballs (Max. 16)", - "Right-Click Snowballs to throw them.", - " ", - "Gets 1 Barrier every 32 seconds [max. 2]", - "Place Barriers to improve your defense.", - "You cant place Barriers above Ice, Packed Ice or Fences.", - " ", - "Supports all nearby allies with RESISTANCE." + }, new Perk[] { + new PerkConstructor("Barrier", 30, 1, Material.FENCE, "Warmth Potion", false), + new PerkIronSkin(0.25) }, EntityType.SKELETON, new ItemStack(Material.FENCE)); @@ -55,6 +39,8 @@ public class KitTactician extends Kit { player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); player.getInventory().setItem(7, ItemStackFactory.Instance.CreateStack(Material.COMPASS.getId(), (byte) 0, 1, "§a§lTracking Compass")); } @@ -66,53 +52,4 @@ public class KitTactician extends Kit ent.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); ent.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); } - - @EventHandler - public void Aura(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - for (Player player : Manager.GetGame().GetPlayers(true)) - { - if (!HasKit(player)) - continue; - - for (Player other : Manager.GetGame().GetPlayers(true)) - { - if (other.equals(player)) - continue; - - if (UtilMath.offset(player, other) > 4) - continue; - - if( Manager.GetGame().GetTeam(player).equals(Manager.GetGame().GetTeam(other))) - Manager.GetCondition().Factory().Protection("Aura", other, player, 1.9, 0, false, false, false); - } - } - } - - @EventHandler - public void KitItems(UpdateEvent event) - { - if(!Manager.GetGame().IsLive()) - return; - - if (event.getType() == UpdateType.SLOWEST) - { - for (Player player : Manager.GetGame().GetPlayers(true)) - { - if (!HasKit(player)) - continue; - - int amount = 0; - if (player.getInventory().getItem(1) != null && UtilInv.contains(player, Material.FENCE, (byte) 0, 1)) - amount = 2; - else - amount = 1; - player.getInventory().setItem(1, ItemStackFactory.Instance.CreateStack(Material.FENCE, (byte) 0, amount, "Barrier")); - } - } - } - } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java new file mode 100644 index 000000000..5f355428e --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java @@ -0,0 +1,84 @@ +package nautilus.game.arcade.kit.perks; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilServer; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.event.PerkConstructorEvent; + +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionType; + +public class PerkPotionGenerator extends Perk +{ + private int _max = 0; + private double _time = 0; + + private PotionType _type; + private boolean _splash; + private String _name; + + public PerkPotionGenerator(String perkName, double time, int max, PotionType type, boolean splash, String name, boolean visible) + { + super(perkName, new String[] + { + C.cGray + "Receive 1 " + name + " every " + time + " seconds. Maximum of " + max + ".", + }, visible); + + _time = time; + _splash = splash; + + _name = name; + } + + @EventHandler + public void Construct(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + for (Player cur : UtilServer.getPlayers()) + { + if (!Kit.HasKit(cur)) + continue; + + if (!Manager.GetGame().IsAlive(cur)) + continue; + + if (Manager.isSpectator(cur)) + continue; + + if (!Recharge.Instance.use(cur, GetName(), (long) (_time * 1000), false, false)) + continue; + + Potion potion = new Potion(_type); + potion.setSplash(_splash); + ItemStack stack = potion.toItemStack(1); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(_name); + + if (UtilInv.contains(cur, stack.getType(), (byte)0, _max)) + continue; + + PerkConstructorEvent cE = new PerkConstructorEvent(cur); + Bukkit.getServer().getPluginManager().callEvent(cE); + + if (cE.isCancelled()) + continue; + + //Add + cur.getInventory().addItem(stack); + + cur.playSound(cur.getLocation(), Sound.ITEM_PICKUP, 2f, 1f); + } + } +} From c36182b8d4403f648eb2b9bd72a985f4b9b18fac Mon Sep 17 00:00:00 2001 From: xGamingDudex Date: Mon, 7 Dec 2015 02:53:14 +0100 Subject: [PATCH 060/223] Cosmetic Update New: + New GUI System + Candy Cane Particle + Candy Cane Double Jump + Candy Cane Death Effect + Candy Cane Arrow Trail + Snowman Morph + Baby Reindeer Mount + Pet Coal Apparition Fixed/Updated: * Added getTick to UpdateEvent and UtilTime * Added more methods to UtilParticle * Gadget manager isMoving now counts flying as moving * Updated some cosmetics --- .../core/common/util/UtilParticle.java | 13 ++ .../mineplex/core/common/util/UtilTime.java | 11 ++ .../cosmetic/ui/button/OpenArrowTrails.java | 23 +++ .../ui/button/OpenDeathAnimations.java | 23 +++ .../cosmetic/ui/button/OpenDoubleJump.java | 23 +++ .../core/cosmetic/ui/button/OpenHats.java | 23 +++ .../core/cosmetic/ui/page/ArrowTrailPage.java | 53 +++++++ .../cosmetic/ui/page/DeathEffectPage.java | 53 +++++++ .../core/cosmetic/ui/page/DoubleJumpPage.java | 53 +++++++ .../core/cosmetic/ui/page/HatPage.java | 57 ++++++++ .../mineplex/core/cosmetic/ui/page/Menu.java | 133 ++++++++++-------- .../core/cosmetic/ui/page/MorphPage.java | 2 + .../core/cosmetic/ui/page/TauntPage.java | 57 ++++++++ .../mineplex/core/gadget/GadgetManager.java | 132 ++++++++++++----- .../arrowtrail/ArrowTrailCandyCane.java | 48 +++++++ .../arrowtrail/ArrowTrailFrostLord.java | 6 +- .../gadget/gadgets/death/DeathCandyCane.java | 49 +++++++ .../gadget/gadgets/death/DeathFrostLord.java | 6 +- .../doublejump/DoubleJumpCandyCane.java | 36 +++++ .../doublejump/DoubleJumpFrostLord.java | 10 +- .../gadgets/doublejump/DoubleJumpTitan.java | 1 + .../gadget/gadgets/item/ItemDuelingSword.java | 3 +- .../gadget/gadgets/item/ItemPaintbrush.java | 3 +- .../gadget/gadgets/morph/MorphSnowman.java | 127 +++++++++++++++++ .../gadget/gadgets/outfit/OutfitTeam.java | 3 +- .../gadgets/particle/ParticleCandyCane.java | 93 ++++++++++++ .../gadgets/particle/ParticleFrostLord.java | 6 +- .../core/gadget/types/ArrowEffectGadget.java | 6 +- .../core/gadget/types/DeathEffectGadget.java | 2 +- .../gadget/types/DoubleJumpEffectGadget.java | 2 +- .../core/gadget/types/GadgetType.java | 4 +- .../core/gadget/types/ItemGadget.java | 4 +- .../core/gadget/types/MorphGadget.java | 2 +- .../core/gadget/types/OutfitGadget.java | 2 +- .../core/gadget/types/ParticleGadget.java | 3 +- .../src/mineplex/core/mount/MountManager.java | 2 + .../core/mount/types/MountBabyReindeer.java | 92 ++++++++++++ .../mineplex/core/mount/types/MountTitan.java | 6 + .../src/mineplex/core/pet/PetFactory.java | 16 +-- .../src/mineplex/core/pet/PetManager.java | 99 ++++++++----- .../core/pet/types/PetCoalApparition.java | 14 ++ .../core/updater/event/UpdateEvent.java | 6 + .../game/arcade/command/DisguiseCommand.java | 2 +- 43 files changed, 1132 insertions(+), 177 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/ArrowTrailPage.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DeathEffectPage.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DoubleJumpPage.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/TauntPage.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java index d7896c943..bacca401f 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java @@ -283,4 +283,17 @@ public class UtilParticle UtilPlayer.sendPacket(player, packet); } } + + public static void PlayParticleToAll(String particle, Location location, Vector offset, float speed, int count, ViewDist dist) + { + PlayParticle(particle, location, (float) offset.getX(), (float) offset.getY(), (float) offset.getZ(), speed, count, dist, UtilServer.getPlayers()); + } + + public static void PlayParticleToAll(String particle, Location location, float offsetX, float offsetY, float offsetZ, + float speed, int count, ViewDist dist) + { + PlayParticle(particle, location, offsetX, offsetY, offsetZ, speed, count, dist, UtilServer.getPlayers()); + } + + } \ No newline at end of file diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilTime.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilTime.java index 908272bc6..5d5174f16 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilTime.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilTime.java @@ -3,6 +3,8 @@ package mineplex.core.common.util; import java.text.SimpleDateFormat; import java.util.Calendar; +import net.minecraft.server.v1_8_R3.MinecraftServer; + public class UtilTime { public static final String DATE_FORMAT_NOW = "MM-dd-yyyy HH:mm:ss"; @@ -41,6 +43,15 @@ public class UtilTime default: return "th"; } } + + /** + * + * @return Returns the current global server tick. Is reset on server restart. Starts out negative. Counts upwards. + */ + public static int getServerTick() + { + return MinecraftServer.currentTick; + } public enum TimeUnit { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java new file mode 100644 index 000000000..2664fb9c7 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java @@ -0,0 +1,23 @@ +package mineplex.core.cosmetic.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.cosmetic.ui.page.ArrowTrailPage; +import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.shop.item.IButton; + +public class OpenArrowTrails implements IButton +{ + private Menu _page; + + public OpenArrowTrails(Menu page) + { + _page = page; + } + + public void onClick(Player player, ClickType clickType) + { + _page.getShop().openPageForPlayer(player, new ArrowTrailPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Arrow Trails", player)); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java new file mode 100644 index 000000000..fad54be30 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java @@ -0,0 +1,23 @@ +package mineplex.core.cosmetic.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.cosmetic.ui.page.DeathEffectPage; +import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.shop.item.IButton; + +public class OpenDeathAnimations implements IButton +{ + private Menu _page; + + public OpenDeathAnimations(Menu page) + { + _page = page; + } + + public void onClick(Player player, ClickType clickType) + { + _page.getShop().openPageForPlayer(player, new DeathEffectPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Death Animations", player)); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java new file mode 100644 index 000000000..b433181c8 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java @@ -0,0 +1,23 @@ +package mineplex.core.cosmetic.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.cosmetic.ui.page.DoubleJumpPage; +import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.shop.item.IButton; + +public class OpenDoubleJump implements IButton +{ + private Menu _page; + + public OpenDoubleJump(Menu page) + { + _page = page; + } + + public void onClick(Player player, ClickType clickType) + { + _page.getShop().openPageForPlayer(player, new DoubleJumpPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Double Jump Effects", player)); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java new file mode 100644 index 000000000..48cd8a98c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java @@ -0,0 +1,23 @@ +package mineplex.core.cosmetic.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.cosmetic.ui.page.HatPage; +import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.shop.item.IButton; + +public class OpenHats implements IButton +{ + private Menu _page; + + public OpenHats(Menu page) + { + _page = page; + } + + public void onClick(Player player, ClickType clickType) + { + _page.getShop().openPageForPlayer(player, new HatPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Hats", player)); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/ArrowTrailPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/ArrowTrailPage.java new file mode 100644 index 000000000..09ee4c247 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/ArrowTrailPage.java @@ -0,0 +1,53 @@ +package mineplex.core.cosmetic.ui.page; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.ui.CosmeticShop; +import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.shop.item.IButton; +import mineplex.core.shop.item.ShopItem; + +public class ArrowTrailPage extends GadgetPage +{ + + public ArrowTrailPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, + Player player) + { + super(plugin, shop, clientManager, donationManager, name, player); + } + + @Override + protected void buildPage() + { + int slot = 19; + + for (Gadget gadget : getPlugin().getGadgetManager().getGadgets(GadgetType.ArrowTrail)) + { + addGadget(gadget, slot); + + if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) + addGlow(slot); + + slot++; + + if (slot == 26) + slot = 28; + } + + addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() + { + public void onClick(Player player, ClickType clickType) + { + getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player)); + } + }); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DeathEffectPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DeathEffectPage.java new file mode 100644 index 000000000..838c60806 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DeathEffectPage.java @@ -0,0 +1,53 @@ +package mineplex.core.cosmetic.ui.page; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.ui.CosmeticShop; +import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.shop.item.IButton; +import mineplex.core.shop.item.ShopItem; + +public class DeathEffectPage extends GadgetPage +{ + + public DeathEffectPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, + String name, Player player) + { + super(plugin, shop, clientManager, donationManager, name, player); + } + + @Override + protected void buildPage() + { + int slot = 19; + + for (Gadget gadget : getPlugin().getGadgetManager().getGadgets(GadgetType.Death)) + { + addGadget(gadget, slot); + + if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) + addGlow(slot); + + slot++; + + if (slot == 26) + slot = 28; + } + + addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() + { + public void onClick(Player player, ClickType clickType) + { + getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player)); + } + }); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DoubleJumpPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DoubleJumpPage.java new file mode 100644 index 000000000..43efbee35 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/DoubleJumpPage.java @@ -0,0 +1,53 @@ +package mineplex.core.cosmetic.ui.page; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.ui.CosmeticShop; +import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.shop.item.IButton; +import mineplex.core.shop.item.ShopItem; + +public class DoubleJumpPage extends GadgetPage +{ + + public DoubleJumpPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, + Player player) + { + super(plugin, shop, clientManager, donationManager, name, player); + } + + @Override + protected void buildPage() + { + int slot = 19; + + for (Gadget gadget : getPlugin().getGadgetManager().getGadgets(GadgetType.DoubleJump)) + { + addGadget(gadget, slot); + + if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) + addGlow(slot); + + slot++; + + if (slot == 26) + slot = 28; + } + + addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() + { + public void onClick(Player player, ClickType clickType) + { + getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player)); + } + }); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java new file mode 100644 index 000000000..8ea9fff22 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java @@ -0,0 +1,57 @@ +package mineplex.core.cosmetic.ui.page; + +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.ui.CosmeticShop; +import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.shop.item.IButton; +import mineplex.core.shop.item.ShopItem; + +public class HatPage extends GadgetPage +{ + + + public HatPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, + Player player) + { + super(plugin, shop, clientManager, donationManager, name, player); + } + + @Override + protected void buildPage() + { + int slot = 19; + + List list = getPlugin().getGadgetManager().getGadgets(GadgetType.Hat); + if(list != null) + for (Gadget gadget : list) + { + addGadget(gadget, slot); + + if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) + addGlow(slot); + + slot++; + + if (slot == 26) + slot = 28; + } + + addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() + { + public void onClick(Player player, ClickType clickType) + { + getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player)); + } + }); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index e77751779..143794f24 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -6,15 +6,19 @@ import org.bukkit.entity.Creature; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; import mineplex.core.account.CoreClientManager; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; +import mineplex.core.common.util.F; import mineplex.core.cosmetic.CosmeticManager; import mineplex.core.cosmetic.ui.CosmeticShop; +import mineplex.core.cosmetic.ui.button.OpenArrowTrails; import mineplex.core.cosmetic.ui.button.OpenCostumes; +import mineplex.core.cosmetic.ui.button.OpenDeathAnimations; +import mineplex.core.cosmetic.ui.button.OpenDoubleJump; import mineplex.core.cosmetic.ui.button.OpenGadgets; +import mineplex.core.cosmetic.ui.button.OpenHats; import mineplex.core.cosmetic.ui.button.OpenMorphs; import mineplex.core.cosmetic.ui.button.OpenMounts; import mineplex.core.cosmetic.ui.button.OpenMusic; @@ -66,67 +70,80 @@ public class Menu extends ShopPageBase ChatColor.RESET + "Receives 30000 Coins per Month" }, 1, false)); -// addItem(6, new ShopItem(Material.GOLD_INGOT, donor.getGold() + " Gold", new String[] { -// " " -// }, 1, false)); - - addButton(18, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this)); - addButton(20, new ShopItem(Material.BOW, "Gadgets", 1, false), new OpenGadgets(this)); - addButton(22, new ShopItem(Material.LEATHER, "Morphs", 1, false), new OpenMorphs(this)); - addButton(24, new ShopItem(Material.IRON_BARDING, "Mounts", 1, false), new OpenMounts(this)); - addButton(26, new ShopItem(Material.BONE, "Pets", 1, false), new OpenPets(this)); - // - addButton(48, new ShopItem(Material.GOLD_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); - addButton(50, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); - - if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Particle) != null) - { - final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Particle); - - addButton(18 + 9, - new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), ChatColor.RESET + C.mItem + gadget.GetName(), new String[]{}, 1, false, false), - new IButton() - { - public void onClick(Player player, ClickType clickType) - { - playAcceptSound(player); - gadget.Disable(player); - refresh(); - } - }); - } - - if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Item) != null) - { - final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Item); - - addButton(20 + 9, - new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), ChatColor.RESET + C.mItem + gadget.GetName(), new String[]{}, 1, false, false), - new IButton() - { - public void onClick(Player player, ClickType clickType) - { - playAcceptSound(player); - gadget.Disable(player); - refresh(); - } - }); - } + addButton(10, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this)); + addButton(12, new ShopItem(Material.ARROW, "Arrow Trails", 1, false), new OpenArrowTrails(this)); + addButton(14, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", 1, false), new OpenDoubleJump(this)); + addButton(16, new ShopItem(Material.SKULL_ITEM, "Death Animations", 1, false), new OpenDeathAnimations(this)); - if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) != null) + addButton(28, new ShopItem(Material.MELON_BLOCK, "Gadgets", 1, false), new OpenGadgets(this)); + addButton(30, new ShopItem(Material.LEATHER, "Morphs", 1, false), new OpenMorphs(this)); + addButton(32, new ShopItem(Material.IRON_BARDING, "Mounts", 1, false), new OpenMounts(this)); + addButton(34, new ShopItem(Material.BONE, "Pets", 1, false), new OpenPets(this)); + + addButton(46, new ShopItem(Material.GOLD_HELMET, "Hats", 1, false), new OpenHats(this)); + addButton(48, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); + addButton(50, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); + addButton(52, new ShopItem(Material.NAME_TAG, "Taunts", 1, false), new IButton() { - final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph); - - addButton(22 + 9, - new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), ChatColor.RESET + C.mItem + gadget.GetName(), new String[]{}, 1, false, false), + @Override + public void onClick(Player player, ClickType clickType) + { + player.sendMessage(F.main("Shop", "Comming soon!")); + } + }); + + for(GadgetType type : GadgetType.values()) + { + final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), type); + if(gadget == null) continue; + + int slot = 10; + switch (type) + { + case Particle: + slot = 10; + break; + case ArrowTrail: + slot = 12; + break; + case DoubleJump: + slot = 14; + break; + case Death: + slot = 16; + break; + case Item: + slot = 28; + break; + case Morph: + slot = 30; + break; + case Hat: + slot = 46; + break; + case Costume: + slot = 48; + break; + case MusicDisc: + slot = 50; + break; + case Taunt: + slot = 52; + break; + default: + slot = 10; + break; + } + slot += 9; + + addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), C.mItem + gadget.GetName(), new String[0], 1, false, false), new IButton() { - public void onClick(Player player, ClickType clickType) - { + public void onClick(Player player, ClickType clickType) { playAcceptSound(player); gadget.Disable(player); refresh(); - } + }; }); } @@ -134,8 +151,8 @@ public class Menu extends ShopPageBase { final Mount mount = getPlugin().getMountManager().getActive(getPlayer()); - addButton(24 + 9, - new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), ChatColor.RESET + C.mItem + mount.GetName(), new String[]{}, 1, false, false), + addButton(32 + 9, + new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), C.mItem + mount.GetName(), new String[0], 1, false, false), new IButton() { public void onClick(Player player, ClickType clickType) @@ -151,7 +168,7 @@ public class Menu extends ShopPageBase { Creature activePet = getPlugin().getPetManager().getActivePet(getPlayer().getName()); String petName = activePet.getType() == EntityType.WITHER ? "Widder" : activePet.getCustomName(); - addButton(26 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), ChatColor.RESET + C.mItem + petName, new String[]{}, 1, false, false), + addButton(34 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), C.mItem + petName, new String[0], 1, false, false), new IButton() { public void onClick(Player player, ClickType clickType) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MorphPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MorphPage.java index 508a58276..fb425172d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MorphPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MorphPage.java @@ -37,6 +37,8 @@ public class MorphPage extends GadgetPage if (slot == 26) slot = 28; + if (slot == 35) + slot = 37; } addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/TauntPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/TauntPage.java new file mode 100644 index 000000000..93aeac8d5 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/TauntPage.java @@ -0,0 +1,57 @@ +package mineplex.core.cosmetic.ui.page; + +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.C; +import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.ui.CosmeticShop; +import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.shop.item.IButton; +import mineplex.core.shop.item.ShopItem; + +public class TauntPage extends GadgetPage +{ + + + public TauntPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, + Player player) + { + super(plugin, shop, clientManager, donationManager, name, player); + } + + @Override + protected void buildPage() + { + int slot = 19; + + List list = getPlugin().getGadgetManager().getGadgets(GadgetType.Taunt); + if(list != null) + for (Gadget gadget : list) + { + addGadget(gadget, slot); + + if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) + addGlow(slot); + + slot++; + + if (slot == 26) + slot = 28; + } + + addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() + { + public void onClick(Player player, ClickType clickType) + { + getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player)); + } + }); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index e612c3350..836cc0aec 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -3,39 +3,6 @@ package mineplex.core.gadget; import java.util.ArrayList; import java.util.List; -import mineplex.core.MiniPlugin; -import mineplex.core.account.CoreClientManager; -import mineplex.core.achievement.AchievementManager; -import mineplex.core.blockrestore.BlockRestore; -import mineplex.core.common.Rank; -import mineplex.core.common.util.NautHashMap; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.disguise.DisguiseManager; -import mineplex.core.donation.DonationManager; -import mineplex.core.gadget.event.GadgetCollideEntityEvent; -import mineplex.core.gadget.gadgets.arrowtrail.*; -import mineplex.core.gadget.gadgets.death.*; -import mineplex.core.gadget.gadgets.doublejump.*; -import mineplex.core.gadget.gadgets.item.*; -import mineplex.core.gadget.gadgets.morph.*; -import mineplex.core.gadget.gadgets.outfit.*; -import mineplex.core.gadget.gadgets.particle.*; -import mineplex.core.gadget.types.Gadget; -import mineplex.core.gadget.types.GadgetType; -import mineplex.core.gadget.types.ItemGadget; -import mineplex.core.gadget.types.MorphGadget; -import mineplex.core.gadget.types.MusicGadget; -import mineplex.core.gadget.types.OutfitGadget; -import mineplex.core.gadget.types.OutfitGadget.ArmorSlot; -import mineplex.core.gadget.types.ParticleGadget; -import mineplex.core.inventory.InventoryManager; -import mineplex.core.mount.MountManager; -import mineplex.core.pet.PetManager; -import mineplex.core.preferences.PreferencesManager; -import mineplex.core.projectile.ProjectileManager; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -49,6 +16,82 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; +import mineplex.core.achievement.AchievementManager; +import mineplex.core.blockrestore.BlockRestore; +import mineplex.core.common.Rank; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.disguise.DisguiseManager; +import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.event.GadgetCollideEntityEvent; +import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane; +import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord; +import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailTitan; +import mineplex.core.gadget.gadgets.death.DeathCandyCane; +import mineplex.core.gadget.gadgets.death.DeathFrostLord; +import mineplex.core.gadget.gadgets.death.DeathTitan; +import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane; +import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord; +import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan; +import mineplex.core.gadget.gadgets.item.ItemBatGun; +import mineplex.core.gadget.gadgets.item.ItemCoinBomb; +import mineplex.core.gadget.gadgets.item.ItemDuelingSword; +import mineplex.core.gadget.gadgets.item.ItemEtherealPearl; +import mineplex.core.gadget.gadgets.item.ItemFirework; +import mineplex.core.gadget.gadgets.item.ItemFleshHook; +import mineplex.core.gadget.gadgets.item.ItemMelonLauncher; +import mineplex.core.gadget.gadgets.item.ItemPaintballGun; +import mineplex.core.gadget.gadgets.item.ItemPaintbrush; +import mineplex.core.gadget.gadgets.item.ItemPartyPopper; +import mineplex.core.gadget.gadgets.item.ItemTNT; +import mineplex.core.gadget.gadgets.morph.MorphBat; +import mineplex.core.gadget.gadgets.morph.MorphBlaze; +import mineplex.core.gadget.gadgets.morph.MorphBlock; +import mineplex.core.gadget.gadgets.morph.MorphBunny; +import mineplex.core.gadget.gadgets.morph.MorphChicken; +import mineplex.core.gadget.gadgets.morph.MorphCow; +import mineplex.core.gadget.gadgets.morph.MorphCreeper; +import mineplex.core.gadget.gadgets.morph.MorphEnderman; +import mineplex.core.gadget.gadgets.morph.MorphPig; +import mineplex.core.gadget.gadgets.morph.MorphPumpkinKing; +import mineplex.core.gadget.gadgets.morph.MorphSlime; +import mineplex.core.gadget.gadgets.morph.MorphSnowman; +import mineplex.core.gadget.gadgets.morph.MorphTitan; +import mineplex.core.gadget.gadgets.morph.MorphVillager; +import mineplex.core.gadget.gadgets.morph.MorphWither; +import mineplex.core.gadget.gadgets.outfit.OutfitRaveSuit; +import mineplex.core.gadget.gadgets.outfit.OutfitSpaceSuit; +import mineplex.core.gadget.gadgets.outfit.OutfitTeam; +import mineplex.core.gadget.gadgets.particle.ParticleCandyCane; +import mineplex.core.gadget.gadgets.particle.ParticleEnchant; +import mineplex.core.gadget.gadgets.particle.ParticleFairy; +import mineplex.core.gadget.gadgets.particle.ParticleFireRings; +import mineplex.core.gadget.gadgets.particle.ParticleFoot; +import mineplex.core.gadget.gadgets.particle.ParticleFrostLord; +import mineplex.core.gadget.gadgets.particle.ParticleGreen; +import mineplex.core.gadget.gadgets.particle.ParticleHeart; +import mineplex.core.gadget.gadgets.particle.ParticleHelix; +import mineplex.core.gadget.gadgets.particle.ParticleLegend; +import mineplex.core.gadget.gadgets.particle.ParticleRain; +import mineplex.core.gadget.gadgets.particle.ParticleTitan; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.gadget.types.ItemGadget; +import mineplex.core.gadget.types.MusicGadget; +import mineplex.core.gadget.types.OutfitGadget; +import mineplex.core.gadget.types.OutfitGadget.ArmorSlot; +import mineplex.core.gadget.types.ParticleGadget; +import mineplex.core.inventory.InventoryManager; +import mineplex.core.mount.MountManager; +import mineplex.core.pet.PetManager; +import mineplex.core.preferences.PreferencesManager; +import mineplex.core.projectile.ProjectileManager; + public class GadgetManager extends MiniPlugin { private CoreClientManager _clientManager; @@ -103,6 +146,7 @@ public class GadgetManager extends MiniPlugin addGadget(new ItemCoinBomb(this)); addGadget(new ItemPaintbrush(this)); addGadget(new ItemDuelingSword(this)); + addGadget(new ItemPartyPopper(this)); // Costume addGadget(new OutfitRaveSuit(this, "Rave Hat", -2, ArmorSlot.Helmet, Material.LEATHER_HELMET, (byte)0)); @@ -135,6 +179,7 @@ public class GadgetManager extends MiniPlugin addGadget(new MorphBunny(this)); addGadget(new MorphSlime(this, _achievementManager)); addGadget(new MorphTitan(this)); + addGadget(new MorphSnowman(this)); // Particles addGadget(new ParticleFoot(this)); @@ -148,18 +193,22 @@ public class GadgetManager extends MiniPlugin addGadget(new ParticleLegend(this)); addGadget(new ParticleFrostLord(this)); addGadget(new ParticleTitan(this)); + addGadget(new ParticleCandyCane(this)); // Arrow Trails addGadget(new ArrowTrailFrostLord(this)); addGadget(new ArrowTrailTitan(this)); + addGadget(new ArrowTrailCandyCane(this)); // Death Effect addGadget(new DeathFrostLord(this)); addGadget(new DeathTitan(this)); + addGadget(new DeathCandyCane(this)); // Double Jump addGadget(new DoubleJumpFrostLord(this)); addGadget(new DoubleJumpTitan(this)); + addGadget(new DoubleJumpCandyCane(this)); // Music @@ -207,6 +256,7 @@ public class GadgetManager extends MiniPlugin return _gadgets.get(gadgetType); } + // Disallows two armor gadgets in same slot. public void RemoveOutfit(Player player, ArmorSlot slot) { @@ -227,6 +277,7 @@ public class GadgetManager extends MiniPlugin } } + /* public void RemoveItem(Player player) { for (GadgetType gadgetType : _gadgets.keySet()) @@ -274,6 +325,17 @@ public class GadgetManager extends MiniPlugin } } } + */ + + public void removeGadetType(Player player, GadgetType type) + { + List gadgets = _gadgets.get(type); + if(gadgets == null) return; + for(Gadget g : gadgets) + { + g.Disable(player); + } + } public void DisableAll() { @@ -367,7 +429,7 @@ public class GadgetManager extends MiniPlugin @EventHandler public void setMoving(PlayerMoveEvent event) { - if (UtilMath.offset(event.getFrom(), event.getTo()) <= 0) + if (UtilMath.offset(event.getFrom(), event.getTo()) <= 0.1) return; _lastMove.put(event.getPlayer(), System.currentTimeMillis()); @@ -375,6 +437,8 @@ public class GadgetManager extends MiniPlugin public boolean isMoving(Player player) { + if (!UtilEnt.isGrounded(player)) return true; + if (!_lastMove.containsKey(player)) return false; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java new file mode 100644 index 000000000..1b9741cfe --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java @@ -0,0 +1,48 @@ +package mineplex.core.gadget.gadgets.arrowtrail; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Arrow; + +import mineplex.core.common.util.C; +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.UtilTime; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.ArrowEffectGadget; + +public class ArrowTrailCandyCane extends ArrowEffectGadget +{ + + public ArrowTrailCandyCane(GadgetManager manager) + { + super(manager, "Candy Cane Arrow Effect", new String[] + { + C.cWhite + "We whish you a marry " + C.Scramble + "christmas" + C.cWhite + ".", + }, + 1, + Material.SNOW_BALL, (byte)0); + } + + @Override + public void doTrail(Arrow arrow) + { + int data = 15; + int tick = Math.abs(UtilTime.getServerTick()%3); + if(tick == 1) data = 1; + if(tick == 2) data = 2; + Location loc = arrow.getLocation(); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), loc, 0, 0, 0, 0.0f, 1, ViewDist.NORMAL); + } + + @Override + public void doHitEffect(Arrow arrow) + { + Location loc = arrow.getLocation(); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 15), loc, 0, 0, 0, 0.1f, 20, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 1), loc, 0, 0, 0, 0.1f, 20, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 2), loc, 0, 0, 0, 0.1f, 20, ViewDist.NORMAL); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java index 90659d76e..658c25e72 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java @@ -15,15 +15,13 @@ public class ArrowTrailFrostLord extends ArrowEffectGadget { public ArrowTrailFrostLord(GadgetManager manager) { - super(manager, "Frost Lord", new String[] + super(manager, "Frost Lord Arrow Trail", new String[] { C.cWhite + "You are a mighty frost lord.", C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", - " ", - C.cPurple + "No longer available", }, - -1, + 10, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java new file mode 100644 index 000000000..524b45244 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java @@ -0,0 +1,49 @@ +package mineplex.core.gadget.gadgets.death; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; + +import mineplex.core.blood.BloodEvent; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.types.DeathEffectGadget; +import mineplex.core.gadget.GadgetManager; + +public class DeathCandyCane extends DeathEffectGadget +{ + public DeathCandyCane(GadgetManager manager) + { + super(manager, "Candy Cane Effect", new String[] + { + C.cWhite + "COLORS FTW!", + C.cWhite + "Take damage with SWAG B)", + }, + 10, + Material.SNOW_BALL, (byte)0); + } + + @EventHandler + public void death(BloodEvent event) + { + if (event.getPlayer() == null) + return; + + if (!IsActive(event.getPlayer())) + return; + + if (!shouldDisplay(event.getPlayer())) + return; + + event.setCancelled(true); + + event.setItem(Material.INK_SACK, (byte) 15); + + Location loc = event.getLocation(); + int a = event.getParticles(); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 1), loc, 0, 0, 0, 0.1f, a, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 2), loc, 0, 0, 0, 0.1f, a, ViewDist.NORMAL); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java index a0ec45f09..91cc05ad6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java @@ -12,15 +12,13 @@ public class DeathFrostLord extends DeathEffectGadget { public DeathFrostLord(GadgetManager manager) { - super(manager, "Frost Lord", new String[] + super(manager, "Frost Lord Death Effect", new String[] { C.cWhite + "You are a mighty frost lord.", C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", - " ", - C.cPurple + "No longer available", }, - -1, + 10, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java new file mode 100644 index 000000000..090963762 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java @@ -0,0 +1,36 @@ +package mineplex.core.gadget.gadgets.doublejump; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.DoubleJumpEffectGadget; + +public class DoubleJumpCandyCane extends DoubleJumpEffectGadget +{ + + public DoubleJumpCandyCane(GadgetManager manager) + { + super(manager, "Candy Cane Jump Effect", new String[] + { + C.cWhite + "We whish you a marry " + C.Scramble + "christmas" + C.cWhite + ".", + }, + 1, + Material.SNOW_BALL, (byte)0); + } + + @Override + public void doEffect(Player player) + { + Location loc = player.getLocation(); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 15), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 1), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 2), loc, 0, 0, 0, 0.15f, 100, ViewDist.NORMAL); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java index 9c7cdc726..365d6d1ce 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java @@ -17,15 +17,11 @@ public class DoubleJumpFrostLord extends DoubleJumpEffectGadget { public DoubleJumpFrostLord(GadgetManager manager) { - super(manager, "Frost Lord", new String[] + super(manager, "Frost Lord Jump Effect", new String[] { - C.cWhite + "You are a mighty frost lord.", - C.cWhite + "Your double jumps and arrows", - C.cWhite + "are enchanted with snow powers.", - " ", - C.cPurple + "No longer available", + C.cWhite + "More snow incomming.", }, - -1, + 1, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java index 618c8eff3..ed418db96 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -36,6 +36,7 @@ public class DoubleJumpTitan extends DoubleJumpEffectGadget { UtilParticle.PlayParticle(ParticleType.LAVA, player.getLocation(), 0f, 0f, 0f, 0.2f, 40, ViewDist.NORMAL, UtilServer.getPlayers()); + UtilParticle.PlayParticleToAll(ParticleType.FLAME, player.getLocation(), 0, 0, 0, 0.2f, 40, ViewDist.NORMAL); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java index 07456110c..99a7d217f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java @@ -8,6 +8,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import mineplex.core.common.util.C; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; @@ -27,7 +28,7 @@ public class ItemDuelingSword extends ItemGadget @Override public void ApplyItem(Player player, boolean inform) { - Manager.RemoveItem(player); + Manager.removeGadetType(player, GadgetType.Item); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java index 93070d3ad..a7cbba607 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java @@ -28,6 +28,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; @@ -56,7 +57,7 @@ public class ItemPaintbrush extends ItemGadget @Override public void ApplyItem(Player player, boolean inform) { - Manager.RemoveItem(player); + Manager.removeGadetType(player, GadgetType.Item); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java new file mode 100644 index 000000000..6e7d29b8e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java @@ -0,0 +1,127 @@ +package mineplex.core.gadget.gadgets.morph; + +import java.util.WeakHashMap; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +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.NautHashMap; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilMath; +import mineplex.core.disguise.disguises.DisguiseSnowman; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.event.GadgetCollideEntityEvent; +import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.recharge.Recharge; +import mineplex.core.recharge.RechargeData; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class MorphSnowman extends MorphGadget +{ + + private WeakHashMap _snowball = new WeakHashMap(); + + public MorphSnowman(GadgetManager manager) + { + super(manager, "Snowman Morph", + new String[]{ C.cWhite + "Do you wanna build a snowman?", C.cWhite + "It doesn't have to be a snowman...", + C.cWhite + "Or... it kind of does...", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Snowball", }, + 6000, Material.SNOW_BALL, (byte) 0); + } + + @Override + public void EnableCustom(Player player) + { + this.ApplyArmor(player); + + DisguiseSnowman disguise = new DisguiseSnowman(player); + disguise.setName(player.getName(), Manager.getClientManager().Get(player).GetRank()); + disguise.setCustomNameVisible(true); + Manager.getDisguiseManager().disguise(disguise); + } + + @Override + public void DisableCustom(Player player) + { + this.RemoveArmor(player); + Manager.getDisguiseManager().undisguise(player); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) + { + if(!IsActive(event.getPlayer())) return; + + if(!UtilEvent.isAction(event, ActionType.L)) return; + + if(event.getItem() != null && event.getItem().getType() != Material.AIR) return; + + if(Recharge.Instance.use(event.getPlayer(), "Blizzard", 12000, true, true)) + { + event.getPlayer().sendMessage(F.main("Recharge", "You used " + F.skill("Blizzard") + ".")); + } + } + + @EventHandler + public void Snow(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTEST) + return; + + for (Player player : GetActive()) + { + NautHashMap map = Recharge.Instance.Get(player); + if(map == null) continue; + + RechargeData data = map.get("Blizzard"); + if(data == null) continue; + if(data.GetRemaining() < 10000) continue; + + for (int i=0 ; i<4 ; i++) + { + Snowball snow = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), Snowball.class); + double x = 0.1 - (UtilMath.r(20)/100d); + double y = UtilMath.r(20)/100d; + double z = 0.1 - (UtilMath.r(20)/100d); + snow.setShooter(player); + snow.setVelocity(player.getLocation().getDirection().add(new Vector(x,y,z)).multiply(2)); + _snowball.put(snow, player); + } + + //Effect + player.getWorld().playSound(player.getLocation(), Sound.STEP_SNOW, 0.2f, 0.5f); + } + } + + @EventHandler + public void Snowball(EntityDamageByEntityEvent event) + { + if (!(event.getDamager() instanceof Snowball)) + return; + + Snowball proj = (Snowball) event.getDamager(); + + if (!_snowball.containsKey(proj)) + return; + + GadgetCollideEntityEvent gevent = new GadgetCollideEntityEvent(this, event.getEntity()); + + if(gevent.isCancelled()) return; + + UtilAction.velocity(event.getEntity(), proj.getVelocity().multiply(0.15).add(new Vector(0, 0.15, 0))); + } + + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java index c994f299c..2e65b7ae5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java @@ -20,6 +20,7 @@ import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.OutfitGadget; import mineplex.core.gadget.types.OutfitGadget.ArmorSlot; import mineplex.core.itemstack.ItemStackFactory; @@ -55,7 +56,7 @@ public class OutfitTeam extends OutfitGadget @Override public void ApplyArmor(Player player) { - Manager.RemoveMorph(player); + Manager.removeGadetType(player, GadgetType.Morph); Manager.RemoveOutfit(player, _slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java new file mode 100644 index 000000000..110cbc4e8 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java @@ -0,0 +1,93 @@ +package mineplex.core.gadget.gadgets.particle; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.util.Vector; + +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.ParticleGadget; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class ParticleCandyCane extends ParticleGadget +{ + + private HashMap _map = new HashMap(); + + public ParticleCandyCane(GadgetManager manager) + { + super(manager, "Candy Cane Particle", new String[]{"Christmas. Nuf said."}, 10, Material.CHEST, (byte)0); + } + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for(Player player : GetActive()) + { + if (!shouldDisplay(player)) + continue; + + boolean moving = Manager.isMoving(player); + Location loc = player.getLocation(); + float y = moving? 0.2f : 0.15f; + double yadd = getY(player); + if(!moving && yadd < 2.1) + { + yadd += 0.05; + setY(player, yadd); + } + if(moving && yadd > 0.7) + { + yadd = 0.7; + setY(player, yadd); + } + loc.add(0, yadd, 0); + + float w = 0.2f; + int a = moving? 2 : 6; + + if(!moving) + { + double d = Math.PI*2 * (event.getTick()/50.0); + Vector v = new Vector(Math.sin(d), 0, Math.cos(d)); + loc.add(v); + } + + + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 15), loc, w, y, w, 0, a, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 1), loc, w, y, w, 0, a, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, 2), loc, w, y, w, 0, a, ViewDist.NORMAL); + } + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) + { + _map.remove(event.getPlayer().getUniqueId()); + } + + private void setY(Player p, double y) + { + _map.put(p.getUniqueId(), y); + } + + private double getY(Player p) + { + Double y = _map.get(p.getUniqueId()); + if(y == null) return 3; + return y.doubleValue(); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index 1b0c142f8..7d7a01928 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -30,15 +30,13 @@ public class ParticleFrostLord extends ParticleGadget public ParticleFrostLord(GadgetManager manager) { - super(manager, "Frost Lord", new String[] + super(manager, "Frost Lord Particle", new String[] { C.cWhite + "You are a mighty frost lord.", C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", - " ", - C.cPurple + "No longer available", }, - -1, + 10, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java index de0705c04..596a1e3f7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java @@ -11,11 +11,7 @@ import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -32,7 +28,7 @@ public abstract class ArrowEffectGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.RemoveParticle(player); + Manager.removeGadetType(player, GadgetType.ArrowTrail); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java index fe5b96f0f..031406193 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java @@ -17,7 +17,7 @@ public abstract class DeathEffectGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.RemoveParticle(player); + Manager.removeGadetType(player, GadgetType.Death); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java index a9e3ecfbf..84b02523a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java @@ -23,7 +23,7 @@ public abstract class DoubleJumpEffectGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.RemoveParticle(player); + Manager.removeGadetType(player, GadgetType.DoubleJump); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java index 22de296e7..5daff04b2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetType.java @@ -9,5 +9,7 @@ public enum GadgetType Costume, DoubleJump, ArrowTrail, - Death + Death, + Hat, + Taunt } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java index 232abb0eb..212964745 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java @@ -64,7 +64,7 @@ public abstract class ItemGadget extends Gadget public void ApplyItem(Player player, boolean inform) { - Manager.RemoveItem(player); + Manager.removeGadetType(player, GadgetType.Item); _active.add(player); @@ -157,7 +157,7 @@ public abstract class ItemGadget extends Gadget { UtilInv.Update(player); return; - } + } Manager.getInventoryManager().addItemToInventory(player, GetName(), -1); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java index 47e121979..c90606af7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java @@ -19,7 +19,7 @@ public abstract class MorphGadget extends Gadget public void ApplyArmor(Player player) { - Manager.RemoveMorph(player); + Manager.removeGadetType(player, GadgetType.Morph); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java index fabae966d..83c54ac96 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java @@ -34,7 +34,7 @@ public abstract class OutfitGadget extends Gadget public void ApplyArmor(Player player) { - Manager.RemoveMorph(player); + Manager.removeGadetType(player, GadgetType.Morph); Manager.RemoveOutfit(player, _slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java index 3dadb6995..499972786 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java @@ -1,6 +1,5 @@ package mineplex.core.gadget.types; -import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -18,7 +17,7 @@ public abstract class ParticleGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.RemoveParticle(player); + Manager.removeGadetType(player, GadgetType.Particle); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/MountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/MountManager.java index 4de2d6666..814280180 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/MountManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/MountManager.java @@ -23,6 +23,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.DisguiseManager; import mineplex.core.donation.DonationManager; +import mineplex.core.mount.types.MountBabyReindeer; import mineplex.core.mount.types.MountCart; import mineplex.core.mount.types.MountDragon; import mineplex.core.mount.types.MountFrost; @@ -68,6 +69,7 @@ public class MountManager extends MiniPlugin _types.add(new MountSpider(this)); _types.add(new MountZombie(this)); _types.add(new MountTitan(this)); + _types.add(new MountBabyReindeer(this)); //_types.add(new MountSheep(this)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java new file mode 100644 index 000000000..0c5b84e98 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java @@ -0,0 +1,92 @@ +package mineplex.core.mount.types; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Horse.Color; +import org.bukkit.entity.Horse.Style; +import org.bukkit.entity.Horse.Variant; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.HorseJumpEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.util.Vector; + +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.mount.HorseMount; +import mineplex.core.mount.MountManager; +import mineplex.core.mount.SingleEntityMountData; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class MountBabyReindeer extends HorseMount +{ + + public MountBabyReindeer(MountManager manager) + { + super(manager, "Baby Rainder", new String[] + { + C.cWhite + "One of Santa's baby reindeers", + C.cWhite + "Still trying to learn how to fly" + }, Material.SNOW_BALL, (byte) 0, 10, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); + } + + @EventHandler + public void EnableCustom(Player player) { + super.EnableCustom(player); + Horse horse = GetActive().get(player).getEntity(); + horse.setBaby(); + horse.setMaxHealth(20); + } + + @EventHandler + public void fly(UpdateEvent event) + { + if(event.getType() != UpdateType.TICK) return; + + for(SingleEntityMountData horse : GetActive().values()) + { + if(horse.getEntity().getPassenger() != horse.getOwner()) continue; + + if(Recharge.Instance.usable(horse.getOwner(), "Reindeer Fly")) continue; + + horse.getEntity().setVelocity(horse.getOwner().getLocation().getDirection().normalize().add(new Vector(0,0.4,0))); + + horse.getEntity().getWorld().playSound(horse.getEntity().getLocation(), Sound.HORSE_BREATHE, 0.3f, 0.5f); + + UtilParticle.PlayParticleToAll(ParticleType.EXPLODE, horse.getEntity().getLocation(), 0.2f,0.0f,0.2f, 0.0f, 10, ViewDist.NORMAL); + } + } + + @EventHandler + public void onClick(PlayerInteractEntityEvent event) + { + if(!IsActive(event.getPlayer())) return; + SingleEntityMountDatadata = getMountData(event.getRightClicked()); + if(data == null) return; + if(data.getOwner() != event.getPlayer()) return; + data.getEntity().setPassenger(data.getOwner()); + } + + @EventHandler + public void onJump(HorseJumpEvent event) + { + SingleEntityMountData data = getMountData(event.getEntity()); + if(data == null) return; + + event.setCancelled(true); + if(UtilEnt.isGrounded(event.getEntity())) + { + if(Recharge.Instance.use(data.getOwner(), "Reindeer Fly", 1000, false, false)) + { + event.getEntity().getWorld().playSound(event.getEntity().getLocation(), Sound.HORSE_ANGRY, 1f, 1f); + } + } + + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java index 4001f5184..49bd13513 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -36,6 +36,12 @@ public class MountTitan extends Mount @Override public void EnableCustom(Player player) { + if(GetActive().size() >= 3) + { + UtilPlayer.message(player, F.main("Mount", "The maximum amount of simultaneous " + F.elem(GetName()) + " in this lobby has been reached.")); + return; + } + player.leaveVehicle(); player.eject(); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java index 56cab2079..de3a66e5e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java @@ -1,19 +1,16 @@ package mineplex.core.pet; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; - -import mineplex.core.common.util.NautHashMap; -import mineplex.core.pet.repository.PetRepository; -import mineplex.core.pet.repository.token.PetExtraToken; -import mineplex.core.pet.repository.token.PetSalesToken; -import mineplex.core.pet.types.Elf; -import mineplex.core.pet.types.Pumpkin; import org.bukkit.Material; import org.bukkit.entity.EntityType; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.pet.repository.PetRepository; +import mineplex.core.pet.types.Elf; +import mineplex.core.pet.types.PetCoalApparition; +import mineplex.core.pet.types.Pumpkin; + public class PetFactory { private PetRepository _repository; @@ -33,6 +30,7 @@ public class PetFactory private void CreatePets() { _pets.put(EntityType.ZOMBIE, new Pumpkin()); + _pets.put(EntityType.PIG_ZOMBIE, new PetCoalApparition()); _pets.put(EntityType.VILLAGER, new Elf()); _pets.put(EntityType.PIG, new Pet("Pig", EntityType.PIG, 5000)); _pets.put(EntityType.SHEEP, new Pet("Sheep", EntityType.SHEEP, 3000)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index d111bc6a7..8ca696f34 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -4,11 +4,38 @@ import java.util.Collection; import java.util.Iterator; import java.util.Map.Entry; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPigZombie; +import org.bukkit.entity.Ageable; +import org.bukkit.entity.Creature; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.PigZombie; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; +import org.bukkit.entity.Villager; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import com.google.gson.Gson; + import mineplex.core.MiniClientPlugin; -import mineplex.core.pet.repository.PetRepository; -import mineplex.core.pet.repository.token.ClientPetTokenWrapper; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.updater.UpdateType; import mineplex.core.account.CoreClientManager; import mineplex.core.account.event.ClientWebResponseEvent; import mineplex.core.blockrestore.BlockRestore; @@ -17,50 +44,22 @@ import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; 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.UtilServer; import mineplex.core.disguise.DisguiseManager; import mineplex.core.disguise.disguises.DisguiseGuardian; import mineplex.core.disguise.disguises.DisguiseWither; import mineplex.core.donation.DonationManager; import mineplex.core.inventory.InventoryManager; +import mineplex.core.pet.repository.PetRepository; +import mineplex.core.pet.repository.token.ClientPetTokenWrapper; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import net.minecraft.server.v1_8_R3.EntityCreature; -import net.minecraft.server.v1_8_R3.EntityWither; -import net.minecraft.server.v1_8_R3.Navigation; import net.minecraft.server.v1_8_R3.NavigationAbstract; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; - -import com.google.gson.Gson; - -import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature; -import org.bukkit.entity.Ageable; -import org.bukkit.entity.Creature; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Guardian; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.Villager; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - public class PetManager extends MiniClientPlugin { private static Object _petOwnerSynch = new Object(); @@ -228,6 +227,12 @@ public class PetManager extends MiniClientPlugin pet.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 99999999, 0)); UtilEnt.silence(pet, true); } + if (pet instanceof PigZombie) + { + ((PigZombie)pet).setBaby(true); + pet.getEquipment().setHelmet(new ItemStack(Material.SKULL_ITEM, 1, (short)0, (byte) 1)); + pet.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 99999999, 0)); + } else if (pet instanceof Villager) { ((Villager) pet).setBaby(); @@ -342,6 +347,22 @@ public class PetManager extends MiniClientPlugin @EventHandler public void onUpdate(UpdateEvent event) { + if (event.getType() == UpdateType.TICK) + { + for(Creature pet : _activePetOwners.values()) + { + if(pet instanceof PigZombie) + { + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, pet.getLocation(), 0.2f,0.0f,0.2f, 0.0f, 4, ViewDist.NORMAL); + if(event.getTick()%3 == 0) pet.getWorld().playSound(pet.getLocation(), Sound.BLAZE_BREATH, 0.1f, 0f); + if(!((CraftPigZombie)pet).getHandle().isSilent()) + { + ((CraftPigZombie)pet).getHandle().setSilent(true); + } + } + } + } + if (event.getType() != UpdateType.FAST) return; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java new file mode 100644 index 000000000..5c0b7ed82 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java @@ -0,0 +1,14 @@ +package mineplex.core.pet.types; + +import org.bukkit.entity.EntityType; + +import mineplex.core.pet.Pet; + +public class PetCoalApparition extends Pet +{ + public PetCoalApparition() + { + super("Coal Apparition", EntityType.PIG_ZOMBIE, 10); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/updater/event/UpdateEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/updater/event/UpdateEvent.java index 59400f196..60c7f0bb8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/updater/event/UpdateEvent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/updater/event/UpdateEvent.java @@ -1,6 +1,7 @@ package mineplex.core.updater.event; import mineplex.core.updater.UpdateType; +import net.minecraft.server.v1_8_R3.MinecraftServer; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -19,6 +20,11 @@ public class UpdateEvent extends Event { return _type; } + + public int getTick() + { + return MinecraftServer.currentTick; + } public HandlerList getHandlers() { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java index c35fc9ab5..5b7237994 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java @@ -169,7 +169,7 @@ public class DisguiseCommand extends CommandBase implements Liste changeName(caller, args[0], true); - Plugin.getCosmeticManager().getGadgetManager().RemoveItem(caller); + Plugin.getCosmeticManager().getGadgetManager().removeGadetType(caller, GadgetType.Item); Bukkit.broadcastMessage(ChatColor.DARK_GRAY + "Quit> " + ChatColor.GRAY + _disguisedPlayersNames.get(caller)); UtilPlayer.message(caller, C.cGreen + C.Bold + "Disguise Active: " + ChatColor.RESET + args[0]); From 0c397d6a811c6f8eaba460c7805e0058941e5a8f Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 13:02:26 +1100 Subject: [PATCH 061/223] simplified kits and intro --- .../game/games/snowfight/SnowFight.java | 59 +++++-------- .../game/games/snowfight/kits/KitMedic.java | 42 ++++++++-- .../games/snowfight/kits/KitSportsman.java | 10 +-- .../games/snowfight/kits/KitTactician.java | 10 +-- .../arcade/kit/perks/PerkPotionGenerator.java | 84 ------------------- 5 files changed, 69 insertions(+), 136 deletions(-) delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index 5e8be4cd6..f262a2c7c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -66,8 +66,8 @@ public class SnowFight extends TeamGame { private HashMap _tiles; + private long _meteorTime = 375000; private boolean _meteors; - private boolean _peace; public SnowFight(ArcadeManager manager) { @@ -86,6 +86,7 @@ public class SnowFight extends TeamGame "Last team alive wins!" }); + this.PrepareFreeze = false; this.HungerSet = 20; this.CompassEnabled = true; this.CompassGiveItem = false; @@ -95,16 +96,6 @@ public class SnowFight extends TeamGame this.BlockBreakAllow = new HashSet<>(Arrays.asList(Material.FENCE.getId())); this._tiles = new HashMap(); this._meteors = false; - this._peace = false; - } - - @EventHandler - public void GameState(GameStateChangeEvent event) - { - if(event.GetState() != GameState.Live) - return; - - this.Announce(C.cRed + C.Bold + "ALERT: " + ChatColor.RESET + C.Bold + "15 seconds Peace Phase is starting!"); } @EventHandler @@ -141,6 +132,22 @@ public class SnowFight extends TeamGame } } + + @EventHandler + public void battleAnnounce(GameStateChangeEvent event) + { + if (event.GetState() == GameState.Prepare) + { + UtilTextMiddle.display(C.cGreen + "Prepare", "Collect Snowballs!", 0, 240, 20, UtilServer.getPlayers()); + } + if (event.GetState() == GameState.Live) + { + for(Player player : GetPlayers(false)) + player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 1F, 1F); + + UtilTextMiddle.display(C.cRed + "FIGHT", "", 0, 40, 20, UtilServer.getPlayers()); + } + } @EventHandler public void Meteor(UpdateEvent event) @@ -151,23 +158,7 @@ public class SnowFight extends TeamGame if (!IsLive()) return; - if (System.currentTimeMillis() <= getGameLiveTime() + 10000) - { - UtilTextMiddle.display(C.cGreen + "Prepare", "Battle in " + UtilTime.MakeStr((getGameLiveTime() + 10000) - System.currentTimeMillis()), 0, 60, 20, UtilServer.getPlayers()); - return; - } - - if (!_peace) - { - for(Player player : GetPlayers(false)) - player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 1F, 1F); - - UtilTextMiddle.display(C.cRed + "FIGHT", "Throw your Snowballs!", 0, 60, 20, UtilServer.getPlayers()); - - _peace = true; - } - - if(System.currentTimeMillis() <= getGameLiveTime() + (195 * 1000)) + if(System.currentTimeMillis() <= getGameLiveTime() + _meteorTime) return; if(!_meteors) @@ -180,6 +171,7 @@ public class SnowFight extends TeamGame _meteors = true; } + makeMeteor(); } @@ -188,7 +180,7 @@ public class SnowFight extends TeamGame { Player player = event.getPlayer(); - if (!IsLive()) + if (!InProgress()) return; if (!IsPlaying(player)) @@ -361,13 +353,6 @@ public class SnowFight extends TeamGame @EventHandler(priority = EventPriority.HIGH) public void SnowballEggDamage(CustomDamageEvent event) { - - if(!_peace) - { - event.SetCancelled("Peace Phase"); - return; - } - if (event.IsCancelled()) return; @@ -606,7 +591,7 @@ public class SnowFight extends TeamGame } } - long time = 1000 * 195 - (System.currentTimeMillis() - this.GetStateTime()); + long time = _meteorTime - (System.currentTimeMillis() - this.GetStateTime()); if(IsLive()) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java index 4c524b981..a99eb5ad9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java @@ -1,6 +1,9 @@ package nautilus.game.arcade.game.games.snowfight.kits; +import mineplex.core.common.util.C; import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; @@ -11,7 +14,10 @@ import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.Potion; import org.bukkit.potion.PotionType; public class KitMedic extends Kit @@ -24,11 +30,12 @@ public class KitMedic extends Kit new String[] { "Throw warmth potions to heal allies!", + }, new Perk[] { - new PerkPotionGenerator("Warmth Potions", 30, 1, PotionType.INSTANT_HEAL, true, "Warmth Potion", false) + new PerkPotionGenerator("Warmth Potions", 32, 1, PotionType.INSTANT_HEAL, true, "Warmth Potion", false) }, EntityType.SKELETON, new ItemStack(Material.POTION)); @@ -39,10 +46,10 @@ public class KitMedic extends Kit @Override public void GiveItems(Player player) { - player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); } @Override @@ -53,4 +60,29 @@ public class KitMedic extends Kit ent.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); ent.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); } + + @EventHandler + public void KitItems(UpdateEvent event) + { + if(!Manager.GetGame().IsLive()) + return; + + if (event.getType() == UpdateType.SLOWEST) + { + for (Player player : Manager.GetGame().GetPlayers(true)) + { + if (!HasKit(player)) + continue; + + Potion potion = new Potion(PotionType.INSTANT_HEAL); + potion.setSplash(true); + ItemStack stack = potion.toItemStack(1); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName("Warmth Potion"); + stack.setItemMeta(meta); + + player.getInventory().setItem(1, stack); + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java index 1bf093f0a..ddc84535f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java @@ -38,7 +38,7 @@ public class KitSportsman extends Kit new Perk[] { new PerkDoubleJump("Snow Jump", 1, 0.8, true, 8000, true), - new PerkFallDamage(2), + new PerkFallDamage(-2), }, EntityType.SKELETON, new ItemStack(Material.SNOW_BALL)); @@ -48,10 +48,10 @@ public class KitSportsman extends Kit @Override public void GiveItems(Player player) { - player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java index f69d290d5..ba40cacbf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java @@ -26,8 +26,8 @@ public class KitTactician extends Kit }, new Perk[] { + new PerkIronSkin(0.25), new PerkConstructor("Barrier", 30, 1, Material.FENCE, "Warmth Potion", false), - new PerkIronSkin(0.25) }, EntityType.SKELETON, new ItemStack(Material.FENCE)); @@ -37,10 +37,10 @@ public class KitTactician extends Kit @Override public void GiveItems(Player player) { - player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP)); + player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); player.getInventory().setItem(7, ItemStackFactory.Instance.CreateStack(Material.COMPASS.getId(), (byte) 0, 1, "§a§lTracking Compass")); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java deleted file mode 100644 index 5f355428e..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPotionGenerator.java +++ /dev/null @@ -1,84 +0,0 @@ -package nautilus.game.arcade.kit.perks; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilServer; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.perks.event.PerkConstructorEvent; - -import org.bukkit.Bukkit; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.potion.Potion; -import org.bukkit.potion.PotionType; - -public class PerkPotionGenerator extends Perk -{ - private int _max = 0; - private double _time = 0; - - private PotionType _type; - private boolean _splash; - private String _name; - - public PerkPotionGenerator(String perkName, double time, int max, PotionType type, boolean splash, String name, boolean visible) - { - super(perkName, new String[] - { - C.cGray + "Receive 1 " + name + " every " + time + " seconds. Maximum of " + max + ".", - }, visible); - - _time = time; - _splash = splash; - - _name = name; - } - - @EventHandler - public void Construct(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - for (Player cur : UtilServer.getPlayers()) - { - if (!Kit.HasKit(cur)) - continue; - - if (!Manager.GetGame().IsAlive(cur)) - continue; - - if (Manager.isSpectator(cur)) - continue; - - if (!Recharge.Instance.use(cur, GetName(), (long) (_time * 1000), false, false)) - continue; - - Potion potion = new Potion(_type); - potion.setSplash(_splash); - ItemStack stack = potion.toItemStack(1); - ItemMeta meta = stack.getItemMeta(); - meta.setDisplayName(_name); - - if (UtilInv.contains(cur, stack.getType(), (byte)0, _max)) - continue; - - PerkConstructorEvent cE = new PerkConstructorEvent(cur); - Bukkit.getServer().getPluginManager().callEvent(cE); - - if (cE.isCancelled()) - continue; - - //Add - cur.getInventory().addItem(stack); - - cur.playSound(cur.getLocation(), Sound.ITEM_PICKUP, 2f, 1f); - } - } -} From cbafb2ba914700d9d9ea451a8a2e172eb1dc8ff5 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 13:04:45 +1100 Subject: [PATCH 062/223] fixes --- .../game/arcade/game/games/snowfight/kits/KitMedic.java | 6 +++--- .../game/arcade/game/games/snowfight/kits/KitTactician.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java index a99eb5ad9..3cb7b3b13 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java @@ -8,7 +8,6 @@ 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.PerkPotionGenerator; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -31,11 +30,12 @@ public class KitMedic extends Kit { "Throw warmth potions to heal allies!", + C.cGray + "Receive 1 Warmth Potion every 16 seconds. Maximum of 1.", }, new Perk[] { - new PerkPotionGenerator("Warmth Potions", 32, 1, PotionType.INSTANT_HEAL, true, "Warmth Potion", false) + }, EntityType.SKELETON, new ItemStack(Material.POTION)); @@ -67,7 +67,7 @@ public class KitMedic extends Kit if(!Manager.GetGame().IsLive()) return; - if (event.getType() == UpdateType.SLOWEST) + if (event.getType() == UpdateType.SLOWER) { for (Player player : Manager.GetGame().GetPlayers(true)) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java index ba40cacbf..1395c2add 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java @@ -26,8 +26,8 @@ public class KitTactician extends Kit }, new Perk[] { + new PerkConstructor("Constructor", 16, 2, Material.FENCE, "Barrier", true), new PerkIronSkin(0.25), - new PerkConstructor("Barrier", 30, 1, Material.FENCE, "Warmth Potion", false), }, EntityType.SKELETON, new ItemStack(Material.FENCE)); From 488895ea535db0859096e88776bbe8da7194c71f Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Sun, 6 Dec 2015 21:12:10 -0500 Subject: [PATCH 063/223] Note block player --- .../mineplex/core/noteblock/NBSReader.java | 131 ++++++++++++++++++ .../src/mineplex/core/noteblock/Note.java | 26 ++++ .../mineplex/core/noteblock/NoteLayer.java | 50 +++++++ .../mineplex/core/noteblock/NotePlayer.java | 88 ++++++++++++ .../src/mineplex/core/noteblock/NoteSong.java | 57 ++++++++ .../src/mineplex/core/noteblock/UtilNote.java | 42 ++++++ .../src/mineplex/hub/HubManager.java | 19 ++- 7 files changed, 412 insertions(+), 1 deletion(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/Note.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteLayer.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteSong.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/UtilNote.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java new file mode 100644 index 000000000..1ca887ede --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java @@ -0,0 +1,131 @@ +package mineplex.core.noteblock; + +import java.io.DataInputStream; +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; + +/** + * Information about the NBS Format was taken from + * http://www.stuffbydavid.com/mcnbs/format + */ +public class NBSReader +{ + public static NoteSong loadSong(String fileName) throws FileNotFoundException + { + return loadSong(new DataInputStream(new FileInputStream(new File(fileName)))); + } + + public static NoteSong loadSong(DataInputStream stream) + { + try + { + // Header Information + short length = readShort(stream); + short height = readShort(stream); + String name = readString(stream); + String author = readString(stream); + String originalAuthor = readString(stream); + String description = readString(stream); + short tempo = readShort(stream); // Tempo multiplied by 1000 + boolean autosave = stream.readBoolean(); + byte autosaveDuration = stream.readByte(); + byte timeSignature = stream.readByte(); + int minutesSpent = readInt(stream); + int leftClicks = readInt(stream); + int rightClicks = readInt(stream); + int blocksAdded = readInt(stream); + int blocksRemoved = readInt(stream); + String midiFileName = readString(stream); + + HashMap layerMap = new HashMap(); + + // Note Block Information + int tick = -1; + int jumps = 0; + while (true) + { + jumps = readShort(stream); + if (jumps == 0) + break; + tick += jumps; + int layer = -1; + while (true) + { + jumps = readShort(stream); + if (jumps == 0) + break; + layer += jumps; + byte instrument = stream.readByte(); + byte key = stream.readByte(); + + Note note = new Note(instrument, key); + NoteLayer noteLayer = layerMap.get(layer); + if (noteLayer == null) + { + noteLayer = new NoteLayer(); + layerMap.put(layer, noteLayer); + } + noteLayer.setNote(tick, note); + } + } + + // Layer Information + for (int i = 0; i < height; i++) + { + NoteLayer layer = layerMap.get(i); + if (layer != null) + { + layer.setName(readString(stream)); + layer.setVolume(stream.readByte()); + } + } + + System.out.println("[NBSReader] Successfully loaded song " + name + ""); + System.out.println("Tempo: " + tempo); + return new NoteSong(length, height, name, tempo, timeSignature, layerMap); + } + catch (IOException e) + { + e.printStackTrace(); + } + + return null; + } + + private static int readInt(DataInputStream stream) throws IOException + { + // For some reason the bytes are in reverse order from stream.readInt() + int ch1 = stream.read(); + int ch2 = stream.read(); + int ch3 = stream.read(); + int ch4 = stream.read(); + if ((ch1 | ch2 | ch3 | ch4) < 0) + throw new EOFException(); + return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + ch1); + } + + private static short readShort(DataInputStream stream) throws IOException + { + // For some reason the bytes are in reverse order from stream.readShort() + int ch1 = stream.read(); + int ch2 = stream.read(); + if ((ch1 | ch2) < 0) + throw new EOFException(); + return (short)((ch2 << 8) + ch1); + } + + private static String readString(DataInputStream stream) throws IOException + { + int length = readInt(stream); + char[] string = new char[length]; + for (int i = 0; i < length; i++) + { + string[i] = (char) stream.readByte(); + } + return new String(string); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/Note.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/Note.java new file mode 100644 index 000000000..223d56011 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/Note.java @@ -0,0 +1,26 @@ +package mineplex.core.noteblock; + +/** + * Represents a single note to be played + */ +public class Note +{ + private byte _instrument; + private byte _note; + + public Note(byte instrument, byte note) + { + _instrument = instrument; + _note = note; + } + + public byte getInstrument() + { + return _instrument; + } + + public byte getNote() + { + return _note; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteLayer.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteLayer.java new file mode 100644 index 000000000..6c83bbab1 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteLayer.java @@ -0,0 +1,50 @@ +package mineplex.core.noteblock; + +import java.util.HashMap; + +/** + * Represents a layer of notes in Note Block Studio + */ +public class NoteLayer +{ + private HashMap _noteMap; // Notes indexed by ticks + private int _volume; // Volume as a percentage 1-100 + private String _name; + + public NoteLayer() + { + _noteMap = new HashMap(); + _volume = 100; + _name = ""; + } + + public int getVolume() + { + return _volume; + } + + public void setVolume(int volume) + { + _volume = volume; + } + + public String getName() + { + return _name; + } + + public void setName(String name) + { + _name = name; + } + + public void setNote(int ticks, Note note) + { + _noteMap.put(ticks, note); + } + + public Note getNote(int ticks) + { + return _noteMap.get(ticks); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java new file mode 100644 index 000000000..19e48f16d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java @@ -0,0 +1,88 @@ +package mineplex.core.noteblock; + +import org.bukkit.entity.Player; + +import mineplex.core.common.util.UtilServer; + +public class NotePlayer +{ + private final NoteSong _song; + private final long _sleepMs; + private volatile boolean _loop; + private volatile int _tick; + private volatile boolean _finished; + + public NotePlayer(NoteSong song, boolean loop) + { + _song = song; + _sleepMs = (long) (1000 / (song.getTempo() / 100D)); + _loop = loop; + _tick = 0; + _finished = false; + + startThread(); + } + + private void startThread() + { + Thread thread = new Thread(new Runnable() + { + @Override + public void run() + { + long startTime = System.currentTimeMillis(); + while (!_finished) + { + _tick++; + if (_tick > _song.getLength()) + { + if (_loop) + { + _tick = 1; + } + else + { + _finished = true; + return; + } + } + + playTick(_tick); + + try + { + Thread.sleep(_sleepMs); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + } + }); + + thread.start(); + } + + private void playTick(int tick) + { + for (NoteLayer layer : _song.getLayers()) + { + Note note = layer.getNote(tick); + if (note != null) + { + float volume = layer.getVolume() / 100F; + for (Player player : UtilServer.getPlayers()) + { + player.playSound(player.getEyeLocation(), UtilNote.getInstrumentSound(note.getInstrument()), volume, (float) UtilNote.getPitch(note.getNote() - 33)); + } + } + } + } + + public void cancel() + { + _finished = true; + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteSong.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteSong.java new file mode 100644 index 000000000..ee892552b --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NoteSong.java @@ -0,0 +1,57 @@ +package mineplex.core.noteblock; + +import java.util.Collection; +import java.util.HashMap; + +public class NoteSong +{ + // Song Data + private short _length; + private short _height; + private String _name; + private short _tempo; + private byte _timeSignature; + + // Layer Data + private HashMap _layerMap; + + public NoteSong(short length, short height, String name, short tempo, byte timeSignature, HashMap layerMap) + { + _length = length; + _height = height; + _name = name; + _tempo = tempo; + _timeSignature = timeSignature; + _layerMap = layerMap; + } + + public short getLength() + { + return _length; + } + + public short getHeight() + { + return _height; + } + + public String getName() + { + return _name; + } + + public short getTempo() + { + return _tempo; + } + + public byte getTimeSignature() + { + return _timeSignature; + } + + public Collection getLayers() + { + return _layerMap.values(); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/UtilNote.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/UtilNote.java new file mode 100644 index 000000000..4ac15643e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/UtilNote.java @@ -0,0 +1,42 @@ +package mineplex.core.noteblock; + +import org.bukkit.Sound; + +/** + * See http://minecraft.gamepedia.com/Note_Block for information about pitches + */ +public class UtilNote +{ + private static final double[] PITCH = { 0.5, 0.53, 0.56, 0.6, 0.63, 0.67, 0.7, 0.76, 0.8, 0.84, 0.9, 0.94, 1.0, + 1.06, 1.12, 1.18, 1.26, 1.34, 1.42, 1.5, 1.6, 1.68, 1.78, 1.88, 2.0 }; + + public static Sound getInstrumentSound(byte instrument) + { + switch (instrument) + { + case 0: + return Sound.NOTE_PIANO; + case 1: + return Sound.NOTE_BASS_GUITAR; + case 2: + return Sound.NOTE_BASS_DRUM; + case 3: + return Sound.NOTE_SNARE_DRUM; + case 4: + return Sound.NOTE_STICKS; + default: + return Sound.NOTE_PIANO; + } + } + + public static double getPitch(int note) + { + if (note >= 0 && note < PITCH.length) + { + return PITCH[note]; + } + + return 0.0; + } + +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 4e16d3376..956cd13cc 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -1,5 +1,6 @@ package mineplex.hub; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.HashMap; @@ -34,6 +35,9 @@ import mineplex.core.hologram.HologramManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.message.PrivateMessageEvent; import mineplex.core.mount.MountManager; +import mineplex.core.noteblock.NBSReader; +import mineplex.core.noteblock.NotePlayer; +import mineplex.core.noteblock.NoteSong; import mineplex.core.notifier.NotificationManager; import mineplex.core.npc.NpcManager; import mineplex.core.packethandler.PacketHandler; @@ -219,7 +223,6 @@ public class HubManager extends MiniClientPlugin ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle().pvpMode = true; - new BonusManager(plugin, clientManager, serverStatusManager, donationManager, pollManager , npcManager, hologramManager, statsManager, _inventoryManager, petManager, giveawayManager); // _halloweenManager = new HalloweenSpookinessManager(this); @@ -229,6 +232,20 @@ public class HubManager extends MiniClientPlugin _serverName = getPlugin().getConfig().getString("serverstatus.name"); _serverName = _serverName.substring(0, Math.min(16, _serverName.length())); + +// try +// { +// NoteSong song = NBSReader.loadSong("songs/LetItGo.nbs"); +// if (song != null) +// { +// NotePlayer player = new NotePlayer(song, true); +// } +// } +// catch (FileNotFoundException e) +// { +// e.printStackTrace(); +// System.out.println("FAILED TO LOAD SONG!!"); +// } } @Override From 54ec0e39bb361d8de59f1ac4bc9d3e743ffe93e9 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 13:25:32 +1100 Subject: [PATCH 064/223] more polisshhhh on snowfight enabled xmas chests --- .../nautilus/game/arcade/ArcadeManager.java | 6 +++-- .../games/monsterleague/kits/KitGolem.java | 2 +- .../monsterleague/perks/PerkStoneWall.java | 22 ++++++++++++++----- .../game/games/snowfight/kits/KitMedic.java | 3 ++- .../games/snowfight/kits/KitSportsman.java | 11 ++++++---- .../games/snowfight/kits/KitTactician.java | 13 +++++++++-- .../game/arcade/managers/HolidayManager.java | 9 ++++++-- 7 files changed, 48 insertions(+), 18 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 a29c226fe..8a852224a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -59,6 +59,7 @@ import mineplex.core.status.ServerStatusManager; import mineplex.core.task.TaskManager; import mineplex.core.teleport.Teleport; import mineplex.core.timing.TimingManager; +import mineplex.core.titangiveaway.TitanGiveawayManager; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.classcombat.Class.ClassManager; import mineplex.minecraft.game.classcombat.Condition.SkillConditionManager; @@ -101,6 +102,7 @@ import nautilus.game.arcade.managers.GameSpectatorManager; import nautilus.game.arcade.managers.GameStatManager; import nautilus.game.arcade.managers.GameTournamentManager; import nautilus.game.arcade.managers.GameWorldManager; +import nautilus.game.arcade.managers.HolidayManager; import nautilus.game.arcade.managers.IdleManager; import nautilus.game.arcade.managers.MiscManager; import nautilus.game.arcade.shop.ArcadeShop; @@ -298,8 +300,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation new MiscManager(this); _hologramManager = hologramManager; _idleManager = new IdleManager(this); - //TitanGiveawayManager titanGiveaway = new TitanGiveawayManager(getPlugin(), clientManager, serverStatusManager); - //new HolidayManager(this, titanGiveaway); + TitanGiveawayManager titanGiveaway = new TitanGiveawayManager(getPlugin(), clientManager, serverStatusManager); + new HolidayManager(this, titanGiveaway); // Game Addons new CompassAddon(plugin, this); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitGolem.java index 9427e6ef2..2024c10bd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitGolem.java @@ -29,7 +29,7 @@ public class KitGolem extends LeagueKit new Perk[] { new PerkDoubleJump("Double Jump", 0.8, 0.8, true), - new PerkStoneWall(), + new PerkStoneWall("Iron Wall", Material.IRON_BLOCK, Material.IRON_INGOT), new PerkSlow(0) }, EntityType.IRON_GOLEM, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java index 90a678c6a..8cf307488 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java @@ -20,7 +20,9 @@ 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.UtilGear; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -29,14 +31,19 @@ import nautilus.game.arcade.kit.perks.data.IcePathData; public class PerkStoneWall extends Perk { - private HashSet _data = new HashSet(); + private Material _type; + private Material _itemInHand; - public PerkStoneWall() + public PerkStoneWall(String name, Material block, Material itemInHand) { - super("Iron Wall", new String[] + super(name, new String[] { - C.cYellow + "Click" + C.cGray + " to use " + C.cGreen + "Iron Wall" + C.cYellow + "Click" + C.cGray + " with " + ItemStackFactory.Instance.GetName(itemInHand, (byte)0, false) + " to use " + C.cGreen + name }); + + _type = block; + + _itemInHand = itemInHand; } @EventHandler @@ -49,6 +56,9 @@ public class PerkStoneWall extends Perk event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + if (!UtilGear.isMat(event.getPlayer().getItemInHand(), _itemInHand)) + return; + if (UtilBlock.usable(event.getClickedBlock())) return; @@ -98,9 +108,9 @@ public class PerkStoneWall extends Perk loc.add(UtilAlg.getLeft(dir).multiply(i)); loc.add(UtilAlg.getUp(dir).multiply(j)); - Manager.GetBlockRestore().add(loc.getBlock(), Material.IRON_BLOCK.getId(), (byte)0, 4000); + Manager.GetBlockRestore().add(loc.getBlock(), _type.getId(), (byte)0, 4000); - loc.getWorld().playEffect(loc, Effect.STEP_SOUND, Material.IRON_BLOCK); + loc.getWorld().playEffect(loc, Effect.STEP_SOUND, _type); } player.getWorld().playSound(player.getLocation(), Sound.IRONGOLEM_DEATH, 2f, 1f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java index 3cb7b3b13..2bfc12179 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java @@ -5,6 +5,7 @@ import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.AbbreviatedKit; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; @@ -19,7 +20,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.potion.Potion; import org.bukkit.potion.PotionType; -public class KitMedic extends Kit +public class KitMedic extends AbbreviatedKit { public KitMedic(ArcadeManager manager) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java index ddc84535f..e0aa1ed95 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java @@ -16,15 +16,17 @@ import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.AbbreviatedKit; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.perks.PerkDoubleJump; import nautilus.game.arcade.kit.perks.PerkFallDamage; +import nautilus.game.arcade.kit.perks.PerkSpeed; -public class KitSportsman extends Kit +public class KitSportsman extends AbbreviatedKit { - + public KitSportsman(ArcadeManager manager) { super(manager, "Sportsman", KitAvailability.Free, @@ -37,8 +39,9 @@ public class KitSportsman extends Kit new Perk[] { - new PerkDoubleJump("Snow Jump", 1, 0.8, true, 8000, true), - new PerkFallDamage(-2), + new PerkSpeed(0), + new PerkFallDamage(-2), + new PerkDoubleJump("Snow Jump", 1, 0.8, true, 8000, true), }, EntityType.SKELETON, new ItemStack(Material.SNOW_BALL)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java index 1395c2add..8452ae106 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java @@ -1,7 +1,11 @@ package nautilus.game.arcade.game.games.snowfight.kits; import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.monsterleague.perks.PerkStoneWall; +import nautilus.game.arcade.kit.AbbreviatedKit; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; @@ -12,9 +16,13 @@ import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.Potion; +import org.bukkit.potion.PotionType; -public class KitTactician extends Kit +public class KitTactician extends AbbreviatedKit { public KitTactician(ArcadeManager manager) @@ -26,8 +34,8 @@ public class KitTactician extends Kit }, new Perk[] { - new PerkConstructor("Constructor", 16, 2, Material.FENCE, "Barrier", true), new PerkIronSkin(0.25), + new PerkStoneWall("Ice Wall", Material.ICE, Material.CLAY_BALL), }, EntityType.SKELETON, new ItemStack(Material.FENCE)); @@ -37,6 +45,7 @@ public class KitTactician extends Kit @Override public void GiveItems(Player player) { + player.getInventory().setItem(1, ItemStackFactory.Instance.CreateStack(Material.CLAY_BALL, (byte)0, 1, "Ice Wall")); player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java index 570ea9ea3..109128ad4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -83,8 +83,8 @@ public class HolidayManager implements Listener } } - private HolidayType type = HolidayType.Halloween; - private String _statName = "Halloween Pumpkins 2015"; + private HolidayType type = HolidayType.Christmas; + private String _statName = "Christmas Presents 2015"; ArcadeManager Manager; private TitanGiveawayManager _titanManager; @@ -173,6 +173,11 @@ public class HolidayManager implements Listener sendChestPackets(block); } } + else if (type == HolidayType.Christmas) + { + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, block.getLocation().add(0.5, 0.2, 0.5), 0.3f, 0.2f, 0.3f, 0, 1, + ViewDist.LONG, UtilServer.getPlayers()); + } } } From 5486d8acf62609697c619b0ee32884162122a9c2 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 13:42:59 +1100 Subject: [PATCH 065/223] more prep --- .../monsterleague/perks/PerkStoneWall.java | 2 +- .../arcade/game/games/snowfight/SnowFight.java | 2 ++ .../game/games/snowfight/kits/KitMedic.java | 18 ++++++++++++++---- .../games/snowfight/kits/KitSportsman.java | 12 +++++++----- .../games/snowfight/kits/KitTactician.java | 17 +++++++---------- .../game/arcade/managers/HolidayManager.java | 4 ++-- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java index 8cf307488..72f78fd0c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkStoneWall.java @@ -67,7 +67,7 @@ public class PerkStoneWall extends Perk if (!Kit.HasKit(player)) return; - if (!Recharge.Instance.use(player, GetName(), 24000, true, true)) + if (!Recharge.Instance.use(player, GetName(), 20000, true, true)) return; Recharge.Instance.setDisplayForce(player, GetName(), true); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index f262a2c7c..1b9592fe7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -178,6 +178,8 @@ public class SnowFight extends TeamGame @EventHandler public void BlockDamage(BlockDamageEvent event) { + System.out.println("DING"); + Player player = event.getPlayer(); if (!InProgress()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java index 2bfc12179..def43a186 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitMedic.java @@ -9,6 +9,7 @@ import nautilus.game.arcade.kit.AbbreviatedKit; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; +import net.md_5.bungee.api.ChatColor; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -30,6 +31,7 @@ public class KitMedic extends AbbreviatedKit new String[] { "Throw warmth potions to heal allies!", + ChatColor.RESET + " ", C.cGray + "Receive 1 Warmth Potion every 16 seconds. Maximum of 1.", }, @@ -47,10 +49,18 @@ public class KitMedic extends AbbreviatedKit @Override public void GiveItems(Player player) { - player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + Potion potion = new Potion(PotionType.INSTANT_HEAL); + potion.setSplash(true); + ItemStack stack = potion.toItemStack(1); + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(ChatColor.RESET + "Warmth Potion"); + stack.setItemMeta(meta); + + player.getInventory().setItem(1, stack); + player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java index e0aa1ed95..38f63cd44 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.game.games.snowfight.kits; +import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -34,6 +35,7 @@ public class KitSportsman extends AbbreviatedKit new String[] { "Trained to be the fastest on snow and ice.", + ChatColor.RESET + " ", }, @@ -41,7 +43,7 @@ public class KitSportsman extends AbbreviatedKit { new PerkSpeed(0), new PerkFallDamage(-2), - new PerkDoubleJump("Snow Jump", 1, 0.8, true, 8000, true), + new PerkDoubleJump("Snow Jump", 1, 0.8, true, 6000, true), }, EntityType.SKELETON, new ItemStack(Material.SNOW_BALL)); @@ -51,10 +53,10 @@ public class KitSportsman extends AbbreviatedKit @Override public void GiveItems(Player player) { - player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java index 8452ae106..a205eed7f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java @@ -12,15 +12,12 @@ import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.perks.PerkConstructor; import nautilus.game.arcade.kit.perks.PerkIronSkin; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.potion.Potion; -import org.bukkit.potion.PotionType; public class KitTactician extends AbbreviatedKit { @@ -31,10 +28,10 @@ public class KitTactician extends AbbreviatedKit new String[] { "No Snowfight is complete without a tactical game!", + ChatColor.RESET + " ", }, new Perk[] { - new PerkIronSkin(0.25), new PerkStoneWall("Ice Wall", Material.ICE, Material.CLAY_BALL), }, EntityType.SKELETON, @@ -45,11 +42,11 @@ public class KitTactician extends AbbreviatedKit @Override public void GiveItems(Player player) { - player.getInventory().setItem(1, ItemStackFactory.Instance.CreateStack(Material.CLAY_BALL, (byte)0, 1, "Ice Wall")); - player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, "Hearty Winter Stew")); + player.getInventory().setItem(1, ItemStackFactory.Instance.CreateStack(Material.CLAY_BALL, (byte)0, 1, ChatColor.RESET + "Ice Wall")); + player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); + player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); player.getInventory().setItem(7, ItemStackFactory.Instance.CreateStack(Material.COMPASS.getId(), (byte) 0, 1, "§a§lTracking Compass")); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java index 109128ad4..cf3bbf215 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -52,7 +52,7 @@ public class HolidayManager implements Listener { public enum HolidayType { - Christmas(Material.CHEST, "Present", Sound.LEVEL_UP), + Christmas(Material.CHEST, "Present", Sound.CAT_MEOW), Halloween(Material.PUMPKIN, "Pumpkin", Sound.ZOMBIE_REMEDY), Easter(Material.CHEST, "Egg Basket", Sound.CAT_MEOW); @@ -175,7 +175,7 @@ public class HolidayManager implements Listener } else if (type == HolidayType.Christmas) { - UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, block.getLocation().add(0.5, 0.2, 0.5), 0.3f, 0.2f, 0.3f, 0, 1, + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, block.getLocation().add(0.5, 1, 0.5), 0.5f, 0.5f, 0.5f, 0, 3, ViewDist.LONG, UtilServer.getPlayers()); } } From 7b5db2d4fbe21295f37c8a5c7868b383ad70ec7d Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 00:58:44 -0500 Subject: [PATCH 066/223] Hub Music, HubMusic Preference --- .../core/noteblock/INoteVerifier.java | 10 +++ .../mineplex/core/noteblock/NotePlayer.java | 40 +++++++++- .../core/noteblock/event/SongFinishEvent.java | 25 +++++++ .../core/noteblock/event/SongStartEvent.java | 25 +++++++ .../core/preferences/PreferencesManager.java | 2 +- .../preferences/PreferencesRepository.java | 9 ++- .../core/preferences/UserPreferences.java | 1 + .../core/preferences/ui/PreferencesPage.java | 25 ++++++- .../src/mineplex/hub/HubManager.java | 75 +++++++++++++++---- 9 files changed, 189 insertions(+), 23 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/INoteVerifier.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongFinishEvent.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongStartEvent.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/INoteVerifier.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/INoteVerifier.java new file mode 100644 index 000000000..f423c6394 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/INoteVerifier.java @@ -0,0 +1,10 @@ +package mineplex.core.noteblock; + +import org.bukkit.entity.Player; + +public interface INoteVerifier +{ + + public boolean shouldPlay(Player player); + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java index 19e48f16d..941bc1dd9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java @@ -1,26 +1,41 @@ package mineplex.core.noteblock; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.common.util.UtilServer; +import mineplex.core.noteblock.event.SongFinishEvent; +import mineplex.core.noteblock.event.SongStartEvent; public class NotePlayer { + private final JavaPlugin _plugin; private final NoteSong _song; + private final INoteVerifier _verifier; private final long _sleepMs; + private volatile float _volumeMult; private volatile boolean _loop; private volatile int _tick; private volatile boolean _finished; - public NotePlayer(NoteSong song, boolean loop) + public NotePlayer(JavaPlugin plugin, NoteSong song, INoteVerifier verifier, float volumeMult, boolean loop) { + _plugin = plugin; _song = song; + _verifier = verifier; _sleepMs = (long) (1000 / (song.getTempo() / 100D)); _loop = loop; _tick = 0; + _volumeMult = volumeMult; _finished = false; startThread(); + + SongStartEvent event = new SongStartEvent(_song); + _plugin.getServer().getPluginManager().callEvent(event); } private void startThread() @@ -43,6 +58,17 @@ public class NotePlayer else { _finished = true; + + _plugin.getServer().getScheduler().runTask(_plugin, new Runnable() + { + @Override + public void run() + { + SongFinishEvent event = new SongFinishEvent(_song); + _plugin.getServer().getPluginManager().callEvent(event); + } + }); + return; } } @@ -66,13 +92,21 @@ public class NotePlayer private void playTick(int tick) { + Player[] playerArray = UtilServer.getPlayers(); + List players = new ArrayList<>(playerArray.length); + for (Player player : playerArray) + { + if (_verifier.shouldPlay(player)) + players.add(player); + } + for (NoteLayer layer : _song.getLayers()) { Note note = layer.getNote(tick); if (note != null) { - float volume = layer.getVolume() / 100F; - for (Player player : UtilServer.getPlayers()) + float volume = _volumeMult * (layer.getVolume() / 100F); + for (Player player : players) { player.playSound(player.getEyeLocation(), UtilNote.getInstrumentSound(note.getInstrument()), volume, (float) UtilNote.getPitch(note.getNote() - 33)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongFinishEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongFinishEvent.java new file mode 100644 index 000000000..863537903 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongFinishEvent.java @@ -0,0 +1,25 @@ +package mineplex.core.noteblock.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import mineplex.core.noteblock.NoteSong; + +public class SongFinishEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { return handlers; } + public HandlerList getHandlers() { return handlers; } + + private NoteSong _song; + + public SongFinishEvent(NoteSong song) + { + _song = song; + } + + public NoteSong getSong() + { + return _song; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongStartEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongStartEvent.java new file mode 100644 index 000000000..00993f7c8 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/event/SongStartEvent.java @@ -0,0 +1,25 @@ +package mineplex.core.noteblock.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import mineplex.core.noteblock.NoteSong; + +public class SongStartEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { return handlers; } + public HandlerList getHandlers() { return handlers; } + + private NoteSong _song; + + public SongStartEvent(NoteSong song) + { + _song = song; + } + + public NoteSong getSong() + { + return _song; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java index 82eec02d1..23d067d8f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java @@ -136,6 +136,6 @@ public class PreferencesManager extends MiniDbClientPlugin @Override public String getQuery(int accountId, String uuid, String name) { - return "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests, friendDisplayInventoryUI, clanTips FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"; + return "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests, friendDisplayInventoryUI, clanTips, hubMusic FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"; } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java index 7449c83c9..895555da6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java @@ -24,7 +24,7 @@ public class PreferencesRepository extends RepositoryBase // DEFAULT 0, showMacReports BOOL NOT NULL DEFAULT 0, ignoreVelocity BOOL // NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE INDEX uuid_index (uuid));"; private static String INSERT_ACCOUNT = "INSERT INTO accountPreferences (uuid) VALUES (?) ON DUPLICATE KEY UPDATE uuid=uuid;"; - private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ?, showMacReports = ?, ignoreVelocity = ?, pendingFriendRequests = ?, friendDisplayInventoryUI = ?, clanTips = ? WHERE uuid=?;"; + private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ?, showMacReports = ?, ignoreVelocity = ?, pendingFriendRequests = ?, friendDisplayInventoryUI = ?, clanTips = ?, hubMusic = ? WHERE uuid=?;"; public PreferencesRepository(JavaPlugin plugin) { @@ -61,8 +61,9 @@ public class PreferencesRepository extends RepositoryBase preparedStatement.setBoolean(11, entry.getValue().PendingFriendRequests); preparedStatement.setBoolean(12, entry.getValue().friendDisplayInventoryUI); preparedStatement.setBoolean(13, entry.getValue().ClanTips); + preparedStatement.setBoolean(14, entry.getValue().HubMusic); System.out.println(">> " + entry.getValue().ClanTips); - preparedStatement.setString(14, entry.getKey()); + preparedStatement.setString(15, entry.getKey()); preparedStatement.addBatch(); } @@ -89,8 +90,9 @@ public class PreferencesRepository extends RepositoryBase preparedStatement.setBoolean(11, entry.getValue().PendingFriendRequests); preparedStatement.setBoolean(12, entry.getValue().friendDisplayInventoryUI); preparedStatement.setBoolean(13, entry.getValue().ClanTips); + preparedStatement.setBoolean(14, entry.getValue().HubMusic); System.out.println(">> " + entry.getValue().ClanTips); - preparedStatement.setString(14, entry.getKey()); + preparedStatement.setString(15, entry.getKey()); preparedStatement.execute(); } @@ -122,6 +124,7 @@ public class PreferencesRepository extends RepositoryBase preferences.PendingFriendRequests = resultSet.getBoolean(11); preferences.friendDisplayInventoryUI = resultSet.getBoolean(12); preferences.ClanTips = resultSet.getBoolean(13); + preferences.HubMusic = resultSet.getBoolean(14); System.out.println("<< " + resultSet.getBoolean(13)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java index 728f549e2..4036b494f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java @@ -16,4 +16,5 @@ public class UserPreferences public boolean PendingFriendRequests = true; public boolean friendDisplayInventoryUI = true; public boolean ClanTips = true; + public volatile boolean HubMusic = true; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java index 7cd111100..27e20e3d6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java @@ -25,6 +25,7 @@ public class PreferencesPage extends ShopPageBase private HashMap> _creativeAdmin = new HashMap>(); + // Christmas Songs + private Random _random = new Random(); + private int _lastSong = 0; + private final String[] _songNames = {"JingleBells.nbs", "TheFirstNoel.nbs", "Hark.nbs", "DeckTheHalls.nbs", "Joy.nbs", "MerryChristmas.nbs"}; + private final NoteSong[] _songs; + public HubManager(JavaPlugin plugin, BlockRestore blockRestore, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, ConditionManager conditionManager, DisguiseManager disguiseManager, TaskManager taskManager, Portal portal, PartyManager partyManager, PreferencesManager preferences, PetManager petManager, PollManager pollManager, StatsManager statsManager, AchievementManager achievementManager, HologramManager hologramManager, NpcManager npcManager, PersonalServerManager personalServerManager, PacketHandler packetHandler, Punish punish, ServerStatusManager serverStatusManager, GiveawayManager giveawayManager) { super("Hub Manager", plugin); @@ -230,22 +241,44 @@ public class HubManager extends MiniClientPlugin // NotificationManager notificationManager = new NotificationManager(plugin, clientManager, donationManager); // new MailManager(_plugin, notificationManager); + _songs = new NoteSong[_songNames.length]; + try + { + for (int i = 0; i < _songNames.length; i++) + { + String name = "songs/" + _songNames[i]; + NoteSong song = NBSReader.loadSong(name); + _songs[i] = song; + System.out.println("Loaded Song: " + name); + } + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + System.out.println("FAILED TO LOAD SONG!!"); + } + + playNextSong(); + _serverName = getPlugin().getConfig().getString("serverstatus.name"); _serverName = _serverName.substring(0, Math.min(16, _serverName.length())); + } -// try -// { -// NoteSong song = NBSReader.loadSong("songs/LetItGo.nbs"); -// if (song != null) -// { -// NotePlayer player = new NotePlayer(song, true); -// } -// } -// catch (FileNotFoundException e) -// { -// e.printStackTrace(); -// System.out.println("FAILED TO LOAD SONG!!"); -// } + private void playNextSong() + { + int index = (_lastSong + _random.nextInt(_songs.length - 1)) % _songs.length; + NoteSong song = _songs[index]; + if (song != null) + { + new NotePlayer(_plugin, song, new INoteVerifier() + { + @Override + public boolean shouldPlay(Player player) + { + return _preferences.Get(player).HubMusic; + } + }, 0.5F, false); + } } @Override @@ -944,4 +977,20 @@ public class HubManager extends MiniClientPlugin new GUIProfile(getPlugin(), event.getPlayer(), _preferences, _achievementManager, _personalServerManager).openInventory();; } + + @EventHandler + public void disableMusicChristmas(GadgetActivateEvent event) + { + if (event.getGadget() != null && event.getGadget().getGadgetType() == GadgetType.MusicDisc) + { + UtilPlayer.message(event.getPlayer(), F.main("Hub", "Music Discs are disabled right now")); + event.setCancelled(true); + } + } + + @EventHandler + public void onSongFinish(SongFinishEvent event) + { + playNextSong(); + } } From 1ada06af91f4a072ba026051e0b36e4f6c45d0a7 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 17:36:45 +1100 Subject: [PATCH 067/223] rewrote lots! --- .../game/games/snowfight/SnowFight.java | 556 +++++++----------- .../games/snowfight/kits/KitSportsman.java | 1 - .../games/snowfight/kits/KitTactician.java | 3 +- 3 files changed, 214 insertions(+), 346 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index 1b9592fe7..bd9edcc7e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -4,10 +4,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.Set; 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.UtilEvent; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; @@ -16,6 +22,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilWorld; +import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.updater.UpdateType; @@ -56,6 +63,7 @@ import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; @@ -64,73 +72,51 @@ import org.bukkit.util.Vector; public class SnowFight extends TeamGame { + private long _meteorTime = 10000; + private boolean _meteors = false; - private HashMap _tiles; - private long _meteorTime = 375000; - private boolean _meteors; - + private HashSet _meteorSet = new HashSet(); + public SnowFight(ArcadeManager manager) { super(manager, GameType.SnowFight, - new Kit[] + new Kit[] { - new KitSportsman(manager), - new KitTactician(manager), - new KitMedic(manager) + new KitSportsman(manager), + new KitTactician(manager), + new KitMedic(manager) }, new String[] { - "Defeat your foes with Snowballs", - "Last team alive wins!" + "Defeat your foes with Snowballs", + "Last team alive wins!" }); this.PrepareFreeze = false; + this.HungerSet = 20; + this.CompassEnabled = true; this.CompassGiveItem = false; + this.TeamArmor = true; this.TeamArmorHotbar = true; - this.BlockPlace = true; - this.BlockBreakAllow = new HashSet<>(Arrays.asList(Material.FENCE.getId())); - this._tiles = new HashMap(); - this._meteors = false; + + this.WorldWeatherEnabled = true; + this.WorldTimeSet = 4000; } - + @EventHandler - public void Weather(UpdateEvent event) + public void weather(UpdateEvent event) { if (event.getType() != UpdateType.SEC) return; - World world = UtilWorld.getWorldType(Environment.NORMAL); - - if (world == null) - return; - - world.setStorm(true); - world.setThundering(false); - world.setWeatherDuration(40); - world.setTime(4000); - } - - @EventHandler - public void IceDamage(UpdateEvent event) { - if(event.getType() != UpdateType.FAST) - return; - - if(!IsLive()) - return; - - for(Player player : GetPlayers(true)) - { - if(IsOnIce(player)) - { - Bukkit.getPluginManager().callEvent(new CustomDamageEvent(player, null, null, null, DamageCause.CUSTOM, 2.0D, false, true, true, "Ice", "Ice", false)); - } - } - + WorldData.World.setStorm(true); + WorldData.World.setThundering(false); + WorldData.World.setWeatherDuration(10); } @EventHandler @@ -138,185 +124,56 @@ public class SnowFight extends TeamGame { if (event.GetState() == GameState.Prepare) { - UtilTextMiddle.display(C.cGreen + "Prepare", "Collect Snowballs!", 0, 240, 20, UtilServer.getPlayers()); + UtilTextMiddle.display(C.cGreen + "Prepare", "Collect Snowballs!", 0, 60, 20, UtilServer.getPlayers()); } if (event.GetState() == GameState.Live) { for(Player player : GetPlayers(false)) player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 1F, 1F); - + UtilTextMiddle.display(C.cRed + "FIGHT", "", 0, 40, 20, UtilServer.getPlayers()); } } - - @EventHandler - public void Meteor(UpdateEvent event) - { - if(event.getType() != UpdateType.FAST) - return; - - if (!IsLive()) - return; - - if(System.currentTimeMillis() <= getGameLiveTime() + _meteorTime) - return; - - if(!_meteors) - { - for(Player player : GetPlayers(false)) - { - player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 1F, 1F); - UtilTextMiddle.display(C.cAqua + C.Bold + "Ice Meteors", "Avoid the Ice Fields!", player); - } - - _meteors = true; - } - - makeMeteor(); - } @EventHandler - public void BlockDamage(BlockDamageEvent event) + public void blockDamage(PlayerInteractEvent event) { - System.out.println("DING"); - Player player = event.getPlayer(); if (!InProgress()) return; - if (!IsPlaying(player)) + if (!UtilEvent.isAction(event, ActionType.L_BLOCK)) return; - if (!IsSnow(event.getBlock())) + if (!IsPlaying(player) || !IsAlive(player)) + return; + + if (!isSnow(event.getClickedBlock())) return; if (UtilInv.contains(player, Material.SNOW_BALL, (byte) 0, 16)) return; - // Item -// -// if (!_tiles.containsKey(player)) -// { -// _tiles.put(player, 0); -// } -// -// if (GetKit(player) instanceof KitSportsman) -// UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); -// -// -// int tiles = _tiles.get(player); -// _tiles.put(player, tiles + 1); -// -// if (!(GetKit(player) instanceof KitSportsman)) -// { -// if (_tiles.get(player) == 2) -// { -// UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); -// _tiles.put(player, 0); -// } -// } - UtilInv.insert(player, new ItemStack(Material.SNOW_BALL)); // Snow Height - SnowDecrease(event.getBlock(), 1); + snowDecrease(event.getClickedBlock(), 1); // Effect - event.getBlock().getWorld().playEffect(event.getBlock().getLocation(), Effect.STEP_SOUND, 80); + event.getClickedBlock().getWorld().playEffect(event.getClickedBlock().getLocation(), Effect.STEP_SOUND, 80); } - // @EventHandler - // public void InteractSnowball(PlayerInteractEvent event) - // { - // Player player = event.getPlayer(); - // - // if (!IsLive()) - // return; - // - // if (!IsPlaying(player)) - // return; - // - // if (!UtilGear.isMat(player.getItemInHand(), Material.SNOW_BALL)) - // return; - // - // event.setCancelled(true); - // - // if (UtilEvent.isAction(event, ActionType.L)) - // SnowballThrow(player); - // - // else if (UtilEvent.isAction(event, ActionType.R_BLOCK)) - // SnowballPlace(player, event.getClickedBlock(), 1); - // } - // - // private void SnowballPlace(Player player, Block block, int above) - // { - // if (block.getTypeId() == 78 || UtilBlock.airFoliage(block)) - // { - // //Build - // if (block.getTypeId() == 78) - // { - // block.setTypeIdAndData(78, (byte)(block.getData() + 1), true); - // - // if (block.getData() >= 7) - // block.setTypeIdAndData(80, (byte)0, true); - // } - // else - // { - // block.setTypeIdAndData(78, (byte)0, true); - // } - // - // //Sound - // block.getWorld().playSound(block.getLocation(), Sound.STEP_SNOW, 1f, - // 0.6f); - // - // //Use Snow - // SnowballCount(player, -1); - // } - // else if ((IsSnow(block) || UtilBlock.solid(block)) && above > 0) - // { - // SnowballPlace(player, block.getRelative(BlockFace.UP), above - 1); - // } - // } - // - // private void SnowballThrow(Player player) - // { - // //Throw - // player.launchProjectile(Snowball.class); - // - // //Use Snow - // SnowballCount(player, -1); - // - // //Sound - // player.getWorld().playSound(player.getLocation(), Sound.STEP_SNOW, 3f, - // 1.5f); - // } - - // private void SnowballCount(Player player, int count) - // { - // if (player.getInventory().getItem(1) != null) - // count += player.getInventory().getItem(1).getAmount(); - // - // if (count > 16) - // count = 16; - // - // if (count > 0) - // player.getInventory().setItem(1, - // ItemStackFactory.Instance.CreateStack(Material.SNOW_BALL, count)); - // else - // player.getInventory().setItem(1, null); - // } - - private void SnowDecrease(Block block, int height) + private void snowDecrease(Block block, int height) { if (height <= 0) return; - if (!IsSnow(block)) + if (!isSnow(block)) return; // Shuffle Up - while (IsSnow(block.getRelative(BlockFace.UP))) + while (isSnow(block.getRelative(BlockFace.UP))) block = block.getRelative(BlockFace.UP); // Snow Block @@ -328,32 +185,32 @@ public class SnowFight extends TeamGame if (height >= snowLevel) { block.setTypeIdAndData(0, (byte) 0, false); - SnowDecrease(block.getRelative(BlockFace.DOWN), height - snowLevel); + snowDecrease(block.getRelative(BlockFace.DOWN), height - snowLevel); } else { block.setTypeIdAndData(78, (byte) (snowLevel - height - 1), false); } } - + @EventHandler - public void HealthRegen(EntityRegainHealthEvent event) + public void healthRegen(EntityRegainHealthEvent event) { if(event.getRegainReason() == RegainReason.SATIATED) { event.setAmount(1); } } - + @EventHandler(priority = EventPriority.HIGH) - public void GenerallDamage(CustomDamageEvent event) + public void generallDamage(CustomDamageEvent event) { if(event.GetCause() == DamageCause.ENTITY_ATTACK) event.SetCancelled("No Melee"); } - @EventHandler(priority = EventPriority.HIGH) - public void SnowballEggDamage(CustomDamageEvent event) + @EventHandler(priority = EventPriority.NORMAL) + public void snowballEggDamage(CustomDamageEvent event) { if (event.IsCancelled()) return; @@ -364,13 +221,13 @@ public class SnowFight extends TeamGame Projectile proj = event.GetProjectile(); if (proj == null) return; - + if(proj instanceof Fireball) return; - + if(proj instanceof Snowball) event.AddMod("Snowball", "Snowball", 2, true); - + event.SetIgnoreRate(true); event.SetIgnoreArmor(true); @@ -379,157 +236,32 @@ public class SnowFight extends TeamGame ((Player) proj.getShooter()).playSound(((Player) proj.getShooter()).getLocation(), Sound.SUCCESSFUL_HIT, 1, 1); } - private boolean IsSnow(Block block) + private boolean isSnow(Block block) { return block.getTypeId() == 78 || block.getTypeId() == 80; } - - private boolean IsOnIce(Player player) + + private boolean isOnIce(Player player) { - return player.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.ICE; - } - - - private void makeMeteor() - { - - Location loc = getEndgameLocation(); - - if (loc == null) - { - return; - } - - summonMeteor(loc, 20F); - + return player.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.PACKED_ICE; } - private void summonMeteor(Location loc, float fireballSize) + private Location getMeteorTargetLocation() { - Vector vector = new Vector(UtilMath.random.nextDouble() - 0.5D, 0.8, UtilMath.random.nextDouble() - 0.5D).normalize(); - - vector.multiply(40); - - loc.add((UtilMath.random.nextDouble() - 0.5) * 7, 0, (UtilMath.random.nextDouble() - 0.5) * 7); - - loc.add(vector); - - final FallingBlock fallingblock = loc.getWorld().spawnFallingBlock(loc, Material.ICE, (byte) 0); - - fallingblock.setMetadata("Meteor", new FixedMetadataValue(getArcadeManager().getPlugin(), fireballSize)); - - new BukkitRunnable() - { - int i; - - public void run() - { - if (fallingblock.isValid() && IsLive()) - { - UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, fallingblock.getLocation(), 0.3F, 0.3F, 0.3F, 0, 3, - ViewDist.MAX, UtilServer.getPlayers()); - - if (i++ % 6 == 0) - { - fallingblock.getWorld().playSound(fallingblock.getLocation(), Sound.CAT_HISS, 0.7F, 0F); - } - } - else - { - cancel(); - } - } - }.runTaskTimer(getArcadeManager().getPlugin(), 0, 0); - - vector.normalize().multiply(-(0.04 + ((0.5 - 0.05) / 2))); - fallingblock.setFireTicks(9999); - } - - @EventHandler - public void MeteorHit(EntityChangeBlockEvent event) - { - Entity projectile = event.getEntity(); - - float size = 2.5F; - double damage = 2.5D; - - for(int i = 1; i <= 10; i++) - { - if(System.currentTimeMillis() >= getGameLiveTime() + (((30 * i) + 180) * 1000)) - { - size = 2.5F * i; - damage = 2.5D * i; - } - } - - if (projectile.hasMetadata("Meteor")) - { - - CustomExplosion explosion = new CustomExplosion(getArcadeManager().GetDamage(), getArcadeManager().GetExplosion(), - projectile.getLocation(), size, "Meteor"); - - explosion.setBlockExplosionSize(size); - explosion.setFallingBlockExplosion(false); - explosion.setDropItems(false); - explosion.setBlocksDamagedEqually(true); - - //Effect - UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, projectile.getLocation(), 0.5f, 0.5f, 0.5f, 0, 5, ViewDist.MAX, UtilServer.getPlayers()); - for(Player player : UtilServer.getPlayers()) - player.playSound(projectile.getLocation(), Sound.EXPLODE, 1, 1); - - - boolean fall = true; - - for(Entity player : projectile.getNearbyEntities(size, size, size)) - { - if(player instanceof Player) - { - Player damagee = (Player) player; - Bukkit.getPluginManager().callEvent(new CustomDamageEvent(damagee, null, null, null, DamageCause.CUSTOM, damage, false, true, true, "Ice Meteor", "Ice Meteor", false)); - } - } - - for(Block block : UtilBlock.getInRadius(event.getEntity().getLocation(), size).keySet()) - { - if(block.getType() != Material.AIR) - { - block.setType(Material.ICE); - - if(block.getRelative(BlockFace.DOWN).getType() == Material.AIR) - { - // to reduce lag - if(fall) - { - block.getWorld().spawnFallingBlock(block.getLocation(), block.getType(), block.getData()); - fall = false; - } - else - { - fall = true; - } - block.setType(Material.AIR); - } - } - } - - } - } - - private Location getEndgameLocation() - { - int chance = UtilMath.r(50) + 3; - int accuracy = Math.max((int) (chance - (0.0001 * chance)), 1); - ArrayList players = GetPlayers(true); + //50 attempts, otherwise skip for (int a = 0; a < 50; a++) { - Player player = players.get(UtilMath.r(players.size())); + Player player = UtilAlg.Random(players); - Location location = player.getLocation().add(UtilMath.r(accuracy * 2) - accuracy, 0, - UtilMath.r(accuracy * 2) - accuracy); + //random offset to player location + Location location = player.getLocation().add( + (Math.random() - 0.5) * 32, + 0, + (Math.random() - 0.5) * 32); + //highest block! location = WorldData.World.getHighestBlockAt(location).getLocation().add(0.5, 0, 0.5); if (location.getBlock().getType() == Material.AIR) @@ -539,6 +271,8 @@ public class SnowFight extends TeamGame if (location.getBlockY() > 0 && location.getBlock().getType() != Material.AIR) { + location.setY(player.getLocation().getY() + 80); + return location; } } @@ -547,24 +281,160 @@ public class SnowFight extends TeamGame } @EventHandler - public void Place(BlockPlaceEvent event) + public void meteorSpawn(UpdateEvent event) { - if(event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.ICE - || event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.PACKED_ICE - || event.getBlock().getRelative(BlockFace.DOWN).getType() == Material.FENCE) + if(event.getType() != UpdateType.FAST) + return; + + if (!IsLive()) + return; + + if(System.currentTimeMillis() <= getGameLiveTime() + _meteorTime) + return; + + //Announce + if(!_meteors) { - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cant place a Barrier here!")); - event.setCancelled(true); + for(Player player : GetPlayers(false)) + { + player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 1F, 1F); + UtilTextMiddle.display(C.cAqua + C.Bold + "Ice Meteors", "Avoid the Ice Fields!", player); + } + + _meteors = true; + } + + //Spawn Meteor + Location loc = getMeteorTargetLocation(); + + if (loc == null) + return; + + FallingBlock fallingblock = loc.getWorld().spawnFallingBlock(loc, Material.ICE, (byte) 0); + + fallingblock.setMetadata("Meteor", new FixedMetadataValue(getArcadeManager().getPlugin(), 20f)); + + _meteorSet.add(fallingblock); + } + + @EventHandler + public void meteorUpdate(UpdateEvent event) + { + if(event.getType() != UpdateType.TICK) + return; + + if(!IsLive()) + return; + + Iterator blockIter = _meteorSet.iterator(); + + while (blockIter.hasNext()) + { + FallingBlock block = blockIter.next(); + + if (block.isValid()) + { + //Particle + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, block.getLocation(), 0.3F, 0.3F, 0.3F, 0, 3, + ViewDist.MAX, UtilServer.getPlayers()); + + //Sound + if (block.getTicksLived() % 6 == 0) + block.getWorld().playSound(block.getLocation(), Sound.CAT_HISS, 0.5F, 0F); + } + //Clean + else + { + block.remove(); + blockIter.remove(); + } } } - + + @EventHandler + public void meteorHit(EntityChangeBlockEvent event) + { + event.setCancelled(true); + + Entity projectile = event.getEntity(); + + float timePassed = (System.currentTimeMillis() - (getGameLiveTime() + _meteorTime))/1000f; + + float multiplier = 1 + Math.min(3f, timePassed / 60f); + + float size = 2 + multiplier; + + if (projectile.hasMetadata("Meteor")) + { + //Effect + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, projectile.getLocation(), 0.5f, 0.5f, 0.5f, 0, 5, ViewDist.MAX, UtilServer.getPlayers()); + for(Player player : UtilServer.getPlayers()) + player.playSound(projectile.getLocation(), Sound.EXPLODE, 1, 1); + + + //Damage + HashMap players = UtilPlayer.getInRadius(event.getEntity().getLocation(), size + 3); + for (Player player : players.keySet()) + { + //Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, + DamageCause.CUSTOM, size * players.get(player), false, true, false, + "Ice Meteor", "Ice Meteor", false); + + //Vel + UtilAction.velocity(player, UtilAlg.getTrajectory(event.getEntity(), player), 1.2 * players.get(player), false, 0, 0.4, 1, true); + } + + //Convert to Ice + for(Block block : UtilBlock.getInRadius(event.getEntity().getLocation(), size).keySet()) + { + int i = 5; + while (block.getY() > 0 && i>0) + { + if (block.getType() == Material.LADDER) + block.breakNaturally(); + + //Has air above it + if (UtilBlock.solid(block) && UtilBlock.isVisible(block)) + block.setType(Material.PACKED_ICE); + + //shuffle down + block = block.getRelative(BlockFace.DOWN); + i--; + } + } + } + + projectile.remove(); + } + + + @EventHandler + public void iceDamage(UpdateEvent event) + { + if(event.getType() != UpdateType.FAST) + return; + + if(!IsLive()) + return; + + for(Player player : GetPlayers(true)) + { + //XXX DO BETTER CHECK, hanging off block, ladders, etc. + if(isOnIce(player)) + { + Bukkit.getPluginManager().callEvent(new CustomDamageEvent(player, null, null, null, DamageCause.CUSTOM, 0.5, false, true, true, "Ice", "Ice", false)); + } + } + } + @Override @EventHandler public void ScoreboardUpdate(UpdateEvent event) { if (event.getType() != UpdateType.FAST) return; - + Scoreboard.Reset(); Scoreboard.WriteBlank(); @@ -574,7 +444,7 @@ public class SnowFight extends TeamGame { if (!team.IsTeamAlive()) continue; - + for(Player player : team.GetPlayers(true)) { Scoreboard.Write(team.GetColor() + player.getName()); @@ -607,7 +477,7 @@ public class SnowFight extends TeamGame Scoreboard.Write(C.cGold + C.Bold + "Meteors!"); } } - + Scoreboard.Draw(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java index 38f63cd44..f678d80dd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitSportsman.java @@ -56,7 +56,6 @@ public class KitSportsman extends AbbreviatedKit player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java index a205eed7f..3e035afb2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/kits/KitTactician.java @@ -35,7 +35,7 @@ public class KitTactician extends AbbreviatedKit new PerkStoneWall("Ice Wall", Material.ICE, Material.CLAY_BALL), }, EntityType.SKELETON, - new ItemStack(Material.FENCE)); + new ItemStack(Material.CLAY_BALL)); } @@ -46,7 +46,6 @@ public class KitTactician extends AbbreviatedKit player.getInventory().setItem(2, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); player.getInventory().setItem(3, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); player.getInventory().setItem(4, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); - player.getInventory().setItem(5, ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP, (byte)0, 1, ChatColor.RESET + "Hearty Winter Stew")); player.getInventory().setItem(7, ItemStackFactory.Instance.CreateStack(Material.COMPASS.getId(), (byte) 0, 1, "§a§lTracking Compass")); } From d75d7a2c8fe4971e50ba60571c0793f64b6c0e24 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 17:56:35 +1100 Subject: [PATCH 068/223] snowfight finish --- .../game/games/snowfight/SnowFight.java | 66 ++++++++++++++----- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index bd9edcc7e..dce28ada5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -72,7 +72,7 @@ import org.bukkit.util.Vector; public class SnowFight extends TeamGame { - private long _meteorTime = 10000; + private long _meteorTime = 240000; private boolean _meteors = false; private HashSet _meteorSet = new HashSet(); @@ -104,20 +104,20 @@ public class SnowFight extends TeamGame this.TeamArmor = true; this.TeamArmorHotbar = true; - this.WorldWeatherEnabled = true; - this.WorldTimeSet = 4000; +// this.WorldWeatherEnabled = true; +// this.WorldTimeSet = 4000; } - @EventHandler - public void weather(UpdateEvent event) - { - if (event.getType() != UpdateType.SEC) - return; - - WorldData.World.setStorm(true); - WorldData.World.setThundering(false); - WorldData.World.setWeatherDuration(10); - } +// @EventHandler +// public void weather(UpdateEvent event) +// { +// if (event.getType() != UpdateType.SEC) +// return; +// +// WorldData.World.setStorm(true); +// WorldData.World.setThundering(false); +// WorldData.World.setWeatherDuration(12); +// } @EventHandler public void battleAnnounce(GameStateChangeEvent event) @@ -243,7 +243,36 @@ public class SnowFight extends TeamGame private boolean isOnIce(Player player) { - return player.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.PACKED_ICE; + //Side Standing + double xMod = player.getLocation().getX() % 1; + if (player.getLocation().getX() < 0) + xMod += 1; + + double zMod = player.getLocation().getZ() % 1; + if (player.getLocation().getZ() < 0) + zMod += 1; + + int xMin = 0; + int xMax = 0; + int zMin = 0; + int zMax = 0; + + if (xMod < 0.3) xMin = -1; + if (xMod > 0.7) xMax = 1; + + if (zMod < 0.3) zMin = -1; + if (zMod > 0.7) zMax = 1; + + for (int x=xMin ; x<=xMax ; x++) + { + for (int z=zMin ; z<=zMax ; z++) + { + if (player.getLocation().add(x, -0.5, z).getBlock().getType() == Material.PACKED_ICE) + return true; + } + } + + return false; } private Location getMeteorTargetLocation() @@ -362,7 +391,7 @@ public class SnowFight extends TeamGame float multiplier = 1 + Math.min(3f, timePassed / 60f); - float size = 2 + multiplier; + float size = 1.5f + multiplier; if (projectile.hasMetadata("Meteor")) { @@ -391,8 +420,11 @@ public class SnowFight extends TeamGame int i = 5; while (block.getY() > 0 && i>0) { - if (block.getType() == Material.LADDER) + if (block.getType() == Material.LADDER || + block.getType() == Material.STAINED_GLASS || + block.getType() == Material.STAINED_GLASS_PANE) block.breakNaturally(); + //Has air above it if (UtilBlock.solid(block) && UtilBlock.isVisible(block)) @@ -423,7 +455,7 @@ public class SnowFight extends TeamGame //XXX DO BETTER CHECK, hanging off block, ladders, etc. if(isOnIce(player)) { - Bukkit.getPluginManager().callEvent(new CustomDamageEvent(player, null, null, null, DamageCause.CUSTOM, 0.5, false, true, true, "Ice", "Ice", false)); + Bukkit.getPluginManager().callEvent(new CustomDamageEvent(player, null, null, null, DamageCause.CUSTOM, 1, false, true, true, "Ice", "Ice", false)); } } } From 44a5bcb793b35ec568a6c0c0da91bce82fff30cf Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 02:06:00 -0500 Subject: [PATCH 069/223] remove titan chest message, update pumkin message, holiday MB/DMT words --- .../redis/GiveawayMessageHandler.java | 2 +- .../redis/TitanChestGiveawayHandler.java | 4 +- .../game/arcade/game/games/build/Build.java | 70 +++++++++++-------- .../game/arcade/game/games/draw/Draw.java | 25 ++++++- 4 files changed, 69 insertions(+), 32 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/GiveawayMessageHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/GiveawayMessageHandler.java index 93bd6183e..3afc7c3c1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/GiveawayMessageHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/GiveawayMessageHandler.java @@ -32,7 +32,7 @@ public class GiveawayMessageHandler implements CommandCallback String playerName = message.getPlayerName(); int count = message.getTitanCount(); String countString = count + UtilTime.getDayOfMonthSuffix(count); - String chatMessage = C.cRed + playerName + C.cWhite + " found Titan in a " + C.cRed + "Flaming Pumpkin"; + String chatMessage = C.cRed + playerName + C.cWhite + " found Titan in a " + C.cRed + "Christmas Present"; UtilTextMiddle.display(C.cDRed + C.Bold + "TITAN", chatMessage, 20, 80, 20, UtilServer.getPlayers()); World world = UtilServer.getPlayers().length > 0 ? UtilServer.getPlayers()[0].getWorld() : Bukkit.getWorlds().get(0); LightFlicker lightFlicker = new LightFlicker(world); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/TitanChestGiveawayHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/TitanChestGiveawayHandler.java index 65081a2d8..0c99ada73 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/TitanChestGiveawayHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/titangiveaway/redis/TitanChestGiveawayHandler.java @@ -16,18 +16,20 @@ public class TitanChestGiveawayHandler implements CommandCallback private ServerStatusManager _statusManager; private long _lastTimer; + private boolean _enabled; public TitanChestGiveawayHandler(ServerStatusManager statusManager) { _statusManager = statusManager; _lastTimer = 0; + _enabled = false; } @Override public void run(ServerCommand command) { - if (command instanceof TitanChestGiveawayMessage) + if (command instanceof TitanChestGiveawayMessage && _enabled) { TitanChestGiveawayMessage chestCommand = ((TitanChestGiveawayMessage) command); if (chestCommand.getServer().equals(_statusManager.getCurrentServerName()) || System.currentTimeMillis() >= _lastTimer + COOLDOWN) 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 c2a457899..a066fd174 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 @@ -118,6 +118,7 @@ public class Build extends SoloGame private int _countdownTimerState = 0; private String[] _words; + private String[] _holidayWords; private String _word = "?"; @@ -140,20 +141,20 @@ public class Build extends SoloGame private ChatColor _hintColor = ChatColor.YELLOW; private ChatColor _firstHintColor = ChatColor.YELLOW; - public Build(ArcadeManager manager) + public Build(ArcadeManager manager) { super(manager, GameType.Build, new Kit[] { - new KitBuilder(manager), + new KitBuilder(manager), }, - new String[] - { - "Be creative and build something", - "based on the build theme!" - }); + new String[] + { + "Be creative and build something", + "based on the build theme!" + }); this.StrictAntiHack = true; this.Damage = false; @@ -161,7 +162,7 @@ public class Build extends SoloGame this.HealthSet = 20; this.BlockBreak = true; - this.BlockPlace = true; + this.BlockPlace = true; this.ItemDrop = true; this.ItemPickup = true; @@ -173,32 +174,42 @@ public class Build extends SoloGame this.PrepareFreeze = false; this.CreatureAllow = true; - + this.WorldFireSpread = true; this.WorldBoneMeal = true; - + this.DontAllowOverfill = true; - + UtilServer.getServer().spigot().getConfig().set("view-distance", 4); _words = new String[] { - "Rollercoaster", "Pokemon", "Pirates", "Vikings", "Dinosaur", "Dragon", "Toilet", "Farm", "Tree House", - "Cat", "Truck", "Bicycle", "Soda", "Music Instrument", "Statue", "Pot of Gold", "Shrek", "Fruit", "Breakfast", - "Toaster", "Robot", "Camping", "Rocket", "Aliens", "Shipwreck", "Spongebob", "Car", "Potted Plant", "Weapons", - "Christmas", "King", "Queen", "Angel", "Demon", "Halloween", "Tank", "Helicopter", "Knight", "Rabbit", - "Sandwich", "Snowman", "Ice Cream", "Sea Shell", "Rainbow", - "Volcano", "Hot Tub", "Octopus", "Ghost", "Ant", "Cheese", "Kite Flying", "Reptile", - "Space Ship", "Pixel Art", "Chicken", "Shoe", "Owl", "Bear", "Flowers", "Lighthouse", - "Lion", "Television", "Batman", "Tiger", "Castle", "House", - "Bed", "Party", "Volleyball", "Toys", "Library", "Love", "Skull", - "Hat", "Snake", "Vacation", "Umbrella", "Magic", "Tornado", "Candy", "Dentist", "Pizza", "Bird", - "Superhero", "Turtle", "Chicken", "Build Anything!", "Food", "Picnic", - "Trophy", "Pool Party", "Hot Air Balloon", "Train", "Chocolate Bar", - "Clown", "Windmill", "Alligator", - "Police", "Igloo", "Gift", "Bumblebee", "Jellyfish", "Speedboat", - "Fall", "Summer", "Autumn", "Winter", "Disco", "Moose", - "Water Gun", "Astronaut", "Wither", "Meteor" + "Rollercoaster", "Pokemon", "Pirates", "Vikings", "Dinosaur", "Dragon", "Toilet", "Farm", "Tree House", + "Cat", "Truck", "Bicycle", "Soda", "Music Instrument", "Statue", "Pot of Gold", "Shrek", "Fruit", "Breakfast", + "Toaster", "Robot", "Camping", "Rocket", "Aliens", "Shipwreck", "Spongebob", "Car", "Potted Plant", "Weapons", + "Christmas", "King", "Queen", "Angel", "Demon", "Halloween", "Tank", "Helicopter", "Knight", "Rabbit", + "Sandwich", "Snowman", "Ice Cream", "Sea Shell", "Rainbow", + "Volcano", "Hot Tub", "Octopus", "Ghost", "Ant", "Cheese", "Kite Flying", "Reptile", + "Space Ship", "Pixel Art", "Chicken", "Shoe", "Owl", "Bear", "Flowers", "Lighthouse", + "Lion", "Television", "Batman", "Tiger", "Castle", "House", + "Bed", "Party", "Volleyball", "Toys", "Library", "Love", "Skull", + "Hat", "Snake", "Vacation", "Umbrella", "Magic", "Tornado", "Candy", "Dentist", "Pizza", "Bird", + "Superhero", "Turtle", "Chicken", "Build Anything!", "Food", "Picnic", + "Trophy", "Pool Party", "Hot Air Balloon", "Train", "Chocolate Bar", + "Clown", "Windmill", "Alligator", + "Police", "Igloo", "Gift", "Bumblebee", "Jellyfish", "Speedboat", + "Fall", "Summer", "Autumn", "Winter", "Disco", "Moose", + "Water Gun", "Astronaut", "Wither", "Meteor" + }; + + _holidayWords = new String[] + { + "Santa", "Reindeer", "Ornament", "Elf", "North Pole", "Candy Cane", "Xmas Lights", "Christmas Tree", + "Fireplace", "Hot Chocolate", "Snowflake", "Snowman", "Sleigh", "Toys", "Milk", "Eggnog", "Coal", + "Cookies", "Mistletoe", "Icicle", "Gingerbread", "Stocking", "Jingle Bells", "Family", "Mittens", + "Snowball Fight", "Decorations", "Snow Fort", "Chimney", "Scrooge", "Sweater", "Ice Skating", + "Pinecone", "Cabin", "Bells", "Cold", "Nutcracker", "Sled", "Mrs. Claus", "Grinch", "Igloo", + "Boots", "Gingerbread Man", "Glacier", "Ice Hockey", "Scarf", "Snowboard" }; _mobShop = new MobShop(getArcadeManager(), getArcadeManager().GetClients(), getArcadeManager().GetDonation()); @@ -238,7 +249,10 @@ public class Build extends SoloGame player.setFlySpeed(0.1f); } - _word = _words[UtilMath.r(_words.length)]; + if (Math.random() >= 0.5) + _word = _words[UtilMath.r(_words.length)]; + else + _word = _holidayWords[UtilMath.r(_holidayWords.length)]; UtilTextMiddle.display(null, C.cYellow + "Build " + C.cWhite + _word, 0, 80, 5); 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 24cd6996f..53d88aeda 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 @@ -83,6 +83,7 @@ public class Draw extends SoloGame private HashSet _tools; private String[] _words; + private String[] _holidayWords; private HashSet _usedWords = new HashSet(); public Draw(ArcadeManager manager) @@ -113,6 +114,16 @@ public class Draw extends SoloGame "Bird", "Volcano", "Sloth", "Love", "Dance", "Hair", "Glasses", "Domino", "Dice", "Computer", "Top Hat", "Beard", "Wind", "Rain", "Minecraft", "Push", "Fighting", "Juggle", "Clown", "Miner", "Creeper", "Ghast", "Spider", "Punch", "Roll", "River", "Desert", "Cold", "Pregnant", "Photo", "Quick", "Mario", "Luigi", "Bridge", "Turtle", "Door Knob", "Mineplex", "Binoculars", "Telescope", "Planet", "Mountain Bike", "Moon", "Comet", "Flower", "Squirrel", "Horse Riding", "Chef", "Elephant", "Yoshi", "Shotgun", "Pistol", "James Bond", "Money", "Salt and Pepper", "Truck", "Helicopter", "Hot Air Balloon", "Sprout", "Yelling", "Muscles", "Skinny", "Zombie", "Lava", "Snake", "Motorbike", "Whale", "Boat", "Letterbox", "Window", "Lollipop", "Handcuffs", "Police", "Uppercut", "Windmill", "Eyepatch", "Campfire", "Rainbow", "Storm", "Pikachu", "Charmander", "Tornado", "Crying", "King", "Hobo", "Worm", "Snail", "XBox", "Playstation", "Nintendo", "Duck", "Pull", "Dinosaur", "Alligator", "Ankle", "Angel", "Acorn", "Bread", "Booty", "Bacon", "Crown", "Donut", "Drill", "Leash", "Magic", "Wizard", "Igloo", "Plant", "Screw", "Rifle", "Puppy", "Stool", "Stamp", "Letter", "Witch", "Zebra", "Wagon", "Compass", "Watch", "Clock", "Time", "Cyclops", "Coconut", "Hang", "Penguin", "Confused", "Bucket", "Lion", "Rubbish", "Spaceship", "Bowl", "Shark", "Pizza", "Pyramid", "Dress", "Pants", "Shorts", "Boots", "Boy", "Girl", "Math", "Sunglasses", "Frog", "Chair", "Cake", "Grapes", "Kiss", "Snorlax", "Earth", "Spaghetti", "Couch", "Family", "Milk", "Blood", "Pig", "Giraffe", "Mouse", "Couch", "Fat", "Chocolate", "Camel", "Cheese", "Beans", "Water", "Chicken", "Cannibal", "Zipper", "Book", "Swimming", "Horse", "Paper", "Toaster", "Television", "Hammer", "Piano", "Sleeping", "Yawn", "Sheep", "Night", "Chest", "Lamp", "Redstone", "Grass", "Plane", "Ocean", "Lake", "Melon", "Pumpkin", "Gift", "Fishing", "Pirate", "Lightning", "Stomach", "Belly Button", "Fishing Rod", "Iron Ore", "Diamonds", "Emeralds", "Nether Portal", "Ender Dragon", "Rabbit", "Harry Potter", "Torch", "Light", "Battery", "Zombie Pigman", "Telephone", "Tent", "Hand", "Traffic Lights", "Anvil", "Tail", "Umbrella", "Piston", "Skeleton", "Spikes", "Bridge", "Bomb", "Spoon", "Rainbow", "Staircase", "Poop", "Dragon", "Fire", "Apple", "Shoe", "Squid", "Cookie", "Tooth", "Camera", "Sock", "Monkey", "Unicorn", "Smile", "Pool", "Rabbit", "Cupcake", "Pancake", "Princess", "Castle", "Flag", "Planet", "Stars", "Camp Fire", "Rose", "Spray", "Pencil", "Ice Cream", "Toilet", "Moose", "Bear", "Beer", "Batman", "Eggs", "Teapot", "Golf Club", "Tennis Racket", "Shield", "Crab", "Pot of Gold", "Cactus", "Television", "Pumpkin Pie", "Chimney", "Stable", "Nether", "Wither", "Beach", "Stop Sign", "Chestplate", "Pokeball", "Christmas Tree", "Present", "Snowflake", "Laptop", "Superman", "Football", "Basketball", "Creeper", "Tetris", "Jump", "Ninja", "Baby", "Troll Face", "Grim Reaper", "Temple", "Explosion", "Vomit", "Ants", "Barn", "Burn", "Baggage", "Frisbee", "Iceberg", "Sleeping", "Dream", "Snorlax", "Balloons", "Elevator", "Alligator", "Bikini", "Butterfly", "Bumblebee", "Pizza", "Jellyfish", "Sideburns", "Speedboat", "Treehouse", "Water Gun", "Drink", "Hook", "Dance", "Fall", "Summer", "Autumn", "Spring", "Winter", "Night Time", "Galaxy", "Sunrise", "Sunset", "Picnic", "Snowflake", "Holding Hands", "America", "Laptop", "Anvil", "Bagel", "Bench", "Cigar", "Darts", "Muffin", "Queen", "Wheat", "Dolphin", "Scarf", "Swing", "Thumb", "Tomato", "Alcohol", "Armor", "Alien", "Beans", "Cheek", "Phone", "Keyboard", "Orange", "Calculator", "Paper", "Desk", "Disco", "Elbow", "Drool", "Giant", "Golem", "Grave", "Llama", "Moose", "Party", "Panda", "Plumber", "Salsa", "Salad", "Skunk", "Skull", "Stump", "Sugar", "Ruler", "Bookcase", "Hamster", "Soup", "Teapot", "Towel", "Waist", "Archer", "Anchor", "Bamboo", "Branch", "Booger", "Carrot", "Cereal", "Coffee", "Wolf", "Crayon", "Finger", "Forest", "Hotdog", "Burger", "Obsidian", "Pillow", "Swing", "YouTube", "Farm", "Rain", "Cloud", "Frozen", "Garbage", "Music", "Twitter", "Facebook", "Santa Hat", "Rope", "Neck", "Sponge", "Sushi", "Noodles", "Soup", "Tower", "Berry", "Capture", "Prison", "Robot", "Trash", "School", "Skype", "Snowman", "Crowd", "Bank", "Mudkip", "Joker", "Lizard", "Tiger", "Royal", "Erupt", "Wizard", "Stain", "Cinema", "Notebook", "Blanket", "Paint", "Guard", "Astronaut" , "Slime" , "Mansion" , "Radar" , "Thorn" , "Tears" , "Tiny" , "Candy" , "Pepsi" , "Flint" , "Draw My Thing" , "Rice" , "Shout" , "Prize" , "Skirt" , "Thief" , "Syrup" , "Kirby" , "Brush" , "Violin", "Car", "Sun", "Eye", "Bow", "Axe", "Face", "Mushroom", "Guitar", "Book", }; + _holidayWords = new String[] + { + "Santa", "Reindeer", "Ornament", "Elf", "North Pole", "Candy Cane", "Christmas Tree", + "Fireplace", "Hot Chocolate", "Snowflake", "Snowman", "Sleigh", "Toys", "Milk", "Eggnog", "Coal", + "Cookies", "Mistletoe", "Icicle", "Gingerbread", "Stocking", "Jingle Bells", "Family", "Mittens", + "Snowball Fight", "Decorations", "Snow Fort", "Chimney", "Scrooge", "Sweater", "Ice Skating", + "Pinecone", "Cabin", "Bells", "Cold", "Nutcracker", "Sled", "Grinch", "Igloo", + "Boots", "Gingerbread Man", "Glacier", "Ice Hockey", "Scarf", "Snowboard" + }; + _tools = new HashSet(); _tools.add(new ToolLine(this)); _tools.add(new ToolSquare(this)); @@ -282,12 +293,22 @@ public class Draw extends SoloGame public String GetWord() { //Get Word - String word = _words[UtilMath.r(_words.length)]; + String word = getRandomWord(); while (!_usedWords.add(word)) - word = _words[UtilMath.r(_words.length)]; + word = getRandomWord(); return word; } + + private String getRandomWord() + { + if (Math.random() >= 0.30) + { + return _words[UtilMath.r(_words.length)]; + } + + return _holidayWords[UtilMath.r(_holidayWords.length)]; + } @EventHandler(priority = EventPriority.LOWEST) public void Guess(AsyncPlayerChatEvent event) From fea637db809998ac3105012ac55b249d72e1d624 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 18:06:26 +1100 Subject: [PATCH 070/223] fixed some freeze --- .../nautilus/game/arcade/game/games/snowfight/SnowFight.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index dce28ada5..9185e035b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -417,7 +417,7 @@ public class SnowFight extends TeamGame //Convert to Ice for(Block block : UtilBlock.getInRadius(event.getEntity().getLocation(), size).keySet()) { - int i = 5; + int i = 20; while (block.getY() > 0 && i>0) { if (block.getType() == Material.LADDER || @@ -427,7 +427,7 @@ public class SnowFight extends TeamGame //Has air above it - if (UtilBlock.solid(block) && UtilBlock.isVisible(block)) + if ((UtilBlock.solid(block) && UtilBlock.isVisible(block)) || block.isLiquid()) block.setType(Material.PACKED_ICE); //shuffle down From 5c632a1e3afe5fb17cd7750be9bb455b0ddb1554 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 18:20:12 +1100 Subject: [PATCH 071/223] sharper target --- .../nautilus/game/arcade/game/games/snowfight/SnowFight.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index 9185e035b..5649d13df 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -286,9 +286,9 @@ public class SnowFight extends TeamGame //random offset to player location Location location = player.getLocation().add( - (Math.random() - 0.5) * 32, + (Math.random() - 0.5) * 24, 0, - (Math.random() - 0.5) * 32); + (Math.random() - 0.5) * 24); //highest block! location = WorldData.World.getHighestBlockAt(location).getLocation().add(0.5, 0, 0.5); From ed3bea8e8577e6167787a631e2a6902bdcb1b74c Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 18:36:05 +1100 Subject: [PATCH 072/223] DONE! --- .../game/games/snowfight/SnowFight.java | 102 ++++++++++-------- 1 file changed, 60 insertions(+), 42 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index 5649d13df..ef901c010 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -63,6 +63,7 @@ import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; @@ -284,11 +285,14 @@ public class SnowFight extends TeamGame { Player player = UtilAlg.Random(players); + Location location = player.getLocation(); + //random offset to player location - Location location = player.getLocation().add( - (Math.random() - 0.5) * 24, + if (Math.random() > 0.1) + location.add( + (Math.random() - 0.5) * 32, 0, - (Math.random() - 0.5) * 24); + (Math.random() - 0.5) * 32); //highest block! location = WorldData.World.getHighestBlockAt(location).getLocation().add(0.5, 0, 0.5); @@ -374,8 +378,10 @@ public class SnowFight extends TeamGame //Clean else { + meteorExplode(block); + block.remove(); - blockIter.remove(); + blockIter.remove(); } } } @@ -387,57 +393,63 @@ public class SnowFight extends TeamGame Entity projectile = event.getEntity(); + if (projectile.hasMetadata("Meteor")) + { + meteorExplode(projectile); + _meteorSet.remove(projectile); + } + } + + public void meteorExplode(Entity meteor) + { float timePassed = (System.currentTimeMillis() - (getGameLiveTime() + _meteorTime))/1000f; float multiplier = 1 + Math.min(3f, timePassed / 60f); float size = 1.5f + multiplier; + + //Effect + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, meteor.getLocation(), 0.5f, 0.5f, 0.5f, 0, 5, ViewDist.MAX, UtilServer.getPlayers()); + for(Player player : UtilServer.getPlayers()) + player.playSound(meteor.getLocation(), Sound.EXPLODE, 1, 1); - if (projectile.hasMetadata("Meteor")) + + //Damage + HashMap players = UtilPlayer.getInRadius(meteor.getLocation(), size + 3); + for (Player player : players.keySet()) { - //Effect - UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, projectile.getLocation(), 0.5f, 0.5f, 0.5f, 0, 5, ViewDist.MAX, UtilServer.getPlayers()); - for(Player player : UtilServer.getPlayers()) - player.playSound(projectile.getLocation(), Sound.EXPLODE, 1, 1); - - - //Damage - HashMap players = UtilPlayer.getInRadius(event.getEntity().getLocation(), size + 3); - for (Player player : players.keySet()) - { - //Damage Event - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.CUSTOM, size * players.get(player), false, true, false, - "Ice Meteor", "Ice Meteor", false); - - //Vel - UtilAction.velocity(player, UtilAlg.getTrajectory(event.getEntity(), player), 1.2 * players.get(player), false, 0, 0.4, 1, true); - } + //Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, + DamageCause.CUSTOM, size * players.get(player), false, true, false, + "Ice Meteor", "Ice Meteor", false); - //Convert to Ice - for(Block block : UtilBlock.getInRadius(event.getEntity().getLocation(), size).keySet()) + //Vel + UtilAction.velocity(player, UtilAlg.getTrajectory(meteor, player), 1.2 * players.get(player), false, 0, 0.4, 1, true); + } + + //Convert to Ice + for(Block block : UtilBlock.getInRadius(meteor.getLocation(), size).keySet()) + { + int i = 20; + while (block.getY() > 0 && i>0) { - int i = 20; - while (block.getY() > 0 && i>0) - { - if (block.getType() == Material.LADDER || - block.getType() == Material.STAINED_GLASS || - block.getType() == Material.STAINED_GLASS_PANE) - block.breakNaturally(); + if (block.getType() == Material.LADDER || + block.getType() == Material.STAINED_GLASS || + block.getType() == Material.STAINED_GLASS_PANE) + block.breakNaturally(); - - //Has air above it - if ((UtilBlock.solid(block) && UtilBlock.isVisible(block)) || block.isLiquid()) - block.setType(Material.PACKED_ICE); + + //Has air above it + if ((UtilBlock.solid(block) && UtilBlock.isVisible(block)) || block.isLiquid()) + block.setType(Material.PACKED_ICE); - //shuffle down - block = block.getRelative(BlockFace.DOWN); - i--; - } + //shuffle down + block = block.getRelative(BlockFace.DOWN); + i--; } } - projectile.remove(); + meteor.remove(); } @@ -452,7 +464,6 @@ public class SnowFight extends TeamGame for(Player player : GetPlayers(true)) { - //XXX DO BETTER CHECK, hanging off block, ladders, etc. if(isOnIce(player)) { Bukkit.getPluginManager().callEvent(new CustomDamageEvent(player, null, null, null, DamageCause.CUSTOM, 1, false, true, true, "Ice", "Ice", false)); @@ -513,5 +524,12 @@ public class SnowFight extends TeamGame Scoreboard.Draw(); } + + @EventHandler + public void meteorStart(PlayerCommandPreprocessEvent event) + { + if (event.getPlayer().isOp() && event.getMessage().equals("/meteor")) + _meteorTime = 0; + } } From 8c4615203c75df91b58786683d190b52a86f6f49 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 20:07:20 +1100 Subject: [PATCH 073/223] sale message --- .../src/mineplex/hub/modules/NewsManager.java | 50 ++++++++++++++- .../game/arcade/managers/GameManager.java | 61 ++++++++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java index 943acdd63..114f88526 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java @@ -258,7 +258,55 @@ public class NewsManager extends MiniPlugin String text = ""; double healthPercent = 1; - if (Manager.Type == HubType.Halloween) + if (Manager.Type == HubType.Christmas) + { + _animationIndex = (_animationIndex + 1) % 77; + + if (_animationIndex >= 0 && _animationIndex <= 20) + text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " " + C.cWhiteB + "50% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + if (_animationIndex == 21) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 5" + C.cWhiteB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 22) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50" + C.cWhiteB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 23) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50%" + C.cWhiteB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 24) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% " + C.cWhiteB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 25) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% O" + C.cWhiteB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 26) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OF" + C.cWhiteB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 27) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF" + C.cWhiteB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 28) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF " + C.cWhiteB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 29) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF A" + C.cWhiteB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 30) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF AL" + C.cWhiteB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 31) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL" + C.cWhiteB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 32) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL " + C.cWhiteB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 33) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL R" + C.cWhiteB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 34) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RA" + C.cWhiteB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 35) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RAN" + C.cWhiteB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 36) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANK" + C.cWhiteB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 37) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + if (_animationIndex >= 38 && _animationIndex <= 59) + text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + + if (_animationIndex == 60) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 5" + C.cGreenB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 61) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50" + C.cGreenB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 62) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50%" + C.cGreenB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 63) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% " + C.cGreenB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 64) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% O" + C.cGreenB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 65) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OF" + C.cGreenB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 66) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF" + C.cGreenB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 67) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF " + C.cGreenB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 68) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF A" + C.cGreenB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 69) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF AL" + C.cGreenB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 70) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL" + C.cGreenB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 71) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL " + C.cGreenB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 72) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL R" + C.cGreenB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 73) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RA" + C.cGreenB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 74) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RAN" + C.cGreenB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 75) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANK" + C.cGreenB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 76) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + } + else if (Manager.Type == HubType.Halloween) { /** * @author Mysticate diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 7f65cc868..17a2bf94a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -52,6 +52,7 @@ public class GameManager implements Listener ArcadeManager Manager; private int _colorId = 0; + private int _animationIndex = 0; public GameManager(ArcadeManager manager) { @@ -63,7 +64,7 @@ public class GameManager implements Listener @EventHandler public void DisplayIP(UpdateEvent event) { - if (event.getType() != UpdateType.FASTER) + if (event.getType() != UpdateType.FASTEST) return; if (Manager.GetGame() != null && !Manager.GetGame().InProgress()) @@ -76,6 +77,64 @@ public class GameManager implements Listener String text = col + C.Bold + "US.MINEPLEX.COM EU.MINEPLEX.COM"; + + + + //Christmas + _animationIndex = (_animationIndex + 1) % 77; + + if (_animationIndex >= 0 && _animationIndex <= 20) + text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " " + C.cWhiteB + "50% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + if (_animationIndex == 21) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 5" + C.cWhiteB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 22) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50" + C.cWhiteB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 23) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50%" + C.cWhiteB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 24) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% " + C.cWhiteB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 25) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% O" + C.cWhiteB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 26) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OF" + C.cWhiteB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 27) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF" + C.cWhiteB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 28) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF " + C.cWhiteB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 29) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF A" + C.cWhiteB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 30) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF AL" + C.cWhiteB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 31) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL" + C.cWhiteB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 32) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL " + C.cWhiteB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 33) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL R" + C.cWhiteB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 34) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RA" + C.cWhiteB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 35) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RAN" + C.cWhiteB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 36) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANK" + C.cWhiteB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 37) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + if (_animationIndex >= 38 && _animationIndex <= 59) + text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + + if (_animationIndex == 60) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 5" + C.cGreenB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 61) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50" + C.cGreenB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 62) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50%" + C.cGreenB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 63) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% " + C.cGreenB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 64) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% O" + C.cGreenB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 65) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OF" + C.cGreenB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 66) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF" + C.cGreenB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 67) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF " + C.cGreenB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 68) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF A" + C.cGreenB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 69) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF AL" + C.cGreenB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 70) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL" + C.cGreenB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 71) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL " + C.cGreenB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 72) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL R" + C.cGreenB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 73) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RA" + C.cGreenB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 74) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RAN" + C.cGreenB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 75) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANK" + C.cGreenB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 76) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + + + + + + + + + + double health = 1; if (Manager.GetGame().GetState() == GameState.Recruit) { From 7b11baf24b49a2d53d9ff2d3b585e2c6eb0c3ab3 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 20:20:49 +1100 Subject: [PATCH 074/223] Christmas sale bossbars --- .../src/mineplex/hub/modules/NewsManager.java | 71 ++++++++---------- .../game/arcade/managers/GameManager.java | 73 ++++++++----------- 2 files changed, 60 insertions(+), 84 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java index 114f88526..5287b1d76 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java @@ -260,50 +260,39 @@ public class NewsManager extends MiniPlugin if (Manager.Type == HubType.Christmas) { - _animationIndex = (_animationIndex + 1) % 77; + _animationIndex = (_animationIndex + 1) % 40; - if (_animationIndex >= 0 && _animationIndex <= 20) - text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " " + C.cWhiteB + "50% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 0) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 5" + C.cWhiteB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 1) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50" + C.cWhiteB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 2) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% " + C.cWhiteB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 3) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% O" + C.cWhiteB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 4) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OF" + C.cWhiteB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 5) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF " + C.cWhiteB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 6) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF A" + C.cWhiteB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 7) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF AL" + C.cWhiteB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 8) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL " + C.cWhiteB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 9) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL R" + C.cWhiteB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 10) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RA" + C.cWhiteB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 11) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RAN" + C.cWhiteB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 12) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANK" + C.cWhiteB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 13) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 21) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 5" + C.cWhiteB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 22) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50" + C.cWhiteB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 23) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50%" + C.cWhiteB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 24) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% " + C.cWhiteB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 25) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% O" + C.cWhiteB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 26) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OF" + C.cWhiteB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 27) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF" + C.cWhiteB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 28) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF " + C.cWhiteB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 29) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF A" + C.cWhiteB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 30) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF AL" + C.cWhiteB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 31) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL" + C.cWhiteB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 32) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL " + C.cWhiteB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 33) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL R" + C.cWhiteB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 34) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RA" + C.cWhiteB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 35) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RAN" + C.cWhiteB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 36) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANK" + C.cWhiteB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 37) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 14) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 15) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 16) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 17) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 18) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 19) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 20) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 21) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 22) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 23) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 24) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 25) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 26) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex >= 38 && _animationIndex <= 59) - text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - - - if (_animationIndex == 60) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 5" + C.cGreenB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 61) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50" + C.cGreenB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 62) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50%" + C.cGreenB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 63) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% " + C.cGreenB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 64) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% O" + C.cGreenB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 65) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OF" + C.cGreenB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 66) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF" + C.cGreenB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 67) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF " + C.cGreenB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 68) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF A" + C.cGreenB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 69) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF AL" + C.cGreenB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 70) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL" + C.cGreenB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 71) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL " + C.cGreenB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 72) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL R" + C.cGreenB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 73) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RA" + C.cGreenB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 74) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RAN" + C.cGreenB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 75) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANK" + C.cGreenB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 76) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex >= 27) + text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " " + C.cWhiteB + "50% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; } else if (Manager.Type == HubType.Halloween) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 17a2bf94a..e78480d1d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -81,52 +81,39 @@ public class GameManager implements Listener //Christmas - _animationIndex = (_animationIndex + 1) % 77; + _animationIndex = (_animationIndex + 1) % 40; - if (_animationIndex >= 0 && _animationIndex <= 20) - text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " " + C.cWhiteB + "50% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - - if (_animationIndex == 21) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 5" + C.cWhiteB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 22) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50" + C.cWhiteB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 23) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50%" + C.cWhiteB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 24) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% " + C.cWhiteB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 25) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% O" + C.cWhiteB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 26) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OF" + C.cWhiteB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 27) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF" + C.cWhiteB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 28) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF " + C.cWhiteB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 29) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF A" + C.cWhiteB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 30) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF AL" + C.cWhiteB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 31) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL" + C.cWhiteB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 32) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL " + C.cWhiteB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 33) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL R" + C.cWhiteB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 34) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RA" + C.cWhiteB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 35) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RAN" + C.cWhiteB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 36) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANK" + C.cWhiteB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 37) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - - if (_animationIndex >= 38 && _animationIndex <= 59) - text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - - - if (_animationIndex == 60) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 5" + C.cGreenB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 61) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50" + C.cGreenB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 62) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50%" + C.cGreenB + " OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 63) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% " + C.cGreenB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 64) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% O" + C.cGreenB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 65) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OF" + C.cGreenB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 66) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF" + C.cGreenB + " ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 67) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF " + C.cGreenB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 68) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF A" + C.cGreenB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 69) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF AL" + C.cGreenB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 70) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL" + C.cGreenB + " RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 71) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL " + C.cGreenB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 72) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL R" + C.cGreenB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 73) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RA" + C.cGreenB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 74) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RAN" + C.cGreenB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 75) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANK" + C.cGreenB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; - if (_animationIndex == 76) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 0) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 5" + C.cWhiteB + "0% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 1) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50" + C.cWhiteB + "% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 2) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% " + C.cWhiteB + "OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 3) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% O" + C.cWhiteB + "FF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 4) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OF" + C.cWhiteB + "F ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 5) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF " + C.cWhiteB + "ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 6) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF A" + C.cWhiteB + "LL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 7) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF AL" + C.cWhiteB + "L RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 8) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL " + C.cWhiteB + "RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 9) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL R" + C.cWhiteB + "ANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 10) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RA" + C.cWhiteB + "NKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 11) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RAN" + C.cWhiteB + "KS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 12) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANK" + C.cWhiteB + "S " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 13) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 14) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 15) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 16) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 17) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 18) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 19) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 20) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 21) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 22) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 23) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 24) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 25) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cWhiteB + " 50% OFF ALL RANKS" + C.cGreenB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex == 26) text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " 50% OFF ALL RANKS" + C.cWhiteB + " " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; + if (_animationIndex >= 27) + text = C.cWhite + " ❄ " + C.cRed + " Massive Winter Sale " + C.cGreenB + " " + C.cWhiteB + "50% OFF ALL RANKS " + C.cYellow + " www.mineplex.com/shop " + C.cWhite + " ❄"; From 2afbe23a7c979ba8d16f1b675c4fc2b0c9a8642a Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 04:23:26 -0500 Subject: [PATCH 075/223] Load songs from update folder --- .../src/mineplex/hub/HubManager.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 494f7cc06..ea96b4c65 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -1,6 +1,10 @@ package mineplex.hub; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.Random; @@ -171,8 +175,8 @@ public class HubManager extends MiniClientPlugin // Christmas Songs private Random _random = new Random(); private int _lastSong = 0; - private final String[] _songNames = {"JingleBells.nbs", "TheFirstNoel.nbs", "Hark.nbs", "DeckTheHalls.nbs", "Joy.nbs", "MerryChristmas.nbs"}; - private final NoteSong[] _songs; +// private final String[] _songNames = {"JingleBells.nbs", "TheFirstNoel.nbs", "Hark.nbs", "DeckTheHalls.nbs", "Joy.nbs", "MerryChristmas.nbs"}; + private final ArrayList _songs; public HubManager(JavaPlugin plugin, BlockRestore blockRestore, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, ConditionManager conditionManager, DisguiseManager disguiseManager, TaskManager taskManager, Portal portal, PartyManager partyManager, PreferencesManager preferences, PetManager petManager, PollManager pollManager, StatsManager statsManager, AchievementManager achievementManager, HologramManager hologramManager, NpcManager npcManager, PersonalServerManager personalServerManager, PacketHandler packetHandler, Punish punish, ServerStatusManager serverStatusManager, GiveawayManager giveawayManager) { @@ -241,15 +245,28 @@ public class HubManager extends MiniClientPlugin // NotificationManager notificationManager = new NotificationManager(plugin, clientManager, donationManager); // new MailManager(_plugin, notificationManager); - _songs = new NoteSong[_songNames.length]; + _songs = new ArrayList(); + try { - for (int i = 0; i < _songNames.length; i++) + + File songsFolder = new File("../../update/songs/"); + if (songsFolder.exists()) { - String name = "songs/" + _songNames[i]; - NoteSong song = NBSReader.loadSong(name); - _songs[i] = song; - System.out.println("Loaded Song: " + name); + File[] files = songsFolder.listFiles(); + + for (File file : files) + { + if (file.getName().endsWith(".nbs")) + { + System.out.println("Loading Song " + file.getPath()); + NoteSong song = NBSReader.loadSong(new DataInputStream(new FileInputStream(file))); + if (song != null) + { + _songs.add(song); + } + } + } } } catch (FileNotFoundException e) @@ -266,8 +283,11 @@ public class HubManager extends MiniClientPlugin private void playNextSong() { - int index = (_lastSong + _random.nextInt(_songs.length - 1)) % _songs.length; - NoteSong song = _songs[index]; + if (_songs.isEmpty()) + return; + + int index = (_lastSong + _random.nextInt(_songs.size() - 1)) % _songs.size(); + NoteSong song = _songs.get(index); if (song != null) { new NotePlayer(_plugin, song, new INoteVerifier() From e1efcabfbfc7eba877f52f834da857d0c59c53d2 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 20:39:31 +1100 Subject: [PATCH 076/223] chat sale msgs --- .../core/notifier/NotificationManager.java | 14 ++++++++++++- .../game/arcade/managers/GameManager.java | 21 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java index 53c841b6c..6c218986e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java @@ -1,5 +1,6 @@ package mineplex.core.notifier; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -17,7 +18,7 @@ import mineplex.core.updater.event.UpdateEvent; public class NotificationManager extends MiniPlugin { - private boolean _enabled = false; + private boolean _enabled = true; private CoreClientManager _clientManager; @@ -48,8 +49,19 @@ public class NotificationManager extends MiniPlugin // if (event.getType() == UpdateType.MIN_16) // sale(); + if (event.getType() == UpdateType.MIN_08) + christmasSale(); } + private void christmasSale() + { + Bukkit.broadcastMessage(C.cWhite + " "); + Bukkit.broadcastMessage(C.cRedB + " MASSIVE WINTER SALE"); + Bukkit.broadcastMessage(C.cWhiteB + " 50% OFF ALL RANKS"); + Bukkit.broadcastMessage(" " + C.cGreen + C.Line + "www.mineplex.com/shop"); + Bukkit.broadcastMessage(C.cWhite + " "); + } + private void sale() { for (Player player : UtilServer.getPlayers()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index e78480d1d..ce83a8995 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -35,6 +35,7 @@ import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.uhc.UHC; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.Location; @@ -61,6 +62,26 @@ public class GameManager implements Listener Manager.getPluginManager().registerEvents(this, Manager.getPlugin()); } + @EventHandler + public void displaySale(UpdateEvent event) + { + if (event.getType() != UpdateType.MIN_08) + return; + + if (Manager.GetGame() == null) + return; + + for (Player player : UtilServer.getPlayers()) + if (!Manager.GetGame().IsAlive(player)) + { + player.sendMessage(C.cWhite + " "); + player.sendMessage(C.cRedB + " MASSIVE WINTER SALE"); + player.sendMessage(C.cWhiteB + " 50% OFF ALL RANKS"); + player.sendMessage(" " + C.cGreen + C.Line + "www.mineplex.com/shop"); + player.sendMessage(C.cWhite + " "); + } + } + @EventHandler public void DisplayIP(UpdateEvent event) { From 4354133de958422556379da53865fb7426c569ae Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 04:40:34 -0500 Subject: [PATCH 077/223] Add Minecraft timings to /lag --- .../src/mineplex/core/monitor/LagMeter.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java b/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java index 12bc7d776..570348c68 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java @@ -5,6 +5,7 @@ import java.util.HashSet; import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClientManager; import mineplex.core.common.Rank; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -18,6 +19,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; +import net.minecraft.server.v1_8_R3.MinecraftServer; public class LagMeter extends MiniPlugin { @@ -128,9 +130,27 @@ public class LagMeter extends MiniPlugin sendUpdate(player); } } + + private String getPrefix(double value) + { + if (value >= 18.0) + return C.cGreen; + else if (value >= 15) + return C.cYellow; + else + return C.cRed; + } private void sendUpdate(Player player) { + double[] tps = MinecraftServer.getServer().recentTps; + String mcString = ""; + for (int i = 0; i < tps.length; i++) + { + mcString += getPrefix(tps[i]) + (double)Math.round(tps[i] * 100.0D) / 100.0D; + if (i < tps.length - 1) mcString += C.cWhite + ", "; + } + player.sendMessage(" "); player.sendMessage(" "); player.sendMessage(" "); @@ -138,6 +158,8 @@ public class LagMeter extends MiniPlugin player.sendMessage(" "); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Live-------" + ChatColor.YELLOW + String.format("%.00f", _ticksPerSecond))); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Avg--------" + ChatColor.YELLOW + String.format("%.00f", _ticksPerSecondAverage * 20))); + player.sendMessage(F.main(getName(), ChatColor.YELLOW + "MC Timings")); + player.sendMessage(F.main(getName(), ChatColor.GRAY + "5m, 10m, 15m Avg---" + mcString)); player.sendMessage(F.main(getName(), ChatColor.YELLOW + "MEM")); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Free-------" + ChatColor.YELLOW + (Runtime.getRuntime().freeMemory() / 1048576) + "MB")); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Max--------" + ChatColor.YELLOW + (Runtime.getRuntime().maxMemory() / 1048576)) + "MB"); From c6c012031f36e4107926ea64a61632f5c557a0ba Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 04:44:19 -0500 Subject: [PATCH 078/223] Less ugly formatting --- Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java b/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java index 570348c68..47c37044a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/monitor/LagMeter.java @@ -158,8 +158,8 @@ public class LagMeter extends MiniPlugin player.sendMessage(" "); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Live-------" + ChatColor.YELLOW + String.format("%.00f", _ticksPerSecond))); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Avg--------" + ChatColor.YELLOW + String.format("%.00f", _ticksPerSecondAverage * 20))); - player.sendMessage(F.main(getName(), ChatColor.YELLOW + "MC Timings")); - player.sendMessage(F.main(getName(), ChatColor.GRAY + "5m, 10m, 15m Avg---" + mcString)); + player.sendMessage(F.main(getName(), ChatColor.YELLOW + "MC Timings (5,10,15 min avg)")); + player.sendMessage(F.main(getName(), ChatColor.GRAY + mcString)); player.sendMessage(F.main(getName(), ChatColor.YELLOW + "MEM")); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Free-------" + ChatColor.YELLOW + (Runtime.getRuntime().freeMemory() / 1048576) + "MB")); player.sendMessage(F.main(getName(), ChatColor.GRAY + "Max--------" + ChatColor.YELLOW + (Runtime.getRuntime().maxMemory() / 1048576)) + "MB"); From d318a5cf87bf0aeba229efd5b8512f0ee61a020a Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 21:53:34 +1100 Subject: [PATCH 079/223] interacto! --- .../nautilus/game/arcade/managers/HolidayManager.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java index cf3bbf215..eb60ba482 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -293,18 +293,21 @@ public class HolidayManager implements Listener } @EventHandler - public void specialBlockDamage(BlockDamageEvent event) + public void specialBlockDamage(PlayerInteractEvent event) { + if (!UtilEvent.isAction(event, ActionType.L_BLOCK)) + return; + if (UtilPlayer.isSpectator(event.getPlayer())) return; if (Manager.GetGame() != null && !Manager.GetGame().IsAlive(event.getPlayer())) return; - if (!_active.contains(event.getBlock())) + if (!_active.contains(event.getClickedBlock())) return; - specialBlockBreak(event.getPlayer(), event.getBlock()); + specialBlockBreak(event.getPlayer(), event.getClickedBlock()); } private void specialBlockBreak(Player player, final Block block) From a39b11ce67040781f9ce4ae0d8d8b11e9a8931e1 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 7 Dec 2015 21:56:00 +1100 Subject: [PATCH 080/223] slowed meteors --- .../nautilus/game/arcade/game/games/snowfight/SnowFight.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java index ef901c010..cb278885d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/snowfight/SnowFight.java @@ -73,7 +73,7 @@ import org.bukkit.util.Vector; public class SnowFight extends TeamGame { - private long _meteorTime = 240000; + private long _meteorTime = 360000; private boolean _meteors = false; private HashSet _meteorSet = new HashSet(); @@ -316,7 +316,7 @@ public class SnowFight extends TeamGame @EventHandler public void meteorSpawn(UpdateEvent event) { - if(event.getType() != UpdateType.FAST) + if(event.getType() != UpdateType.SEC) return; if (!IsLive()) From 7984c0ac31b0bc9e61c75a52c55dc3907eca5ddf Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 06:12:49 -0500 Subject: [PATCH 081/223] Add ! --- .../src/nautilus/game/arcade/managers/HolidayManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java index eb60ba482..ba2c0d8cd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -117,7 +117,7 @@ public class HolidayManager implements Listener @EventHandler public void blockEffect(UpdateEvent event) { - if (event.getType() == UpdateType.TICK) + if (event.getType() != UpdateType.TICK) return; Iterator blockIterator = _active.iterator(); From c3ace42a68c6d565d5d3d6c8476510845d806ccb Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 13:21:11 -0500 Subject: [PATCH 082/223] Winter MOTD, Stat fixes (maybe?!) --- .../src/mineplex/bungee/motd/MotdManager.java | 4 +- .../src/mineplex/core/stats/StatsManager.java | 83 ++++++++++--------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java index ede793bef..1f2835f13 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java @@ -56,11 +56,11 @@ public class MotdManager implements Listener, Runnable //String motdLine = "§f§l◄ §c§lMaintenance§f§l ►"; //String motdLine = "§f§l◄ §a§lCarl the Creeper§f§l ►"; // String motdLine = " §2§l§n M O N S T E R M A Z E B E T A §f"; - String motdLine = " §f§l◄ §b§lNew Game§f§l ▬ §3§lChampions CTF§f§l ►"; + String motdLine = " §f❄ §2§lWinter Update §f❄ §2§lSnow Fight §f❄"; //String motdLine = " §d§lRank Sale §a§l40% Off"); //String motdLine = " §f§l◄§c§lMAINTENANCE§f§l►"); - updateMainMotd(" §f§l§m §8§l§m[ §r §6§lMineplex§r §f§lGames§r §8§l§m ]§f§l§m §r", motdLine); + updateMainMotd(" §c§m §f§m §c§m §f§m §2§l§m[ §r §c§lMineplex§r §f§lGames§r §2§l§m ]§f§m §c§m §f§m §c§m §r", motdLine); System.out.println("Updated Bungee MOTD"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 4b60646f1..7ec46f8f9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -91,41 +91,14 @@ public class StatsManager extends MiniDbClientPlugin UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue)); // Verify stat is in our local cache, if not add it remotely. - if (!_stats.containsKey(statName)) + registerNewStat(statName, new Runnable() { - runAsync(new Runnable() + @Override + public void run() { - public void run() - { - synchronized (_statSync) - { - // If many players come in for a new stat, when the first add finishes the others are queued to add again - // This makes a second check for the stat name (already added before lock was released) - // Then it pops into queue and forgets adding the new stat to db. - if (_stats.containsKey(statName)) - { - addToQueue(statName, player, value); - return; - } - - _repository.addStat(statName); - - _stats.clear(); - - for (Stat stat : _repository.retrieveStats()) - { - _stats.put(stat.Name, stat.Id); - } - - addToQueue(statName, player, value); - } - } - }); - } - else - { - addToQueue(statName, player, value); - } + addToQueue(statName, player, value); + } + }); } private void addToQueue(String statName, Player player, long value) @@ -192,23 +165,51 @@ public class StatsManager extends MiniDbClientPlugin public boolean incrementStat(final int accountId, final String statName, final long value) { - if (_stats.containsKey(statName)) - return false; - - final NautHashMap> uploadQueue = new NautHashMap>(); - uploadQueue.put(accountId, new NautHashMap()); - uploadQueue.get(accountId).put(_stats.get(statName), value); - - runAsync(new Runnable() + // This will register a new stat if we don't have one, otherwise it will just run the callback + registerNewStat(statName, new Runnable() { + @Override public void run() { + final NautHashMap> uploadQueue = new NautHashMap>(); + uploadQueue.put(accountId, new NautHashMap()); + uploadQueue.get(accountId).put(_stats.get(statName), value); + _repository.saveStats(uploadQueue); } }); return true; } + + private void registerNewStat(final String statName, final Runnable callback) + { + runAsync(new Runnable() + { + public void run() + { + synchronized (_statSync) + { + if (_stats.containsKey(statName)) + { + if (callback != null) callback.run(); + return; + } + + _repository.addStat(statName); + + _stats.clear(); + + for (Stat stat : _repository.retrieveStats()) + { + _stats.put(stat.Name, stat.Id); + } + + if (callback != null) callback.run(); + } + } + }); + } public int getStatId(String statName) { From 0619fb857f03e7382af02975b659ee5b6653236b Mon Sep 17 00:00:00 2001 From: Sarah Date: Mon, 7 Dec 2015 23:44:02 +0100 Subject: [PATCH 083/223] fixing invisibility. --- .../arcade/gametutorial/GameTutorial.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 5a0207e30..fc4457377 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -111,12 +111,19 @@ public abstract class GameTutorial { for(final Player player : _players.keySet()) { - VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); + //VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); Manager.runSyncLater(new Runnable() { @Override public void run() { + for(Player player : Manager.GetGame().GetPlayers(true)) + { + for(Player other : Manager.GetGame().GetPlayers(true)) + { + player.showPlayer(other); + } + } player.setAllowFlight(false); player.setFlying(false); } @@ -163,7 +170,7 @@ public abstract class GameTutorial _players.put(player, Manager.GetGame().GetTeam(player).GetSpawns().get(i)); player.setAllowFlight(true); player.setFlying(true); - VisibilityManager.Instance.setVisibility(player, false, UtilServer.getPlayers()); + // VisibilityManager.Instance.setVisibility(player, false, UtilServer.getPlayers()); i++; } } @@ -209,6 +216,16 @@ public abstract class GameTutorial public int tick() { + if(!_hasEnded && hasStarted()) + { + for(Player player : UtilServer.getPlayers()) + { + for(Player other : _players.keySet()) + { + player.hidePlayer(other); + } + } + } _tick++; return _tick; } From 55f04538979461a1f8a54f2e603db254e565f5d1 Mon Sep 17 00:00:00 2001 From: William Burns Date: Mon, 7 Dec 2015 23:20:03 +0000 Subject: [PATCH 084/223] Start of re-write --- .../src/mineplex/core/game/GameDisplay.java | 2 + .../src/nautilus/game/arcade/GameType.java | 2 + .../game/games/gladiators/ArenaType.java | 243 ++++++++++++++++++ .../game/games/gladiators/Gladiators.java | 28 ++ .../arcade/game/games/gladiators/Loadout.java | 22 ++ .../games/gladiators/kits/KitGladiator.java | 38 +++ 6 files changed, 335 insertions(+) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaType.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Loadout.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/kits/KitGladiator.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java index 6c43e8729..ebdc89a02 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/game/GameDisplay.java @@ -72,6 +72,8 @@ public enum GameDisplay BouncyBalls("Bouncy Balls", Material.SLIME_BALL, (byte)0, GameCategory.ARCADE, 57), + Gladiators("Gladiators", Material.IRON_SWORD, (byte)0, GameCategory.ARCADE, 58), + Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999); String _name; 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 5eedb306e..5ff9e576c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -26,6 +26,7 @@ import nautilus.game.arcade.game.games.dragons.DragonsTeams; import nautilus.game.arcade.game.games.draw.Draw; import nautilus.game.arcade.game.games.event.EventGame; import nautilus.game.arcade.game.games.evolution.Evolution; +import nautilus.game.arcade.game.games.gladiators.Gladiators; import nautilus.game.arcade.game.games.gravity.Gravity; import nautilus.game.arcade.game.games.halloween.Halloween; import nautilus.game.arcade.game.games.hideseek.HideSeek; @@ -128,6 +129,7 @@ public enum GameType SkywarsTeams(TeamSkywars.class, GameDisplay.SkywarsTeams, new GameType[]{GameType.Skywars}, false), MonsterMaze(MonsterMaze.class, GameDisplay.MonsterMaze), MonsterLeague(MonsterLeague.class, GameDisplay.MonsterLeague), + Gladiators(Gladiators.class, GameDisplay.Gladiators), BouncyBalls(BouncyBalls.class, GameDisplay.BouncyBalls), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaType.java new file mode 100644 index 000000000..73506445e --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaType.java @@ -0,0 +1,243 @@ +package nautilus.game.arcade.game.games.gladiators; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +/** + * Created by William (WilliamTiger). + * 07/12/15 + */ +public enum ArenaType +{ + + RED(1, new Loadout() + { + @Override + public ItemStack getSword() + { + return new ItemStack(Material.DIAMOND_SWORD, 1); + } + + @Override + public ItemStack getRod() + { + return new ItemStack(Material.FISHING_ROD, 1); + } + + @Override + public ItemStack getBow() + { + return new ItemStack(Material.BOW, 1); + } + + @Override + public ItemStack getArrows() + { + return new ItemStack(Material.ARROW, 10); + } + + @Override + public ItemStack getHelmet() + { + return new ItemStack(Material.IRON_HELMET, 1); + } + + @Override + public ItemStack getChestplate() + { + return new ItemStack(Material.IRON_CHESTPLATE, 1); + } + + @Override + public ItemStack getLeggings() + { + return new ItemStack(Material.IRON_LEGGINGS, 1); + } + + @Override + public ItemStack getBoots() + { + return new ItemStack(Material.IRON_BOOTS, 1); + } + }), + ORANGE(2, new Loadout() + { + @Override + public ItemStack getSword() + { + return new ItemStack(Material.IRON_SWORD, 1); + } + + @Override + public ItemStack getRod() + { + return new ItemStack(Material.FISHING_ROD, 1); + } + + @Override + public ItemStack getBow() + { + return new ItemStack(Material.BOW, 1); + } + + @Override + public ItemStack getArrows() + { + return new ItemStack(Material.ARROW, 7); + } + + @Override + public ItemStack getHelmet() + { + return new ItemStack(Material.CHAINMAIL_HELMET); + } + + @Override + public ItemStack getChestplate() + { + return new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1); + } + + @Override + public ItemStack getLeggings() + { + return new ItemStack(Material.CHAINMAIL_LEGGINGS, 1); + } + + @Override + public ItemStack getBoots() + { + return new ItemStack(Material.CHAINMAIL_BOOTS, 1); + } + }), + YELLOW(4, new Loadout() + { + @Override + public ItemStack getSword() + { + return new ItemStack(Material.STONE_SWORD, 1); + } + + @Override + public ItemStack getRod() + { + return new ItemStack(Material.FISHING_ROD, 1); + } + + @Override + public ItemStack getBow() + { + return new ItemStack(Material.BOW, 1); + } + + @Override + public ItemStack getArrows() + { + return new ItemStack(Material.ARROW, 5); + } + + @Override + public ItemStack getHelmet() + { + return new ItemStack(Material.GOLD_HELMET, 1); + } + + @Override + public ItemStack getChestplate() + { + return new ItemStack(Material.GOLD_CHESTPLATE, 1); + } + + @Override + public ItemStack getLeggings() + { + return new ItemStack(Material.GOLD_LEGGINGS, 1); + } + + @Override + public ItemStack getBoots() + { + return new ItemStack(Material.GOLD_BOOTS, 1); + } + }), + GREEN(8, new Loadout() + { + @Override + public ItemStack getSword() + { + return new ItemStack(Material.WOOD_SWORD, 1); + } + + @Override + public ItemStack getRod() + { + return new ItemStack(Material.FISHING_ROD, 1); + } + + @Override + public ItemStack getBow() + { + return new ItemStack(Material.BOW, 1); + } + + @Override + public ItemStack getArrows() + { + return new ItemStack(Material.ARROW, 3); + } + + @Override + public ItemStack getHelmet() + { + return new ItemStack(Material.LEATHER_HELMET, 1); + } + + @Override + public ItemStack getChestplate() + { + return new ItemStack(Material.LEATHER_CHESTPLATE, 1); + } + + @Override + public ItemStack getLeggings() + { + return new ItemStack(Material.LEATHER_LEGGINGS, 1); + } + + @Override + public ItemStack getBoots() + { + return new ItemStack(Material.LEATHER_BOOTS, 1); + } + }); + + private int _endsAt; + private Loadout _loadout; + + ArenaType(int endsAt, Loadout loadout) + { + _endsAt = endsAt; + _loadout = loadout; + } + + public Loadout getLoadout() + { + return _loadout; + } + + public int getEndsAt() + { + return _endsAt; + } + + public String getName() + { + return toString().toLowerCase(); + } + + public boolean furtherOut(ArenaType other) + { + return !(compareTo(other) <= 0); + } + +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java new file mode 100644 index 000000000..144b191a7 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -0,0 +1,28 @@ +package nautilus.game.arcade.game.games.gladiators; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.game.SoloGame; +import nautilus.game.arcade.game.games.gladiators.kits.KitGladiator; +import nautilus.game.arcade.kit.Kit; + +/** + * Created by William (WilliamTiger). + * 07/12/15 + */ +public class Gladiators extends SoloGame +{ + public Gladiators(ArcadeManager manager) + { + super(manager, GameType.Gladiators, + new Kit[0], + new String[] + { + "This is a 1v1 tournament!", + "Kill and then run to the next arena!", + "There is only one victor!" + }); + + setKits(new Kit[]{new KitGladiator(manager)}); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Loadout.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Loadout.java new file mode 100644 index 000000000..4d9f23c61 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Loadout.java @@ -0,0 +1,22 @@ +package nautilus.game.arcade.game.games.gladiators; + +import org.bukkit.inventory.ItemStack; + +/** + * Created by William (WilliamTiger). + * 07/12/15 + */ +public interface Loadout +{ + + public ItemStack getSword(); + public ItemStack getRod(); + public ItemStack getBow(); + public ItemStack getArrows(); + + public ItemStack getHelmet(); + public ItemStack getChestplate(); + public ItemStack getLeggings(); + public ItemStack getBoots(); + +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/kits/KitGladiator.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/kits/KitGladiator.java new file mode 100644 index 000000000..1a0df8140 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/kits/KitGladiator.java @@ -0,0 +1,38 @@ +package nautilus.game.arcade.game.games.gladiators.kits; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +/** + * Created by William (WilliamTiger). + * 07/12/15 + */ +public class KitGladiator extends Kit +{ + public KitGladiator(ArcadeManager manager) + { + super(manager, "Gladiator", KitAvailability.Free, + new String[] + { + "At my signal, unleash hell." + }, + new Perk[] + { + + }, + EntityType.ZOMBIE, new ItemStack(Material.IRON_SWORD)); + } + + @Override + public void GiveItems(Player player) + { + //todo: items based on loadout + } +} From 42a0354c9e808e04a93922dfdfcec3d5ad317594 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 7 Dec 2015 18:28:05 -0500 Subject: [PATCH 085/223] Now Playing, Preference to disable ads --- .../core/notifier/NotificationManager.java | 21 ++++++++++---- .../core/preferences/PreferencesManager.java | 2 +- .../preferences/PreferencesRepository.java | 9 ++++-- .../core/preferences/UserPreferences.java | 1 + .../core/preferences/ui/PreferencesPage.java | 28 +++++++++++++++++-- .../src/mineplex/hub/HubManager.java | 13 +++++++-- .../nautilus/game/arcade/ArcadeManager.java | 4 +-- .../game/arcade/managers/GameManager.java | 5 +--- 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java index 6c218986e..8e4cb3dc7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java @@ -13,6 +13,7 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.preferences.PreferencesManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -21,6 +22,7 @@ public class NotificationManager extends MiniPlugin private boolean _enabled = true; private CoreClientManager _clientManager; + private PreferencesManager _preferencesManager; private String _summerLine = C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█" + C.cBlack + "█" + @@ -30,11 +32,12 @@ public class NotificationManager extends MiniPlugin C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█" + C.cBlack + "█" + C.cYellow + "█"; - public NotificationManager(JavaPlugin plugin, CoreClientManager client) + public NotificationManager(JavaPlugin plugin, CoreClientManager client, PreferencesManager preferencesManager) { super("Notification Manager", plugin); _clientManager = client; + _preferencesManager = preferencesManager; } @EventHandler @@ -55,11 +58,17 @@ public class NotificationManager extends MiniPlugin private void christmasSale() { - Bukkit.broadcastMessage(C.cWhite + " "); - Bukkit.broadcastMessage(C.cRedB + " MASSIVE WINTER SALE"); - Bukkit.broadcastMessage(C.cWhiteB + " 50% OFF ALL RANKS"); - Bukkit.broadcastMessage(" " + C.cGreen + C.Line + "www.mineplex.com/shop"); - Bukkit.broadcastMessage(C.cWhite + " "); + for (Player player : UtilServer.getPlayers()) + { + if (!_preferencesManager.Get(player).DisableAds) + { + player.sendMessage(C.cWhite + " "); + player.sendMessage(C.cRedB + " MASSIVE WINTER SALE"); + player.sendMessage(C.cWhiteB + " 50% OFF ALL RANKS"); + player.sendMessage(" " + C.cGreen + C.Line + "www.mineplex.com/shop"); + player.sendMessage(C.cWhite + " "); + } + } } private void sale() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java index 23d067d8f..ae7f67755 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java @@ -136,6 +136,6 @@ public class PreferencesManager extends MiniDbClientPlugin @Override public String getQuery(int accountId, String uuid, String name) { - return "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests, friendDisplayInventoryUI, clanTips, hubMusic FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"; + return "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests, friendDisplayInventoryUI, clanTips, hubMusic, disableAds FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"; } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java index 895555da6..957785cb4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java @@ -24,7 +24,7 @@ public class PreferencesRepository extends RepositoryBase // DEFAULT 0, showMacReports BOOL NOT NULL DEFAULT 0, ignoreVelocity BOOL // NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE INDEX uuid_index (uuid));"; private static String INSERT_ACCOUNT = "INSERT INTO accountPreferences (uuid) VALUES (?) ON DUPLICATE KEY UPDATE uuid=uuid;"; - private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ?, showMacReports = ?, ignoreVelocity = ?, pendingFriendRequests = ?, friendDisplayInventoryUI = ?, clanTips = ?, hubMusic = ? WHERE uuid=?;"; + private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ?, showMacReports = ?, ignoreVelocity = ?, pendingFriendRequests = ?, friendDisplayInventoryUI = ?, clanTips = ?, hubMusic = ?, disableAds = ? WHERE uuid=?;"; public PreferencesRepository(JavaPlugin plugin) { @@ -62,8 +62,9 @@ public class PreferencesRepository extends RepositoryBase preparedStatement.setBoolean(12, entry.getValue().friendDisplayInventoryUI); preparedStatement.setBoolean(13, entry.getValue().ClanTips); preparedStatement.setBoolean(14, entry.getValue().HubMusic); + preparedStatement.setBoolean(15, entry.getValue().DisableAds); System.out.println(">> " + entry.getValue().ClanTips); - preparedStatement.setString(15, entry.getKey()); + preparedStatement.setString(16, entry.getKey()); preparedStatement.addBatch(); } @@ -91,8 +92,9 @@ public class PreferencesRepository extends RepositoryBase preparedStatement.setBoolean(12, entry.getValue().friendDisplayInventoryUI); preparedStatement.setBoolean(13, entry.getValue().ClanTips); preparedStatement.setBoolean(14, entry.getValue().HubMusic); + preparedStatement.setBoolean(15, entry.getValue().DisableAds); System.out.println(">> " + entry.getValue().ClanTips); - preparedStatement.setString(15, entry.getKey()); + preparedStatement.setString(16, entry.getKey()); preparedStatement.execute(); } @@ -125,6 +127,7 @@ public class PreferencesRepository extends RepositoryBase preferences.friendDisplayInventoryUI = resultSet.getBoolean(12); preferences.ClanTips = resultSet.getBoolean(13); preferences.HubMusic = resultSet.getBoolean(14); + preferences.DisableAds = resultSet.getBoolean(15); System.out.println("<< " + resultSet.getBoolean(13)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java index 4036b494f..ee8e1ca3b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/UserPreferences.java @@ -17,4 +17,5 @@ public class UserPreferences public boolean friendDisplayInventoryUI = true; public boolean ClanTips = true; public volatile boolean HubMusic = true; + public boolean DisableAds = false; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java index 27e20e3d6..a6ae4f518 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesPage.java @@ -26,6 +26,7 @@ public class PreferencesPage extends ShopPageBase _achievementManager.setGiveInterfaceItem(true); _packetHandler = packetHandler; - new NotificationManager(getPlugin(), clientManager); + new NotificationManager(getPlugin(), clientManager, preferences); new BotSpamManager(plugin, clientManager, punish); ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle().pvpMode = true; @@ -290,6 +291,14 @@ public class HubManager extends MiniClientPlugin NoteSong song = _songs.get(index); if (song != null) { + for (Player player : UtilServer.getPlayers()) + { + if (_preferences.Get(player).HubMusic) + { + UtilTextBottom.display(C.cWhite + "Now Playing " + C.cYellow + song.getName(), player); + } + } + new NotePlayer(_plugin, song, new INoteVerifier() { @Override @@ -1003,7 +1012,7 @@ public class HubManager extends MiniClientPlugin { if (event.getGadget() != null && event.getGadget().getGadgetType() == GadgetType.MusicDisc) { - UtilPlayer.message(event.getPlayer(), F.main("Hub", "Music Discs are disabled right now")); + UtilPlayer.message(event.getPlayer(), F.main("Hub", "Music Discs are disabled right now!")); event.setCancelled(true); } } 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 8a852224a..21e3ea398 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -308,8 +308,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation new SoupAddon(plugin, this); new TeamArmorAddon(plugin, this); - new NotificationManager(getPlugin(), clientManager); - +// new NotificationManager(getPlugin(), clientManager); + new BonusManager(plugin, clientManager, serverStatusManager, donationManager, pollManager , npcManager, hologramManager, statsManager, _inventoryManager, petManager, giveawayManager); //Champions Modules diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index ce83a8995..0c7481f59 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -68,11 +68,8 @@ public class GameManager implements Listener if (event.getType() != UpdateType.MIN_08) return; - if (Manager.GetGame() == null) - return; - for (Player player : UtilServer.getPlayers()) - if (!Manager.GetGame().IsAlive(player)) + if ((Manager.getName() == null || !Manager.GetGame().IsAlive(player)) && !Manager.getPreferences().Get(player).DisableAds) { player.sendMessage(C.cWhite + " "); player.sendMessage(C.cRedB + " MASSIVE WINTER SALE"); From 4ba2e8c96c56f1819407c4e3a4156a9004dc89b6 Mon Sep 17 00:00:00 2001 From: Cheese Date: Tue, 8 Dec 2015 10:31:11 +1100 Subject: [PATCH 086/223] fixed old staff being stuck invis. partially changed scoreboard to show playercount --- .../src/mineplex/hub/HubClient.java | 14 +------------- .../src/mineplex/hub/HubManager.java | 17 ++++++++--------- .../hub/modules/HubVisibilityManager.java | 2 +- 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubClient.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubClient.java index 4008f1b63..4b56eff02 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubClient.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubClient.java @@ -22,9 +22,7 @@ public class HubClient public int DisplayLength = 16; private int _lastGemCount = 0; - - private int _lastCoinCount = 0; - + public HubClient(String name) { ScoreboardString = " Welcome " + name + ", to the Mineplex Network!"; @@ -133,14 +131,4 @@ public class HubClient return display; } - - public void SetLastCoinCount(int coins) - { - _lastCoinCount = coins; - } - - public int GetLastCoinCount() - { - return _lastCoinCount; - } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index ea96b4c65..8e78486e7 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -165,7 +165,7 @@ public class HubManager extends MiniClientPlugin private HashMap _scoreboards = new HashMap(); private String _serverName = ""; - + private int _lastPlayerCount = 0; private boolean _shuttingDown; private HashMap _portalTime = new HashMap(); @@ -719,15 +719,14 @@ public class HubManager extends MiniClientPlugin //Space obj.getScore(" ").setScore(line--); - //Coins - obj.getScore(C.cYellow + C.Bold + "Coins").setScore(line--); + //Players + obj.getScore(C.cYellow + C.Bold + "Players").setScore(line--); - // Remove Old - player.getScoreboard().resetScores(Get(player.getName()).GetLastCoinCount() + ""); - // Add New - obj.getScore(GetDonation().Get(player.getName()).getCoins() + "").setScore(line--); - - Get(player.getName()).SetLastCoinCount(GetDonation().Get(player.getName()).getCoins()); + player.getScoreboard().resetScores(_lastPlayerCount + ""); + + _lastPlayerCount++; + + obj.getScore(_lastPlayerCount + "").setScore(line--); //Space diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java index db7624cd9..1733a2fcc 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java @@ -65,7 +65,7 @@ public class HubVisibilityManager extends MiniPlugin { boolean hideMe = Manager.GetTutorial().InTutorial(player) || UtilMath.offset2d(player.getLocation(), Manager.GetSpawn()) == 0 || - Manager.getPreferences().Get(player).Invisibility || + (Manager.getPreferences().Get(player).Invisibility && Manager.GetClients().Get(player).GetRank().has(Rank.MODERATOR)) || _hiddenPlayers.contains(player); for (Player other : UtilServer.getPlayers()) From b1536547d36ce13ad8913e6a5edaaf3b4135032b Mon Sep 17 00:00:00 2001 From: xGamingDudex Date: Tue, 8 Dec 2015 00:50:08 +0100 Subject: [PATCH 087/223] Cosmetic Update 2 + Item Coal + Freeze Cannon + Party Popper / Party Bomb + Snowball + Coal Fumes Particle + Snowman sneak trail/glide + Teaked stuff --- .../core/common/util/UtilParticle.java | 33 ++- .../mineplex/core/gadget/GadgetManager.java | 8 + .../core/gadget/gadgets/item/ItemCoal.java | 126 +++++++++++ .../gadget/gadgets/item/ItemFirework.java | 3 +- .../gadget/gadgets/item/ItemFreezeCannon.java | 197 ++++++++++++++++++ .../gadget/gadgets/item/ItemPartyPopper.java | 141 +++++++++++++ .../gadget/gadgets/item/ItemSnowball.java | 61 ++++++ .../gadget/gadgets/morph/MorphSnowman.java | 64 ++++-- .../gadgets/particle/ParticleCoalFumes.java | 45 ++++ .../src/mineplex/core/pet/PetManager.java | 2 +- .../src/mineplex/core/updater/UpdateType.java | 66 ++++++ .../src/mineplex/hub/HubManager.java | 3 +- .../hub/commands/DisguiseCommand.java | 2 +- 13 files changed, 720 insertions(+), 31 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java index bacca401f..a1b747a9e 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java @@ -249,12 +249,30 @@ public class UtilParticle public static void PlayParticleToAll(ParticleType type, Location location, Vector offset, float speed, int count, ViewDist dist) { - PlayParticle(type, location, (float) offset.getX(), (float) offset.getY(), (float) offset.getZ(), speed, count, dist, UtilServer.getPlayers()); + float x = 0; + float y = 0; + float z = 0; + if(offset != null) + { + x = (float) offset.getX(); + y = (float) offset.getY(); + z = (float) offset.getZ(); + } + PlayParticle(type, location, x, y, z, speed, count, dist, UtilServer.getPlayers()); } public static void PlayParticle(ParticleType type, Location location, Vector offset, float speed, int count, ViewDist dist, Player... players) { - PlayParticle(type, location, (float) offset.getX(), (float) offset.getY(), (float) offset.getZ(), speed, count, dist, players); + float x = 0; + float y = 0; + float z = 0; + if(offset != null) + { + x = (float) offset.getX(); + y = (float) offset.getY(); + z = (float) offset.getZ(); + } + PlayParticle(type, location, x, y, z, speed, count, dist, players); } public static void PlayParticleToAll(ParticleType type, Location location, float offsetX, float offsetY, float offsetZ, @@ -286,7 +304,16 @@ public class UtilParticle public static void PlayParticleToAll(String particle, Location location, Vector offset, float speed, int count, ViewDist dist) { - PlayParticle(particle, location, (float) offset.getX(), (float) offset.getY(), (float) offset.getZ(), speed, count, dist, UtilServer.getPlayers()); + float x = 0; + float y = 0; + float z = 0; + if(offset != null) + { + x = (float) offset.getX(); + y = (float) offset.getY(); + z = (float) offset.getZ(); + } + PlayParticle(particle, location, x, y, z, speed, count, dist, UtilServer.getPlayers()); } public static void PlayParticleToAll(String particle, Location location, float offsetX, float offsetY, float offsetZ, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 836cc0aec..e799d89e9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -39,15 +39,18 @@ import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane; import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord; import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan; import mineplex.core.gadget.gadgets.item.ItemBatGun; +import mineplex.core.gadget.gadgets.item.ItemCoal; import mineplex.core.gadget.gadgets.item.ItemCoinBomb; import mineplex.core.gadget.gadgets.item.ItemDuelingSword; import mineplex.core.gadget.gadgets.item.ItemEtherealPearl; import mineplex.core.gadget.gadgets.item.ItemFirework; import mineplex.core.gadget.gadgets.item.ItemFleshHook; +import mineplex.core.gadget.gadgets.item.ItemFreezeCannon; import mineplex.core.gadget.gadgets.item.ItemMelonLauncher; import mineplex.core.gadget.gadgets.item.ItemPaintballGun; import mineplex.core.gadget.gadgets.item.ItemPaintbrush; import mineplex.core.gadget.gadgets.item.ItemPartyPopper; +import mineplex.core.gadget.gadgets.item.ItemSnowball; import mineplex.core.gadget.gadgets.item.ItemTNT; import mineplex.core.gadget.gadgets.morph.MorphBat; import mineplex.core.gadget.gadgets.morph.MorphBlaze; @@ -68,6 +71,7 @@ import mineplex.core.gadget.gadgets.outfit.OutfitRaveSuit; import mineplex.core.gadget.gadgets.outfit.OutfitSpaceSuit; import mineplex.core.gadget.gadgets.outfit.OutfitTeam; import mineplex.core.gadget.gadgets.particle.ParticleCandyCane; +import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes; import mineplex.core.gadget.gadgets.particle.ParticleEnchant; import mineplex.core.gadget.gadgets.particle.ParticleFairy; import mineplex.core.gadget.gadgets.particle.ParticleFireRings; @@ -147,6 +151,9 @@ public class GadgetManager extends MiniPlugin addGadget(new ItemPaintbrush(this)); addGadget(new ItemDuelingSword(this)); addGadget(new ItemPartyPopper(this)); + addGadget(new ItemCoal(this)); + addGadget(new ItemFreezeCannon(this)); + addGadget(new ItemSnowball(this)); // Costume addGadget(new OutfitRaveSuit(this, "Rave Hat", -2, ArmorSlot.Helmet, Material.LEATHER_HELMET, (byte)0)); @@ -194,6 +201,7 @@ public class GadgetManager extends MiniPlugin addGadget(new ParticleFrostLord(this)); addGadget(new ParticleTitan(this)); addGadget(new ParticleCandyCane(this)); + addGadget(new ParticleCoalFumes(this)); // Arrow Trails addGadget(new ArrowTrailFrostLord(this)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java new file mode 100644 index 000000000..38ff604cc --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -0,0 +1,126 @@ +package mineplex.core.gadget.gadgets.item; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.Callback; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilGear; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; +import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.types.ItemGadget; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; + +public class ItemCoal extends ItemGadget +{ + + public String[] Messages = new String[] + { + "Maybe you could.... eat it?", + "Yep, you're holding some coal...", + "This sure is a nice piece of coal!", + "Na na na na Na na na na " + C.cDGray + "BLACK COAL" + C.mBody + "!", + "Did you know that coal can be used for " + C.Scramble + "nothing" + C.mBody + "!", + }; + + public ItemCoal(GadgetManager manager) + { + super(manager, "Coal", new String[] + { + C.cDGray + "Exclusive Coal!", + C.cDGray + "Earned by beeing naughty" + } + , -1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] + { + C.cDGray + "Exclusive Coal!", + C.cDGray + "Earned by beeing naughty" + } + , 100, 100)); + } + + @Override + public void ActivateCustom(final Player player) + { + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) + { + player.sendMessage(F.main("Coal", "You unlocked " + C.cDGray + "COAL FUMES!")); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); + player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); + Manager.getInventoryManager().addItemToInventory(new Callback() + { + @Override + public void run(Boolean data) + { + Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + } + }, player, "Coal Fumes", 1); + return; + } + + int i = UtilMath.r(Messages.length); + String msg = Messages[i]; + player.sendMessage(F.main("Coal", msg)); + player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 0.2f, 1.5f*(i/(float)Messages.length)); + } + + @EventHandler @Override + public void Activate(PlayerInteractEvent event) + { + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) + return; + + if (UtilBlock.usable(event.getClickedBlock())) + return; + + if (!UtilGear.isMat(event.getPlayer().getItemInHand(), this.GetDisplayMaterial())) + return; + + Player player = event.getPlayer(); + + if (!IsActive(player)) + return; + + event.setCancelled(true); + + //Stock + if (Manager.getInventoryManager().Get(player).getItemCount(GetName()) <= 0) + { + + UtilPlayer.message(player, F.main("Gadget", "You do not have any " + GetName() + " left.")); + + ItemGadgetOutOfAmmoEvent ammoEvent = new ItemGadgetOutOfAmmoEvent(event.getPlayer(), this); + Bukkit.getServer().getPluginManager().callEvent(ammoEvent); + + return; + } + + //Recharge + if (!Recharge.Instance.use(player, GetName(), GetName(), _recharge, _recharge > 1000, true, false, true, "Cosmetics")) + { + UtilInv.Update(player); + return; + } + + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + + ActivateCustom(event.getPlayer()); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java index 0462dd311..1f7463054 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java @@ -2,9 +2,9 @@ package mineplex.core.gadget.gadgets.item; import org.bukkit.Color; import org.bukkit.FireworkEffect; +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.entity.Player; import org.bukkit.util.Vector; @@ -17,7 +17,6 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; -import mineplex.core.recharge.Recharge; public class ItemFirework extends ItemGadget { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java new file mode 100644 index 000000000..d8ac3177e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java @@ -0,0 +1,197 @@ +package mineplex.core.gadget.gadgets.item; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.EntityEffect; +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.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.LivingEntity; +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 org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +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.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.types.ItemGadget; +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; + +public class ItemFreezeCannon extends ItemGadget implements IThrown +{ + + private HashMap _playerMap = new HashMap<>(); + + public ItemFreezeCannon(GadgetManager manager) + { + super(manager, "Freeze Cannon", new String[] + { + C.cWhite + "Freeze your nemesis inside a block of ice!" + } + , -1, Material.ICE, (byte) 0, 2000, new Ammo("Freeze Cannon", "100 Ice Blocks", Material.ICE, (byte) 0, new String[] + { + C.cWhite + "100 Ice Blocks for you to launch!" + }, 500, 100)); + } + + @Override + public void ActivateCustom(Player player) + { + Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), new ItemStack(Material.ICE)); + UtilAction.velocity(item, player.getLocation().getDirection(), + 1, false, 0, 0.2, 10, false); + + Manager.getProjectileManager().AddThrow(item, player, this, 5000, true, true, true, true, + null, 1f, 1f, null, null, 0, UpdateType.TICK, 0.5f); + + //Inform + UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); + + //Effect + item.getWorld().playSound(item.getLocation(), Sound.EXPLODE, 0.5f, 0.5f); + } + + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + if (target instanceof Player) + { + Player p = (Player) target; + + int ticks = 4 * 20; + if(isClear(p.getLocation())) + { + Manager.getBlockRestore().add(p.getLocation().getBlock(), Material.STAINED_GLASS.getId(), (byte)5, 0, (byte)0, ticks*50); + Manager.getBlockRestore().add(p.getLocation().getBlock().getRelative(BlockFace.UP), Material.STAINED_GLASS.getId(), (byte)5, 0, (byte)0, ticks*50); + if(p.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.AIR) + { + Manager.getBlockRestore().add(p.getLocation().getBlock().getRelative(BlockFace.DOWN), Material.STAINED_GLASS.getId(), (byte)5, 0, (byte)0, ticks*50); + } + p.setWalkSpeed(0); + _playerMap.put(p, System.currentTimeMillis() + (ticks * 50)); + p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, ticks, 250, true, false)); + p.teleport(target.getLocation().getBlock().getLocation().add(0.5, 0, 0.5)); + Recharge.Instance.useForce(p, "Double Jump", ticks*50); + p.setAllowFlight(false); + p.getWorld().playSound(p.getLocation(), Sound.FIZZ, 0.25f, 0.75f); + } + + //Effect + target.playEffect(EntityEffect.HURT); + } + + smash(data.GetThrown()); + } + + @EventHandler + public void onMove(PlayerMoveEvent event) + { + if(!_playerMap.containsKey(event.getPlayer())) return; + + if(event.getFrom().distanceSquared(event.getTo()) > 0.3) + { + event.setCancelled(true); + } + } + + public boolean isClear(Location loc) + { + Block b = loc.getBlock(); + ArrayList blocks = UtilBlock.getInBoundingBox(b.getLocation().subtract(1, 0, 1), b.getLocation().add(1, 1, 1)); + for(Block test : blocks) + { + if(test.getType() == Material.PORTAL) return false; + } + if(b.getType() != Material.AIR) return false; + if(b.getRelative(BlockFace.UP).getType() != Material.AIR) return false; + + return true; + } + + @EventHandler + public void cleanup(UpdateEvent event) + { + if(event.getType() == UpdateType.FAST) + { + for(Iterator it = _playerMap.keySet().iterator(); it.hasNext();) + { + Player p = it.next(); + Long time = _playerMap.get(p); + if(time == null) + { + p.setWalkSpeed(0.2f); + p.setAllowFlight(false); + it.remove(); + continue; + } + if(time < System.currentTimeMillis()) + { + p.setWalkSpeed(0.2f); + p.setAllowFlight(false); + it.remove(); + continue; + } + } + } + if(event.getType() == UpdateType.TICK) + { + for(Player p : _playerMap.keySet()) + { + Long time = _playerMap.get(p); + if(time <= System.currentTimeMillis()) continue; + + for(Player op : UtilServer.getPlayers()) + { + if(op.equals(p)) continue; + op.sendBlockChange(p.getLocation(), Material.ICE, (byte) 0); + op.sendBlockChange(p.getLocation().add(0, 1, 0), Material.ICE, (byte) 0); + } + } + } + } + + @Override + public void Idle(ProjectileUser data) + { + smash(data.GetThrown()); + } + + @Override + public void Expire(ProjectileUser data) + { + smash(data.GetThrown()); + } + + public void smash(Entity ent) + { + //Effect + ent.getWorld().playEffect(ent.getLocation(), Effect.STEP_SOUND, Material.ICE); + + //Remove + ent.remove(); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java new file mode 100644 index 000000000..2a44e16da --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java @@ -0,0 +1,141 @@ +package mineplex.core.gadget.gadgets.item; + +import java.util.HashSet; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.Item; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.types.ItemGadget; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.projectile.IThrown; +import mineplex.core.projectile.ProjectileUser; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class ItemPartyPopper extends ItemGadget implements IThrown +{ + HashSet _items = new HashSet<>(); + + public ItemPartyPopper(GadgetManager manager) + { + super(manager, "Confetti Bomb", new String[] + { + C.cWhite + "POP BANG!", + }, -1, Material.GOLDEN_CARROT, (byte) 0, 1000, new Ammo("Confetti Bomb", "100 Party Poppers", Material.DIAMOND_BARDING, + (byte) 0, new String[] + { + C.cWhite + "100 Party Poppers for you to shoot!" + }, 500, 100)); + } + + @Override + public void ActivateCustom(Player player) + { + + Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), + ItemStackFactory.Instance.CreateStack(Material.REDSTONE_LAMP_OFF, (byte)0, 1, "Lamp" + Math.random())); + + UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.1), 1, false, 0, 0.2, 10, false); + + Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); + + /* + for(int data : new int[]{1,2,4,5,6,9,10,11,12,13,14,15}) + { + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), null, 0.4f, 50, ViewDist.LONG); + /* + for(int i = 0; i < 10; i++) + { + Vector v = new Vector(Math.random() - 0.5, Math.random() - 0.3, Math.random() - 0.5); + v.normalize(); + v.multiply(0.2); + v.add(player.getLocation().getDirection()); + v.normalize().multiply(Math.random()*0.4 + 0.4); + + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), v, 1, 0, ViewDist.LONG); + } + + /* + Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), + ItemStackFactory.Instance.CreateStack(Material.INK_SACK, (byte)data, 1, "Ink" + Math.random())); + _items.add(ent); + + Vector random = new Vector(Math.random() - 0.5, Math.random() - 0.3, Math.random() - 0.5); + random.normalize(); + random.multiply(0.05); + + UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.3).add(random), 1 + 0.4 * Math.random(), false, 0, 0.2, 10, false); + + Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); + */ +// } + // Sound + for(int i = 0; i < 3; i++) + { + player.getWorld().playSound(player.getLocation(), Sound.CHICKEN_EGG_POP, 2.0f, 0.8f); + } + } + + @Override + public void Collide(LivingEntity target, Block block, ProjectileUser data) + { + Explode(data); + } + + @Override + public void Idle(ProjectileUser data) + { + Explode(data); + } + + @Override + public void Expire(ProjectileUser data) + { + Explode(data); + } + + @EventHandler + public void particleTrail(UpdateEvent event) + { + if(event.getType() != UpdateType.TICK) return; + + for(Item item : _items) + { + byte data = item.getItemStack().getData().getData(); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), item.getLocation(), 0, 0, 0, 0.0f, 3, ViewDist.LONG); + } + } + + public void Explode(ProjectileUser data) + { + for(int type : new int[]{1,2,4,5,6,9,10,11,12,13,14,15}) + { + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, type), data.GetThrown().getLocation(), null, 0.4f, 50, ViewDist.LONG); + } + data.GetThrown().getWorld().playSound(data.GetThrown().getLocation(), Sound.LAVA_POP, 0.75f, 1.25f); + data.GetThrown().remove(); + /* + if (data.GetThrown() instanceof Item) + { + Item item = (Item) data.GetThrown(); + byte b = item.getItemStack().getData().getData(); + UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, b), item.getLocation(), 0, 0, 0, 0.2f, 80, ViewDist.LONG); + _items.remove(item); + } + data.GetThrown().getWorld().playSound(data.GetThrown().getLocation(), Sound.LAVA_POP, 0.75f, 1.25f); + data.GetThrown().remove(); + */ + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java new file mode 100644 index 000000000..ce1f5dc79 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java @@ -0,0 +1,61 @@ +package mineplex.core.gadget.gadgets.item; + +import java.util.HashSet; + +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.util.Vector; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAction; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.event.GadgetCollideEntityEvent; +import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.types.ItemGadget; + +public class ItemSnowball extends ItemGadget +{ + + private HashSet _snowballs = new HashSet<>(); + + public ItemSnowball(GadgetManager manager) + { + super(manager, "Snowball", new String[] + { + C.cWhite + "Throw snowball!", + C.cWhite + "Start epic snowfights!" + } + , -1, Material.SNOW_BALL, (byte) 0, 1, new Ammo("Snowball", "50 Snowballs", Material.SNOW_BALL, (byte) 0, new String[] + { + C.cWhite + "50 Snowballs for you to throw!" + } + , 100, 50)); + + } + + @Override + public void ActivateCustom(Player player) + { + Snowball ball = player.launchProjectile(Snowball.class); + _snowballs.add(ball); + ball.getWorld().playSound(ball.getLocation(), Sound.CHICKEN_EGG_POP, 1f, 0.3f); + } + + @EventHandler + public void onHit(EntityDamageByEntityEvent event) + { + if(!_snowballs.contains(event.getDamager())) return; + + GadgetCollideEntityEvent gevent = new GadgetCollideEntityEvent(this, event.getEntity()); + + if(gevent.isCancelled()) return; + + UtilAction.velocity(event.getEntity(), event.getDamager().getVelocity().normalize().add(new Vector(0,0.5,0))); + event.getDamager().getWorld().playSound(event.getDamager().getLocation(), Sound.STEP_SNOW, 1, 0.5f); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java index 6e7d29b8e..40a7ff8cd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java @@ -16,9 +16,13 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilEvent.ActionType; 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.disguise.disguises.DisguiseSnowman; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetCollideEntityEvent; @@ -77,31 +81,45 @@ public class MorphSnowman extends MorphGadget @EventHandler public void Snow(UpdateEvent event) { - if (event.getType() != UpdateType.FASTEST) - return; - - for (Player player : GetActive()) + if (event.getType() == UpdateType.FASTEST) { - NautHashMap map = Recharge.Instance.Get(player); - if(map == null) continue; - - RechargeData data = map.get("Blizzard"); - if(data == null) continue; - if(data.GetRemaining() < 10000) continue; - - for (int i=0 ; i<4 ; i++) - { - Snowball snow = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), Snowball.class); - double x = 0.1 - (UtilMath.r(20)/100d); - double y = UtilMath.r(20)/100d; - double z = 0.1 - (UtilMath.r(20)/100d); - snow.setShooter(player); - snow.setVelocity(player.getLocation().getDirection().add(new Vector(x,y,z)).multiply(2)); - _snowball.put(snow, player); - } - //Effect - player.getWorld().playSound(player.getLocation(), Sound.STEP_SNOW, 0.2f, 0.5f); + for (Player player : GetActive()) + { + NautHashMap map = Recharge.Instance.Get(player); + if(map == null) continue; + + RechargeData data = map.get("Blizzard"); + if(data == null) continue; + if(data.GetRemaining() < 10000) continue; + + for (int i=0 ; i<4 ; i++) + { + Snowball snow = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), Snowball.class); + double x = 0.1 - (UtilMath.r(20)/100d); + double y = UtilMath.r(20)/100d; + double z = 0.1 - (UtilMath.r(20)/100d); + snow.setShooter(player); + snow.setVelocity(player.getLocation().getDirection().add(new Vector(x,y,z)).multiply(2)); + _snowball.put(snow, player); + } + + //Effect + player.getWorld().playSound(player.getLocation(), Sound.STEP_SNOW, 0.2f, 0.5f); + } + } + + if(event.getType() == UpdateType.TICK) + { + for (Player player : GetActive()) + { + if(player.isSneaking() && UtilEnt.isGrounded(player)) + { + player.setVelocity(player.getLocation().getDirection().setY(0).normalize()); + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, player.getLocation(), 0.3f, 0.1f, 0.3f, 0, 10, ViewDist.NORMAL); + player.getWorld().playSound(player.getLocation(), Sound.STEP_SNOW, 0.3f, 0.3f); + } + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java new file mode 100644 index 000000000..04ccec81d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java @@ -0,0 +1,45 @@ +package mineplex.core.gadget.gadgets.particle; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.ParticleGadget; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class ParticleCoalFumes extends ParticleGadget +{ + + public ParticleCoalFumes(GadgetManager manager) + { + super(manager, "Coal Fumes", new String[] + { + C.cDGray + "Nothing to read here. Please move on." + }, -1, Material.COAL, (byte) 0); + } + + @EventHandler + public void onUpdate(UpdateEvent event) + { + if(event.getType() != UpdateType.TICK) return; + + int dur = 200; + int tick = Math.abs(event.getTick()%dur); + + + double d = tick/(double)dur; + float xz = (float) Math.sin(d*Math.PI); + + for(Player p : GetActive()) + { + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, p.getLocation(), xz, 0, xz, 0, 5, ViewDist.NORMAL); + } + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index 8ca696f34..4e609930f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -354,7 +354,7 @@ public class PetManager extends MiniClientPlugin if(pet instanceof PigZombie) { UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, pet.getLocation(), 0.2f,0.0f,0.2f, 0.0f, 4, ViewDist.NORMAL); - if(event.getTick()%3 == 0) pet.getWorld().playSound(pet.getLocation(), Sound.BLAZE_BREATH, 0.1f, 0f); + if(event.getTick()%3 == 0) pet.getWorld().playSound(pet.getLocation(), Sound.BLAZE_BREATH, 0.03f, 0f); if(!((CraftPigZombie)pet).getHandle().isSilent()) { ((CraftPigZombie)pet).getHandle().setSilent(true); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java b/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java index 0b6c89cfb..52d63e2a1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java @@ -4,27 +4,93 @@ import mineplex.core.common.util.UtilTime; public enum UpdateType { + /** + * Once every 64 minutes + */ MIN_64(3840000), + /** + * Once every 60 minutes + */ HOUR_01(3600000), + /** + * Once every 32 minutes + */ MIN_32(1920000), + /** + * Once every 30 minutes + */ MIN_30(1800000), + /** + * Once every 16 minutes + */ MIN_16(960000), + /** + * Once every 10 minutes + */ MIN_10(600000), + /** + * Once every 8 minutes + */ MIN_08(480000), + /** + * Once every 5 minutes + */ MIN_05(300000), + /** + * Once every 4 minutes + */ MIN_04(240000), + /** + * Once every 2 minutes + */ MIN_02(120000), + /** + * Once every minute + */ MIN_01(60000), + /** + * Once every 32 seconds + */ SLOWEST(32000), + /** + * ONce every 30 seconds + */ SEC_30(30000), + /** + * Once every 16 seconds + */ SLOWER(16000), + /** + * Once every 8 seconds + */ SEC_08(8000), + /** + * Once every 4 seconds + */ SLOW(4000), + /** + * Once every 40 ticks + */ TWOSEC(2000), + /** + * Once every 20 ticks + */ SEC(1000), + /** + * Once every 10 ticks + */ FAST(500), + /** + * Once every 5 ticks + */ FASTER(250), + /** + * Once every 3 ticks + */ FASTEST(125), + /** + * Once every tick + */ TICK(49); private long _time; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 4ae6eea74..ad5f421a0 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -30,6 +30,7 @@ import mineplex.core.donation.DonationManager; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetActivateEvent; import mineplex.core.gadget.event.GadgetCollideEntityEvent; +import mineplex.core.gadget.types.GadgetType; import mineplex.core.giveaway.GiveawayManager; import mineplex.core.hologram.HologramManager; import mineplex.core.inventory.InventoryManager; @@ -279,7 +280,7 @@ public class HubManager extends MiniClientPlugin Player player = event.getPlayer(); - _gadgetManager.RemoveItem(player); + _gadgetManager.removeGadetType(player, GadgetType.Item); player.getInventory().setItem(3, new ItemStack(Material.SNOW_BALL, 16)); } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java index d76e0db30..cc55696c8 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java @@ -176,7 +176,7 @@ public class DisguiseCommand extends CommandBase implements Listener changeName(caller, args[0]); - Plugin.GetGadget().RemoveItem(caller); + Plugin.GetGadget().removeGadetType(caller, GadgetType.Item); UtilPlayer.message(caller, C.cGreen + C.Bold + "Disguise Active: " + ChatColor.RESET + args[0]); } catch(Exception e) From fe1f763374bcaf0b98839715b97ed7c81131b87e Mon Sep 17 00:00:00 2001 From: Cheese Date: Tue, 8 Dec 2015 15:26:32 +1100 Subject: [PATCH 088/223] changed order blocks will be added to the list --- .../src/mineplex/core/common/util/UtilBlock.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 da7bc464c..8f3b37176 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 @@ -552,8 +552,8 @@ public class UtilBlock if (diagonals) { for (int x = -1; x <= 1; x++) - for (int y = -1; y <= 1; y++) - for (int z = -1; z <= 1; z++) + for (int z = -1; z <= 1; z++) + for (int y = 1; y >= -1; y--) { if (x == 0 && y == 0 && z == 0) continue; @@ -563,11 +563,11 @@ public class UtilBlock else { blocks.add(block.getRelative(BlockFace.UP)); - blocks.add(block.getRelative(BlockFace.DOWN)); blocks.add(block.getRelative(BlockFace.NORTH)); blocks.add(block.getRelative(BlockFace.SOUTH)); blocks.add(block.getRelative(BlockFace.EAST)); blocks.add(block.getRelative(BlockFace.WEST)); + blocks.add(block.getRelative(BlockFace.DOWN)); } return blocks; From e6d995008ef88f114553a5c7b0a914e87e935df4 Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 10:44:24 +0000 Subject: [PATCH 089/223] Arenas --- .../arcade/game/games/gladiators/Arena.java | 223 ++++++++++++++++++ .../game/games/gladiators/Gladiators.java | 103 ++++++++ 2 files changed, 326 insertions(+) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java new file mode 100644 index 000000000..026e0ba86 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -0,0 +1,223 @@ +package nautilus.game.arcade.game.games.gladiators; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; + +/** + * Created by William (WilliamTiger). + * 07/12/15 + */ +public class Arena +{ + + private Gladiators _host; + private ArenaType _colour; + private Location _mid; + private ArrayList _spawns; + + private Arena _parent; + private Arena[] _childs = new Arena[2]; + private boolean _isUsed; + + private ArrayList _doorBlocks; + private boolean _closedDoor; + + public Arena(Gladiators host, Location mid, ArenaType colour) + { + _host = host; + _mid = mid; + _colour = colour; + _spawns = new ArrayList<>(); + _parent = null; + _isUsed = false; + _doorBlocks = new ArrayList<>(); + _closedDoor = false; + + setupSpawns(); + } + + public Arena getParent() + { + return _parent; + } + + public void setParent(Arena parent) + { + _parent = parent; + } + + public Arena getChildAt(int index) + { + return _childs[index]; + } + + public Arena[] getChilds() + { + return _childs; + } + + public int getCapacity() + { + int cap = _childs.length; + + for(Arena child : _childs) + { + if(child != null) + if(child.isUsed()) cap--; + } + + return cap; + } + + public ArrayList getDoorBlocks() + { + return _doorBlocks; + } + + public void setChild(int index, Arena child) + { + _childs[index] = child; + child.setParent(this); + } + + public void getUsageMap(HashMap used) + { + if(isUsed()) used.put(this, getCapacity()); + + for(Arena child : _childs) + { + if(child != null) child.getUsageMap(used); + } + } + + public boolean areChildrenUsed() + { + for(Arena child : _childs) + { + if(child != null) + if(!child.isUsed()) return false; + } + + return true; + } + + public Arena getUnusedChild() + { + for(Arena child : _childs) + { + if(child != null) + if(!child.isUsed()) return child; + } + + return null; + } + + private void setupSpawns() + { + ArrayList possible = (ArrayList) _host.WorldData.GetDataLocs("BLACK").clone(); + _mid.setY(UtilAlg.findClosest(_mid, possible).getY()); + + _spawns.add(correctFace(UtilAlg.findClosest(_mid, possible))); + possible.remove(_spawns.get(0)); + _spawns.add(correctFace(UtilAlg.findClosest(_mid, possible))); + } + + private Location correctFace(Location l) + { + l.setPitch(UtilAlg.GetPitch(UtilAlg.getTrajectory(l, _mid))); + l.setYaw(UtilAlg.GetYaw(UtilAlg.getTrajectory(l, _mid))); + return l; + } + + public Gladiators getHost() + { + return _host; + } + + public ArenaType getColour() + { + return _colour; + } + + public Location getMid() + { + return _mid; + } + + public ArrayList getSpawns() + { + return _spawns; + } + + public ArrayList capacitySpawns() + { + ArrayList ret = new ArrayList<>(); + + if (getCapacity() == 0) return ret; + if (getCapacity() == 1) + { + ret.add(_spawns.get(0)); + return ret; + } + if (getCapacity() == 2) + { + ret.add(_spawns.get(0)); + ret.add(_spawns.get(1)); + return ret; + } + + return ret; + } + + public ArrayList getPlayers() + { + ArrayList pls = new ArrayList<>(); + + for (Player p : _host.GetPlayers(true)) + { + if (UtilMath.offset(p.getLocation(), _mid) <= 21) + pls.add(p); + } + + return pls; + } + + public int getPlayerCount() + { + ArrayList pls = new ArrayList<>(); + + for (Player p : _host.GetPlayers(true)) + { + if (UtilMath.offset(p.getLocation(), _mid) <= 21) + pls.add(p); + } + + return pls.size(); + } + + public boolean isUsed() + { + return _isUsed; + } + + public void setIsUsed(boolean isUsed) + { + _isUsed = isUsed; + } + + public boolean isClosedDoor() + { + return _closedDoor; + } + + public void setClosedDoor(boolean closedDoor) + { + _closedDoor = closedDoor; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 144b191a7..ae5645bad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -1,5 +1,10 @@ package nautilus.game.arcade.game.games.gladiators; +import java.util.ArrayList; + +import org.bukkit.Location; + +import mineplex.core.common.util.UtilAlg; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.game.SoloGame; @@ -12,6 +17,10 @@ import nautilus.game.arcade.kit.Kit; */ public class Gladiators extends SoloGame { + + private ArrayList _allArenas; + private ArrayList _gameArenaSet; + public Gladiators(ArcadeManager manager) { super(manager, GameType.Gladiators, @@ -25,4 +34,98 @@ public class Gladiators extends SoloGame setKits(new Kit[]{new KitGladiator(manager)}); } + + @Override + public void ParseData() + { + parseArenas(); + } + + private void parseArenas() + { + _allArenas = new ArrayList<>(); + + for (Location mid : WorldData.GetDataLocs("RED")) + _allArenas.add(new Arena(this, mid, ArenaType.RED)); + + for (Location mid : WorldData.GetDataLocs("ORANGE")) + _allArenas.add(new Arena(this, mid, ArenaType.ORANGE)); + + for (Location mid : WorldData.GetDataLocs("YELLOW")) + _allArenas.add(new Arena(this, mid, ArenaType.YELLOW)); + + for (Location mid : WorldData.GetDataLocs("GREEN")) + _allArenas.add(new Arena(this, mid, ArenaType.GREEN)); + + for (Arena a : _allArenas) + { + if (a.getColour().equals(ArenaType.GREEN)) + continue; + + // Set the children of that arena. + ArrayList possible = (ArrayList) getAllArenaMidsOfType(getPreviousColour(a.getColour())).clone(); + a.setChild(0, getArenaByMid(UtilAlg.findClosest(a.getMid(), possible))); + possible.remove(a.getChildAt(0).getMid()); + a.setChild(1, getArenaByMid(UtilAlg.findClosest(a.getMid(), possible))); + } + } + + private void findGameArenaSet() + { + _gameArenaSet = new ArrayList<>(); + } + + public Arena getArenaByMid(Location mid) + { + for (Arena a : _allArenas) + if (a.getMid().equals(mid)) + return a; + + return null; + } + + public ArrayList getAllArenaMidsOfType(ArenaType type) + { + ArrayList mids = new ArrayList<>(); + + for (Arena a : _allArenas) + if (a.getColour().equals(type)) + mids.add(a.getMid()); + + return mids; + } + + public ArrayList getAllArenaMids() + { + ArrayList mids = new ArrayList<>(); + + for (Arena a : _allArenas) + mids.add(a.getMid()); + + return mids; + } + + public ArenaType getNextColour(ArenaType old) + { + switch (old) + { + case GREEN: return ArenaType.YELLOW; + case YELLOW: return ArenaType.ORANGE; + case ORANGE: return ArenaType.RED; + } + + return null; + } + + public ArenaType getPreviousColour(ArenaType old) + { + switch (old) + { + case RED: return ArenaType.ORANGE; + case ORANGE: return ArenaType.YELLOW; + case YELLOW: return ArenaType.GREEN; + } + + return null; + } } From a84f580719d1b221bbcaa49cd19d4251defa3b11 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Tue, 8 Dec 2015 05:45:26 -0500 Subject: [PATCH 090/223] Update IntelliJ to Java 8 --- Plugins/.idea/compiler.xml | 3 ++- Plugins/.idea/misc.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/.idea/compiler.xml b/Plugins/.idea/compiler.xml index 30263f09d..b232f8467 100644 --- a/Plugins/.idea/compiler.xml +++ b/Plugins/.idea/compiler.xml @@ -5,6 +5,7 @@ + @@ -28,7 +29,7 @@ - + - + \ No newline at end of file From b22c64ca6a5419e6b23abea1681cc750d15b6d37 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Tue, 8 Dec 2015 05:51:21 -0500 Subject: [PATCH 091/223] Fix excludes --- Plugins/.idea/compiler.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/Plugins/.idea/compiler.xml b/Plugins/.idea/compiler.xml index b232f8467..df8666836 100644 --- a/Plugins/.idea/compiler.xml +++ b/Plugins/.idea/compiler.xml @@ -5,7 +5,6 @@ - From addb2c8c0e91c5ac1162d5d09ed1cca5b4611910 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Tue, 8 Dec 2015 08:02:40 -0500 Subject: [PATCH 092/223] Fix java 8 compiler issue --- .../game/arcade/game/games/smash/perks/PerkCowAngryHerd.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java index 79f51f53b..d398bba74 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java @@ -87,7 +87,8 @@ public class PerkCowAngryHerd extends SmashPerk loc.add(UtilAlg.getLeft(dir).multiply(i*1.5)); Manager.GetGame().CreatureAllowOverride = true; - Cow cow = player.getWorld().spawn(loc, isSuperActive(player) ? MushroomCow.class : Cow.class); + Class clazz = isSuperActive(player) ? MushroomCow.class : Cow.class; + Cow cow = player.getWorld().spawn(loc, clazz); Manager.GetGame().CreatureAllowOverride = false; _active.add(new DataCowCharge(player, cow)); From 2b12016e147f7de79dc6029aa81271a7691c6186 Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 13:12:30 +0000 Subject: [PATCH 093/223] Progress --- .../arcade/game/games/gladiators/Arena.java | 13 +- .../game/games/gladiators/Gladiators.java | 208 +++++++++++++++++- .../events/PlayerChangeArenaEvent.java | 53 +++++ .../games/smash/perks/PerkCowAngryHerd.java | 6 +- 4 files changed, 265 insertions(+), 15 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/PlayerChangeArenaEvent.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 026e0ba86..e2aab1fb8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import mineplex.core.common.util.UtilAlg; @@ -26,7 +27,6 @@ public class Arena private boolean _isUsed; private ArrayList _doorBlocks; - private boolean _closedDoor; public Arena(Gladiators host, Location mid, ArenaType colour) { @@ -37,7 +37,6 @@ public class Arena _parent = null; _isUsed = false; _doorBlocks = new ArrayList<>(); - _closedDoor = false; setupSpawns(); } @@ -211,13 +210,9 @@ public class Arena _isUsed = isUsed; } - public boolean isClosedDoor() + public void closeDoor() { - return _closedDoor; - } - - public void setClosedDoor(boolean closedDoor) - { - _closedDoor = closedDoor; + for (Location loc : _doorBlocks) + loc.getBlock().setType(Material.OBSIDIAN); } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index ae5645bad..a4010e009 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -1,13 +1,23 @@ package nautilus.game.arcade.game.games.gladiators; import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerMoveEvent; import mineplex.core.common.util.UtilAlg; 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.gladiators.events.PlayerChangeArenaEvent; import nautilus.game.arcade.game.games.gladiators.kits.KitGladiator; import nautilus.game.arcade.kit.Kit; @@ -21,24 +31,54 @@ public class Gladiators extends SoloGame private ArrayList _allArenas; private ArrayList _gameArenaSet; + private HashMap _playerArenas; + public Gladiators(ArcadeManager manager) { super(manager, GameType.Gladiators, new Kit[0], new String[] - { - "This is a 1v1 tournament!", - "Kill and then run to the next arena!", - "There is only one victor!" - }); + { + "This is a 1v1 tournament!", + "Kill and then run to the next arena!", + "There is only one victor!" + }); + + Damage = true; + DamageFall = false; + DamagePvP = true; + DamageSelf = true; + DamageTeamSelf = true; + HungerSet = 20; setKits(new Kit[]{new KitGladiator(manager)}); + + _playerArenas = new HashMap<>(); } @Override public void ParseData() { parseArenas(); + parseDoors(); + } + + private void parseDoors() + { + for (Location loc : WorldData.GetCustomLocs("129")) + { + ArrayList mids = new ArrayList<>(getAllArenaMids()); + Arena arena1 = getArenaByMid(UtilAlg.findClosest(loc, mids)); + mids.remove(UtilAlg.findClosest(loc, mids)); + Arena arena2 = getArenaByMid(UtilAlg.findClosest(loc, mids)); + + if (arena1.getColour().furtherOut(arena2.getColour())) + arena1.getDoorBlocks().add(loc); + else + arena2.getDoorBlocks().add(loc); + + loc.getBlock().setType(Material.FENCE); + } } private void parseArenas() @@ -73,6 +113,107 @@ public class Gladiators extends SoloGame private void findGameArenaSet() { _gameArenaSet = new ArrayList<>(); + + GetTeamList().get(0).GetSpawns().clear(); // Clear the original game spawns. + + int neededSpawns = Math.min(GetPlayers(true).size(), 16); // Quick fix + Arena masterNode = getArenasOfType(ArenaType.RED).get(0); + + HashMap spawnsPerRoom = new HashMap<>(); + + Queue queue = new LinkedList<>(); + Queue nextQueue = new LinkedList<>(); + queue.add(masterNode); + + int sum; + boolean solved = false; + + while (!queue.isEmpty() && !solved) + { + sum = 0; + ArrayList currentNodes = new ArrayList<>(); + while (!queue.isEmpty()) + { + currentNodes.add(queue.poll()); + } + + for (Arena node : currentNodes) + { + sum += node.getCapacity(); + node.setIsUsed(true); + } + + if (sum >= neededSpawns) + { + solved = true; + } + else + { + for (Arena node : currentNodes) + { + for(int i = 0; i < node.getChilds().length; i++) + { + System.out.println("Adding child of node: " + node.getColour() + "number of childs: " + node.getChilds().length); + nextQueue.add(node.getChildAt(i)); + queue.add(node.getChildAt(i)); + } + } + + while (!nextQueue.isEmpty()) + { + Arena node = nextQueue.poll(); + node.setIsUsed(true); + + System.out.println("Node: " + node.getColour()); + sum = sum + node.getCapacity() - 1; + + /* + if (node.getParent().areChildrenUsed()) + { + node.getParent().setIsUsed(false); + } + */ + + if (sum >= neededSpawns) + { + solved = true; + break; + } + } + } + + if (solved) + { + masterNode.getUsageMap(spawnsPerRoom); + System.out.println("Solution: "); + + for (Map.Entry entry : spawnsPerRoom.entrySet()) + { + System.out.println("Color: " + entry.getKey().getColour() + ", Spawns: " + entry.getValue()); + _gameArenaSet.add(entry.getKey()); + } + } + } + + for (Arena a : _gameArenaSet) + { + if (a.getCapacity() <= 0) + continue; + + for (Location l : a.capacitySpawns()) + GetTeamList().get(0).GetSpawns().add(l); + } + } + + public ArrayList getArenasOfType(ArenaType type) + { + ArrayList arenas = new ArrayList<>(); + + for (Arena a : _allArenas) + if (a.getColour().equals(type)) + arenas.add(a); + + return arenas; } public Arena getArenaByMid(Location mid) @@ -128,4 +269,61 @@ public class Gladiators extends SoloGame return null; } + + @EventHandler + public void setups(GameStateChangeEvent e) + { + if (e.GetState().equals(GameState.Live)) + { + for (Player p : GetPlayers(true)) + { + for (Arena a : _allArenas) + { + if (a.getPlayers().contains(p)) + _playerArenas.put(p, a); + } + } + return; + } + + if (e.GetState() != GameState.Prepare) + return; + + findGameArenaSet(); + } + + @EventHandler + public void arenaMoveCheck(PlayerMoveEvent e){ + if (!GetPlayers(true).contains(e.getPlayer())) + return; + + if (!_playerArenas.containsKey(e.getPlayer())) + return; + + for (Arena a : _allArenas) + { + if (a.getPlayers().contains(e.getPlayer())) + { + if (_playerArenas.get(e.getPlayer()) != a) + { + Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), + a, _playerArenas.get(e.getPlayer()))); + + _playerArenas.put(e.getPlayer(), a); + } + } + } + } + + @EventHandler + public void arenaChange(PlayerChangeArenaEvent e) + { + Player p = e.getPlayer(); + Arena old = e.getFrom(); + Arena current = e.getTo(); + + old.closeDoor(); + + p.sendMessage("§7§lDEBUG: §3You left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/PlayerChangeArenaEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/PlayerChangeArenaEvent.java new file mode 100644 index 000000000..c948b3d90 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/PlayerChangeArenaEvent.java @@ -0,0 +1,53 @@ +package nautilus.game.arcade.game.games.gladiators.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import nautilus.game.arcade.game.games.gladiators.Arena; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public class PlayerChangeArenaEvent extends Event +{ + private static final HandlerList _handlers = new HandlerList(); + + private Player player; + private Arena to; + private Arena from; + + public PlayerChangeArenaEvent(Player player, Arena to, Arena from) + { + this.player = player; + this.to = to; + this.from = from; + } + + public Player getPlayer() + { + return player; + } + + public Arena getTo() + { + return to; + } + + public Arena getFrom() + { + return from; + } + + public static HandlerList getHandlerList() + { + return _handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java index 79f51f53b..dd0564f47 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/perks/PerkCowAngryHerd.java @@ -87,7 +87,11 @@ public class PerkCowAngryHerd extends SmashPerk loc.add(UtilAlg.getLeft(dir).multiply(i*1.5)); Manager.GetGame().CreatureAllowOverride = true; - Cow cow = player.getWorld().spawn(loc, isSuperActive(player) ? MushroomCow.class : Cow.class); + Cow cow; + if (isSuperActive(player)) + cow = player.getWorld().spawn(loc, MushroomCow.class); + else + cow = player.getWorld().spawn(loc, Cow.class); Manager.GetGame().CreatureAllowOverride = false; _active.add(new DataCowCharge(player, cow)); From a1915e324c4a7af83142cd83a518c101b925966b Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Tue, 8 Dec 2015 08:42:45 -0500 Subject: [PATCH 094/223] Some java 8 code --- .../mineplex/core/common/util/UtilServer.java | 7 ++ .../mineplex/core/noteblock/NotePlayer.java | 94 ++++++++----------- 2 files changed, 45 insertions(+), 56 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java index c56faa15a..79f248c3d 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilServer.java @@ -1,10 +1,12 @@ package mineplex.core.common.util; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.stream.Stream; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -18,6 +20,11 @@ public class UtilServer return getServer().getOnlinePlayers().toArray(new Player[0]); } + public static Collection getPlayersCollection() + { + return getServer().getOnlinePlayers(); + } + public static List getSortedPlayers() { return getSortedPlayers(new Comparator() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java index 941bc1dd9..70e5a8c1f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java @@ -1,7 +1,10 @@ package mineplex.core.noteblock; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -40,78 +43,57 @@ public class NotePlayer private void startThread() { - Thread thread = new Thread(new Runnable() - { - @Override - public void run() + Thread thread = new Thread(() -> { + while (!_finished) { - long startTime = System.currentTimeMillis(); - while (!_finished) + _tick++; + if (_tick > _song.getLength()) { - _tick++; - if (_tick > _song.getLength()) + if (_loop) { - if (_loop) - { - _tick = 1; - } - else - { - _finished = true; - - _plugin.getServer().getScheduler().runTask(_plugin, new Runnable() - { - @Override - public void run() - { - SongFinishEvent event = new SongFinishEvent(_song); - _plugin.getServer().getPluginManager().callEvent(event); - } - }); - - return; - } + _tick = 1; } - - playTick(_tick); - - try + else { - Thread.sleep(_sleepMs); - } - catch (InterruptedException e) - { - e.printStackTrace(); + _finished = true; + + _plugin.getServer().getScheduler().runTask(_plugin, () -> { + SongFinishEvent event = new SongFinishEvent(_song); + _plugin.getServer().getPluginManager().callEvent(event); + }); + + return; } } + + playTick(_tick); + + try + { + Thread.sleep(_sleepMs); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } } }); thread.start(); } + private void playNote(Note note, float volume, Collection players) + { + players.stream().filter(_verifier::shouldPlay).forEach((player) -> + player.playSound(player.getEyeLocation(), UtilNote.getInstrumentSound(note.getInstrument()), volume, (float) UtilNote.getPitch(note.getNote() - 33))); + } + private void playTick(int tick) { - Player[] playerArray = UtilServer.getPlayers(); - List players = new ArrayList<>(playerArray.length); - for (Player player : playerArray) - { - if (_verifier.shouldPlay(player)) - players.add(player); - } + Collection players = UtilServer.getPlayersCollection(); - for (NoteLayer layer : _song.getLayers()) - { - Note note = layer.getNote(tick); - if (note != null) - { - float volume = _volumeMult * (layer.getVolume() / 100F); - for (Player player : players) - { - player.playSound(player.getEyeLocation(), UtilNote.getInstrumentSound(note.getInstrument()), volume, (float) UtilNote.getPitch(note.getNote() - 33)); - } - } - } + float volume = _volumeMult * 1F; + _song.getLayers().stream().map(layer -> layer.getNote(tick)).filter(Objects::nonNull).forEach((note) -> playNote(note, volume, players)); } public void cancel() From f8f95c64e5a7b1feb98e260b3d5d778a261b5a25 Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 15:10:29 +0000 Subject: [PATCH 095/223] Fixing arena moving --- .../core/achievement/Achievement.java | 2 + .../core/achievement/AchievementCategory.java | 4 + .../arcade/game/games/gladiators/Arena.java | 50 +++++----- .../game/games/gladiators/Gladiators.java | 98 +++++++++++++++---- .../gladiators/trackers/BrawlerTracker.java | 39 ++++++++ 5 files changed, 152 insertions(+), 41 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/BrawlerTracker.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 6f36f0dd3..56fe4ba6e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -770,6 +770,8 @@ public enum Achievement new String[]{"Get hit by a monster and", "land on the Safe Pad"}, new int[]{1}, AchievementCategory.MONSTER_MAZE), + + ; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 2bf9be288..265e031a4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -150,6 +150,10 @@ public enum AchievementCategory MONSTER_MAZE("Monster Maze", null, new StatDisplay[] {StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED}, Material.ROTTEN_FLESH, 0, GameCategory.ARCADE, "SoonTM"), + + GLADIATORS("Gladiators", null, + new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, + Material.IRON_SWORD, 0, GameCategory.ARCADE, null) ; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index e2aab1fb8..48a37ec50 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -8,7 +8,6 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilMath; /** * Created by William (WilliamTiger). @@ -27,6 +26,9 @@ public class Arena private boolean _isUsed; private ArrayList _doorBlocks; + private boolean _isOpenDoor; + + private ArrayList _pastPlayers; public Arena(Gladiators host, Location mid, ArenaType colour) { @@ -37,6 +39,8 @@ public class Arena _parent = null; _isUsed = false; _doorBlocks = new ArrayList<>(); + _isOpenDoor = false; + _pastPlayers = new ArrayList<>(); setupSpawns(); } @@ -174,30 +178,9 @@ public class Arena return ret; } - public ArrayList getPlayers() + public ArrayList getPastPlayers() { - ArrayList pls = new ArrayList<>(); - - for (Player p : _host.GetPlayers(true)) - { - if (UtilMath.offset(p.getLocation(), _mid) <= 21) - pls.add(p); - } - - return pls; - } - - public int getPlayerCount() - { - ArrayList pls = new ArrayList<>(); - - for (Player p : _host.GetPlayers(true)) - { - if (UtilMath.offset(p.getLocation(), _mid) <= 21) - pls.add(p); - } - - return pls.size(); + return _pastPlayers; } public boolean isUsed() @@ -215,4 +198,23 @@ public class Arena for (Location loc : _doorBlocks) loc.getBlock().setType(Material.OBSIDIAN); } + + public boolean isOpenDoor() + { + return _isOpenDoor; + } + + public void openDoor() + { + _isOpenDoor = true; + + _host.Manager.getScheduler().scheduleSyncDelayedTask(_host.Manager.getPlugin(), () -> { + + for (Location loc : _doorBlocks) + { + loc.getBlock().setType(Material.AIR); + } + + }, 5L); + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index a4010e009..971abe53f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -13,6 +13,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerMoveEvent; import mineplex.core.common.util.UtilAlg; +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; @@ -36,7 +38,10 @@ public class Gladiators extends SoloGame public Gladiators(ArcadeManager manager) { super(manager, GameType.Gladiators, - new Kit[0], + new Kit[] + { + new KitGladiator(manager) + }, new String[] { "This is a 1v1 tournament!", @@ -51,8 +56,6 @@ public class Gladiators extends SoloGame DamageTeamSelf = true; HungerSet = 20; - setKits(new Kit[]{new KitGladiator(manager)}); - _playerArenas = new HashMap<>(); } @@ -277,11 +280,11 @@ public class Gladiators extends SoloGame { for (Player p : GetPlayers(true)) { - for (Arena a : _allArenas) - { - if (a.getPlayers().contains(p)) - _playerArenas.put(p, a); - } + Location closest = UtilAlg.findClosest(p.getLocation(), getAllArenaMids()); + Arena arena = getArenaByMid(closest); + _playerArenas.put(p, arena); + + giveLoadout(p, _playerArenas.get(p).getColour()); } return; } @@ -300,17 +303,20 @@ public class Gladiators extends SoloGame if (!_playerArenas.containsKey(e.getPlayer())) return; - for (Arena a : _allArenas) + for (Player p : GetPlayers(true)) { - if (a.getPlayers().contains(e.getPlayer())) - { - if (_playerArenas.get(e.getPlayer()) != a) - { - Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), - a, _playerArenas.get(e.getPlayer()))); + if (!_playerArenas.containsKey(p)) + continue; - _playerArenas.put(e.getPlayer(), a); - } + if (!_playerArenas.get(p).isOpenDoor()) + continue; // No need to check since no door to go through. + + Arena closest = getArenaByMid(UtilAlg.findClosest(p.getLocation(), getAllArenaMids())); + + if (closest != _playerArenas.get(p)) + { + Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), closest, _playerArenas.get(p))); + _playerArenas.put(p, closest); } } } @@ -323,7 +329,65 @@ public class Gladiators extends SoloGame Arena current = e.getTo(); old.closeDoor(); + old.getPastPlayers().remove(p); + current.getPastPlayers().add(p); p.sendMessage("§7§lDEBUG: §3You left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); + + giveLoadout(p, current.getColour()); + + } + + private void giveLoadout(Player p, ArenaType type) + { + if (!GetPlayers(true).contains(p)) + return; + + p.getInventory().clear(); + p.getInventory().setArmorContents(null); + + p.getInventory().setItem(0, type.getLoadout().getSword()); + p.getInventory().setItem(1, type.getLoadout().getRod()); + p.getInventory().setItem(2, type.getLoadout().getBow()); + p.getInventory().setItem(8, type.getLoadout().getArrows()); + + p.getInventory().setHelmet(type.getLoadout().getHelmet()); + p.getInventory().setChestplate(type.getLoadout().getChestplate()); + p.getInventory().setLeggings(type.getLoadout().getLeggings()); + p.getInventory().setBoots(type.getLoadout().getBoots()); + } + + @EventHandler + public void arenaNeedsMoving(UpdateEvent e) + { + if (e.getType() != UpdateType.TICK) + return; + + for (Arena a : _gameArenaSet) + { + for (Player p : a.getPastPlayers()) + { + if (!GetPlayers(true).contains(p)) + a.getPastPlayers().remove(p); + } + + if (a.getPastPlayers().size() == 1) + { + if (a.isOpenDoor()) + continue; + + a.openDoor(); + a.getPastPlayers().get(0).sendMessage("§7§lDEBUG: §3Door has been opened in your arena."); + } + } + } + + @EventHandler + public void alert(UpdateEvent e) + { + if (e.getType() != UpdateType.SEC) + return; + + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/BrawlerTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/BrawlerTracker.java new file mode 100644 index 000000000..6aa1da3d7 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/BrawlerTracker.java @@ -0,0 +1,39 @@ +package nautilus.game.arcade.game.games.gladiators.trackers; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; +import nautilus.game.arcade.game.games.gladiators.Gladiators; +import nautilus.game.arcade.stats.StatTracker; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public class BrawlerTracker extends StatTracker +{ + public BrawlerTracker(Gladiators game) + { + super(game); + } + + @EventHandler + public void death(CombatDeathEvent e) + { + if (e.GetLog().GetKiller() == null) + return; + + if (Bukkit.getPlayerExact(e.GetLog().GetKiller().GetName()) != null) + { + Player p = Bukkit.getPlayerExact(e.GetLog().GetKiller().GetName()); + if (p.getItemInHand() == null) + return; + + if (p.getItemInHand().getType().equals(Material.AIR)) + addStat(p, "Brawler", 1, false, false); + } + } +} \ No newline at end of file From 2bf1012fa41ec41d71e8bea7489786bd6ea21805 Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 8 Dec 2015 16:34:07 +0000 Subject: [PATCH 096/223] SSM Pig bomb bug fix --- .../mineplex/core/common/util/UtilPlayer.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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 af1712362..8f4e98a6a 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,7 @@ package mineplex.core.common.util; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; @@ -496,6 +498,20 @@ public class UtilPlayer return best; } + private static boolean checkClosest(Player player, Entity... ignore) + { + for(Entity e : ignore) + { + if(e instanceof Player) + { + if(e == player) + return true; + } + } + + return false; + } + public static Player getClosest(Location loc, Entity... ignore) { Player best = null; @@ -509,6 +525,9 @@ public class UtilPlayer if (cur.isDead()) continue; + if(checkClosest(cur, ignore)) + continue; + if (ignore != null) { for (int i = 0; i < ignore.length; i++) From 504a49278cb7e140029e4c2ceb85f3defe524a33 Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 8 Dec 2015 16:35:49 +0000 Subject: [PATCH 097/223] SSM kit description change, grammar mistake --- .../src/nautilus/game/arcade/game/games/smash/kits/KitPig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 755cfa69d..4ae1fcb33 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 @@ -62,7 +62,7 @@ public class KitPig extends SmashKit ChatColor.RESET + "dealing damage and knockback to enemies.", ChatColor.RESET + "", ChatColor.RESET + "Eat the bacon to restore some Energy.", - ChatColor.RESET + "Bacon that hit an enemy will restore Health.", + ChatColor.RESET + "Bacon that hits an enemy will restore Health.", })); From d598f83ec054b175815c450f64c27f420ee5fb38 Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 18:17:43 +0000 Subject: [PATCH 098/223] More progress --- .../arcade/game/games/gladiators/Arena.java | 13 +++ .../game/games/gladiators/ArenaState.java | 14 ++++ .../game/games/gladiators/Gladiators.java | 79 ++++++++++++++++++- .../game/games/gladiators/RoundState.java | 16 ++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaState.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 48a37ec50..4913f55ce 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -30,6 +30,8 @@ public class Arena private ArrayList _pastPlayers; + private ArenaState _state; + public Arena(Gladiators host, Location mid, ArenaType colour) { _host = host; @@ -41,6 +43,7 @@ public class Arena _doorBlocks = new ArrayList<>(); _isOpenDoor = false; _pastPlayers = new ArrayList<>(); + _state = ArenaState.EMPTY; setupSpawns(); } @@ -78,6 +81,16 @@ public class Arena return cap; } + public ArenaState getState() + { + return _state; + } + + public void setState(ArenaState state) + { + _state = state; + } + public ArrayList getDoorBlocks() { return _doorBlocks; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaState.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaState.java new file mode 100644 index 000000000..c92405389 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ArenaState.java @@ -0,0 +1,14 @@ +package nautilus.game.arcade.game.games.gladiators; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public enum ArenaState +{ + EMPTY, + WAITING, + FIGHTING, + RUNNING, + ENDED; +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 971abe53f..b44ad8990 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -10,9 +10,13 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; +import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; @@ -35,6 +39,8 @@ public class Gladiators extends SoloGame private HashMap _playerArenas; + private RoundState _roundState; + public Gladiators(ArcadeManager manager) { super(manager, GameType.Gladiators, @@ -57,6 +63,8 @@ public class Gladiators extends SoloGame HungerSet = 20; _playerArenas = new HashMap<>(); + + _roundState = RoundState.FIGHTING; } @Override @@ -282,6 +290,8 @@ public class Gladiators extends SoloGame { Location closest = UtilAlg.findClosest(p.getLocation(), getAllArenaMids()); Arena arena = getArenaByMid(closest); + arena.getPastPlayers().add(p); + arena.setState(ArenaState.WAITING); _playerArenas.put(p, arena); giveLoadout(p, _playerArenas.get(p).getColour()); @@ -330,7 +340,9 @@ public class Gladiators extends SoloGame old.closeDoor(); old.getPastPlayers().remove(p); + old.setState(ArenaState.ENDED); current.getPastPlayers().add(p); + current.setState(ArenaState.WAITING); p.sendMessage("§7§lDEBUG: §3You left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); @@ -357,6 +369,40 @@ public class Gladiators extends SoloGame p.getInventory().setBoots(type.getLoadout().getBoots()); } + @EventHandler + public void debug(PlayerCommandPreprocessEvent e){ + if (e.getMessage().startsWith("/debuginfo")) + return; + + if (e.getPlayer().getName() != "WilliamTiger") + return; + + e.setCancelled(true); + Player p = e.getPlayer(); + + Player target = UtilPlayer.searchExact(e.getMessage().split(" ")[1]); + + if (target == null) + { + p.sendMessage("Target is null / not online"); + return; + } + + if (!GetPlayers(true).contains(target)) + { + p.sendMessage("That player isn't alive"); + return; + } + + Arena arena = _playerArenas.get(target); + + p.sendMessage("Info of " + target.getName() + "'s arena:"); + p.sendMessage("Type - " + arena.getColour().toString()); + p.sendMessage("Players - " + arena.getPastPlayers().toString()); + p.sendMessage("Players Size - " + arena.getPastPlayers().size()); + p.sendMessage("Door Open - " + arena.isOpenDoor()); + } + @EventHandler public void arenaNeedsMoving(UpdateEvent e) { @@ -382,12 +428,43 @@ public class Gladiators extends SoloGame } } + @EventHandler + public void updateRound(UpdateEvent e) + { + if (e.getType() != UpdateType.TICK) + return; + + boolean allWaiting = true; + + for (Arena a : _gameArenaSet) + { + if (a.getState() != ArenaState.WAITING) + return; + } + } + @EventHandler public void alert(UpdateEvent e) { if (e.getType() != UpdateType.SEC) return; - + for (Arena a : _gameArenaSet) + { + if (a.getState().equals(ArenaState.WAITING)) + { + for (Player p : a.getPastPlayers()) + UtilTextMiddle.display("", C.cRed + "Wait for the round to begin", 0, 60 , 0, p); + } + else if (a.getState().equals(ArenaState.FIGHTING)) + { + //TODO: poison etc, round end times + } + else if (a.getState().equals(ArenaState.RUNNING)) + { + //TODO: particles + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particle trail", 0, 60, 0, a.getPastPlayers().get(0)); + } + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java new file mode 100644 index 000000000..bb717f6fc --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java @@ -0,0 +1,16 @@ +package nautilus.game.arcade.game.games.gladiators; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public enum RoundState +{ + WAITING, + STARTING_5, + STARTING_4, + STARTING_3, + STARTING_2, + STARTING_1, + FIGHTING; +} From 09d8367b4baa87630524cd9c2b11685dc7ad764d Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 9 Dec 2015 07:32:36 +1100 Subject: [PATCH 099/223] fixed method --- .../mineplex/core/common/util/UtilPlayer.java | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) 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 8f4e98a6a..f1e17e2df 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 @@ -498,20 +498,6 @@ public class UtilPlayer return best; } - private static boolean checkClosest(Player player, Entity... ignore) - { - for(Entity e : ignore) - { - if(e instanceof Player) - { - if(e == player) - return true; - } - } - - return false; - } - public static Player getClosest(Location loc, Entity... ignore) { Player best = null; @@ -525,16 +511,21 @@ public class UtilPlayer if (cur.isDead()) continue; - if(checkClosest(cur, ignore)) - continue; - + //Ignore Check if (ignore != null) { - for (int i = 0; i < ignore.length; i++) + boolean shouldIgnore = false; + for (Entity ent : ignore) { - if (cur.equals(ignore[i])) - continue; + if (cur.equals(ent)) + { + shouldIgnore = true; + break; + } } + + if (shouldIgnore) + continue; } double dist = UtilMath.offset(cur.getLocation(), loc); From 2decc049c5af3786d4326e74f50bf5e0ca485450 Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 9 Dec 2015 07:47:07 +1100 Subject: [PATCH 100/223] fixed my muddling of perks --- .../game/games/monsterleague/kits/KitEnderman.java | 5 ++--- ...{PerkBlink.java => PerkBlinkMonsterLeague.java} | 8 +++----- .../nautilus/game/arcade/kit/perks/PerkBlink.java | 14 ++++++++++---- 3 files changed, 15 insertions(+), 12 deletions(-) rename Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/{PerkBlink.java => PerkBlinkMonsterLeague.java} (94%) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitEnderman.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitEnderman.java index 20796f801..5f1c52111 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitEnderman.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/kits/KitEnderman.java @@ -6,12 +6,11 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; -import mineplex.core.disguise.disguises.DisguiseEnderman; import mineplex.core.itemstack.ItemStackFactory; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.monsterleague.perks.PerkBlinkMonsterLeague; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.perks.PerkBlink; import nautilus.game.arcade.kit.perks.PerkDoubleJump; public class KitEnderman extends LeagueKit @@ -28,7 +27,7 @@ public class KitEnderman extends LeagueKit new Perk[] { new PerkDoubleJump("Double Jump", 1, 1, true), - new PerkBlink("Blink", 32, 16000), + new PerkBlinkMonsterLeague("Blink", 32, 16000), }, EntityType.ENDERMAN, new ItemStack(Material.AIR), 1.4); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkBlink.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkBlinkMonsterLeague.java similarity index 94% rename from Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkBlink.java rename to Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkBlinkMonsterLeague.java index 75e0654a9..de32a72e1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkBlink.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/perks/PerkBlinkMonsterLeague.java @@ -19,14 +19,15 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilPlayer; import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.SmashPerk; -public class PerkBlink extends SmashPerk +public class PerkBlinkMonsterLeague extends Perk { private double _range = 32; private long _recharge = 24000; - public PerkBlink(String name, double range, long recharge) + public PerkBlinkMonsterLeague(String name, double range, long recharge) { super("Blink", new String[] { @@ -51,9 +52,6 @@ public class PerkBlink extends SmashPerk return; Player player = event.getPlayer(); - - if (isSuperActive(player)) - return; if (!Kit.HasKit(player)) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlink.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlink.java index 4890bc63e..dfbc490a4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlink.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBlink.java @@ -17,11 +17,12 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilPlayer; import mineplex.core.recharge.Recharge; -import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.SmashPerk; -public class PerkBlink extends Perk +public class PerkBlink extends SmashPerk { private String _name = ""; private double _range; @@ -45,17 +46,22 @@ public class PerkBlink extends Perk if (event.isCancelled()) return; - if (event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK && - event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return; if (UtilBlock.usable(event.getClickedBlock())) return; + + if (!UtilGear.isAxe(event.getPlayer().getItemInHand())) + return; Player player = event.getPlayer(); if (!Kit.HasKit(player)) return; + + if (isSuperActive(player)) + return; if (!Recharge.Instance.use(player, _name, _recharge, true, true)) return; From 7bdbd5a6af247927d8055962d8be4777035601f4 Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 21:10:27 +0000 Subject: [PATCH 101/223] Woo almost done! --- .../arcade/game/games/gladiators/Arena.java | 115 ++++++++++++++ .../game/games/gladiators/Gladiators.java | 141 ++++++++++++++---- .../game/games/gladiators/ParticleData.java | 56 +++++++ .../game/games/gladiators/RoundState.java | 2 +- 4 files changed, 285 insertions(+), 29 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ParticleData.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 4913f55ce..28c001771 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -2,12 +2,19 @@ package nautilus.game.arcade.game.games.gladiators; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; +import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilTextBottom; +import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.common.util.UtilTime; +import mineplex.core.recharge.Recharge; /** * Created by William (WilliamTiger). @@ -31,6 +38,9 @@ public class Arena private ArrayList _pastPlayers; private ArenaState _state; + private long _stateTime; + + private HashMap> _particles; public Arena(Gladiators host, Location mid, ArenaType colour) { @@ -44,6 +54,8 @@ public class Arena _isOpenDoor = false; _pastPlayers = new ArrayList<>(); _state = ArenaState.EMPTY; + _stateTime = System.currentTimeMillis(); + _particles = new HashMap<>(); setupSpawns(); } @@ -53,6 +65,16 @@ public class Arena return _parent; } + public long getStateTime() + { + return _stateTime; + } + + public void setStateTime(long stateTime) + { + _stateTime = stateTime; + } + public void setParent(Arena parent) { _parent = parent; @@ -230,4 +252,97 @@ public class Arena }, 5L); } + + public void update() + { + if (getPastPlayers().size() <= 0) + _state = ArenaState.EMPTY; + + if (_state.equals(ArenaState.EMPTY)) + return; + + if (_state.equals(ArenaState.WAITING)) + { + for (Player p : getPastPlayers()) + { + UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20, 0, p); + } + } + else if (_state.equals(ArenaState.FIGHTING)) + { + if (!UtilTime.elapsed(_stateTime, 60000)) + return; // 60 seconds before poison + + for (Player p : getPastPlayers()) + { + UtilTextBottom.display(C.cRed + C.Bold + "YOU ARE POISONED! KEEP FIGHTING!", p); + _host.Manager.GetDamage().NewDamageEvent(p, null, null, EntityDamageEvent.DamageCause.CUSTOM, 1D, false, true, true, "Health Loss", "Health Loss"); + } + } + else if (_state.equals(ArenaState.RUNNING)) + { + for (Player p : getPastPlayers()) + { + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20, 0, p); + } + + if (UtilTime.elapsed(_stateTime, 15000)) + handleSlowMovers(); + } + } + + public void updateTick() + { + if (_state.equals(ArenaState.RUNNING)) + { + getPastPlayers().stream().forEach(this::showParticles); + } + } + + private void showParticles(Player p) + { + if (!getPastPlayers().contains(p) || !_state.equals(ArenaState.RUNNING)) + { + _particles.remove(p); + return; + } + + //New Trails + if (Recharge.Instance.use(p, "Particle Trail", 3000, false, false)) + { + if (!_particles.containsKey(p)) + _particles.put(p, new ArrayList()); + + Location end = UtilAlg.findClosest(_mid, _host.WorldData.GetDataLocs("PINK")); + + _particles.get(p).add(new ParticleData(p, end)); + } + + //Old Trails + if (_particles.containsKey(p) && !_particles.get(p).isEmpty()) + { + Iterator trailIter = _particles.get(p).iterator(); + + while (trailIter.hasNext()) + { + ParticleData data = trailIter.next(); + + //Returns true if its hit the endpoint + if (data.update()) + trailIter.remove(); + } + } + } + + private void handleSlowMovers() + { + Arena next = _host.getArenaByMid(UtilAlg.findClosest(_mid, _host.getAllArenaMidsOfType(_host.getNextColour(_colour)))); + + for (Player p : getPastPlayers()) + { + //Teleport after 15 seconds of waiting. + + p.teleport(UtilAlg.getLocationAwayFromPlayers(next.getSpawns(), _host.GetPlayers(true)).clone()); + } + } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index b44ad8990..d7612b205 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -10,6 +10,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -424,47 +425,131 @@ public class Gladiators extends SoloGame a.openDoor(); a.getPastPlayers().get(0).sendMessage("§7§lDEBUG: §3Door has been opened in your arena."); + a.setState(ArenaState.RUNNING); + a.setStateTime(System.currentTimeMillis()); } } } @EventHandler - public void updateRound(UpdateEvent e) - { - if (e.getType() != UpdateType.TICK) - return; - - boolean allWaiting = true; - - for (Arena a : _gameArenaSet) - { - if (a.getState() != ArenaState.WAITING) - return; - } - } - - @EventHandler - public void alert(UpdateEvent e) + public void arenaUpdateTick(UpdateEvent e) { if (e.getType() != UpdateType.SEC) return; for (Arena a : _gameArenaSet) + a.updateTick(); + } + + @EventHandler + public void arenaUpdate(UpdateEvent e) + { + if (e.getType() != UpdateType.SEC) + return; + + for (Arena a : _gameArenaSet) + a.update(); + } + + @EventHandler + public void damageCancel(EntityDamageEvent e) + { + if (!(e.getEntity() instanceof Player)) + return; + + Player p = (Player) e.getEntity(); + + if (!_playerArenas.containsKey(p)) + return; + + if (_playerArenas.get(p).getState() != ArenaState.FIGHTING) + e.setCancelled(true); + } + + @EventHandler + public void startCountdown(UpdateEvent e) + { + if (e.getType() != UpdateType.SEC) + return; + + if (_roundState.equals(RoundState.FIGHTING)) + return; + + if (_roundState.equals(RoundState.STARTING_5)) { - if (a.getState().equals(ArenaState.WAITING)) + _roundState = RoundState.STARTING_4; + return; + } + else if (_roundState.equals(RoundState.STARTING_4)) + { + _roundState = RoundState.STARTING_3; + return; + } + else if (_roundState.equals(RoundState.STARTING_3)) + { + _roundState = RoundState.STARTING_2; + UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + return; + } + else if (_roundState.equals(RoundState.STARTING_2)) + { + _roundState = RoundState.STARTING_1; + UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + return; + } + else if (_roundState.equals(RoundState.STARTING_1)) + { + _roundState = RoundState.STARTED; + UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + return; + } + else if (_roundState.equals(RoundState.STARTED)) + { + _roundState = RoundState.FIGHTING; + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + for (Arena a : _gameArenaSet) { - for (Player p : a.getPastPlayers()) - UtilTextMiddle.display("", C.cRed + "Wait for the round to begin", 0, 60 , 0, p); - } - else if (a.getState().equals(ArenaState.FIGHTING)) - { - //TODO: poison etc, round end times - } - else if (a.getState().equals(ArenaState.RUNNING)) - { - //TODO: particles - UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particle trail", 0, 60, 0, a.getPastPlayers().get(0)); + if (a.getState().equals(ArenaState.WAITING)) + { + a.setState(ArenaState.FIGHTING); + a.setStateTime(System.currentTimeMillis()); + } } + return; } } + + @EventHandler + public void roundUpdate(UpdateEvent e) + { + if (e.getType() != UpdateType.TICK) + return; + + if (_roundState.equals(RoundState.FIGHTING)) + { + for (Arena a : _gameArenaSet) + if (a.getState() != ArenaState.WAITING) + return; + + //All of the arenas are waiting for the next fight. + _roundState = RoundState.STARTING_5; + + UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); + return; + } + } + + private String getRoundNotation() + { + int size = GetPlayers(true).size(); + + if (size == 2) + return "FINALS"; + else if (size == 4) + return "SEMI-FINALS"; + else if (size == 8) + return "QUARTER-FINALS"; + else return "ROUND OF " + size; + } + } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ParticleData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ParticleData.java new file mode 100644 index 000000000..2ec4129b2 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/ParticleData.java @@ -0,0 +1,56 @@ +package nautilus.game.arcade.game.games.gladiators; + +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public class ParticleData +{ + public Player Player; + public Location CurrentLocation; + public Vector Velocity; + public Location Target; + + public ParticleData(Player player, Location target) + { + Player = player; + + Velocity = player.getLocation().getDirection(); + if (Velocity.getY() < 0) + Velocity.setY(0); + Velocity.normalize(); + + CurrentLocation = player.getLocation().add(0, 1, 0); + Target = target; + } + + public boolean update() + { + //Turn + Velocity.add(UtilAlg.getTrajectory(CurrentLocation, Target).multiply(0.15)); + + //Normalize Speed + UtilAlg.Normalize(Velocity); + + //Move + CurrentLocation.add(Velocity.clone().multiply(0.5)); + + //Particle + UtilParticle.PlayParticle(UtilParticle.ParticleType.HAPPY_VILLAGER, CurrentLocation, 0.03f, 0.03f, 0.03f, 0, 3, + UtilParticle.ViewDist.LONG, Player); + + //Sound + CurrentLocation.getWorld().playSound(CurrentLocation, Sound.FIZZ, 0.2f, 3f); + + return UtilMath.offset(CurrentLocation, Target) < 4; + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java index bb717f6fc..54cd18b16 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java @@ -6,11 +6,11 @@ package nautilus.game.arcade.game.games.gladiators; */ public enum RoundState { - WAITING, STARTING_5, STARTING_4, STARTING_3, STARTING_2, STARTING_1, + STARTED, FIGHTING; } From a83ede3caacf5b0d7fdc9396bacd7e9035b1a83c Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 21:14:19 +0000 Subject: [PATCH 102/223] Handling slow movers --- .../game/arcade/game/games/gladiators/Arena.java | 6 +++++- .../game/arcade/game/games/gladiators/Gladiators.java | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 28c001771..d415767d7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -15,6 +15,7 @@ import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.game.games.gladiators.events.PlayerChangeArenaEvent; /** * Created by William (WilliamTiger). @@ -340,9 +341,12 @@ public class Arena for (Player p : getPastPlayers()) { - //Teleport after 15 seconds of waiting. + // TP after 15 seconds of waiting p.teleport(UtilAlg.getLocationAwayFromPlayers(next.getSpawns(), _host.GetPlayers(true)).clone()); + _host.Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(p, next, this)); + _host.setPlayerArena(p, next); + UtilTextBottom.display("§c§lTELEPORTED! YOU TOOK TOO LONG!", p); } } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index d7612b205..b8d32b4f2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -347,8 +347,8 @@ public class Gladiators extends SoloGame p.sendMessage("§7§lDEBUG: §3You left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); - giveLoadout(p, current.getColour()); - + giveLoadout(p, current.getColour()); //Kit + p.setHealth(p.getMaxHealth()); //Heal } private void giveLoadout(Player p, ArenaType type) @@ -552,4 +552,9 @@ public class Gladiators extends SoloGame else return "ROUND OF " + size; } + public void setPlayerArena(Player p, Arena a) + { + _playerArenas.put(p, a); + } + } From fba88ec231a1aa2a68868faa7e6436c4448da0b5 Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 9 Dec 2015 08:19:55 +1100 Subject: [PATCH 103/223] mount stuff is fixed --- .../mineplex/core/mount/types/MountCart.java | 2 +- .../mineplex/core/mount/types/MountSlime.java | 98 ++++++++++--------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java index 3abbf00e0..f5aa7f809 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java @@ -75,7 +75,7 @@ public class MountCart extends Mount> if (event.getRightClicked() == null) return; - SingleEntityMountData mount = GetActive().get(event.getPlayer()); + SingleEntityMountData mount = getMountData(event.getRightClicked()); if(mount == null) return; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java index 2a0b3831a..e8a1bd649 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java @@ -30,11 +30,11 @@ public class MountSlime extends Mount> { super(manager, "Slime Mount", Material.SLIME_BALL, (byte)0, new String[] { - ChatColor.RESET + "Bounce around on your very", - ChatColor.RESET + "own personal slime friend!", + ChatColor.RESET + "Bounce around on your very", + ChatColor.RESET + "own personal slime friend!", }, 15000); - + KnownPackage = false; } @@ -42,153 +42,155 @@ public class MountSlime extends Mount> { player.leaveVehicle(); player.eject(); - + //Remove other mounts Manager.DeregisterAll(player); - + SingleEntityMountData mount = new SingleEntityMountData(player, player.getWorld().spawn(player.getLocation(), Slime.class)); mount.getEntity().setSize(2); - + mount.getEntity().setCustomName(player.getName() + "'s " + GetName()); //Inform UtilPlayer.message(player, F.main("Mount", "You spawned " + F.elem(GetName()) + ".")); - + //Store _active.put(player, mount); } - + public void Disable(Player player) { SingleEntityMountData mount = _active.remove(player); if (mount != null) { mount.remove(); - + //Inform UtilPlayer.message(player, F.main("Mount", "You despawned " + F.elem(GetName()) + ".")); - + Manager.removeActive(player); } } - + @EventHandler public void interactMount(PlayerInteractEntityEvent event) { if (event.getRightClicked() == null) return; - - if (!GetActive().containsKey(event.getPlayer())) - return; - - if(!GetActive().get(event.getPlayer()).ownsMount(event.getPlayer())) - return; - + + SingleEntityMountData data = GetActive().get(event.getPlayer()); + + if(data == null) return; + + if(!data.ownsMount(event.getPlayer())) return; + + if(!data.isPartOfMount(event.getRightClicked())) return; + event.getPlayer().leaveVehicle(); event.getPlayer().eject(); - + event.getRightClicked().setPassenger(event.getPlayer()); } - + @EventHandler public void target(EntityTargetEvent event) { if (!GetActive().containsKey(event.getTarget())) return; - + if (!GetActive().get(event.getTarget()).equals(event.getEntity())) event.setCancelled(true); } - + @EventHandler public void updateBounce(UpdateEvent event) { if (event.getType() != UpdateType.TICK) return; - + //Bounce for (SingleEntityMountData slimeData : GetActive().values()) { Slime slime = slimeData.getEntity(); - + if (slime.getPassenger() == null) { UtilEnt.setFakeHead(slime, false); continue; } - + if (!UtilEnt.isGrounded(slime)) continue; - + if (!(slime.getPassenger() instanceof Player)) continue; - + Player player = (Player)slime.getPassenger(); - + if (!Recharge.Instance.use(player, GetName(), 200, false, false)) continue; Vector dir = slime.getPassenger().getLocation().getDirection(); - + UtilAction.velocity(slime, dir, 1, true, 0, 0.4, 1, true); - + UtilEnt.CreatureForceLook(slime, 0, UtilAlg.GetYaw(dir)); - + slime.getWorld().playSound(slime.getLocation(), Sound.SLIME_WALK, 1f, 0.75f); } - + //Collide for (SingleEntityMountData slimeData : GetActive().values()) { Slime slime = slimeData.getEntity(); if (slime.getPassenger() == null) continue; - + if (!(slime.getPassenger() instanceof Player)) continue; - + Player player = (Player)slime.getPassenger(); - + if (!Recharge.Instance.usable(player, GetName() + " Collide")) continue; - + for (SingleEntityMountData otherSlime : GetActive().values()) { Slime other = otherSlime.getEntity(); - + if (other.equals(slime)) continue; - + if (other.getPassenger() == null) continue; - + if (!(other.getPassenger() instanceof Player)) continue; - + Player otherPlayer = (Player)other.getPassenger(); - + if (!Recharge.Instance.usable(otherPlayer, GetName() + " Collide")) continue; - + //Collide if (UtilMath.offset(slime, other) > 2) continue; - + Recharge.Instance.useForce(player, GetName() + " Collide", 500); Recharge.Instance.useForce(otherPlayer, GetName() + " Collide", 500); - + UtilAction.velocity(slime, UtilAlg.getTrajectory(other, slime), 1.2, false, 0, 0.8, 10, true); UtilAction.velocity(other, UtilAlg.getTrajectory(slime, other), 1.2, false, 0, 0.8, 10, true); - + slime.getWorld().playSound(slime.getLocation(), Sound.SLIME_ATTACK, 1f, 0.5f); slime.getWorld().playSound(slime.getLocation(), Sound.SLIME_WALK, 1f, 0.5f); other.getWorld().playSound(other.getLocation(), Sound.SLIME_WALK, 1f, 0.5f); - + slime.playEffect(EntityEffect.HURT); other.playEffect(EntityEffect.HURT); } } } - - + + } From 26c5c419f8ee1c75357063822608f525bfab438a Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 9 Dec 2015 08:38:05 +1100 Subject: [PATCH 104/223] fixed a bug where old displayName would be used after name was updated. --- .../src/nautilus/game/arcade/game/Game.java | 18 ++++++++++++++++++ .../nautilus/game/arcade/game/GameTeam.java | 9 ++++++--- 2 files changed, 24 insertions(+), 3 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 7616b98ad..edf144f5e 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 @@ -36,6 +36,7 @@ import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -1723,4 +1724,21 @@ public abstract class Game implements Listener } } } + + @EventHandler + public void debug(PlayerCommandPreprocessEvent event) + { + if (event.getMessage().equals("/debugteams")) + { + for (GameTeam team : GetTeamList()) + { + event.getPlayer().sendMessage(team.GetFormattedName()); + + for (Player player : team.GetPlayers(false)) + { + event.getPlayer().sendMessage(player.getName() + ": " + team.IsAlive(player)); + } + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java index ddbd4f68c..7d8264b88 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java @@ -79,7 +79,7 @@ public class GameTeam { Host = host; - _displayName = name; + _displayName = null; _name = name; _color = color; _spawns = spawns; @@ -178,7 +178,7 @@ public class GameTeam { _players.put(player, in ? PlayerState.IN : PlayerState.OUT); - UtilPlayer.message(player, F.main("Team", _color + C.Bold + "You joined " + _displayName + " Team.")); + UtilPlayer.message(player, F.main("Team", _color + C.Bold + "You joined " + getDisplayName() + " Team.")); VisibilityManager.Instance.refreshPlayerToAll(player); } @@ -192,7 +192,7 @@ public class GameTeam other.getScoreboard().getTeam(Host.Manager.GetClients().Get(player).GetRank().Name + _name.toUpperCase()).removePlayer(player); other.getScoreboard().getTeam(Host.Manager.GetClients().Get(player).GetRank().Name).addPlayer(player); } - UtilPlayer.message(player, F.main("Team", _color + C.Bold + _displayName + " Team was disbanded.")); + UtilPlayer.message(player, F.main("Team", _color + C.Bold + getDisplayName() + " Team was disbanded.")); } _players.clear(); @@ -323,6 +323,9 @@ public class GameTeam public String getDisplayName() { + if (_displayName == null) + return _name; + return _displayName; } From 2e496110355bf265705015b054b63e9c85f75af2 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Tue, 8 Dec 2015 17:45:27 -0500 Subject: [PATCH 105/223] LinkedHashMaps, Buttons --- .../hub/server/ui/ServerGameMenu.java | 6 +++-- .../hub/server/ui/button/SelectBHButton.java | 23 +++++++++++++++++++ .../hub/server/ui/button/SelectMSButton.java | 23 +++++++++++++++++++ .../nautilus/game/arcade/world/WorldData.java | 8 +++---- 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.java create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMSButton.java 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 3cafbb8bf..4e3bc8320 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -14,12 +14,14 @@ import mineplex.core.donation.DonationManager; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.shop.page.ShopPageBase; import mineplex.hub.server.ServerManager; +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.SelectCSButton; import mineplex.hub.server.ui.button.SelectDMTButton; import mineplex.hub.server.ui.button.SelectDOMButton; import mineplex.hub.server.ui.button.SelectMINButton; +import mineplex.hub.server.ui.button.SelectMSButton; import mineplex.hub.server.ui.button.SelectPLAYERButton; import mineplex.hub.server.ui.button.SelectSGButton; import mineplex.hub.server.ui.button.SelectSKYButton; @@ -193,9 +195,9 @@ public class ServerGameMenu extends ShopPageBase getButtonMap().put(8, new SelectWIZButton(this)); getButtonMap().put(18, new SelectCSButton(this)); -// getButtonMap().put(20, new SelectBHButton(this)); + getButtonMap().put(20, new SelectBHButton(this)); getButtonMap().put(22, new SelectSSMButton(this)); -// getButtonMap().put(24, new SelectMSButton(this)); + getButtonMap().put(24, new SelectMSButton(this)); getButtonMap().put(26, new SelectDMTButton(this)); getButtonMap().put(36, new SelectDOMButton(this)); getButtonMap().put(38, new SelectTDMButton(this)); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.java new file mode 100644 index 000000000..fea9423b6 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.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 SelectBHButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectBHButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + _menu.OpenBH(player); + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMSButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMSButton.java new file mode 100644 index 000000000..ca500cb25 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMSButton.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 SelectMSButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectMSButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + _menu.openMS(player); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java index 068035b74..74242f538 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java @@ -54,10 +54,10 @@ public class WorldData public GameType Game = null; - public HashMap> SpawnLocs = new HashMap>(); - private HashMap> DataLocs = new HashMap>(); - private HashMap> CustomLocs = new HashMap>(); - private final Map _dataEntries = new HashMap<>(); + public HashMap> SpawnLocs = new LinkedHashMap>(); + private HashMap> DataLocs = new LinkedHashMap>(); + private HashMap> CustomLocs = new LinkedHashMap>(); + private final Map _dataEntries = new LinkedHashMap<>(); public WorldData(Game game) { From d709071febc0dffabff7dd52ccf7cb567e2cb45b Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 23:20:42 +0000 Subject: [PATCH 106/223] Much fix, many wow. --- .../core/achievement/Achievement.java | 40 ++++++++++ .../arcade/game/games/gladiators/Arena.java | 16 +++- .../game/games/gladiators/Gladiators.java | 77 ++++++++++++++++-- .../gladiators/trackers/FlawlessTracker.java | 61 ++++++++++++++ .../gladiators/trackers/PrecisionTracker.java | 79 +++++++++++++++++++ 5 files changed, 265 insertions(+), 8 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/PrecisionTracker.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 56fe4ba6e..cc80b6904 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -771,7 +771,47 @@ public enum Achievement new int[]{1}, AchievementCategory.MONSTER_MAZE), + GLADIATORS_HARDENED_GLADIATOR("Hardened Gladiator", 1000, + new String[]{"Gladiators.Wins"}, + new String[]{"Win 50 games of Gladiators"}, + new int[]{50}, + AchievementCategory.GLADIATORS), + GLADIATORS_BATTLE_BRED("Battle Bred", 1500, + new String[]{"Gladiators.Wins"}, + new String[]{"Win 100 games of Gladiators"}, + new int[]{100}, + AchievementCategory.GLADIATORS), + + GLADIATORS_BRAWLER("Brawler", 1000, + new String[]{"Gladiators.Brawler"}, + new String[]{"Kill 3 Gladiators", "with your bare hands"}, + new int[]{3}, + AchievementCategory.GLADIATORS), + + GLADIATORS_UNTOUCHABLE("Untouchable", 1500, + new String[]{"Gladiators.Untouchable"}, + new String[]{"Kill 10 Gladiators", "without taking any damage"}, + new int[]{10}, + AchievementCategory.GLADIATORS), + + GLADIATORS_FLAWLESS("Flawless", 1000, + new String[]{"Gladiators.Flawless"}, + new String[]{"Win a game of gladiators", "without taking any damage"}, + new int[]{1}, + AchievementCategory.GLADIATORS), + + GLADIATORS_PRECISION("Precision", 800, + new String[]{"Gladiators.Precision"}, + new String[]{"Don't miss a single", "arrow in a game of", "Gladiators (Minimum 3)"}, + new int[]{1}, + AchievementCategory.GLADIATORS), + + GLADIATORS_SWIFT_KILL("Swift Kill", 1000, + new String[]{"Gladiators.SwiftKill"}, + new String[]{"Earn 15 first bloods", "in Gladiators"}, + new int[]{15}, + AchievementCategory.GLADIATORS) ; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index d415767d7..3659b5714 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -11,6 +11,7 @@ import org.bukkit.event.entity.EntityDamageEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; @@ -264,6 +265,9 @@ public class Arena if (_state.equals(ArenaState.WAITING)) { + if (_host.getRoundState() != RoundState.FIGHTING) + return; + for (Player p : getPastPlayers()) { UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20, 0, p); @@ -272,7 +276,14 @@ public class Arena else if (_state.equals(ArenaState.FIGHTING)) { if (!UtilTime.elapsed(_stateTime, 60000)) + { + double elapsed = UtilMath.trim(1, System.currentTimeMillis() - _stateTime); + + for (Player p : getPastPlayers()) + UtilTextBottom.display(C.cRed + C.Bold + "Poison in " + (UtilTime.MakeStr((long)(60 - elapsed))), p); + return; // 60 seconds before poison + } for (Player p : getPastPlayers()) { @@ -296,7 +307,8 @@ public class Arena { if (_state.equals(ArenaState.RUNNING)) { - getPastPlayers().stream().forEach(this::showParticles); + for (Player p : getPastPlayers()) + showParticles(p); } } @@ -337,6 +349,8 @@ public class Arena private void handleSlowMovers() { + _state = ArenaState.ENDED; + Arena next = _host.getArenaByMid(UtilAlg.findClosest(_mid, _host.getAllArenaMidsOfType(_host.getNextColour(_colour)))); for (Player p : getPastPlayers()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index b8d32b4f2..598488f4f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -6,6 +6,7 @@ import java.util.LinkedList; import java.util.Map; import java.util.Queue; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -292,11 +293,24 @@ public class Gladiators extends SoloGame Location closest = UtilAlg.findClosest(p.getLocation(), getAllArenaMids()); Arena arena = getArenaByMid(closest); arena.getPastPlayers().add(p); - arena.setState(ArenaState.WAITING); _playerArenas.put(p, arena); giveLoadout(p, _playerArenas.get(p).getColour()); } + + for (Arena a : _gameArenaSet) + { + if (a.getPastPlayers().size() > 1) + { + a.setState(ArenaState.FIGHTING); + a.setStateTime(System.currentTimeMillis()); + } + else if (a.getPastPlayers().size() == 0) + a.setState(ArenaState.EMPTY); + else if (a.getPastPlayers().size() == 1) + a.setState(ArenaState.WAITING); + } + return; } @@ -304,10 +318,22 @@ public class Gladiators extends SoloGame return; findGameArenaSet(); + closeUnusedArenas(); + } + + private void closeUnusedArenas() + { + for (Arena a : _allArenas) + if (!_gameArenaSet.contains(a)) + a.closeDoor(); } @EventHandler - public void arenaMoveCheck(PlayerMoveEvent e){ + public void arenaMoveCheck(PlayerMoveEvent e) + { + if (!IsLive()) + return; + if (!GetPlayers(true).contains(e.getPlayer())) return; @@ -345,7 +371,7 @@ public class Gladiators extends SoloGame current.getPastPlayers().add(p); current.setState(ArenaState.WAITING); - p.sendMessage("§7§lDEBUG: §3You left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); + Bukkit.broadcastMessage("§7§lDEBUG: §3" + p.getName() + " left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); giveLoadout(p, current.getColour()); //Kit p.setHealth(p.getMaxHealth()); //Heal @@ -372,7 +398,8 @@ public class Gladiators extends SoloGame @EventHandler public void debug(PlayerCommandPreprocessEvent e){ - if (e.getMessage().startsWith("/debuginfo")) + + if (!e.getMessage().startsWith("/debuginfo")) return; if (e.getPlayer().getName() != "WilliamTiger") @@ -407,6 +434,9 @@ public class Gladiators extends SoloGame @EventHandler public void arenaNeedsMoving(UpdateEvent e) { + if (!IsLive()) + return; + if (e.getType() != UpdateType.TICK) return; @@ -420,7 +450,7 @@ public class Gladiators extends SoloGame if (a.getPastPlayers().size() == 1) { - if (a.isOpenDoor()) + if (a.isOpenDoor() || a.getColour().equals(ArenaType.RED)) continue; a.openDoor(); @@ -434,7 +464,10 @@ public class Gladiators extends SoloGame @EventHandler public void arenaUpdateTick(UpdateEvent e) { - if (e.getType() != UpdateType.SEC) + if (!IsLive()) + return; + + if (e.getType() != UpdateType.TICK) return; for (Arena a : _gameArenaSet) @@ -444,6 +477,9 @@ public class Gladiators extends SoloGame @EventHandler public void arenaUpdate(UpdateEvent e) { + if (!IsLive()) + return; + if (e.getType() != UpdateType.SEC) return; @@ -454,6 +490,9 @@ public class Gladiators extends SoloGame @EventHandler public void damageCancel(EntityDamageEvent e) { + if (!IsLive()) + return; + if (!(e.getEntity() instanceof Player)) return; @@ -469,6 +508,9 @@ public class Gladiators extends SoloGame @EventHandler public void startCountdown(UpdateEvent e) { + if (!IsLive()) + return; + if (e.getType() != UpdateType.SEC) return; @@ -522,13 +564,18 @@ public class Gladiators extends SoloGame @EventHandler public void roundUpdate(UpdateEvent e) { + if (!IsLive()) + return; + if (e.getType() != UpdateType.TICK) return; if (_roundState.equals(RoundState.FIGHTING)) { for (Arena a : _gameArenaSet) - if (a.getState() != ArenaState.WAITING) + if (!(a.getState() == ArenaState.WAITING || + a.getState() == ArenaState.ENDED || + a.getState() == ArenaState.EMPTY)) return; //All of the arenas are waiting for the next fight. @@ -557,4 +604,20 @@ public class Gladiators extends SoloGame _playerArenas.put(p, a); } + public RoundState getRoundState() + { + return _roundState; + } + + @EventHandler + public void arenaBounce(UpdateEvent e) + { + if (e.getType() != UpdateType.TICK) + return; + + for (Player p : GetPlayers(true)) + { + + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java new file mode 100644 index 000000000..088a428aa --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java @@ -0,0 +1,61 @@ +package nautilus.game.arcade.game.games.gladiators.trackers; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent; + +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.games.gladiators.Gladiators; +import nautilus.game.arcade.stats.StatTracker; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public class FlawlessTracker extends StatTracker +{ + + private List _noWin; + + public FlawlessTracker(Gladiators game) + { + super(game); + + _noWin = new ArrayList<>(); + } + + @EventHandler + public void onDmg(EntityDamageEvent e) + { + if (e.isCancelled()) + return; + + if (e.getEntity() instanceof Player) + { + _noWin.add(((Player)e.getEntity()).getName()); + } + } + + @EventHandler + public void end(GameStateChangeEvent e) + { + if (e.GetState() != Game.GameState.End) + return; + + if (getGame().getWinners() == null) + return; + + for (Player p : getGame().getWinners()) + { + if (_noWin.contains(p.getName())) + continue; + + addStat(p, "Flawless", 1, true, false); + } + } + +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/PrecisionTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/PrecisionTracker.java new file mode 100644 index 000000000..975e040be --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/PrecisionTracker.java @@ -0,0 +1,79 @@ +package nautilus.game.arcade.game.games.gladiators.trackers; + +import java.util.HashMap; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.ProjectileHitEvent; + +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.games.gladiators.Gladiators; +import nautilus.game.arcade.stats.StatTracker; + +/** + * Created by William (WilliamTiger). + * 08/12/15 + */ +public class PrecisionTracker extends StatTracker +{ + private HashMap _shot; + private HashMap _hit; + + public PrecisionTracker(Gladiators game) + { + super(game); + + _shot = new HashMap<>(); + _hit = new HashMap<>(); + } + + @EventHandler + public void end(GameStateChangeEvent e) + { + if (e.GetState() != Game.GameState.End) + return; + + for (Player p : getGame().getWinners()) + { + if (_shot.containsKey(p.getName()) && _hit.containsKey(p.getName())) + { + if (_shot.get(p.getName()) == _hit.get(p.getName())) + { + if (_shot.get(p.getName()) >= 3) + addStat(p, "Precision", 1, true, false); + } + } + } + } + + @EventHandler + public void shoot(EntityShootBowEvent e) + { + if (!(e.getEntity() instanceof Player)) + return; + + Player p = (Player) e.getEntity(); + + if (_shot.containsKey(p.getName())) + _shot.put(p.getName(), _shot.get(p.getName()) + 1); + else + _shot.put(p.getName(), 1); + } + + @EventHandler + public void hit(ProjectileHitEvent e) + { + if (e.getEntity().getShooter() instanceof Player) + { + Player p = (Player) e.getEntity().getShooter(); + + if (_hit.containsKey(p.getName())) + _hit.put(p.getName(), _hit.get(p.getName()) + 1); + else + _hit.put(p.getName(), 1); + } + } + +} \ No newline at end of file From c021fbf9ed2f9d7ea189a9b7a4d671a332301916 Mon Sep 17 00:00:00 2001 From: William Burns Date: Tue, 8 Dec 2015 23:27:38 +0000 Subject: [PATCH 107/223] Bounce baby bounce. --- .../game/games/gladiators/Gladiators.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 598488f4f..73405381c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -16,9 +16,11 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; @@ -352,6 +354,17 @@ public class Gladiators extends SoloGame if (closest != _playerArenas.get(p)) { + if (_playerArenas.get(p).getColour().furtherOut(closest.getColour())) + { + // No going backwards. Bounce baby bounce. + if (Recharge.Instance.use(p, "Arena Bounce", 500, false, false)) + { + UtilAction.velocity(p, UtilAlg.getTrajectory2d(e.getTo(), p.getLocation()), 1.7, true, 0.5, 0, 5, true); + } + + return; + } + Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), closest, _playerArenas.get(p))); _playerArenas.put(p, closest); } @@ -608,16 +621,4 @@ public class Gladiators extends SoloGame { return _roundState; } - - @EventHandler - public void arenaBounce(UpdateEvent e) - { - if (e.getType() != UpdateType.TICK) - return; - - for (Player p : GetPlayers(true)) - { - - } - } } From a5c46545df503df2d2f42417becae4df6b0e7c2e Mon Sep 17 00:00:00 2001 From: Sarah Date: Wed, 9 Dec 2015 14:44:22 +0100 Subject: [PATCH 108/223] fixing timer being shown. --- .../nautilus/game/arcade/managers/GameManager.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index a4fac6a32..a1739088f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -172,13 +172,13 @@ public class GameManager implements Listener if(!team.getTutorial().hasEnded()) { finished = false; - } - if(checkForTimer) - { - if(team.getTutorial().ShowPrepareTimer) - finished = false; - else - finished = true; + if(checkForTimer) + { + if(team.getTutorial().ShowPrepareTimer) + finished = false; + else + finished = true; + } } } if(prepTime <= timeUsage) From 852be97bae6a7ee9a88d0089706498036bbb7ae7 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 20:16:16 +0000 Subject: [PATCH 109/223] Work --- .../arcade/game/games/gladiators/Arena.java | 84 +++++++- .../game/games/gladiators/Gladiators.java | 187 +++++++++++++----- .../game/games/gladiators/RoundState.java | 26 ++- 3 files changed, 239 insertions(+), 58 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 3659b5714..5f4585135 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -1,6 +1,7 @@ package nautilus.game.arcade.game.games.gladiators; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; @@ -36,6 +37,7 @@ public class Arena private ArrayList _doorBlocks; private boolean _isOpenDoor; + private boolean _doorWaitNextRound; private ArrayList _pastPlayers; @@ -58,10 +60,21 @@ public class Arena _state = ArenaState.EMPTY; _stateTime = System.currentTimeMillis(); _particles = new HashMap<>(); + _doorWaitNextRound = false; setupSpawns(); } + public boolean isDoorWaitNextRound() + { + return _doorWaitNextRound; + } + + public void setDoorWaitNextRound(boolean doorWaitNextRound) + { + _doorWaitNextRound = doorWaitNextRound; + } + public Arena getParent() { return _parent; @@ -257,9 +270,21 @@ public class Arena public void update() { + arenaStateCheck(); + if (getPastPlayers().size() <= 0) _state = ArenaState.EMPTY; + if (_colour == ArenaType.RED) + { + // Manual red override. + if (getState() == ArenaState.RUNNING) + setState(ArenaState.WAITING); + + if (getState() == ArenaState.FIGHTING && getPastPlayers().size() == 1) + setState(ArenaState.WAITING); + } + if (_state.equals(ArenaState.EMPTY)) return; @@ -279,8 +304,8 @@ public class Arena { double elapsed = UtilMath.trim(1, System.currentTimeMillis() - _stateTime); - for (Player p : getPastPlayers()) - UtilTextBottom.display(C.cRed + C.Bold + "Poison in " + (UtilTime.MakeStr((long)(60 - elapsed))), p); + //for (Player p : getPastPlayers()) + //UtilTextBottom.display(C.cRed + C.Bold + "Poison in " + (UtilTime.MakeStr((long)(60 - elapsed))), p); return; // 60 seconds before poison } @@ -303,6 +328,52 @@ public class Arena } } + private void arenaStateCheck() + { + if (_state == ArenaState.EMPTY) + { + // It's empty. Nothing to see here. + return; + } + else if (_state == ArenaState.WAITING) + { + if (isDoorWaitNextRound()) + { + // They just have to wait. We don't want their door to open just yet. They are a 'bye'. + return; + } + else + { + if (getPastPlayers().size() == 1) + { + // Run! + _state = ArenaState.RUNNING; + return; + } + else + { + // They have to just wait there. + return; + } + } + } + else if (_state == ArenaState.FIGHTING) + { + if (getPastPlayers().size() == 1) + { + // They should be running or waiting on a bye. + _state = ArenaState.WAITING; + // Set to waiting, and let the above handle that state. + return; + } + else + { + // Fighting. No problem here. + return; + } + } + } + public void updateTick() { if (_state.equals(ArenaState.RUNNING)) @@ -353,14 +424,19 @@ public class Arena Arena next = _host.getArenaByMid(UtilAlg.findClosest(_mid, _host.getAllArenaMidsOfType(_host.getNextColour(_colour)))); - for (Player p : getPastPlayers()) + for (Player p : _pastPlayers) { - // TP after 15 seconds of waiting + // TP after 15 seconds of waiting. p.teleport(UtilAlg.getLocationAwayFromPlayers(next.getSpawns(), _host.GetPlayers(true)).clone()); + //p.sendMessage("HANDLE SLOW MOVERS METHOD!"); _host.Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(p, next, this)); + closeDoor(); _host.setPlayerArena(p, next); UtilTextBottom.display("§c§lTELEPORTED! YOU TOOK TOO LONG!", p); + next.setDoorWaitNextRound(true); } + + _pastPlayers.clear(); // Clear out the un-used players. } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 73405381c..02a086b31 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -12,13 +12,16 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; +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.UtilAlg; -import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -26,6 +29,8 @@ 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.events.PlayerPrepareTeleportEvent; +import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.games.gladiators.events.PlayerChangeArenaEvent; import nautilus.game.arcade.game.games.gladiators.kits.KitGladiator; @@ -65,6 +70,7 @@ public class Gladiators extends SoloGame DamageSelf = true; DamageTeamSelf = true; HungerSet = 20; + DontAllowOverfill = true; _playerArenas = new HashMap<>(); @@ -310,7 +316,10 @@ public class Gladiators extends SoloGame else if (a.getPastPlayers().size() == 0) a.setState(ArenaState.EMPTY); else if (a.getPastPlayers().size() == 1) + { + a.setDoorWaitNextRound(true); a.setState(ArenaState.WAITING); + } } return; @@ -320,7 +329,7 @@ public class Gladiators extends SoloGame return; findGameArenaSet(); - closeUnusedArenas(); + //closeUnusedArenas(); } private void closeUnusedArenas() @@ -342,32 +351,30 @@ public class Gladiators extends SoloGame if (!_playerArenas.containsKey(e.getPlayer())) return; - for (Player p : GetPlayers(true)) + Player p = e.getPlayer(); + + //if (!_playerArenas.get(p).isOpenDoor()) + //return; // No need to check since no door to go through. + + Arena closest = getArenaByMid(UtilAlg.findClosest(p.getLocation(), getAllArenaMids())); + + if (closest != _playerArenas.get(p)) { - if (!_playerArenas.containsKey(p)) - continue; - - if (!_playerArenas.get(p).isOpenDoor()) - continue; // No need to check since no door to go through. - - Arena closest = getArenaByMid(UtilAlg.findClosest(p.getLocation(), getAllArenaMids())); - - if (closest != _playerArenas.get(p)) + if (closest.getColour().furtherOut(_playerArenas.get(p).getColour())) { - if (_playerArenas.get(p).getColour().furtherOut(closest.getColour())) + // No going backwards. Bounce baby bounce. + if (Recharge.Instance.use(p, "Arena Bounce", 500, false, false)) { - // No going backwards. Bounce baby bounce. - if (Recharge.Instance.use(p, "Arena Bounce", 500, false, false)) - { - UtilAction.velocity(p, UtilAlg.getTrajectory2d(e.getTo(), p.getLocation()), 1.7, true, 0.5, 0, 5, true); - } - - return; + //p.sendMessage("bounce. closest = " + closest.toString() + " player arena = " + _playerArenas.get(p).toString()); + UtilAction.velocity(p, UtilAlg.getTrajectory2d(e.getTo(), p.getLocation()), 1.7, true, 0.5, 0, 5, true); } - Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), closest, _playerArenas.get(p))); - _playerArenas.put(p, closest); + return; } + + //p.sendMessage("ARENA MOVE CHECK METHOD!"); + Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), closest, _playerArenas.get(p))); + _playerArenas.put(p, closest); } } @@ -383,6 +390,7 @@ public class Gladiators extends SoloGame old.setState(ArenaState.ENDED); current.getPastPlayers().add(p); current.setState(ArenaState.WAITING); + current.setDoorWaitNextRound(true); Bukkit.broadcastMessage("§7§lDEBUG: §3" + p.getName() + " left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); @@ -411,37 +419,19 @@ public class Gladiators extends SoloGame @EventHandler public void debug(PlayerCommandPreprocessEvent e){ - - if (!e.getMessage().startsWith("/debuginfo")) + if (!e.getPlayer().getName().equalsIgnoreCase("WilliamTiger")) return; - if (e.getPlayer().getName() != "WilliamTiger") + if (!e.getMessage().equalsIgnoreCase("/arenas")) return; - e.setCancelled(true); Player p = e.getPlayer(); - Player target = UtilPlayer.searchExact(e.getMessage().split(" ")[1]); - - if (target == null) + p.sendMessage("Round State = " + _roundState.toString()); + for (Arena a : _gameArenaSet) { - p.sendMessage("Target is null / not online"); - return; + p.sendMessage(a.getColour().toString() + " - " + a.getPastPlayers().size() + " - " + a.getState().toString()); } - - if (!GetPlayers(true).contains(target)) - { - p.sendMessage("That player isn't alive"); - return; - } - - Arena arena = _playerArenas.get(target); - - p.sendMessage("Info of " + target.getName() + "'s arena:"); - p.sendMessage("Type - " + arena.getColour().toString()); - p.sendMessage("Players - " + arena.getPastPlayers().toString()); - p.sendMessage("Players Size - " + arena.getPastPlayers().size()); - p.sendMessage("Door Open - " + arena.isOpenDoor()); } @EventHandler @@ -463,11 +453,11 @@ public class Gladiators extends SoloGame if (a.getPastPlayers().size() == 1) { - if (a.isOpenDoor() || a.getColour().equals(ArenaType.RED)) + if (a.isOpenDoor() || a.getColour().equals(ArenaType.RED) || a.isDoorWaitNextRound()) continue; a.openDoor(); - a.getPastPlayers().get(0).sendMessage("§7§lDEBUG: §3Door has been opened in your arena."); + //a.getPastPlayers().get(0).sendMessage("§7§lDEBUG: §3Door has been opened in your arena."); a.setState(ArenaState.RUNNING); a.setStateTime(System.currentTimeMillis()); } @@ -594,6 +584,10 @@ public class Gladiators extends SoloGame //All of the arenas are waiting for the next fight. _roundState = RoundState.STARTING_5; + for (Arena a : _gameArenaSet) + if (a.isDoorWaitNextRound()) + a.setDoorWaitNextRound(false); + UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); return; } @@ -621,4 +615,103 @@ public class Gladiators extends SoloGame { return _roundState; } + + @EventHandler + public void onShoot(EntityShootBowEvent e) + { + if (_roundState == null) + return; + + if (_roundState.equals(RoundState.FIGHTING)) + return; + + e.setCancelled(true); + + if (e.getEntity() instanceof Player) + { + ((Player)e.getEntity()).getInventory().addItem(new ItemStack(Material.ARROW, 1)); // Arrow fix. + ((Player)e.getEntity()).updateInventory(); + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + Scoreboard.Reset(); + + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cGreen + C.Bold + "Status"); + if (_roundState == RoundState.FIGHTING) + { + double start = -1D; + for (Arena a : _gameArenaSet) + { + if (start != -1D) + continue; + + if (a.getState() == ArenaState.FIGHTING) + start = a.getStateTime(); + } + double time = UtilMath.trim(1, ((60000L + start) - System.currentTimeMillis())); + if (time < 0) + Scoreboard.Write("Poison Active"); + else + Scoreboard.Write("Poison in " + time + "s"); + } + else + { + Scoreboard.Write(_roundState.getScoreboardText()); + } + + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cAqua + C.Bold + "Matches Left"); + Scoreboard.Write(C.cWhite + getMatchesFighting()); + + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cYellow + C.Bold + "Players"); + if (GetPlayers(true).size() > 7) + { + Scoreboard.Write(C.cWhite + GetPlayers(true).size() + " Players"); + } + else + { + for (Player p : GetPlayers(true)) + { + Scoreboard.Write(C.cWhite + p.getName()); + } + } + + Scoreboard.Draw(); + } + + private int getMatchesFighting() + { + if (_gameArenaSet == null) + return 0; + + int count = 0; + for (Arena a : _gameArenaSet) + { + if (a.getState() == ArenaState.FIGHTING) + count++; + } + + return count; + } + + @EventHandler + public void overfillCheck(PlayerPrepareTeleportEvent e) + { + Player p = e.GetPlayer(); + if (GetPlayers(true).size() > 16) + { + SetPlayerState(p, GameTeam.PlayerState.OUT); + Manager.addSpectator(p, true); + p.sendMessage(F.main("Game", "Too many players are in this server. You are now spectating, sorry.")); + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java index 54cd18b16..20072f6cc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java @@ -6,11 +6,23 @@ package nautilus.game.arcade.game.games.gladiators; */ public enum RoundState { - STARTING_5, - STARTING_4, - STARTING_3, - STARTING_2, - STARTING_1, - STARTED, - FIGHTING; + STARTING_5("Starting in 5s"), + STARTING_4("Starting in 4s"), + STARTING_3("Starting in 3s"), + STARTING_2("Starting in 2s"), + STARTING_1("Starting in 1s"), + STARTED("FIGHT!"), + FIGHTING("Fighting"); + + private String scoreboardText; + + RoundState(String scoreboardText) + { + this.scoreboardText = scoreboardText; + } + + public String getScoreboardText() + { + return scoreboardText; + } } From 513db5dd8de12efb82a2903b2f4fc825c86cb717 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 21:33:31 +0000 Subject: [PATCH 110/223] doing byes --- .../game/arcade/game/games/gladiators/Arena.java | 16 ++++++++-------- .../arcade/game/games/gladiators/Gladiators.java | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 5f4585135..860e7d5d9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -37,7 +37,7 @@ public class Arena private ArrayList _doorBlocks; private boolean _isOpenDoor; - private boolean _doorWaitNextRound; + private boolean _doBye; private ArrayList _pastPlayers; @@ -60,19 +60,19 @@ public class Arena _state = ArenaState.EMPTY; _stateTime = System.currentTimeMillis(); _particles = new HashMap<>(); - _doorWaitNextRound = false; + _doBye = false; setupSpawns(); } - public boolean isDoorWaitNextRound() + public boolean isDoBye() { - return _doorWaitNextRound; + return _doBye; } - public void setDoorWaitNextRound(boolean doorWaitNextRound) + public void setDoBye(boolean doBye) { - _doorWaitNextRound = doorWaitNextRound; + _doBye = doBye; } public Arena getParent() @@ -337,7 +337,7 @@ public class Arena } else if (_state == ArenaState.WAITING) { - if (isDoorWaitNextRound()) + if (isDoBye()) { // They just have to wait. We don't want their door to open just yet. They are a 'bye'. return; @@ -434,7 +434,7 @@ public class Arena closeDoor(); _host.setPlayerArena(p, next); UtilTextBottom.display("§c§lTELEPORTED! YOU TOOK TOO LONG!", p); - next.setDoorWaitNextRound(true); + next.setDoBye(true); } _pastPlayers.clear(); // Clear out the un-used players. diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 02a086b31..00177a5f8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -317,7 +317,7 @@ public class Gladiators extends SoloGame a.setState(ArenaState.EMPTY); else if (a.getPastPlayers().size() == 1) { - a.setDoorWaitNextRound(true); + a.setDoBye(true); a.setState(ArenaState.WAITING); } } @@ -390,7 +390,7 @@ public class Gladiators extends SoloGame old.setState(ArenaState.ENDED); current.getPastPlayers().add(p); current.setState(ArenaState.WAITING); - current.setDoorWaitNextRound(true); + current.setDoBye(true); Bukkit.broadcastMessage("§7§lDEBUG: §3" + p.getName() + " left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); @@ -453,7 +453,7 @@ public class Gladiators extends SoloGame if (a.getPastPlayers().size() == 1) { - if (a.isOpenDoor() || a.getColour().equals(ArenaType.RED) || a.isDoorWaitNextRound()) + if (a.isOpenDoor() || a.getColour().equals(ArenaType.RED) || a.isDoBye()) continue; a.openDoor(); @@ -585,8 +585,8 @@ public class Gladiators extends SoloGame _roundState = RoundState.STARTING_5; for (Arena a : _gameArenaSet) - if (a.isDoorWaitNextRound()) - a.setDoorWaitNextRound(false); + if (a.isDoBye()) + a.setDoBye(false); UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); return; From 17c989d9415d432dfcdc63a9c8ad52fe73c77670 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 22:39:04 +0000 Subject: [PATCH 111/223] Less per-player arena stuff --- .../arcade/game/games/gladiators/Arena.java | 77 ++-------- .../game/games/gladiators/Gladiators.java | 144 ++++++++---------- .../game/games/gladiators/RoundState.java | 1 + 3 files changed, 71 insertions(+), 151 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 860e7d5d9..079af448d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -270,24 +270,12 @@ public class Arena public void update() { - arenaStateCheck(); - if (getPastPlayers().size() <= 0) - _state = ArenaState.EMPTY; - - if (_colour == ArenaType.RED) { - // Manual red override. - if (getState() == ArenaState.RUNNING) - setState(ArenaState.WAITING); - - if (getState() == ArenaState.FIGHTING && getPastPlayers().size() == 1) - setState(ArenaState.WAITING); + setState(ArenaState.EMPTY); + return; // Empty check. } - if (_state.equals(ArenaState.EMPTY)) - return; - if (_state.equals(ArenaState.WAITING)) { if (_host.getRoundState() != RoundState.FIGHTING) @@ -300,16 +288,17 @@ public class Arena } else if (_state.equals(ArenaState.FIGHTING)) { - if (!UtilTime.elapsed(_stateTime, 60000)) + if (getPastPlayers().size() == 1) { - double elapsed = UtilMath.trim(1, System.currentTimeMillis() - _stateTime); + openDoor(); - //for (Player p : getPastPlayers()) - //UtilTextBottom.display(C.cRed + C.Bold + "Poison in " + (UtilTime.MakeStr((long)(60 - elapsed))), p); - - return; // 60 seconds before poison + setState(ArenaState.RUNNING); + return; } + if (!UtilTime.elapsed(_stateTime, 60000)) + return; // No poison yet. + for (Player p : getPastPlayers()) { UtilTextBottom.display(C.cRed + C.Bold + "YOU ARE POISONED! KEEP FIGHTING!", p); @@ -328,52 +317,6 @@ public class Arena } } - private void arenaStateCheck() - { - if (_state == ArenaState.EMPTY) - { - // It's empty. Nothing to see here. - return; - } - else if (_state == ArenaState.WAITING) - { - if (isDoBye()) - { - // They just have to wait. We don't want their door to open just yet. They are a 'bye'. - return; - } - else - { - if (getPastPlayers().size() == 1) - { - // Run! - _state = ArenaState.RUNNING; - return; - } - else - { - // They have to just wait there. - return; - } - } - } - else if (_state == ArenaState.FIGHTING) - { - if (getPastPlayers().size() == 1) - { - // They should be running or waiting on a bye. - _state = ArenaState.WAITING; - // Set to waiting, and let the above handle that state. - return; - } - else - { - // Fighting. No problem here. - return; - } - } - } - public void updateTick() { if (_state.equals(ArenaState.RUNNING)) @@ -420,7 +363,7 @@ public class Arena private void handleSlowMovers() { - _state = ArenaState.ENDED; + setState(ArenaState.ENDED); Arena next = _host.getArenaByMid(UtilAlg.findClosest(_mid, _host.getAllArenaMidsOfType(_host.getNextColour(_colour)))); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 00177a5f8..ec69eb73d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -50,6 +50,8 @@ public class Gladiators extends SoloGame private RoundState _roundState; + private ArenaType _furthestOutCurrent; + public Gladiators(ArcadeManager manager) { super(manager, GameType.Gladiators, @@ -74,7 +76,7 @@ public class Gladiators extends SoloGame _playerArenas = new HashMap<>(); - _roundState = RoundState.FIGHTING; + _roundState = RoundState.WAITING; } @Override @@ -306,22 +308,6 @@ public class Gladiators extends SoloGame giveLoadout(p, _playerArenas.get(p).getColour()); } - for (Arena a : _gameArenaSet) - { - if (a.getPastPlayers().size() > 1) - { - a.setState(ArenaState.FIGHTING); - a.setStateTime(System.currentTimeMillis()); - } - else if (a.getPastPlayers().size() == 0) - a.setState(ArenaState.EMPTY); - else if (a.getPastPlayers().size() == 1) - { - a.setDoBye(true); - a.setState(ArenaState.WAITING); - } - } - return; } @@ -332,6 +318,63 @@ public class Gladiators extends SoloGame //closeUnusedArenas(); } + /** + *------------------- + * MAIN UPDATE METHOD + *------------------- + */ + @EventHandler + public void roundUpdateCheck(UpdateEvent e) + { + if (!IsLive()) + return; + + if (e.getType() != UpdateType.TICK) + return; + + if (_roundState == RoundState.WAITING) + { + _roundState = RoundState.STARTING_5; + UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); + + _furthestOutCurrent = getFurthestOut(); // Find furthest out for fight. + + for (Arena a : _gameArenaSet) + { + if (a.getState() == ArenaState.WAITING && a.getColour() == _furthestOutCurrent) + { + // This arena is going to fight. + a.setState(ArenaState.FIGHTING); + a.setStateTime(System.currentTimeMillis()); + } + } + } + else if (_roundState.equals(RoundState.FIGHTING)) + { + for (Arena a : _gameArenaSet) + if (!(a.getState() == ArenaState.WAITING || + a.getState() == ArenaState.ENDED || + a.getState() == ArenaState.EMPTY)) + return; + + //All of the arenas are waiting for the next fight, so let's make them wait a bit. + _roundState = RoundState.WAITING; + return; + } + } + + private ArenaType getFurthestOut() + { + ArenaType best = null; + for (Arena a : _gameArenaSet) + { + if (best == null || a.getColour().furtherOut(best)) + best = a.getColour(); + } + + return best; + } + private void closeUnusedArenas() { for (Arena a : _allArenas) @@ -434,36 +477,6 @@ public class Gladiators extends SoloGame } } - @EventHandler - public void arenaNeedsMoving(UpdateEvent e) - { - if (!IsLive()) - return; - - if (e.getType() != UpdateType.TICK) - return; - - for (Arena a : _gameArenaSet) - { - for (Player p : a.getPastPlayers()) - { - if (!GetPlayers(true).contains(p)) - a.getPastPlayers().remove(p); - } - - if (a.getPastPlayers().size() == 1) - { - if (a.isOpenDoor() || a.getColour().equals(ArenaType.RED) || a.isDoBye()) - continue; - - a.openDoor(); - //a.getPastPlayers().get(0).sendMessage("§7§lDEBUG: §3Door has been opened in your arena."); - a.setState(ArenaState.RUNNING); - a.setStateTime(System.currentTimeMillis()); - } - } - } - @EventHandler public void arenaUpdateTick(UpdateEvent e) { @@ -552,43 +565,6 @@ public class Gladiators extends SoloGame { _roundState = RoundState.FIGHTING; UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); - for (Arena a : _gameArenaSet) - { - if (a.getState().equals(ArenaState.WAITING)) - { - a.setState(ArenaState.FIGHTING); - a.setStateTime(System.currentTimeMillis()); - } - } - return; - } - } - - @EventHandler - public void roundUpdate(UpdateEvent e) - { - if (!IsLive()) - return; - - if (e.getType() != UpdateType.TICK) - return; - - if (_roundState.equals(RoundState.FIGHTING)) - { - for (Arena a : _gameArenaSet) - if (!(a.getState() == ArenaState.WAITING || - a.getState() == ArenaState.ENDED || - a.getState() == ArenaState.EMPTY)) - return; - - //All of the arenas are waiting for the next fight. - _roundState = RoundState.STARTING_5; - - for (Arena a : _gameArenaSet) - if (a.isDoBye()) - a.setDoBye(false); - - UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); return; } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java index 20072f6cc..1807db499 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/RoundState.java @@ -6,6 +6,7 @@ package nautilus.game.arcade.game.games.gladiators; */ public enum RoundState { + WAITING("Waiting"), STARTING_5("Starting in 5s"), STARTING_4("Starting in 4s"), STARTING_3("Starting in 3s"), From 3ad0a3db6ea9fb07bd946adbb54310624f23aa68 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 23:14:08 +0000 Subject: [PATCH 112/223] fix --- .../game/games/gladiators/Gladiators.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index ec69eb73d..fb35f2472 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -308,6 +308,12 @@ public class Gladiators extends SoloGame giveLoadout(p, _playerArenas.get(p).getColour()); } + for (Arena a : _gameArenaSet) + { + if (a.getPastPlayers().size() != 0) + a.setState(ArenaState.WAITING); + } + return; } @@ -421,6 +427,25 @@ public class Gladiators extends SoloGame } } + @EventHandler + public void arenaCheckPlayer(UpdateEvent e) + { + if (!IsLive()) + return; + + if (e.getType() != UpdateType.TICK) + return; + + for (Arena a : _gameArenaSet) + { + for (Player p : a.getPastPlayers()) + { + if (!GetPlayers(true).contains(p)) + a.getPastPlayers().remove(p); + } + } + } + @EventHandler public void arenaChange(PlayerChangeArenaEvent e) { From b8a2304eddc110f0bb96c5d3a68284817d410865 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 23:39:00 +0000 Subject: [PATCH 113/223] work --- .../arcade/game/games/gladiators/Arena.java | 2 +- .../game/games/gladiators/Gladiators.java | 36 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 079af448d..329b67a05 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -367,7 +367,7 @@ public class Arena Arena next = _host.getArenaByMid(UtilAlg.findClosest(_mid, _host.getAllArenaMidsOfType(_host.getNextColour(_colour)))); - for (Player p : _pastPlayers) + for (Player p : new ArrayList(_pastPlayers)) { // TP after 15 seconds of waiting. diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index fb35f2472..c7a31c85e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -427,24 +427,24 @@ public class Gladiators extends SoloGame } } - @EventHandler - public void arenaCheckPlayer(UpdateEvent e) - { - if (!IsLive()) - return; - - if (e.getType() != UpdateType.TICK) - return; - - for (Arena a : _gameArenaSet) - { - for (Player p : a.getPastPlayers()) - { - if (!GetPlayers(true).contains(p)) - a.getPastPlayers().remove(p); - } - } - } +// @EventHandler +// public void arenaCheckPlayer(UpdateEvent e) +// { +// if (!IsLive()) +// return; +// +// if (e.getType() != UpdateType.TICK) +// return; +// +// for (Arena a : _gameArenaSet) +// { +// for (Player p : a.getPastPlayers()) +// { +// if (!GetPlayers(true).contains(p)) +// a.getPastPlayers().remove(p); +// } +// } +// } @EventHandler public void arenaChange(PlayerChangeArenaEvent e) From 05bd55f720fd65337da03848a7c30d01a9b1fcc2 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 23:53:04 +0000 Subject: [PATCH 114/223] iter --- .../game/games/gladiators/Gladiators.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index c7a31c85e..d1c400b49 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -2,6 +2,7 @@ package nautilus.game.arcade.game.games.gladiators; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Queue; @@ -388,6 +389,28 @@ public class Gladiators extends SoloGame a.closeDoor(); } + @EventHandler + public void arenaCheckPlayer(UpdateEvent e) + { + if (!IsLive()) + return; + + if (e.getType() != UpdateType.TICK) + return; + + for (Arena a : _gameArenaSet) + { + Iterator pls = a.getPastPlayers().iterator(); + while (pls.hasNext()) + { + Player p = pls.next(); + + if (!GetPlayers(true).contains(p)) + pls.remove(); + } + } + } + @EventHandler public void arenaMoveCheck(PlayerMoveEvent e) { @@ -427,25 +450,6 @@ public class Gladiators extends SoloGame } } -// @EventHandler -// public void arenaCheckPlayer(UpdateEvent e) -// { -// if (!IsLive()) -// return; -// -// if (e.getType() != UpdateType.TICK) -// return; -// -// for (Arena a : _gameArenaSet) -// { -// for (Player p : a.getPastPlayers()) -// { -// if (!GetPlayers(true).contains(p)) -// a.getPastPlayers().remove(p); -// } -// } -// } - @EventHandler public void arenaChange(PlayerChangeArenaEvent e) { From cea2716851726c9b869e27dcb22c78e90a2397f4 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 9 Dec 2015 23:59:20 +0000 Subject: [PATCH 115/223] fight man --- .../nautilus/game/arcade/game/games/gladiators/Gladiators.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index d1c400b49..ecc05a635 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -365,7 +365,7 @@ public class Gladiators extends SoloGame return; //All of the arenas are waiting for the next fight, so let's make them wait a bit. - _roundState = RoundState.WAITING; + _roundState = RoundState.FIGHTING; return; } } From 90896073d4ae8ead265f27be7bd7e31e1083e74d Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 00:03:17 +0000 Subject: [PATCH 116/223] debug --- .../game/arcade/game/games/gladiators/Gladiators.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index ecc05a635..f4cb9dfa3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -365,7 +365,7 @@ public class Gladiators extends SoloGame return; //All of the arenas are waiting for the next fight, so let's make them wait a bit. - _roundState = RoundState.FIGHTING; + _roundState = RoundState.WAITING; return; } } @@ -491,15 +491,13 @@ public class Gladiators extends SoloGame @EventHandler public void debug(PlayerCommandPreprocessEvent e){ - if (!e.getPlayer().getName().equalsIgnoreCase("WilliamTiger")) - return; - if (!e.getMessage().equalsIgnoreCase("/arenas")) return; e.setCancelled(true); Player p = e.getPlayer(); p.sendMessage("Round State = " + _roundState.toString()); + p.sendMessage("Out state = " + _furthestOutCurrent.toString()); for (Arena a : _gameArenaSet) { p.sendMessage(a.getColour().toString() + " - " + a.getPastPlayers().size() + " - " + a.getState().toString()); @@ -593,6 +591,7 @@ public class Gladiators extends SoloGame else if (_roundState.equals(RoundState.STARTED)) { _roundState = RoundState.FIGHTING; + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); return; } From 87a834c01bad5f96cb77161329b6a8124d82b56f Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 00:03:57 +0000 Subject: [PATCH 117/223] FIX --- .../nautilus/game/arcade/game/games/gladiators/Gladiators.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index f4cb9dfa3..cc98772bf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -375,6 +375,9 @@ public class Gladiators extends SoloGame ArenaType best = null; for (Arena a : _gameArenaSet) { + if (a.getState() != ArenaState.WAITING) + continue; + if (best == null || a.getColour().furtherOut(best)) best = a.getColour(); } From fabf3dab5919f4cae2bcc256689b84e1b97240af Mon Sep 17 00:00:00 2001 From: Cheese Date: Thu, 10 Dec 2015 13:12:01 +1100 Subject: [PATCH 118/223] updated blocksearch --- .../src/mineplex/core/common/util/UtilBlock.java | 7 +++++-- Plugins/Nautilus.Game.Arcade/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +++--- .../src/nautilus/game/arcade/ArcadeManager.java | 2 -- .../nautilus/game/arcade/game/games/event/EventGame.java | 2 -- .../game/arcade/game/games/monsterleague/Ball.java | 2 -- 6 files changed, 9 insertions(+), 12 deletions(-) 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 8f3b37176..c0a7f5f3b 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 @@ -835,7 +835,7 @@ public class UtilBlock return getBedHead(bed.getBlock()) != null && getBedFoot(bed.getBlock()) != null; } - public static HashSet findConnectedBlocks(Block block, HashSet blocks, int limit) + public static HashSet findConnectedBlocks(Block source, Block block, HashSet blocks, int limit, double range) { if (blocks == null) blocks = new HashSet(); @@ -852,10 +852,13 @@ public class UtilBlock { if (neighbour.getType() == Material.AIR) continue; + + if (UtilMath.offset(source.getLocation(), neighbour.getLocation()) > range) + continue; //If neighbour hasn't been searched, recursively search it! if (!blocks.contains(neighbour)) - findConnectedBlocks(neighbour, blocks, limit); + findConnectedBlocks(source, neighbour, blocks, limit, range); } return blocks; diff --git a/Plugins/Nautilus.Game.Arcade/.classpath b/Plugins/Nautilus.Game.Arcade/.classpath index 0c832983c..315ba497a 100644 --- a/Plugins/Nautilus.Game.Arcade/.classpath +++ b/Plugins/Nautilus.Game.Arcade/.classpath @@ -1,7 +1,7 @@ - + diff --git a/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs b/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs index 70732762e..bfbbfb4d1 100644 --- a/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs +++ b/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,14 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert 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 21e3ea398..fbf22d621 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -308,8 +308,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation new SoupAddon(plugin, this); new TeamArmorAddon(plugin, this); -// new NotificationManager(getPlugin(), clientManager); - new BonusManager(plugin, clientManager, serverStatusManager, donationManager, pollManager , npcManager, hologramManager, statsManager, _inventoryManager, petManager, giveawayManager); //Champions Modules diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java index 31e1a164a..03499db01 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java @@ -77,8 +77,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import com.sun.xml.internal.ws.resources.UtilMessages; - public class EventGame extends Game { private GameHostManager _mps; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/Ball.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/Ball.java index 5b901bc62..65af10219 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/Ball.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monsterleague/Ball.java @@ -30,8 +30,6 @@ import org.bukkit.entity.Projectile; import org.bukkit.entity.Slime; import org.bukkit.util.Vector; -import sun.rmi.runtime.Log; - public class Ball { private MonsterLeague _host; From eaf393700400e4367576541879353573352e07b1 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 10 Dec 2015 20:02:12 +1300 Subject: [PATCH 119/223] Fix the damage while walking on falling block --- .../src/nautilus/game/arcade/game/games/runner/Runner.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java index 59c1a8896..1cd250deb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java @@ -302,6 +302,11 @@ public class Runner extends SoloGame implements IThrown { return; } + + if (target.getLocation().getY() > data.GetThrown().getLocation().getY() + 0.5) + { + return; + } } //Damage Event From af7c058f220a1f32641e96698520c65393a43c71 Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 19:06:07 +0000 Subject: [PATCH 120/223] Lots of bug fixes / additions since the testing 12/9/15. --- .../game/arcade/events/FirstBloodEvent.java | 39 +++++ .../arcade/game/games/gladiators/Arena.java | 3 +- .../game/games/gladiators/Gladiators.java | 138 +++++++++++++++--- .../gladiators/events/RoundStartEvent.java | 24 +++ .../gladiators/trackers/SwiftKillTracker.java | 26 ++++ .../trackers/UntouchableTracker.java | 55 +++++++ .../game/arcade/managers/GameGemManager.java | 3 + 7 files changed, 262 insertions(+), 26 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/events/FirstBloodEvent.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/RoundStartEvent.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/SwiftKillTracker.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/events/FirstBloodEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/events/FirstBloodEvent.java new file mode 100644 index 000000000..a3a5bcbae --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/events/FirstBloodEvent.java @@ -0,0 +1,39 @@ +package nautilus.game.arcade.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Created by William (WilliamTiger). + * 10/12/15 + */ +public class FirstBloodEvent extends Event +{ + + private Player player; + + public FirstBloodEvent(Player player) + { + this.player = player; + } + + public Player getPlayer() + { + return player; + } + + private static HandlerList _handlers = new HandlerList(); + + public static HandlerList getHandlerList() + { + return _handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } + +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 329b67a05..52079b41d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -1,7 +1,6 @@ package nautilus.game.arcade.game.games.gladiators; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; @@ -12,7 +11,6 @@ import org.bukkit.event.entity.EntityDamageEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; @@ -293,6 +291,7 @@ public class Arena openDoor(); setState(ArenaState.RUNNING); + setStateTime(System.currentTimeMillis()); return; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index cc98772bf..34baa0a1b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -8,25 +8,32 @@ import java.util.Map; import java.util.Queue; import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; 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.UtilAlg; -import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextMiddle; 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.ArcadeFormat; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -34,7 +41,13 @@ import nautilus.game.arcade.events.PlayerPrepareTeleportEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.games.gladiators.events.PlayerChangeArenaEvent; +import nautilus.game.arcade.game.games.gladiators.events.RoundStartEvent; import nautilus.game.arcade.game.games.gladiators.kits.KitGladiator; +import nautilus.game.arcade.game.games.gladiators.trackers.BrawlerTracker; +import nautilus.game.arcade.game.games.gladiators.trackers.FlawlessTracker; +import nautilus.game.arcade.game.games.gladiators.trackers.PrecisionTracker; +import nautilus.game.arcade.game.games.gladiators.trackers.SwiftKillTracker; +import nautilus.game.arcade.game.games.gladiators.trackers.UntouchableTracker; import nautilus.game.arcade.kit.Kit; /** @@ -75,6 +88,14 @@ public class Gladiators extends SoloGame HungerSet = 20; DontAllowOverfill = true; + registerStatTrackers( + new BrawlerTracker(this), + new UntouchableTracker(this), + new FlawlessTracker(this), + new PrecisionTracker(this), + new SwiftKillTracker(this) + ); + _playerArenas = new HashMap<>(); _roundState = RoundState.WAITING; @@ -177,7 +198,7 @@ public class Gladiators extends SoloGame { for(int i = 0; i < node.getChilds().length; i++) { - System.out.println("Adding child of node: " + node.getColour() + "number of childs: " + node.getChilds().length); + //System.out.println("Adding child of node: " + node.getColour() + "number of childs: " + node.getChilds().length); nextQueue.add(node.getChildAt(i)); queue.add(node.getChildAt(i)); } @@ -188,7 +209,7 @@ public class Gladiators extends SoloGame Arena node = nextQueue.poll(); node.setIsUsed(true); - System.out.println("Node: " + node.getColour()); + //System.out.println("Node: " + node.getColour()); sum = sum + node.getCapacity() - 1; /* @@ -209,11 +230,11 @@ public class Gladiators extends SoloGame if (solved) { masterNode.getUsageMap(spawnsPerRoom); - System.out.println("Solution: "); + //System.out.println("Solution: "); for (Map.Entry entry : spawnsPerRoom.entrySet()) { - System.out.println("Color: " + entry.getKey().getColour() + ", Spawns: " + entry.getValue()); + //System.out.println("Color: " + entry.getKey().getColour() + ", Spawns: " + entry.getValue()); _gameArenaSet.add(entry.getKey()); } } @@ -354,7 +375,21 @@ public class Gladiators extends SoloGame a.setState(ArenaState.FIGHTING); a.setStateTime(System.currentTimeMillis()); } + + if (a.getState() == ArenaState.WAITING) + { + // No fight for them, they have a bye. + for (Player p : a.getPastPlayers()) + { + p.sendMessage(ArcadeFormat.Line); + p.sendMessage(" " + C.cWhite + C.Bold + "You have a bye!"); + p.sendMessage(" " + C.cGreen + "You automatically go through this round."); + p.sendMessage(ArcadeFormat.Line); + } + } } + + Manager.getPluginManager().callEvent(new RoundStartEvent()); } else if (_roundState.equals(RoundState.FIGHTING)) { @@ -467,7 +502,7 @@ public class Gladiators extends SoloGame current.setState(ArenaState.WAITING); current.setDoBye(true); - Bukkit.broadcastMessage("§7§lDEBUG: §3" + p.getName() + " left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); + //Bukkit.broadcastMessage("§7§lDEBUG: §3" + p.getName() + " left §b" + old.getColour().toString() + " §3and entered §b" + current.getColour().toString() + "§3."); giveLoadout(p, current.getColour()); //Kit p.setHealth(p.getMaxHealth()); //Heal @@ -490,22 +525,24 @@ public class Gladiators extends SoloGame p.getInventory().setChestplate(type.getLoadout().getChestplate()); p.getInventory().setLeggings(type.getLoadout().getLeggings()); p.getInventory().setBoots(type.getLoadout().getBoots()); + + p.playSound(p.getLocation(), Sound.LEVEL_UP, 1f, 1f); } - @EventHandler - public void debug(PlayerCommandPreprocessEvent e){ - if (!e.getMessage().equalsIgnoreCase("/arenas")) - return; - e.setCancelled(true); - Player p = e.getPlayer(); - - p.sendMessage("Round State = " + _roundState.toString()); - p.sendMessage("Out state = " + _furthestOutCurrent.toString()); - for (Arena a : _gameArenaSet) - { - p.sendMessage(a.getColour().toString() + " - " + a.getPastPlayers().size() + " - " + a.getState().toString()); - } - } +// @EventHandler +// public void debug(PlayerCommandPreprocessEvent e){ +// if (!e.getMessage().equalsIgnoreCase("/arenas")) +// return; +// e.setCancelled(true); +// Player p = e.getPlayer(); +// +// p.sendMessage("Round State = " + _roundState.toString()); +// p.sendMessage("Out state = " + _furthestOutCurrent.toString()); +// for (Arena a : _gameArenaSet) +// { +// p.sendMessage(a.getColour().toString() + " - " + a.getPastPlayers().size() + " - " + a.getState().toString()); +// } +// } @EventHandler public void arenaUpdateTick(UpdateEvent e) @@ -547,7 +584,7 @@ public class Gladiators extends SoloGame if (!_playerArenas.containsKey(p)) return; - if (_playerArenas.get(p).getState() != ArenaState.FIGHTING) + if ((_playerArenas.get(p).getState() != ArenaState.FIGHTING) || (_roundState != RoundState.FIGHTING)) e.setCancelled(true); } @@ -577,25 +614,37 @@ public class Gladiators extends SoloGame { _roundState = RoundState.STARTING_2; UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + + for (Player p : UtilServer.getPlayers()) + p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); return; } else if (_roundState.equals(RoundState.STARTING_2)) { _roundState = RoundState.STARTING_1; UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + + for (Player p : UtilServer.getPlayers()) + p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); return; } else if (_roundState.equals(RoundState.STARTING_1)) { _roundState = RoundState.STARTED; UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + + for (Player p : UtilServer.getPlayers()) + p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); return; } else if (_roundState.equals(RoundState.STARTED)) { _roundState = RoundState.FIGHTING; - UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 40, 0); + + for (Player p : UtilServer.getPlayers()) + p.playSound(p.getLocation(), Sound.NOTE_PLING, 2f, 2f); return; } } @@ -610,7 +659,7 @@ public class Gladiators extends SoloGame return "SEMI-FINALS"; else if (size == 8) return "QUARTER-FINALS"; - else return "ROUND OF " + size; + else return "ROUND OF " + size + " PLAYERS"; } public void setPlayerArena(Player p, Arena a) @@ -663,7 +712,7 @@ public class Gladiators extends SoloGame if (a.getState() == ArenaState.FIGHTING) start = a.getStateTime(); } - double time = UtilMath.trim(1, ((60000L + start) - System.currentTimeMillis())); + int time = Math.round((float)((60000L + start) - System.currentTimeMillis())); if (time < 0) Scoreboard.Write("Poison Active"); else @@ -721,4 +770,45 @@ public class Gladiators extends SoloGame p.sendMessage(F.main("Game", "Too many players are in this server. You are now spectating, sorry.")); } } + + @EventHandler + public void fireworkDeath(CombatDeathEvent e) + { + Location loc = e.GetEvent().getEntity().getLocation(); + Color color = Color.AQUA; + switch (_furthestOutCurrent) + { + case RED: + color = Color.RED; + break; + case ORANGE: + color = Color.ORANGE; + break; + case YELLOW: + color = Color.YELLOW; + break; + case GREEN: + color = Color.GREEN; + break; + } + UtilFirework.playFirework(loc, FireworkEffect.Type.BALL, color, false, false); + } + + @EventHandler + public void quitAlert(PlayerQuitEvent e) + { + if (_playerArenas.containsKey(e.getPlayer())) + { + for (Player p : _playerArenas.get(e.getPlayer()).getPastPlayers()) + { + if (p.equals(e.getPlayer())) + continue; + + p.sendMessage(ArcadeFormat.Line); + p.sendMessage(" " + C.cWhite + C.Bold + "Your opponent has QUIT!"); + p.sendMessage(" " + C.cGreen + "You automatically win the fight."); + p.sendMessage(ArcadeFormat.Line); + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/RoundStartEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/RoundStartEvent.java new file mode 100644 index 000000000..91d654d94 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/events/RoundStartEvent.java @@ -0,0 +1,24 @@ +package nautilus.game.arcade.game.games.gladiators.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Created by William (WilliamTiger). + * 10/12/15 + */ +public class RoundStartEvent extends Event +{ + private static final HandlerList _handlers = new HandlerList(); + + public static HandlerList getHandlerList() + { + return _handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/SwiftKillTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/SwiftKillTracker.java new file mode 100644 index 000000000..52caeec89 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/SwiftKillTracker.java @@ -0,0 +1,26 @@ +package nautilus.game.arcade.game.games.gladiators.trackers; + +import org.bukkit.event.EventHandler; + +import nautilus.game.arcade.events.FirstBloodEvent; +import nautilus.game.arcade.game.games.gladiators.Gladiators; +import nautilus.game.arcade.stats.StatTracker; + +/** + * Created by William (WilliamTiger). + * 10/12/15 + */ +public class SwiftKillTracker extends StatTracker +{ + public SwiftKillTracker(Gladiators game) + { + super(game); + } + + @EventHandler + public void blood(FirstBloodEvent e) + { + addStat(e.getPlayer(), "SwiftKill", 1, false, false); + } + +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java new file mode 100644 index 000000000..bd9f68e61 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java @@ -0,0 +1,55 @@ +package nautilus.game.arcade.game.games.gladiators.trackers; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageEvent; + +import nautilus.game.arcade.game.games.gladiators.Gladiators; +import nautilus.game.arcade.game.games.gladiators.events.RoundStartEvent; +import nautilus.game.arcade.stats.StatTracker; + +/** + * Created by William (WilliamTiger). + * 10/12/15 + */ +public class UntouchableTracker extends StatTracker +{ + private List _noWin; + + public UntouchableTracker(Gladiators game) + { + super(game); + + _noWin = new ArrayList<>(); + } + + @EventHandler + public void onDmg(EntityDamageEvent e) + { + if (e.isCancelled()) + return; + + if (e.getEntity() instanceof Player) + { + _noWin.add(((Player)e.getEntity()).getName()); + } + } + + @EventHandler + public void onEnd(RoundStartEvent e) + { + for (Player p : getGame().GetPlayers(true)) + { + if (_noWin.contains(p.getName())) + return; + + addStat(p, "Untouchable", 1, false, false); + } + + _noWin.clear(); + } + +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java index 83230ab09..b49f5bb06 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java @@ -16,6 +16,7 @@ import mineplex.serverdata.Utility; import nautilus.game.arcade.ArcadeFormat; 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.PlayerStateChangeEvent; import nautilus.game.arcade.game.Game; @@ -77,6 +78,8 @@ public class GameGemManager implements Listener { game.AddGems(killer, 10, "First Blood", false, false); + Manager.getPluginManager().callEvent(new FirstBloodEvent(killer)); + game.FirstKill = false; game.Announce(F.main("Game", Manager.GetColor(killer) + killer.getName() + " drew first blood!")); From 358664241408f0babf4754d263f2aa47dc466d5d Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 19:32:25 +0000 Subject: [PATCH 121/223] Added back the tutorial. --- .../game/games/gladiators/Gladiators.java | 161 +++++++++++++++++- .../tutorial/TutorialGladiators.java | 135 +++++++++++++++ .../tutorial/TutorialPhaseGladiators.java | 27 +++ 3 files changed, 314 insertions(+), 9 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 34baa0a1b..8a4956992 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -1,23 +1,24 @@ package nautilus.game.arcade.game.games.gladiators; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Queue; -import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityShootBowEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; @@ -26,8 +27,11 @@ 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.UtilFirework; +import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilShapes; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -48,6 +52,8 @@ import nautilus.game.arcade.game.games.gladiators.trackers.FlawlessTracker; import nautilus.game.arcade.game.games.gladiators.trackers.PrecisionTracker; import nautilus.game.arcade.game.games.gladiators.trackers.SwiftKillTracker; import nautilus.game.arcade.game.games.gladiators.trackers.UntouchableTracker; +import nautilus.game.arcade.game.games.gladiators.tutorial.TutorialGladiators; +import nautilus.game.arcade.gametutorial.events.GameTutorialStartEvent; import nautilus.game.arcade.kit.Kit; /** @@ -87,6 +93,7 @@ public class Gladiators extends SoloGame DamageTeamSelf = true; HungerSet = 20; DontAllowOverfill = true; + EnableTutorials = true; registerStatTrackers( new BrawlerTracker(this), @@ -101,6 +108,135 @@ public class Gladiators extends SoloGame _roundState = RoundState.WAITING; } + @EventHandler + public void tutorialStart(GameTutorialStartEvent e) + { + Location white = WorldData.GetDataLocs("WHITE").get(0); + Location orange = UtilAlg.findClosest(white, WorldData.GetDataLocs("ORANGE")); + Location pink = UtilAlg.findClosest(orange, WorldData.GetDataLocs("PINK")); + ArrayList spawns = new ArrayList<>(WorldData.GetDataLocs("BROWN")); + Location spawn1 = spawns.get(0); + spawns.remove(spawn1); + Location spawn2 = spawns.get(0); + + e.getTutorial().getPhase(1).setLocation(white); + e.getTutorial().getPhase(1).setTarget(orange); + + CreatureAllowOverride = true; + Zombie zombie1 = (Zombie) WorldData.World.spawnEntity(spawn1, EntityType.ZOMBIE); + Zombie zombie2 = (Zombie) WorldData.World.spawnEntity(spawn2, EntityType.ZOMBIE); + CreatureAllowOverride = false; + for (Zombie zombie : Arrays.asList(zombie1, zombie2)) + { + //DisguisePlayer player = new DisguisePlayer(zombie); + //Manager.GetDisguise().disguise(player); + UtilEnt.Vegetate(zombie); + zombie.getEquipment().setHelmet(ArenaType.ORANGE.getLoadout().getHelmet()); + zombie.getEquipment().setChestplate(ArenaType.ORANGE.getLoadout().getChestplate()); + zombie.getEquipment().setLeggings(ArenaType.ORANGE.getLoadout().getLeggings()); + zombie.getEquipment().setBoots(ArenaType.ORANGE.getLoadout().getBoots()); + zombie.getEquipment().setItemInHand(ArenaType.ORANGE.getLoadout().getSword()); + + UtilEnt.CreatureMoveFast(zombie, orange, 1); + } + + ((TutorialGladiators)e.getTutorial()).setOrange(orange); + ((TutorialGladiators)e.getTutorial()).setPink(pink); + ((TutorialGladiators)e.getTutorial()).setZombie1(zombie1); + ((TutorialGladiators)e.getTutorial()).setZombie2(zombie2); + } + + @EventHandler + public void tutorialUpdate(UpdateEvent e) + { + if (e.getType() != UpdateType.FASTEST) + return; + + if (GetState() != GameState.Prepare) + return; + + if (GetTeamList().get(0).getTutorial() == null) + return; + + TutorialGladiators tutorial = (TutorialGladiators) GetTeamList().get(0).getTutorial(); + + if (tutorial == null) + { + System.out.println("tutorial object null"); + + if (GetTeamList().get(0).getTutorial() == null) + System.out.println("tutorial is null"); + + if (!(GetTeamList().get(0).getTutorial() instanceof TutorialGladiators)) + System.out.println("its not a gladiators one"); + + return; + } + + if (tutorial.hasEnded()) + return; + + UtilEnt.CreatureMoveFast(tutorial.getZombie1(), tutorial.getOrange(), 1); + UtilEnt.CreatureMoveFast(tutorial.getZombie2(), tutorial.getOrange(), 1); + + if (tutorial.getRunning() >= 2000 && !tutorial.isHasHit1()) + { + tutorial.setHasHit1(true); + + // Zombie hit one + +// EntityZombie zombie1 = ((CraftZombie)tutorial.getZombie1()).getHandle(); +// zombie1.world.broadcastEntityEffect(zombie1, (byte) 4); // Attack effect +// + tutorial.getZombie2().damage(1); // Hurt effect + + return; + } + + if (tutorial.getRunning() >= 4000 && !tutorial.isHasHit2()) + { + tutorial.setHasHit2(true); + + // Zombie hit two + +// EntityZombie zombie1 = ((CraftZombie)tutorial.getZombie1()).getHandle(); +// zombie1.world.broadcastEntityEffect(zombie1, (byte) 4); // Attack effect +// + tutorial.getZombie2().damage(1); // Hurt effect + + return; + } + + if (tutorial.getRunning() >= 5000 && !tutorial.getZombie2().isDead()) + { + // Zombie remove time + + tutorial.getZombie2().remove(); + } + + if (tutorial.getRunning() > 5000) + { + // Particles + + if (tutorial.getZombie1() == null || tutorial.getPink() == null) + return; + + UtilEnt.CreatureMoveFast(tutorial.getZombie1(), tutorial.getPink(), 1); + + for (Location loc : UtilShapes.getLinesDistancedPoints(tutorial.getZombie1().getLocation(), tutorial.getPink(), 0.2)) + { + UtilParticle.PlayParticle(UtilParticle.ParticleType.HAPPY_VILLAGER, loc, 0.03f, 0.03f, 0.03f, 0, 3, + UtilParticle.ViewDist.LONG, UtilServer.getPlayers()); + } + } + } + + @Override + public void addTutorials() + { + GetTeamList().get(0).setTutorial(new TutorialGladiators(Manager)); + } + @Override public void ParseData() { @@ -240,14 +376,21 @@ public class Gladiators extends SoloGame } } - for (Arena a : _gameArenaSet) - { - if (a.getCapacity() <= 0) - continue; + // Moved the below to tutorial - for (Location l : a.capacitySpawns()) - GetTeamList().get(0).GetSpawns().add(l); - } +// for (Arena a : _gameArenaSet) +// { +// if (a.getCapacity() <= 0) +// continue; +// +// for (Location l : a.capacitySpawns()) +// GetTeamList().get(0).GetSpawns().add(l); +// } + } + + public ArrayList getGameArenaSet() + { + return _gameArenaSet; } public ArrayList getArenasOfType(ArenaType type) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java new file mode 100644 index 000000000..bb4e97c2e --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java @@ -0,0 +1,135 @@ +package nautilus.game.arcade.game.games.gladiators.tutorial; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.entity.Zombie; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.gladiators.Arena; +import nautilus.game.arcade.game.games.gladiators.Gladiators; +import nautilus.game.arcade.gametutorial.GameTutorial; +import nautilus.game.arcade.gametutorial.TutorialPhase; + +/** + * Created by William (WilliamTiger). + * 10/12/15 + */ +public class TutorialGladiators extends GameTutorial +{ + + private Gladiators _host; + + private Location _pink, _orange; + private Zombie _zombie1, _zombie2; + + private boolean hasHit1, hasHit2; + + public TutorialGladiators(ArcadeManager manager) + { + super(manager, new TutorialPhase[]{ + new TutorialPhaseGladiators() + }); + + TeleportOnEnd = false; + + hasHit1 = false; + hasHit2 = false; + + _host = (Gladiators) manager.GetGame(); + } + + public Location getPink() + { + return _pink; + } + + public void setPink(Location pink) + { + _pink = pink; + } + + public Location getOrange() + { + return _orange; + } + + public void setOrange(Location orange) + { + _orange = orange; + } + + public Zombie getZombie1() + { + return _zombie1; + } + + public void setZombie1(Zombie zombie1) + { + _zombie1 = zombie1; + } + + public Zombie getZombie2() + { + return _zombie2; + } + + public void setZombie2(Zombie zombie2) + { + _zombie2 = zombie2; + } + + public boolean isHasHit1() + { + return hasHit1; + } + + public void setHasHit1(boolean hasHit1) + { + this.hasHit1 = hasHit1; + } + + public boolean isHasHit2() + { + return hasHit2; + } + + public void setHasHit2(boolean hasHit2) + { + this.hasHit2 = hasHit2; + } + + @Override + public void onEnd() + { + Gladiators game = (Gladiators) Manager.GetGame(); + + for (Player p : game.GetPlayers(true)) + { + p.teleport(game.GetTeam(p).GetSpawn().clone()); + } + + if (_zombie1 != null) + _zombie1.remove(); + + if (_zombie2 != null) + _zombie2.remove(); + + // Spawns + + _host.GetTeamList().get(0).GetSpawns().clear(); + + for (Arena a : _host.getGameArenaSet()) + { + if (a.getCapacity() <= 0) + continue; + + for (Location l : a.capacitySpawns()) + _host.GetTeamList().get(0).GetSpawns().add(l); + } + + for (Player p : _host.GetPlayers(true)) + { + _host.GetTeam(p).SpawnTeleport(p); + } + } +} \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java new file mode 100644 index 000000000..8df753ec4 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -0,0 +1,27 @@ +package nautilus.game.arcade.game.games.gladiators.tutorial; + +import nautilus.game.arcade.gametutorial.TutorialPhase; +import nautilus.game.arcade.gametutorial.TutorialText; + +/** + * Created by William (WilliamTiger). + * 10/12/15 + */ +public class TutorialPhaseGladiators extends TutorialPhase +{ + + public TutorialPhaseGladiators() + { + super(new TutorialText[]{ + new TutorialText("Defeat your opponent!", 20 * 6, 1), + new TutorialText("Follow the particles...", 20 * 2, 2), + new TutorialText("...to the next arena!", 20 * 2, 3) + }); + } + + @Override + public int ID() + { + return 1; + } +} \ No newline at end of file From 29510880057568433f083d2b2fe5778b88d4fd20 Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 20:48:13 +0000 Subject: [PATCH 122/223] Tutorial changes/additions. --- .../game/games/gladiators/Gladiators.java | 35 +++++++++++++++---- .../tutorial/TutorialGladiators.java | 5 +++ .../tutorial/TutorialPhaseGladiators.java | 6 ++-- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 8a4956992..f93ff258f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -23,6 +23,8 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation; + import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; @@ -30,6 +32,7 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilShapes; import mineplex.core.common.util.UtilTextMiddle; @@ -185,9 +188,15 @@ public class Gladiators extends SoloGame // Zombie hit one -// EntityZombie zombie1 = ((CraftZombie)tutorial.getZombie1()).getHandle(); -// zombie1.world.broadcastEntityEffect(zombie1, (byte) 4); // Attack effect -// + PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); + packet.a = tutorial.getZombie1().getEntityId(); + packet.b = 0; + + for (Player p : UtilServer.getPlayers()) + { + UtilPlayer.sendPacket(p, packet); // Attack effect + } + tutorial.getZombie2().damage(1); // Hurt effect return; @@ -199,9 +208,15 @@ public class Gladiators extends SoloGame // Zombie hit two -// EntityZombie zombie1 = ((CraftZombie)tutorial.getZombie1()).getHandle(); -// zombie1.world.broadcastEntityEffect(zombie1, (byte) 4); // Attack effect -// + PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); + packet.a = tutorial.getZombie1().getEntityId(); + packet.b = 0; + + for (Player p : UtilServer.getPlayers()) + { + UtilPlayer.sendPacket(p, packet); // Attack effect + } + tutorial.getZombie2().damage(1); // Hurt effect return; @@ -211,7 +226,13 @@ public class Gladiators extends SoloGame { // Zombie remove time + tutorial.getZombie2().damage(1); + UtilFirework.playFirework(tutorial.getZombie2().getLocation(), FireworkEffect.Type.BALL, Color.ORANGE, false, false); tutorial.getZombie2().remove(); + + Arena gateArena = getArenaByMid(tutorial.getOrange()); + for (Location loc : gateArena.getDoorBlocks()) + loc.getBlock().setType(Material.AIR); // Manual door open. } if (tutorial.getRunning() > 5000) @@ -295,7 +316,7 @@ public class Gladiators extends SoloGame { _gameArenaSet = new ArrayList<>(); - GetTeamList().get(0).GetSpawns().clear(); // Clear the original game spawns. + //GetTeamList().get(0).GetSpawns().clear(); // Clear the original game spawns. int neededSpawns = Math.min(GetPlayers(true).size(), 16); // Quick fix Arena masterNode = getArenasOfType(ArenaType.RED).get(0); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java index bb4e97c2e..48bfebcba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java @@ -1,6 +1,7 @@ package nautilus.game.arcade.game.games.gladiators.tutorial; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.entity.Zombie; @@ -114,6 +115,10 @@ public class TutorialGladiators extends GameTutorial if (_zombie2 != null) _zombie2.remove(); + Arena gateArena = _host.getArenaByMid(getOrange()); + for (Location loc : gateArena.getDoorBlocks()) + loc.getBlock().setType(Material.FENCE); // Manual door close. + // Spawns _host.GetTeamList().get(0).GetSpawns().clear(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java index 8df753ec4..2299651f3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -13,9 +13,9 @@ public class TutorialPhaseGladiators extends TutorialPhase public TutorialPhaseGladiators() { super(new TutorialText[]{ - new TutorialText("Defeat your opponent!", 20 * 6, 1), - new TutorialText("Follow the particles...", 20 * 2, 2), - new TutorialText("...to the next arena!", 20 * 2, 3) + new TutorialText("Defeat your opponent!", 20 * 5, 1), + new TutorialText("", 20 * 2, 2), + new TutorialText("") }); } From 8d7b03e3f64fc1e94f8c596e3974c07024e48762 Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 20:52:41 +0000 Subject: [PATCH 123/223] Added the ability to have title AND subtitle per TutorialText. --- .../arcade/gametutorial/TutorialPhase.java | 2 +- .../arcade/gametutorial/TutorialText.java | 25 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index b140b79bc..222028622 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -136,7 +136,7 @@ public abstract class TutorialPhase i++; } displayMessage(text); - UtilTextMiddle.display("", text.getText(), 0, text.getStayTime(), 0, players); + UtilTextMiddle.display((text.getBigText() == null ? "" : text.getBigText()), text.getText(), 0, text.getStayTime(), 0, players); try { Thread.sleep(text.getStayTime() * 50); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java index dba1d39a6..cc438d484 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -7,6 +7,7 @@ public class TutorialText { private String _text; + private String _bigText; private int _stayTime; private int _id; private Sound _sound; @@ -33,6 +34,24 @@ public class TutorialText { this(text, stayTime, id, Sound.NOTE_PLING); } + + public TutorialText(String text, String bigText, int id) + { + this(text, (int) (Math.round(1.5 * text.length()) + 25), id, Sound.NOTE_PLING); + _bigText = bigText; + } + + public TutorialText(String text, String bigText, int id, Sound sound) + { + this(text, (int) (Math.round(1.5 * text.length()) + 25), id, sound); + _bigText = bigText; + } + + public TutorialText(String text, String bigText, int stayTime, int id) + { + this(text, stayTime, id, Sound.NOTE_PLING); + _bigText = bigText; + } public String getText() { @@ -58,5 +77,9 @@ public class TutorialText { _text = text; } - + + public String getBigText() + { + return _bigText; + } } From 4cf33eef056ddb3996b754a92e727fa8ae773f07 Mon Sep 17 00:00:00 2001 From: William Burns Date: Thu, 10 Dec 2015 21:32:14 +0000 Subject: [PATCH 124/223] Tutorial changes! --- .../game/games/gladiators/Gladiators.java | 28 +++++++++++++++---- .../tutorial/TutorialPhaseGladiators.java | 4 +-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index f93ff258f..260f7bd2c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -7,12 +7,14 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Queue; +import java.util.UUID; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Zombie; @@ -25,8 +27,11 @@ import org.bukkit.inventory.ItemStack; import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation; +import com.mojang.authlib.GameProfile; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.ProfileLoader; +import mineplex.core.common.util.UUIDFetcher; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; @@ -36,6 +41,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilShapes; import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.disguise.disguises.DisguisePlayer; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -131,8 +137,11 @@ public class Gladiators extends SoloGame CreatureAllowOverride = false; for (Zombie zombie : Arrays.asList(zombie1, zombie2)) { - //DisguisePlayer player = new DisguisePlayer(zombie); - //Manager.GetDisguise().disguise(player); + GameProfile tiger = new ProfileLoader(UUIDFetcher.getUUIDOf("WilliamTiger").toString(), "WilliamTiger").loadProfile(); + GameProfile random = stealGameProfile(); + DisguisePlayer player = new DisguisePlayer(zombie, (zombie.equals(zombie1) ? tiger : random)); + Manager.GetDisguise().disguise(player); + UtilEnt.Vegetate(zombie); zombie.getEquipment().setHelmet(ArenaType.ORANGE.getLoadout().getHelmet()); zombie.getEquipment().setChestplate(ArenaType.ORANGE.getLoadout().getChestplate()); @@ -149,6 +158,14 @@ public class Gladiators extends SoloGame ((TutorialGladiators)e.getTutorial()).setZombie2(zombie2); } + private GameProfile stealGameProfile() + { + Player random = UtilServer.getPlayers()[0]; + GameProfile gp = new GameProfile(UUID.randomUUID(), random.getName()); + gp.getProperties().putAll(((CraftPlayer)random).getHandle().getProfile().getProperties()); + return gp; + } + @EventHandler public void tutorialUpdate(UpdateEvent e) { @@ -189,7 +206,7 @@ public class Gladiators extends SoloGame // Zombie hit one PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); - packet.a = tutorial.getZombie1().getEntityId(); + packet.a = Manager.GetDisguise().getDisguise(tutorial.getZombie1()).GetEntityId(); packet.b = 0; for (Player p : UtilServer.getPlayers()) @@ -209,7 +226,7 @@ public class Gladiators extends SoloGame // Zombie hit two PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); - packet.a = tutorial.getZombie1().getEntityId(); + packet.a = Manager.GetDisguise().getDisguise(tutorial.getZombie1()).GetEntityId(); packet.b = 0; for (Player p : UtilServer.getPlayers()) @@ -876,7 +893,8 @@ public class Gladiators extends SoloGame if (a.getState() == ArenaState.FIGHTING) start = a.getStateTime(); } - int time = Math.round((float)((60000L + start) - System.currentTimeMillis())); + double number = ((start + 60000) - System.currentTimeMillis()); + int time = (int)(number / 1000.0 + 0.5); if (time < 0) Scoreboard.Write("Poison Active"); else diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java index 2299651f3..80ff77bca 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -13,9 +13,9 @@ public class TutorialPhaseGladiators extends TutorialPhase public TutorialPhaseGladiators() { super(new TutorialText[]{ - new TutorialText("Defeat your opponent!", 20 * 5, 1), + new TutorialText("Defeat your opponent!", 20 * 4, 1), new TutorialText("", 20 * 2, 2), - new TutorialText("") + new TutorialText("To the next arena!", "Follow the particles", 20 * 4, 3) }); } From 851b613d2e6a9e2db6ba71d19a12729888b5fe3f Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 17:04:15 -0500 Subject: [PATCH 125/223] Now playing fix --- .../mineplex/core/noteblock/NBSReader.java | 7 +- .../mineplex/core/noteblock/NotePlayer.java | 94 +++++++++++-------- .../src/mineplex/hub/HubManager.java | 2 +- 3 files changed, 62 insertions(+), 41 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java index 1ca887ede..e7844c9d1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NBSReader.java @@ -16,10 +16,10 @@ public class NBSReader { public static NoteSong loadSong(String fileName) throws FileNotFoundException { - return loadSong(new DataInputStream(new FileInputStream(new File(fileName)))); + return loadSong(new DataInputStream(new FileInputStream(new File(fileName))), fileName); } - public static NoteSong loadSong(DataInputStream stream) + public static NoteSong loadSong(DataInputStream stream, String defaultName) { try { @@ -41,6 +41,9 @@ public class NBSReader int blocksRemoved = readInt(stream); String midiFileName = readString(stream); + if ((name == null || name.length() == 0) && defaultName != null) + name = defaultName; + HashMap layerMap = new HashMap(); // Note Block Information diff --git a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java index 70e5a8c1f..941bc1dd9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/noteblock/NotePlayer.java @@ -1,10 +1,7 @@ package mineplex.core.noteblock; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Objects; -import java.util.stream.Stream; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -43,38 +40,49 @@ public class NotePlayer private void startThread() { - Thread thread = new Thread(() -> { - while (!_finished) + Thread thread = new Thread(new Runnable() + { + @Override + public void run() { - _tick++; - if (_tick > _song.getLength()) + long startTime = System.currentTimeMillis(); + while (!_finished) { - if (_loop) + _tick++; + if (_tick > _song.getLength()) { - _tick = 1; + if (_loop) + { + _tick = 1; + } + else + { + _finished = true; + + _plugin.getServer().getScheduler().runTask(_plugin, new Runnable() + { + @Override + public void run() + { + SongFinishEvent event = new SongFinishEvent(_song); + _plugin.getServer().getPluginManager().callEvent(event); + } + }); + + return; + } } - else + + playTick(_tick); + + try { - _finished = true; - - _plugin.getServer().getScheduler().runTask(_plugin, () -> { - SongFinishEvent event = new SongFinishEvent(_song); - _plugin.getServer().getPluginManager().callEvent(event); - }); - - return; + Thread.sleep(_sleepMs); + } + catch (InterruptedException e) + { + e.printStackTrace(); } - } - - playTick(_tick); - - try - { - Thread.sleep(_sleepMs); - } - catch (InterruptedException e) - { - e.printStackTrace(); } } }); @@ -82,18 +90,28 @@ public class NotePlayer thread.start(); } - private void playNote(Note note, float volume, Collection players) - { - players.stream().filter(_verifier::shouldPlay).forEach((player) -> - player.playSound(player.getEyeLocation(), UtilNote.getInstrumentSound(note.getInstrument()), volume, (float) UtilNote.getPitch(note.getNote() - 33))); - } - private void playTick(int tick) { - Collection players = UtilServer.getPlayersCollection(); + Player[] playerArray = UtilServer.getPlayers(); + List players = new ArrayList<>(playerArray.length); + for (Player player : playerArray) + { + if (_verifier.shouldPlay(player)) + players.add(player); + } - float volume = _volumeMult * 1F; - _song.getLayers().stream().map(layer -> layer.getNote(tick)).filter(Objects::nonNull).forEach((note) -> playNote(note, volume, players)); + for (NoteLayer layer : _song.getLayers()) + { + Note note = layer.getNote(tick); + if (note != null) + { + float volume = _volumeMult * (layer.getVolume() / 100F); + for (Player player : players) + { + player.playSound(player.getEyeLocation(), UtilNote.getInstrumentSound(note.getInstrument()), volume, (float) UtilNote.getPitch(note.getNote() - 33)); + } + } + } } public void cancel() diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 78bf6f694..2dd2823cb 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -261,7 +261,7 @@ public class HubManager extends MiniClientPlugin if (file.getName().endsWith(".nbs")) { System.out.println("Loading Song " + file.getPath()); - NoteSong song = NBSReader.loadSong(new DataInputStream(new FileInputStream(file))); + NoteSong song = NBSReader.loadSong(new DataInputStream(new FileInputStream(file)), file.getName().replace("_", " ").replace(".nbs", "")); if (song != null) { _songs.add(song); From d16d9a36e9e86d95ed904016d90b320dff2eec32 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 17:25:39 -0500 Subject: [PATCH 126/223] Use Account ID from client manager instead of PlayerCache --- .../src/mineplex/core/inventory/InventoryManager.java | 3 ++- .../src/mineplex/core/treasure/TreasureStyle.java | 10 +++++++++- .../src/mineplex/core/treasure/TreasureType.java | 4 +++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java index 82becc622..0a32aa977 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java @@ -93,6 +93,7 @@ public class InventoryManager extends MiniDbClientPlugin public void addItemToInventory(final Callback callback, final Player player, final String item, final int count) { + int accountId = getClientManager().getAccountId(player); addItemToInventoryForOffline(new Callback() { public void run(Boolean success) @@ -105,7 +106,7 @@ public class InventoryManager extends MiniDbClientPlugin if (callback != null) callback.run(success); } - }, player.getUniqueId(), item, count); + }, accountId, item, count); } public boolean validItem(String item) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java index 8875cac4a..38828ee6b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java @@ -25,7 +25,15 @@ public enum TreasureStyle ParticleType.LARGE_EXPLODE, ParticleType.INSTANT_SPELL, Sound.PORTAL_TRAVEL, - Sound.ANVIL_LAND); + Sound.ANVIL_LAND), + + CHRISTMAS( + ParticleType.SNOW_SHOVEL, + ParticleType.SNOWBALL_POOF, + ParticleType.FIREWORKS_SPARK, + Sound.FIZZ, + Sound.CHICKEN_EGG_POP + ); private ParticleType _secondaryParticle; private ParticleType _chestSpawnParticle; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java index 1d6a5a399..ab8660490 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java @@ -11,7 +11,9 @@ public enum TreasureType ANCIENT(C.cGold + "Ancient Chest", "Ancient Chest", "Ancient", RewardType.AncientChest, Material.TRAPPED_CHEST, TreasureStyle.ANCIENT), - MYTHICAL(C.cRed + "Mythical Chest", "Mythical Chest", "Mythical", RewardType.MythicalChest, Material.ENDER_CHEST, TreasureStyle.MYTHICAL); + MYTHICAL(C.cRed + "Mythical Chest", "Mythical Chest", "Mythical", RewardType.MythicalChest, Material.ENDER_CHEST, TreasureStyle.MYTHICAL), + + CHRISTMAS(C.cAqua + "Christmas Chest", "Christmas Chest", "Christmas", RewardType.MythicalChest, Material.CHEST, TreasureStyle.CHRISTMAS); private final String _name; private final RewardType _rewardType; From a6a4c8be361bf8303b614d10dbad9f7ed8c694eb Mon Sep 17 00:00:00 2001 From: xGamingDudex Date: Fri, 11 Dec 2015 01:05:32 +0100 Subject: [PATCH 127/223] Cosmetic Update + Added GadgetDisable Event + Renamed GadgetActivateEvent to GadgetEnable event + Added hat framework, and some example hats + Added sets and Frost Lord set + Fixed some imports + Added new way of checking ownership of gadgets + Added some utility methods to GadgetManager + Added support for alternative package name of gadgets + Fixed coal + New Blood Helix particle --- .../core/cosmetic/ui/page/CostumePage.java | 3 + .../core/cosmetic/ui/page/GadgetPage.java | 2 +- .../core/cosmetic/ui/page/HatPage.java | 11 ++ .../mineplex/core/gadget/GadgetManager.java | 107 ++++++++++-------- .../core/gadget/event/GadgetDisableEvent.java | 43 +++++++ ...ivateEvent.java => GadgetEnableEvent.java} | 7 +- .../arrowtrail/ArrowTrailFrostLord.java | 4 +- .../gadget/gadgets/death/DeathFrostLord.java | 2 +- .../doublejump/DoubleJumpFrostLord.java | 10 +- .../core/gadget/gadgets/hat/HatCoal.java | 18 +++ .../core/gadget/gadgets/hat/HatPresent.java | 15 +++ .../core/gadget/gadgets/hat/HatSanta.java | 15 +++ .../core/gadget/gadgets/hat/HatSnowman.java | 15 +++ .../core/gadget/gadgets/item/ItemCoal.java | 18 ++- .../gadget/gadgets/outfit/OutfitTeam.java | 4 +- .../gadgets/particle/ParticleFrostLord.java | 28 +++-- .../gadgets/particle/ParticleHelix.java | 59 +++++++++- .../gadgets/particle/ParticleTitan.java | 7 +- .../core/gadget/set/SetFrostLord.java | 38 +++++++ .../core/gadget/types/ArrowEffectGadget.java | 4 +- .../core/gadget/types/DeathEffectGadget.java | 4 +- .../gadget/types/DoubleJumpEffectGadget.java | 8 +- .../mineplex/core/gadget/types/Gadget.java | 31 ++++- .../mineplex/core/gadget/types/GadgetSet.java | 93 +++++++++++++++ .../mineplex/core/gadget/types/HatGadget.java | 92 +++++++++++++++ .../core/gadget/types/MusicGadget.java | 4 +- .../core/gadget/types/ParticleGadget.java | 4 +- .../game/arcade/command/DisguiseCommand.java | 4 +- .../arcade/game/games/event/EventGame.java | 8 +- 29 files changed, 546 insertions(+), 112 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetDisableEvent.java rename Plugins/Mineplex.Core/src/mineplex/core/gadget/event/{GadgetActivateEvent.java => GadgetEnableEvent.java} (88%) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java index 144131e81..803f8705f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java @@ -3,11 +3,14 @@ package mineplex.core.cosmetic.ui.page; import java.util.ArrayList; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import com.sun.org.glassfish.gmbal.ManagedAttribute; + import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.C; import mineplex.core.cosmetic.CosmeticManager; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index cebfad6bd..317f6503c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -109,7 +109,7 @@ public class GadgetPage extends ShopPageBase itemLore.add(C.cWhite + "Your Ammo : " + C.cGreen + getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.GetName())); } - if (gadget.IsFree() || getDonationManager().Get(getPlayer().getName()).OwnsUnknownPackage(gadget.GetName()) || getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.GetName()) > 0) + if (gadget.ownsGadget(getPlayer())) { if (gadget.GetActive().contains(getPlayer())) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java index 8ea9fff22..4ff3ded5a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java @@ -5,6 +5,8 @@ import java.util.List; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.C; @@ -13,6 +15,7 @@ import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; +import mineplex.core.gadget.types.HatGadget; import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; @@ -37,6 +40,14 @@ public class HatPage extends GadgetPage { addGadget(gadget, slot); + ItemStack item = getItem(slot); + if(item.getType() == Material.SKULL_ITEM) + { + SkullMeta data = (SkullMeta) item.getItemMeta(); + data.setOwner(((SkullMeta)((HatGadget)gadget).getHelmetItem().getItemMeta()).getOwner()); + item.setItemMeta(data); + } + if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) addGlow(slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index e799d89e9..7af09dfe5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -1,7 +1,9 @@ package mineplex.core.gadget; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -38,6 +40,10 @@ import mineplex.core.gadget.gadgets.death.DeathTitan; import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane; import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord; import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan; +import mineplex.core.gadget.gadgets.hat.HatCoal; +import mineplex.core.gadget.gadgets.hat.HatPresent; +import mineplex.core.gadget.gadgets.hat.HatSanta; +import mineplex.core.gadget.gadgets.hat.HatSnowman; import mineplex.core.gadget.gadgets.item.ItemBatGun; import mineplex.core.gadget.gadgets.item.ItemCoal; import mineplex.core.gadget.gadgets.item.ItemCoinBomb; @@ -83,7 +89,9 @@ import mineplex.core.gadget.gadgets.particle.ParticleHelix; import mineplex.core.gadget.gadgets.particle.ParticleLegend; import mineplex.core.gadget.gadgets.particle.ParticleRain; import mineplex.core.gadget.gadgets.particle.ParticleTitan; +import mineplex.core.gadget.set.SetFrostLord; import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetSet; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.gadget.types.MusicGadget; @@ -113,6 +121,8 @@ public class GadgetManager extends MiniPlugin private NautHashMap _lastMove = new NautHashMap(); private NautHashMap> _playerActiveGadgetMap = new NautHashMap>(); + private HashSet _sets = new HashSet<>(); + private boolean _hideParticles = false; private int _activeItemSlot = 3; @@ -133,6 +143,12 @@ public class GadgetManager extends MiniPlugin _achievementManager = achievementManager; CreateGadgets(); + createSets(); + } + + private void createSets() + { + addSet(new SetFrostLord(this)); } private void CreateGadgets() @@ -218,6 +234,11 @@ public class GadgetManager extends MiniPlugin addGadget(new DoubleJumpTitan(this)); addGadget(new DoubleJumpCandyCane(this)); + // Hat + addGadget(new HatSanta(this)); + addGadget(new HatSnowman(this)); + addGadget(new HatPresent(this)); + addGadget(new HatCoal(this)); // Music addGadget(new MusicGadget(this, "13 Disc", new String[] {""}, -2, 2256, 178000)); @@ -233,6 +254,42 @@ public class GadgetManager extends MiniPlugin addGadget(new MusicGadget(this, "Wait Disc", new String[] {""}, -2, 2267, 238000)); } + public Gadget getGadget(Class c) + { + for(GadgetType type : GadgetType.values()) + { + for(Gadget gadget : getGadgets(type)) + { + if(gadget.getClass().equals(c)) return gadget; + } + } + return null; + } + + public Set getSets(Gadget gadget) + { + HashSet hset = new HashSet<>(); + for(GadgetSet set : _sets) + { + if(set.isPartOfSet(gadget)) hset.add(set); + } + return hset; + } + + public GadgetSet getGadgetSet(Class c) + { + for(GadgetSet set : _sets) + { + if(set.getClass().equals(c)) return set; + } + return null; + } + + private void addSet(GadgetSet set) + { + _sets.add(set); + } + private void addGadget(Gadget gadget) { if (!_gadgets.containsKey(gadget.getGadgetType())) @@ -284,56 +341,6 @@ public class GadgetManager extends MiniPlugin } } } - - /* - public void RemoveItem(Player player) - { - for (GadgetType gadgetType : _gadgets.keySet()) - { - for (Gadget gadget : _gadgets.get(gadgetType)) - { - if (gadget instanceof ItemGadget) - { - ItemGadget item = (ItemGadget) gadget; - - item.RemoveItem(player); - } - } - } - } - - public void RemoveParticle(Player player) - { - for (GadgetType gadgetType : _gadgets.keySet()) - { - for (Gadget gadget : _gadgets.get(gadgetType)) - { - if (gadget instanceof ParticleGadget) - { - ParticleGadget part = (ParticleGadget) gadget; - - part.Disable(player); - } - } - } - } - - public void RemoveMorph(Player player) - { - for (GadgetType gadgetType : _gadgets.keySet()) - { - for (Gadget gadget : _gadgets.get(gadgetType)) - { - if (gadget instanceof MorphGadget) - { - MorphGadget part = (MorphGadget) gadget; - - part.Disable(player); - } - } - } - } - */ public void removeGadetType(Player player, GadgetType type) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetDisableEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetDisableEvent.java new file mode 100644 index 000000000..000eace62 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetDisableEvent.java @@ -0,0 +1,43 @@ +package mineplex.core.gadget.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import mineplex.core.gadget.types.Gadget; + +public class GadgetDisableEvent extends Event +{ + + private static final HandlerList handlers = new HandlerList(); + + private Player _player; + private Gadget _gadget; + + public GadgetDisableEvent(Player player, Gadget gadget) + { + _player = player; + _gadget = gadget; + } + + public Player getPlayer() + { + return _player; + } + + public Gadget getGadget() + { + return _gadget; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public HandlerList getHandlers() + { + return handlers; + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetActivateEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetEnableEvent.java similarity index 88% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetActivateEvent.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetEnableEvent.java index 913d4860a..05112dfbf 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetActivateEvent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/GadgetEnableEvent.java @@ -7,16 +7,17 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -public class GadgetActivateEvent extends Event +public class GadgetEnableEvent extends Event { private static final HandlerList handlers = new HandlerList(); private Player _player; private Gadget _gadget; + private boolean _cancelled = false; - public GadgetActivateEvent(Player player, Gadget gadget) + public GadgetEnableEvent(Player player, Gadget gadget) { _player = player; _gadget = gadget; @@ -41,7 +42,7 @@ public class GadgetActivateEvent extends Event { return _player; } - + public void setCancelled(boolean cancel) { _cancelled = cancel; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java index 658c25e72..41659abca 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java @@ -15,14 +15,14 @@ public class ArrowTrailFrostLord extends ArrowEffectGadget { public ArrowTrailFrostLord(GadgetManager manager) { - super(manager, "Frost Lord Arrow Trail", new String[] + super(manager, "Arrows of the Frost Lord", new String[] { C.cWhite + "You are a mighty frost lord.", C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", }, 10, - Material.SNOW_BALL, (byte)0); + Material.SNOW_BALL, (byte)0, "Frost Lord"); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java index 91cc05ad6..f0e5d5d42 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java @@ -19,7 +19,7 @@ public class DeathFrostLord extends DeathEffectGadget C.cWhite + "are enchanted with snow powers.", }, 10, - Material.SNOW_BALL, (byte)0); + Material.SNOW_BALL, (byte)0, "Frost Lord"); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java index 365d6d1ce..ab1047715 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java @@ -2,27 +2,25 @@ package mineplex.core.gadget.gadgets.doublejump; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerToggleFlightEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; -import mineplex.core.gadget.types.DoubleJumpEffectGadget; +import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.DoubleJumpEffectGadget; public class DoubleJumpFrostLord extends DoubleJumpEffectGadget { public DoubleJumpFrostLord(GadgetManager manager) { - super(manager, "Frost Lord Jump Effect", new String[] + super(manager, "Boots of the Frost Lord", new String[] { C.cWhite + "More snow incomming.", }, 1, - Material.SNOW_BALL, (byte)0); + Material.SNOW_BALL, (byte)0, "Frost Lord"); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java new file mode 100644 index 000000000..5a58edd2e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java @@ -0,0 +1,18 @@ +package mineplex.core.gadget.gadgets.hat; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.C; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.HatGadget; + +public class HatCoal extends HatGadget +{ + + public HatCoal(GadgetManager manager) + { + super(manager, "Coal Hat", new String[]{C.cWhite + "Coal Hat"}, 10, new ItemStack(Material.COAL_BLOCK)); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java new file mode 100644 index 000000000..393f956b2 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.hat; + +import mineplex.core.common.util.C; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.HatGadget; + +public class HatPresent extends HatGadget +{ + + public HatPresent(GadgetManager manager) + { + super(manager, "Present Hat", new String[]{C.cWhite + "Present Hat"}, 10, "christmasgift"); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java new file mode 100644 index 000000000..618e1005e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.hat; + +import mineplex.core.common.util.C; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.HatGadget; + +public class HatSanta extends HatGadget +{ + + public HatSanta(GadgetManager manager) + { + super(manager, "Santa Hat", new String[]{C.cWhite + "Santa Hat"}, 10, "Presents"); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java new file mode 100644 index 000000000..69a2ca1f5 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.hat; + +import mineplex.core.common.util.C; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.HatGadget; + +public class HatSnowman extends HatGadget +{ + + public HatSnowman(GadgetManager manager) + { + super(manager, "Snowman Hat", new String[]{C.cWhite + "Snowman Hat"}, 10, "snowman002"); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index 38ff604cc..b0fae1e93 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -58,17 +58,23 @@ public class ItemCoal extends ItemGadget { if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) { - player.sendMessage(F.main("Coal", "You unlocked " + C.cDGray + "COAL FUMES!")); - UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); - UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); - player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); Manager.getInventoryManager().addItemToInventory(new Callback() { @Override public void run(Boolean data) { - Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); - player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + if(data) + { + player.sendMessage(F.main("Coal", "You unlocked " + C.cDGray + "COAL FUMES!")); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); + player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); + + Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + } else { + player.sendMessage("Something went wrong..."); + } } }, player, "Coal Fumes", 1); return; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java index 2e65b7ae5..6b598c419 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java @@ -19,7 +19,7 @@ import mineplex.core.common.util.F; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.OutfitGadget; import mineplex.core.gadget.types.OutfitGadget.ArmorSlot; @@ -41,7 +41,7 @@ public class OutfitTeam extends OutfitGadget @Override public void Enable(Player player) { - GadgetActivateEvent gadgetEvent = new GadgetActivateEvent(player, this); + GadgetEnableEvent gadgetEvent = new GadgetEnableEvent(player, this); Bukkit.getServer().getPluginManager().callEvent(gadgetEvent); if (gadgetEvent.isCancelled()) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index 7d7a01928..e01e24201 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -1,28 +1,25 @@ package mineplex.core.gadget.gadgets.particle; import java.util.HashSet; -import java.util.Iterator; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Arrow; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.entity.ProjectileLaunchEvent; -import org.bukkit.event.player.PlayerToggleFlightEvent; -import mineplex.core.blood.BloodEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilServer; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.set.SetFrostLord; +import mineplex.core.gadget.types.GadgetSet; import mineplex.core.gadget.types.ParticleGadget; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.gadget.GadgetManager; public class ParticleFrostLord extends ParticleGadget { @@ -30,14 +27,14 @@ public class ParticleFrostLord extends ParticleGadget public ParticleFrostLord(GadgetManager manager) { - super(manager, "Frost Lord Particle", new String[] + super(manager, "Wind of the Frost Lord", new String[] { C.cWhite + "You are a mighty frost lord.", C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", }, 10, - Material.SNOW_BALL, (byte)0); + Material.SNOW_BALL, (byte)0, "Frost Lord"); } @EventHandler @@ -62,12 +59,19 @@ public class ParticleFrostLord extends ParticleGadget double scale = (double)(player.getTicksLived() % 50) / 50d; - for (int i = 0 ; i < 8 ; i++) + int amount = 4; + + GadgetSet set = Manager.getGadgetSet(SetFrostLord.class); + if(set.isActive(player)) amount = 6; + + double ang = Math.PI*2/amount; + + for (int i = 0 ; i < amount ; i++) { double r = (1d-scale) * Math.PI * 2; - double x = Math.sin(r + (i * (Math.PI/4))) * (r%(Math.PI * 4)) * 0.4; - double z = Math.cos(r + (i * (Math.PI/4))) * (r%(Math.PI * 4)) * 0.4; + double x = Math.sin(r + (i * ang)) * (r%(Math.PI * 4)) * 0.4; + double z = Math.cos(r + (i * ang)) * (r%(Math.PI * 4)) * 0.4; UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, player.getLocation().add(x, scale * 3, z), 0f, 0f, 0f, 0, 1, ViewDist.NORMAL, UtilServer.getPlayers()); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java index cc4a4882e..26e47dae7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java @@ -1,20 +1,20 @@ package mineplex.core.gadget.gadgets.particle; -import org.bukkit.GameMode; +import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilServer; +import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.ParticleGadget; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.core.gadget.GadgetManager; public class ParticleHelix extends ParticleGadget { @@ -49,6 +49,56 @@ public class ParticleHelix extends ParticleGadget } else { + + int ticks = 10; + int hticks = 40; + boolean up = player.getTicksLived()%(hticks*2) < hticks; + int tick = player.getTicksLived()%ticks; + double htick = player.getTicksLived()%hticks; + int splits = 4; + + Location loc = player.getLocation().add(0, 2, 0); + + for(double d = tick*(Math.PI*2/splits)/ticks; d < Math.PI*2; d += Math.PI*2/splits) + { + Vector v = new Vector(Math.sin(d), 0, Math.cos(d)); + v.normalize().multiply(Math.max(0.2, Math.sin((htick/hticks)*Math.PI)*1.0)); + v.setY((htick/hticks) * -2); + if(up) v.setY(-2 + 2*(htick/hticks)); + + +// v.multiply(2).subtract(v.clone().multiply(htick/hticks)); +// v.multiply(2*(htick/hticks)); + + Location lloc = loc.clone().add(v); + + UtilParticle.PlayParticleToAll(ParticleType.RED_DUST, lloc, null, 0f, 2, ViewDist.NORMAL); + } + +// UtilParticle.PlayParticle(ParticleType.RED_DUST, player.getLocation().add(0, 0.1, 0), 0.5f, 0.1f, 0.5f, 0, 20, +// ViewDist.NORMAL, UtilServer.getPlayers()); + + /* + * With Flame + int ticks = 10; + int tick = player.getTicksLived()%ticks; + int splits = 3; + + Location loc = player.getLocation().add(0, 3, 0); + + for(double d = tick*(Math.PI*2/splits)/ticks; d < Math.PI*2; d += Math.PI*2/splits) + { + Vector v = new Vector(Math.sin(d), 0, Math.cos(d)); + + v.setY(-1.5); + + UtilParticle.PlayParticleToAll(ParticleType.FLAME, loc, v, 0.1f, 0, ViewDist.NORMAL); + } + + UtilParticle.PlayParticle(ParticleType.RED_DUST, player.getLocation().add(0, 0.1, 0), 0.5f, 0.1f, 0.5f, 0, 20, + ViewDist.NORMAL, UtilServer.getPlayers()); + */ + /* for (int height=0 ; height <= 20 ; height++) { for (int i=0 ; i < 2 ; i++) @@ -73,6 +123,7 @@ public class ParticleHelix extends ParticleGadget //Sound player.getWorld().playSound(player.getLocation(), Sound.LAVA, 0.3f, 1f); + */ } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index 8431e6f7c..12353e872 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -59,8 +59,11 @@ public class ParticleTitan extends ParticleGadget double r = 3; boolean redstone = false; - if(Manager.isMoving(player)) - r = 0.5; + if(Manager.isMoving(player)) + { + UtilParticle.PlayParticleToAll(ParticleType.FLAME, player.getLocation().add(0, 0.1, 0), 0.2f, 0.1f, 0.2f, 0.015f, 3, ViewDist.NORMAL); + continue; + } for(int i = 0; i < total; i++) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java new file mode 100644 index 000000000..ce34dfc65 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java @@ -0,0 +1,38 @@ +package mineplex.core.gadget.set; + +import org.bukkit.entity.Player; + +import mineplex.core.common.util.F; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord; +import mineplex.core.gadget.gadgets.death.DeathFrostLord; +import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord; +import mineplex.core.gadget.gadgets.particle.ParticleFrostLord; +import mineplex.core.gadget.types.GadgetSet; + +public class SetFrostLord extends GadgetSet +{ + + public SetFrostLord(GadgetManager manager) + { + super(manager, + manager.getGadget(ArrowTrailFrostLord.class), + manager.getGadget(DeathFrostLord.class), + manager.getGadget(DoubleJumpFrostLord.class), + manager.getGadget(ParticleFrostLord.class)); + } + + @Override + public void customEnable(Player player) + { + player.sendMessage(F.main("GadgetSet", "Enabled full set of " + F.elem("Frost Lord"))); + } + + @Override + public void customDisable(Player player) + { + player.sendMessage(F.main("GadgetSet", "Disabled full set of " + F.elem("Frost Lord"))); + + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java index 596a1e3f7..3513506a9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java @@ -20,9 +20,9 @@ public abstract class ArrowEffectGadget extends Gadget { protected HashSet _arrows = new HashSet(); - public ArrowEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + public ArrowEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data, String...altNames) { - super(manager, GadgetType.ArrowTrail, name, desc, cost, mat, data); + super(manager, GadgetType.ArrowTrail, name, desc, cost, mat, data, 1, altNames); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java index 031406193..4e04cb807 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java @@ -9,9 +9,9 @@ import mineplex.core.gadget.GadgetManager; public abstract class DeathEffectGadget extends Gadget { - public DeathEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + public DeathEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data, String...altNames) { - super(manager, GadgetType.Death, name, desc, cost, mat, data); + super(manager, GadgetType.Death, name, desc, cost, mat, data, 1, altNames); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java index 84b02523a..59575b97f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java @@ -6,18 +6,14 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerToggleFlightEvent; import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; public abstract class DoubleJumpEffectGadget extends Gadget { - public DoubleJumpEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + public DoubleJumpEffectGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data, String...altNames) { - super(manager, GadgetType.DoubleJump, name, desc, cost, mat, data); + super(manager, GadgetType.DoubleJump, name, desc, cost, mat, data, 1, altNames); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java index 063495f54..fae816a3f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java @@ -7,7 +7,8 @@ import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; +import mineplex.core.gadget.event.GadgetDisableEvent; import mineplex.core.shop.item.SalesPackageBase; import org.bukkit.Bukkit; @@ -25,18 +26,23 @@ public abstract class Gadget extends SalesPackageBase implements Listener protected HashSet _active = new HashSet(); + private String[] _alternativePackageNames; + public Gadget(GadgetManager manager, GadgetType gadgetType, String name, String[] desc, int cost, Material mat, byte data) { this(manager, gadgetType, name, desc, cost, mat, data, 1); } - public Gadget(GadgetManager manager, GadgetType gadgetType, String name, String[] desc, int cost, Material mat, byte data, int quantity) + public Gadget(GadgetManager manager, GadgetType gadgetType, String name, String[] desc, int cost, Material mat, byte data, int quantity, String... alternativesalepackageNames) { super(name, mat, data, desc, cost, quantity); _gadgetType = gadgetType; KnownPackage = false; + _alternativePackageNames = alternativesalepackageNames; + if(_alternativePackageNames == null) _alternativePackageNames = new String[0]; + Manager = manager; Manager.getPlugin().getServer().getPluginManager().registerEvents(this, Manager.getPlugin()); @@ -65,7 +71,7 @@ public abstract class Gadget extends SalesPackageBase implements Listener public void Enable(Player player) { - GadgetActivateEvent gadgetEvent = new GadgetActivateEvent(player, this); + GadgetEnableEvent gadgetEvent = new GadgetEnableEvent(player, this); Bukkit.getServer().getPluginManager().callEvent(gadgetEvent); if (gadgetEvent.isCancelled()) @@ -89,7 +95,11 @@ public abstract class Gadget extends SalesPackageBase implements Listener public void Disable(Player player) { if (IsActive(player)) + { Manager.removeActive(player, this); + GadgetDisableEvent event = new GadgetDisableEvent(player, this); + Bukkit.getServer().getPluginManager().callEvent(event); + } DisableCustom(player); } @@ -102,6 +112,21 @@ public abstract class Gadget extends SalesPackageBase implements Listener { } + + public boolean ownsGadget(Player player) + { + if(IsFree()) return true; + if(Manager.getDonationManager().Get(player.getName()).OwnsUnknownPackage(GetName())) return true; + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) > 0) return true; + + for(String alt : _alternativePackageNames) + { + if(Manager.getDonationManager().Get(player.getName()).OwnsUnknownPackage(alt)) return true; + if(Manager.getInventoryManager().Get(player).getItemCount(alt) > 0) return true; + } + + return false; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java new file mode 100644 index 000000000..94e7dde71 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java @@ -0,0 +1,93 @@ +package mineplex.core.gadget.types; + +import java.util.HashSet; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.event.GadgetEnableEvent; +import mineplex.core.gadget.event.GadgetDisableEvent; + +public abstract class GadgetSet implements Listener +{ + + private Gadget[] _gadgets; + + protected GadgetManager Manager; + + HashSet _active = new HashSet<>(); + + public GadgetSet(GadgetManager manager, Gadget... gadgets) + { + Manager = manager; + _gadgets = gadgets; + + Bukkit.getPluginManager().registerEvents(this, Manager.getPlugin()); + } + + public void checkPlayer(Player player, Gadget gadget, boolean enable) + { + boolean wasActive = isActive(player); + + for(Gadget g : _gadgets) + { + if(!g.IsActive(player) || g.equals(gadget)) + { + if(enable && g.equals(gadget)) continue; + + _active.remove(player); + if(wasActive) customDisable(player); + return; + } + } + _active.add(player); + if(!wasActive) + { + customEnable(player); + } + } + + @EventHandler + public void onActivate(GadgetEnableEvent event) + { + checkPlayer(event.getPlayer(), event.getGadget(), true); + } + + @EventHandler + public void onDeativate(GadgetDisableEvent event) + { + checkPlayer(event.getPlayer(), event.getGadget(), false); + } + + public boolean isActive(Player player) + { + return _active.contains(player); + } + + public abstract void customEnable(Player player); + + + public abstract void customDisable(Player player); + + public Gadget[] getGadgets() + { + Gadget[] array = new Gadget[_gadgets.length]; + System.arraycopy(_gadgets, 0, array, 0, array.length); + return array; + } + + public boolean isPartOfSet(Gadget gadget) + { + for(Gadget g : _gadgets) + { + if(g.equals(gadget)) return true; + } + return false; + } + + + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java new file mode 100644 index 000000000..e7ad0ea37 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java @@ -0,0 +1,92 @@ +package mineplex.core.gadget.types; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.gadget.GadgetManager; + +public abstract class HatGadget extends OutfitGadget +{ + + private ItemStack _hat; + + public HatGadget(GadgetManager manager, String name, String[] desc, int cost, ItemStack item) + { + super(manager, name, desc, cost, ArmorSlot.Helmet, item.getType(), item.getData().getData()); + _hat = item; + } + + public HatGadget(GadgetManager manager, String name, String[] desc, int cost, String playerName) + { + this(manager, name, desc, cost, getSkull(playerName)); + } + + public ItemStack getHelmetItem() + { + return _hat.clone(); + } + + public void ApplyArmor(Player player) + { + Manager.removeGadetType(player, GadgetType.Morph); + + Manager.RemoveOutfit(player, _slot); + + _active.add(player); + + UtilPlayer.message(player, F.main("Gadget", "You put on " + F.elem(GetName()) + ".")); + + player.getInventory().setHelmet(getHelmetItem()); + } + + public void RemoveArmor(Player player) + { + if (!_active.remove(player)) + return; + + UtilPlayer.message(player, F.main("Gadget", "You took off " + F.elem(GetName()) + ".")); + + player.getInventory().setHelmet(null); + } + + public static ItemStack getSkull(String playerName) + { + SkullMeta meta = (SkullMeta) Bukkit.getItemFactory().getItemMeta(Material.SKULL_ITEM); + + meta.setOwner(playerName); + + ItemStack stack = new ItemStack(Material.SKULL_ITEM,1 , (byte)3); + + stack.setItemMeta(meta); + + return stack; + } + + @Override + public GadgetType getGadgetType() + { + return GadgetType.Hat; + } + + + @Override + public void EnableCustom(Player player) + { + ApplyArmor(player); + } + + @Override + public void DisableCustom(Player player) + { + RemoveArmor(player); + } + + + + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java index 7dd175be3..c139e85c8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java @@ -8,7 +8,7 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.event.GadgetBlockEvent; import mineplex.core.gadget.gadgets.SongData; import mineplex.core.recharge.Recharge; @@ -41,7 +41,7 @@ public class MusicGadget extends Gadget @Override public void Enable(Player player) { - GadgetActivateEvent gadgetEvent = new GadgetActivateEvent(player, this); + GadgetEnableEvent gadgetEvent = new GadgetEnableEvent(player, this); Bukkit.getServer().getPluginManager().callEvent(gadgetEvent); if (gadgetEvent.isCancelled()) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java index 499972786..24444a965 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java @@ -9,9 +9,9 @@ import mineplex.core.gadget.GadgetManager; public abstract class ParticleGadget extends Gadget { - public ParticleGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data) + public ParticleGadget(GadgetManager manager, String name, String[] desc, int cost, Material mat, byte data, String...altNames) { - super(manager, GadgetType.Particle, name, desc, cost, mat, data); + super(manager, GadgetType.Particle, name, desc, cost, mat, data, 1, altNames); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java index 5b7237994..f10a8db0d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java @@ -15,7 +15,7 @@ import mineplex.core.common.util.UUIDFetcher; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.types.GadgetType; import mineplex.core.treasure.event.TreasureStartEvent; import mineplex.core.updater.UpdateType; @@ -291,7 +291,7 @@ public class DisguiseCommand extends CommandBase implements Liste } @EventHandler - public void gadget(GadgetActivateEvent event) + public void gadget(GadgetEnableEvent event) { if(!event.getGadget().GetName().equalsIgnoreCase("Coin Party Bomb") && event.getGadget().getGadgetType() != GadgetType.Morph) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java index 31e1a164a..58f1e3b2b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java @@ -25,7 +25,7 @@ import mineplex.core.disguise.disguises.DisguiseBat; import mineplex.core.disguise.disguises.DisguiseChicken; import mineplex.core.disguise.disguises.DisguiseEnderman; import mineplex.core.disguise.disguises.DisguiseWither; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.give.Give; @@ -298,7 +298,7 @@ public class EventGame extends Game } @EventHandler - public void gadgetActivate(GadgetActivateEvent event) + public void gadgetActivate(GadgetEnableEvent event) { if (!_gadgetsEnabled) event.setCancelled(true); @@ -459,7 +459,7 @@ public class EventGame extends Game } @EventHandler - public void gadgetDisable(GadgetActivateEvent event) + public void gadgetDisable(GadgetEnableEvent event) { if (_allowAllGadgets) return; @@ -931,7 +931,7 @@ public class EventGame extends Game } @EventHandler - public void activateGadget(GadgetActivateEvent event) + public void activateGadget(GadgetEnableEvent event) { for(EventArea area : _customAreas.values()) { From 5b0909012d1388b5bc19e1e77fe1e29414d0ec0a Mon Sep 17 00:00:00 2001 From: xGamingDudex Date: Fri, 11 Dec 2015 01:07:47 +0100 Subject: [PATCH 128/223] Renamed GadgetActivateEvent to GadgetEnable event Some files didn't make it to prev commit --- Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java | 4 ++-- .../src/mineplex/hub/commands/DisguiseCommand.java | 4 ++-- .../Mineplex.Hub/src/mineplex/hub/modules/KothManager.java | 4 ++-- .../src/mineplex/hub/modules/ParkourManager.java | 6 +++--- .../src/mineplex/hub/modules/SoccerManager.java | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index ad5f421a0..7d6414188 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -28,7 +28,7 @@ import mineplex.core.disguise.DisguiseManager; import mineplex.core.disguise.disguises.DisguiseSlime; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.event.GadgetCollideEntityEvent; import mineplex.core.gadget.types.GadgetType; import mineplex.core.giveaway.GiveawayManager; @@ -949,7 +949,7 @@ public class HubManager extends MiniClientPlugin } @EventHandler - public void GadgetActivate(GadgetActivateEvent event) + public void GadgetActivate(GadgetEnableEvent event) { if (!_gadgetsEnabled) event.setCancelled(true); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java index cc55696c8..2255c8a89 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java @@ -16,7 +16,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.disguises.DisguisePlayer; import mineplex.core.donation.Donor; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.treasure.event.TreasureStartEvent; @@ -285,7 +285,7 @@ public class DisguiseCommand extends CommandBase implements Listener } @EventHandler - public void gadget(GadgetActivateEvent event) + public void gadget(GadgetEnableEvent event) { if(!event.getGadget().GetName().equalsIgnoreCase("Coin Party Bomb") && event.getGadget().getGadgetType() != GadgetType.Morph) return; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java index 6f69a5782..d45cb3c8d 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/KothManager.java @@ -22,7 +22,7 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.gadgets.item.ItemDuelingSword; import mineplex.core.gadget.gadgets.outfit.OutfitTeam; import mineplex.core.gadget.types.Gadget; @@ -214,7 +214,7 @@ public class KothManager extends MiniPlugin } @EventHandler - public void disableGadgets(GadgetActivateEvent event) + public void disableGadgets(GadgetEnableEvent event) { if (isKothMode(event.getPlayer())) event.setCancelled(true); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ParkourManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ParkourManager.java index 2b4b198d3..b5d86f0d6 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ParkourManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ParkourManager.java @@ -36,7 +36,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.donation.DonationManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.event.GadgetBlockEvent; import mineplex.core.gadget.types.MusicGadget; import mineplex.core.mount.event.MountActivateEvent; @@ -138,7 +138,7 @@ public class ParkourManager extends MiniPlugin } @EventHandler - public void disableGadgets(GadgetActivateEvent event) + public void disableGadgets(GadgetEnableEvent event) { if (isParkourMode(event.getPlayer())) event.setCancelled(true); @@ -460,7 +460,7 @@ public class ParkourManager extends MiniPlugin } @EventHandler - public void musicDisable(GadgetActivateEvent event) + public void musicDisable(GadgetEnableEvent event) { if (event.getGadget() instanceof MusicGadget) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java index 687bf534c..b33dadd43 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/SoccerManager.java @@ -41,7 +41,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.gadgets.outfit.OutfitTeam; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; @@ -491,7 +491,7 @@ public class SoccerManager extends MiniPlugin } @EventHandler - public void disableGadgets(GadgetActivateEvent event) + public void disableGadgets(GadgetEnableEvent event) { if (isSoccerMode(event.getPlayer())) event.setCancelled(true); From 7b4f5d5b752f53f9d90e4ec38899644fb083f346 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 19:19:20 -0500 Subject: [PATCH 129/223] Christmas chest in gui --- .../core/treasure/gui/TreasurePage.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java index f1426accf..a4823f5d2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java @@ -39,6 +39,7 @@ public class TreasurePage extends ShopPageBase int basicCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.OLD.getItemName()); int heroicCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.ANCIENT.getItemName()); int legendaryCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.MYTHICAL.getItemName()); + int christmasCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.CHRISTMAS.getItemName()); List basicLore = new ArrayList(); basicLore.add(" "); @@ -97,17 +98,41 @@ public class TreasurePage extends ShopPageBase legendaryLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } + List christmasLore = new ArrayList(); + christmasLore.add(" "); + christmasLore.add(F.value("Christmas Chests Owned", "" + christmasCount)); + christmasLore.add(" "); + christmasLore.add(C.cGray + "All our previous adventurers have"); + christmasLore.add(C.cGray + "perished in search of these chests."); + christmasLore.add(C.cGray + "However, legends of their existence"); + christmasLore.add(C.cGray + "convinced Sterling, Chiss and Defek7"); + christmasLore.add(C.cGray + "to venture out and discover the"); + christmasLore.add(C.cGray + "location of these chests on their own."); + christmasLore.add(" "); + if (christmasCount > 0) + christmasLore.add(ChatColor.RESET + C.cGreen + "Click to Open!"); + else + { + christmasLore.add(ChatColor.RESET + "Click to Purchase for " + C.cYellow + "10000 Coins"); + christmasLore.add(" "); + christmasLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); + } + ShopItem basic = new ShopItem(Material.CHEST, C.cGreen + C.Bold + "Old Chest", basicLore.toArray(new String[0]), 0, false, false); ShopItem heroic = new ShopItem(Material.TRAPPED_CHEST, C.cGold + C.Bold + "Ancient Chest", heroicLore.toArray(new String[0]), 0, false, false); ShopItem legendary = new ShopItem(Material.ENDER_CHEST, C.cRed + C.Bold + "Mythical Chest", legendaryLore.toArray(new String[0]), 0, false, false); + ShopItem christmas = new ShopItem(Material.SNOW_BALL, C.cAqua + C.Bold + "Christmas Chest", christmasLore.toArray(new String[0]), 0, false, false); - if (basicCount > 0) addButton(2, basic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.OLD)); - else addButton(2, basic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Old Chest", Material.CHEST, 1000)); + if (basicCount > 0) addButton(1, basic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.OLD)); + else addButton(1, basic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Old Chest", Material.CHEST, 1000)); - if (heroicCount > 0) addButton(4, heroic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.ANCIENT)); - else addButton(4, heroic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Ancient Chest", Material.CHEST, 5000)); + if (heroicCount > 0) addButton(3, heroic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.ANCIENT)); + else addButton(3, heroic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Ancient Chest", Material.CHEST, 5000)); - if (legendaryCount > 0) addButton(6, legendary, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.MYTHICAL)); - else addButton(6, legendary, new BuyChestButton(getPlayer(), _inventoryManager, this, "Mythical Chest", Material.ENDER_CHEST, 10000)); + if (legendaryCount > 0) addButton(5, legendary, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.MYTHICAL)); + else addButton(5, legendary, new BuyChestButton(getPlayer(), _inventoryManager, this, "Mythical Chest", Material.ENDER_CHEST, 10000)); + + if (christmasCount > 0) addButton(6, christmas, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.CHRISTMAS)); + else addButton(6, christmas, new BuyChestButton(getPlayer(), _inventoryManager, this, "Christmas Chest", Material.SNOW_BALL, 10000)); } } From 5d96ceb41ee7b1eeaca90456906bd6a58b0e576f Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 19:20:11 -0500 Subject: [PATCH 130/223] Let owner+ disguise as staff - easy way to check a player's rank --- .../src/mineplex/hub/commands/DisguiseCommand.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java index cc55696c8..4f7e3aa8e 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java @@ -111,6 +111,8 @@ public class DisguiseCommand extends CommandBase implements Listener return; } + final Rank rank = Plugin.GetClients().Get(caller).GetRank(); + Bukkit.getServer().getScheduler().runTaskAsynchronously(Plugin.getPlugin(), new Runnable() { @Override @@ -162,7 +164,7 @@ public class DisguiseCommand extends CommandBase implements Listener otherRank = other.GetRank(); } catch(NullPointerException exception) {} - if(otherRank.has(Rank.TWITCH)) + if(otherRank.has(Rank.TWITCH) && !rank.has(Rank.OWNER)) { UtilPlayer.message(caller, C.cRed + C.Bold + "You can't disguise as staff!"); return; From 4d8b8bd58bb1aca419124a70af21c84c96609892 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 19:27:32 -0500 Subject: [PATCH 131/223] Fix errors, update cosmetic menu --- .../mineplex/core/cosmetic/ui/page/Menu.java | 41 ++++++------------- .../mineplex/core/gadget/GadgetManager.java | 4 +- .../src/mineplex/hub/HubManager.java | 6 +-- 3 files changed, 17 insertions(+), 34 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index 143794f24..a0ecf9001 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -53,37 +53,20 @@ public class Menu extends ShopPageBase // " " // }, 1, false)); - - addItem(4, new ShopItem(175, getDonationManager().Get(getPlayer().getName()).getCoins() + " Coins", new String[] - { - " ", - ChatColor.RESET + C.cYellow + "Purchase Coins", - ChatColor.RESET + "www.mineplex.com/shop", - " ", - ChatColor.RESET + C.cAqua + "Ultra Rank", - ChatColor.RESET + "Receives 7500 Coins per Month", - " ", - ChatColor.RESET + C.cPurple + "Hero Rank", - ChatColor.RESET + "Receives 15000 Coins per Month", - " ", - ChatColor.RESET + C.cGreen + "Legend Rank", - ChatColor.RESET + "Receives 30000 Coins per Month" - }, 1, false)); - - addButton(10, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this)); - addButton(12, new ShopItem(Material.ARROW, "Arrow Trails", 1, false), new OpenArrowTrails(this)); - addButton(14, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", 1, false), new OpenDoubleJump(this)); - addButton(16, new ShopItem(Material.SKULL_ITEM, "Death Animations", 1, false), new OpenDeathAnimations(this)); + addButton(1, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this)); + addButton(3, new ShopItem(Material.ARROW, "Arrow Trails", 1, false), new OpenArrowTrails(this)); + addButton(5, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", 1, false), new OpenDoubleJump(this)); + addButton(7, new ShopItem(Material.SKULL_ITEM, "Death Animations", 1, false), new OpenDeathAnimations(this)); - addButton(28, new ShopItem(Material.MELON_BLOCK, "Gadgets", 1, false), new OpenGadgets(this)); - addButton(30, new ShopItem(Material.LEATHER, "Morphs", 1, false), new OpenMorphs(this)); - addButton(32, new ShopItem(Material.IRON_BARDING, "Mounts", 1, false), new OpenMounts(this)); - addButton(34, new ShopItem(Material.BONE, "Pets", 1, false), new OpenPets(this)); + addButton(19, new ShopItem(Material.MELON_BLOCK, "Gadgets", 1, false), new OpenGadgets(this)); + addButton(21, new ShopItem(Material.LEATHER, "Morphs", 1, false), new OpenMorphs(this)); + addButton(23, new ShopItem(Material.IRON_BARDING, "Mounts", 1, false), new OpenMounts(this)); + addButton(25, new ShopItem(Material.BONE, "Pets", 1, false), new OpenPets(this)); - addButton(46, new ShopItem(Material.GOLD_HELMET, "Hats", 1, false), new OpenHats(this)); - addButton(48, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); - addButton(50, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); - addButton(52, new ShopItem(Material.NAME_TAG, "Taunts", 1, false), new IButton() + addButton(37, new ShopItem(Material.GOLD_HELMET, "Hats", 1, false), new OpenHats(this)); + addButton(39, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); + addButton(42, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); + addButton(44, new ShopItem(Material.NAME_TAG, "Taunts", 1, false), new IButton() { @Override public void onClick(Player player, ClickType clickType) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 1c6de2bb4..4f1852000 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -30,8 +30,8 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.DisguiseManager; import mineplex.core.donation.DonationManager; -import mineplex.core.gadget.event.GadgetActivateEvent; import mineplex.core.gadget.event.GadgetCollideEntityEvent; +import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane; import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord; import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailTitan; @@ -578,7 +578,7 @@ public class GadgetManager extends MiniPlugin } @EventHandler - public void GadgetActivate(GadgetActivateEvent event) + public void GadgetActivate(GadgetEnableEvent event) { if (!_gadgetsEnabled) event.setCancelled(true); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index d9673ed0b..6eaf1149a 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -234,7 +234,7 @@ public class HubManager extends MiniClientPlugin _achievementManager.setGiveInterfaceItem(true); _packetHandler = packetHandler; - new NotificationManager(getPlugin(), clientManager); + new NotificationManager(getPlugin(), clientManager, _preferences); new BotSpamManager(plugin, clientManager, punish); ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle().pvpMode = true; @@ -933,7 +933,7 @@ public class HubManager extends MiniClientPlugin GetGadget().toggleGadgetEnabled(); for (Player player : UtilServer.getPlayers()) - player.sendMessage(C.cWhite + C.Bold + "Gadgets/Mounts are now " + F.elem(_gadgetsEnabled ? C.cGreen + C.Bold + "Enabled" : C.cRed + C.Bold + "Disabled")); + player.sendMessage(C.cWhite + C.Bold + "Gadgets/Mounts are now " + F.elem(GetGadget().isGadgetEnabled() ? C.cGreen + C.Bold + "Enabled" : C.cRed + C.Bold + "Disabled")); } public void addGameMode(Player caller, Player target) @@ -1007,7 +1007,7 @@ public class HubManager extends MiniClientPlugin } @EventHandler - public void disableMusicChristmas(GadgetActivateEvent event) + public void disableMusicChristmas(GadgetEnableEvent event) { if (event.getGadget() != null && event.getGadget().getGadgetType() == GadgetType.MusicDisc) { From 626a81284454339bbca2159ace6ec3ba2096a333 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 00:40:54 +0000 Subject: [PATCH 132/223] Many changes --- .../mineplex/core/common/util/UtilItem.java | 9 + .../mineplex/core/gadget/GadgetManager.java | 9 + .../arcade/game/games/gladiators/Arena.java | 16 +- .../game/games/gladiators/Gladiators.java | 219 ++++++++++-------- .../trackers/UntouchableTracker.java | 2 +- .../tutorial/TutorialGladiators.java | 55 +++-- .../tutorial/TutorialPhaseGladiators.java | 18 +- 7 files changed, 208 insertions(+), 120 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java index c82d37f9f..5a300322c 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java @@ -12,6 +12,7 @@ import java.util.Map.Entry; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import mineplex.core.common.structs.ItemContainer; @@ -1116,4 +1117,12 @@ public class UtilItem { return _materials.containsKey(material); } + + public static ItemStack makeUnbreakable(ItemStack i) + { + ItemMeta im = i.getItemMeta(); + im.spigot().setUnbreakable(true); + i.setItemMeta(im); + return i; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index bb17d1e2f..f6ae08bb5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -298,6 +298,15 @@ public class GadgetManager extends MiniPlugin } } } + + public void DisableParticles() + { + for (Gadget gadget : _gadgets.get(GadgetType.Particle)) + { + for (Player player : UtilServer.getPlayers()) + gadget.Disable(player); + } + } public void DisableAll() { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 52079b41d..63191e213 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -44,6 +44,8 @@ public class Arena private HashMap> _particles; + private ArrayList _sentParticles; + public Arena(Gladiators host, Location mid, ArenaType colour) { _host = host; @@ -59,6 +61,7 @@ public class Arena _stateTime = System.currentTimeMillis(); _particles = new HashMap<>(); _doBye = false; + _sentParticles = new ArrayList<>(); setupSpawns(); } @@ -256,6 +259,8 @@ public class Arena { _isOpenDoor = true; + _sentParticles.clear(); + _host.Manager.getScheduler().scheduleSyncDelayedTask(_host.Manager.getPlugin(), () -> { for (Location loc : _doorBlocks) @@ -281,7 +286,11 @@ public class Arena for (Player p : getPastPlayers()) { - UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20, 0, p); + if (_sentParticles.contains(p)) + continue; + + UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20 * 100, 0, p); + _sentParticles.add(p); } } else if (_state.equals(ArenaState.FIGHTING)) @@ -308,7 +317,10 @@ public class Arena { for (Player p : getPastPlayers()) { - UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20, 0, p); + if (_sentParticles.contains(p)) + continue; + + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20 * 100, 0, p); } if (UtilTime.elapsed(_stateTime, 15000)) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 260f7bd2c..4c79a20bd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -5,21 +5,26 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Queue; -import java.util.UUID; +import java.util.Random; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Golem; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -36,6 +41,7 @@ import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; @@ -120,8 +126,11 @@ public class Gladiators extends SoloGame @EventHandler public void tutorialStart(GameTutorialStartEvent e) { + Manager.getCosmeticManager().getGadgetManager().DisableParticles(); // Particles blocking tutorial... + Location white = WorldData.GetDataLocs("WHITE").get(0); - Location orange = UtilAlg.findClosest(white, WorldData.GetDataLocs("ORANGE")); + Location purple = WorldData.GetDataLocs("PURPLE").get(0); + Location orange = UtilAlg.findClosest(purple, WorldData.GetDataLocs("ORANGE")); Location pink = UtilAlg.findClosest(orange, WorldData.GetDataLocs("PINK")); ArrayList spawns = new ArrayList<>(WorldData.GetDataLocs("BROWN")); Location spawn1 = spawns.get(0); @@ -129,41 +138,46 @@ public class Gladiators extends SoloGame Location spawn2 = spawns.get(0); e.getTutorial().getPhase(1).setLocation(white); - e.getTutorial().getPhase(1).setTarget(orange); + e.getTutorial().getPhase(1).setTarget(purple); CreatureAllowOverride = true; - Zombie zombie1 = (Zombie) WorldData.World.spawnEntity(spawn1, EntityType.ZOMBIE); - Zombie zombie2 = (Zombie) WorldData.World.spawnEntity(spawn2, EntityType.ZOMBIE); + Zombie zombie = (Zombie) WorldData.World.spawnEntity(spawn1, EntityType.ZOMBIE); + Golem villager = (Golem) WorldData.World.spawnEntity(spawn2, EntityType.IRON_GOLEM); CreatureAllowOverride = false; - for (Zombie zombie : Arrays.asList(zombie1, zombie2)) + for (LivingEntity ent : Arrays.asList(zombie, villager)) { GameProfile tiger = new ProfileLoader(UUIDFetcher.getUUIDOf("WilliamTiger").toString(), "WilliamTiger").loadProfile(); GameProfile random = stealGameProfile(); - DisguisePlayer player = new DisguisePlayer(zombie, (zombie.equals(zombie1) ? tiger : random)); + DisguisePlayer player = new DisguisePlayer(ent, (ent.equals(zombie) ? random : tiger)); Manager.GetDisguise().disguise(player); - UtilEnt.Vegetate(zombie); - zombie.getEquipment().setHelmet(ArenaType.ORANGE.getLoadout().getHelmet()); - zombie.getEquipment().setChestplate(ArenaType.ORANGE.getLoadout().getChestplate()); - zombie.getEquipment().setLeggings(ArenaType.ORANGE.getLoadout().getLeggings()); - zombie.getEquipment().setBoots(ArenaType.ORANGE.getLoadout().getBoots()); - zombie.getEquipment().setItemInHand(ArenaType.ORANGE.getLoadout().getSword()); + ent.getEquipment().setHelmet(ArenaType.ORANGE.getLoadout().getHelmet()); + ent.getEquipment().setChestplate(ArenaType.ORANGE.getLoadout().getChestplate()); + ent.getEquipment().setLeggings(ArenaType.ORANGE.getLoadout().getLeggings()); + ent.getEquipment().setBoots(ArenaType.ORANGE.getLoadout().getBoots()); + ent.getEquipment().setItemInHand(ArenaType.ORANGE.getLoadout().getSword()); - UtilEnt.CreatureMoveFast(zombie, orange, 1); + if (ent.equals(villager)) + ent.setHealth(100); + + //UtilEnt.CreatureMoveFast(zombie, purple, 1); } - ((TutorialGladiators)e.getTutorial()).setOrange(orange); - ((TutorialGladiators)e.getTutorial()).setPink(pink); - ((TutorialGladiators)e.getTutorial()).setZombie1(zombie1); - ((TutorialGladiators)e.getTutorial()).setZombie2(zombie2); + zombie.setTarget(villager); + villager.setTarget(zombie); + + ((TutorialGladiators) e.getTutorial()).setOrange(orange); + ((TutorialGladiators) e.getTutorial()).setPink(pink); + ((TutorialGladiators) e.getTutorial()).setZombie(zombie); + ((TutorialGladiators) e.getTutorial()).setVillager(villager); + ((TutorialGladiators) e.getTutorial()).setPurple(purple); } private GameProfile stealGameProfile() { - Player random = UtilServer.getPlayers()[0]; - GameProfile gp = new GameProfile(UUID.randomUUID(), random.getName()); - gp.getProperties().putAll(((CraftPlayer)random).getHandle().getProfile().getProperties()); - return gp; + List steal = Arrays.asList("Chiss", "Sigils", "Mysticate", "b2_mp", "Bitjump"); + String random = steal.get(new Random().nextInt(steal.size())); + return new ProfileLoader(UUIDFetcher.getUUIDOf(random).toString(), random).loadProfile(); } @EventHandler @@ -196,72 +210,14 @@ public class Gladiators extends SoloGame if (tutorial.hasEnded()) return; - UtilEnt.CreatureMoveFast(tutorial.getZombie1(), tutorial.getOrange(), 1); - UtilEnt.CreatureMoveFast(tutorial.getZombie2(), tutorial.getOrange(), 1); - - if (tutorial.getRunning() >= 2000 && !tutorial.isHasHit1()) + if (tutorial.isParticleStage()) { - tutorial.setHasHit1(true); + if (tutorial.getZombie() != null) + tutorial.getZombie().damage(200); - // Zombie hit one + UtilEnt.CreatureMoveFast(tutorial.getVillager(), tutorial.getPink(), 1F); - PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); - packet.a = Manager.GetDisguise().getDisguise(tutorial.getZombie1()).GetEntityId(); - packet.b = 0; - - for (Player p : UtilServer.getPlayers()) - { - UtilPlayer.sendPacket(p, packet); // Attack effect - } - - tutorial.getZombie2().damage(1); // Hurt effect - - return; - } - - if (tutorial.getRunning() >= 4000 && !tutorial.isHasHit2()) - { - tutorial.setHasHit2(true); - - // Zombie hit two - - PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); - packet.a = Manager.GetDisguise().getDisguise(tutorial.getZombie1()).GetEntityId(); - packet.b = 0; - - for (Player p : UtilServer.getPlayers()) - { - UtilPlayer.sendPacket(p, packet); // Attack effect - } - - tutorial.getZombie2().damage(1); // Hurt effect - - return; - } - - if (tutorial.getRunning() >= 5000 && !tutorial.getZombie2().isDead()) - { - // Zombie remove time - - tutorial.getZombie2().damage(1); - UtilFirework.playFirework(tutorial.getZombie2().getLocation(), FireworkEffect.Type.BALL, Color.ORANGE, false, false); - tutorial.getZombie2().remove(); - - Arena gateArena = getArenaByMid(tutorial.getOrange()); - for (Location loc : gateArena.getDoorBlocks()) - loc.getBlock().setType(Material.AIR); // Manual door open. - } - - if (tutorial.getRunning() > 5000) - { - // Particles - - if (tutorial.getZombie1() == null || tutorial.getPink() == null) - return; - - UtilEnt.CreatureMoveFast(tutorial.getZombie1(), tutorial.getPink(), 1); - - for (Location loc : UtilShapes.getLinesDistancedPoints(tutorial.getZombie1().getLocation(), tutorial.getPink(), 0.2)) + for (Location loc : UtilShapes.getLinesDistancedPoints(tutorial.getVillager().getLocation(), tutorial.getPink(), 0.2)) { UtilParticle.PlayParticle(UtilParticle.ParticleType.HAPPY_VILLAGER, loc, 0.03f, 0.03f, 0.03f, 0, 3, UtilParticle.ViewDist.LONG, UtilServer.getPlayers()); @@ -563,8 +519,8 @@ public class Gladiators extends SoloGame for (Player p : a.getPastPlayers()) { p.sendMessage(ArcadeFormat.Line); - p.sendMessage(" " + C.cWhite + C.Bold + "You have a bye!"); - p.sendMessage(" " + C.cGreen + "You automatically go through this round."); + p.sendMessage(" " + C.cWhite + C.Bold + "Please Wait!"); + p.sendMessage(" " + C.cGreen + "Your fight will begin next round."); p.sendMessage(ArcadeFormat.Line); } } @@ -697,8 +653,8 @@ public class Gladiators extends SoloGame p.getInventory().clear(); p.getInventory().setArmorContents(null); - p.getInventory().setItem(0, type.getLoadout().getSword()); - p.getInventory().setItem(1, type.getLoadout().getRod()); + p.getInventory().setItem(0, UtilItem.makeUnbreakable(type.getLoadout().getSword())); + p.getInventory().setItem(1, UtilItem.makeUnbreakable(type.getLoadout().getRod())); p.getInventory().setItem(2, type.getLoadout().getBow()); p.getInventory().setItem(8, type.getLoadout().getArrows()); @@ -794,38 +750,94 @@ public class Gladiators extends SoloGame else if (_roundState.equals(RoundState.STARTING_3)) { _roundState = RoundState.STARTING_2; - UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); - for (Player p : UtilServer.getPlayers()) + for (Arena a : _gameArenaSet) + { + if (a.getState() != ArenaState.FIGHTING) + continue; + + for (Player p : a.getPastPlayers()) + { + UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); + } + } + + for (Player p : GetPlayers(false)) + { + UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); + } + return; } else if (_roundState.equals(RoundState.STARTING_2)) { - _roundState = RoundState.STARTING_1; - UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + for (Arena a : _gameArenaSet) + { + if (a.getState() != ArenaState.FIGHTING) + continue; - for (Player p : UtilServer.getPlayers()) + for (Player p : a.getPastPlayers()) + { + UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); + } + } + + for (Player p : GetPlayers(false)) + { + UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); + } + return; } else if (_roundState.equals(RoundState.STARTING_1)) { _roundState = RoundState.STARTED; - UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); + for (Arena a : _gameArenaSet) + { + if (a.getState() != ArenaState.FIGHTING) + continue; - for (Player p : UtilServer.getPlayers()) + for (Player p : a.getPastPlayers()) + { + UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); + } + } + + for (Player p : GetPlayers(false)) + { + UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); + } + return; } else if (_roundState.equals(RoundState.STARTED)) { _roundState = RoundState.FIGHTING; - UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 40, 0); + for (Arena a : _gameArenaSet) + { + if (a.getState() != ArenaState.FIGHTING) + continue; + + for (Player p : a.getPastPlayers()) + { + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + p.playSound(p.getLocation(), Sound.NOTE_BASS, 1f, 1f); + } + } + + for (Player p : GetPlayers(false)) + { + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + p.playSound(p.getLocation(), Sound.NOTE_BASS, 1f, 1f); + } - for (Player p : UtilServer.getPlayers()) - p.playSound(p.getLocation(), Sound.NOTE_PLING, 2f, 2f); return; } } @@ -993,4 +1005,11 @@ public class Gladiators extends SoloGame } } } + + @EventHandler + public void tutorialDie(EntityDeathEvent e) + { + e.getDrops().clear(); + e.setDroppedExp(0); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java index bd9f68e61..44115ca72 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java @@ -44,7 +44,7 @@ public class UntouchableTracker extends StatTracker for (Player p : getGame().GetPlayers(true)) { if (_noWin.contains(p.getName())) - return; + continue; addStat(p, "Untouchable", 1, false, false); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java index 48bfebcba..f26bbe8d2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java @@ -2,7 +2,9 @@ package nautilus.game.arcade.game.games.gladiators.tutorial; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.entity.Golem; import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; import org.bukkit.entity.Zombie; import nautilus.game.arcade.ArcadeManager; @@ -20,8 +22,11 @@ public class TutorialGladiators extends GameTutorial private Gladiators _host; - private Location _pink, _orange; - private Zombie _zombie1, _zombie2; + private Location _pink, _orange, _purple; + private Zombie _zombie; + private Golem _villager; + + private boolean _particleStage; private boolean hasHit1, hasHit2; @@ -36,6 +41,8 @@ public class TutorialGladiators extends GameTutorial hasHit1 = false; hasHit2 = false; + _particleStage = false; + _host = (Gladiators) manager.GetGame(); } @@ -59,24 +66,24 @@ public class TutorialGladiators extends GameTutorial _orange = orange; } - public Zombie getZombie1() + public Zombie getZombie() { - return _zombie1; + return _zombie; } - public void setZombie1(Zombie zombie1) + public void setZombie(Zombie zombie) { - _zombie1 = zombie1; + _zombie = zombie; } - public Zombie getZombie2() + public Golem getVillager() { - return _zombie2; + return _villager; } - public void setZombie2(Zombie zombie2) + public void setVillager(Golem villager) { - _zombie2 = zombie2; + _villager = villager; } public boolean isHasHit1() @@ -99,6 +106,26 @@ public class TutorialGladiators extends GameTutorial this.hasHit2 = hasHit2; } + public Location getPurple() + { + return _purple; + } + + public void setPurple(Location purple) + { + _purple = purple; + } + + public boolean isParticleStage() + { + return _particleStage; + } + + public void setParticleStage(boolean particleStage) + { + _particleStage = particleStage; + } + @Override public void onEnd() { @@ -109,11 +136,11 @@ public class TutorialGladiators extends GameTutorial p.teleport(game.GetTeam(p).GetSpawn().clone()); } - if (_zombie1 != null) - _zombie1.remove(); + if (_zombie != null) + _zombie.remove(); - if (_zombie2 != null) - _zombie2.remove(); + if (_villager != null) + _villager.remove(); Arena gateArena = _host.getArenaByMid(getOrange()); for (Location loc : gateArena.getDoorBlocks()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java index 80ff77bca..ca18b6c09 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.game.games.gladiators.tutorial; +import mineplex.core.common.util.C; import nautilus.game.arcade.gametutorial.TutorialPhase; import nautilus.game.arcade.gametutorial.TutorialText; @@ -10,12 +11,14 @@ import nautilus.game.arcade.gametutorial.TutorialText; public class TutorialPhaseGladiators extends TutorialPhase { + private static final TutorialText TUT1 = new TutorialText(C.cGreen + "Defeat your opponent!", 20 * 3, 1); + private static final TutorialText TUT2 = new TutorialText("", 20 * 4, 2); + private static final TutorialText TUT3 = new TutorialText(C.cGreen + "To the next arena!", C.cGreen + "Follow the particles", 20 * 3, 3); + public TutorialPhaseGladiators() { super(new TutorialText[]{ - new TutorialText("Defeat your opponent!", 20 * 4, 1), - new TutorialText("", 20 * 2, 2), - new TutorialText("To the next arena!", "Follow the particles", 20 * 4, 3) + TUT1, TUT2, TUT3 }); } @@ -24,4 +27,13 @@ public class TutorialPhaseGladiators extends TutorialPhase { return 1; } + + @Override + public void onMessageDisplay(TutorialText text) + { + if (text.equals(TUT3)) + { + ((TutorialGladiators)getTutorial()).setParticleStage(true); + } + } } \ No newline at end of file From dda5ac6728a182a48457589bbc85a04d77cce6f9 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 01:20:36 +0000 Subject: [PATCH 133/223] work --- .../game/games/gladiators/Gladiators.java | 99 +--------------- .../tutorial/TutorialGladiators.java | 112 ------------------ .../tutorial/TutorialPhaseGladiators.java | 15 +-- 3 files changed, 6 insertions(+), 220 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 4c79a20bd..6b82e972a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -128,101 +128,10 @@ public class Gladiators extends SoloGame { Manager.getCosmeticManager().getGadgetManager().DisableParticles(); // Particles blocking tutorial... - Location white = WorldData.GetDataLocs("WHITE").get(0); - Location purple = WorldData.GetDataLocs("PURPLE").get(0); - Location orange = UtilAlg.findClosest(purple, WorldData.GetDataLocs("ORANGE")); - Location pink = UtilAlg.findClosest(orange, WorldData.GetDataLocs("PINK")); - ArrayList spawns = new ArrayList<>(WorldData.GetDataLocs("BROWN")); - Location spawn1 = spawns.get(0); - spawns.remove(spawn1); - Location spawn2 = spawns.get(0); + Location loc = WorldData.GetDataLocs("RED").get(0); - e.getTutorial().getPhase(1).setLocation(white); - e.getTutorial().getPhase(1).setTarget(purple); - - CreatureAllowOverride = true; - Zombie zombie = (Zombie) WorldData.World.spawnEntity(spawn1, EntityType.ZOMBIE); - Golem villager = (Golem) WorldData.World.spawnEntity(spawn2, EntityType.IRON_GOLEM); - CreatureAllowOverride = false; - for (LivingEntity ent : Arrays.asList(zombie, villager)) - { - GameProfile tiger = new ProfileLoader(UUIDFetcher.getUUIDOf("WilliamTiger").toString(), "WilliamTiger").loadProfile(); - GameProfile random = stealGameProfile(); - DisguisePlayer player = new DisguisePlayer(ent, (ent.equals(zombie) ? random : tiger)); - Manager.GetDisguise().disguise(player); - - ent.getEquipment().setHelmet(ArenaType.ORANGE.getLoadout().getHelmet()); - ent.getEquipment().setChestplate(ArenaType.ORANGE.getLoadout().getChestplate()); - ent.getEquipment().setLeggings(ArenaType.ORANGE.getLoadout().getLeggings()); - ent.getEquipment().setBoots(ArenaType.ORANGE.getLoadout().getBoots()); - ent.getEquipment().setItemInHand(ArenaType.ORANGE.getLoadout().getSword()); - - if (ent.equals(villager)) - ent.setHealth(100); - - //UtilEnt.CreatureMoveFast(zombie, purple, 1); - } - - zombie.setTarget(villager); - villager.setTarget(zombie); - - ((TutorialGladiators) e.getTutorial()).setOrange(orange); - ((TutorialGladiators) e.getTutorial()).setPink(pink); - ((TutorialGladiators) e.getTutorial()).setZombie(zombie); - ((TutorialGladiators) e.getTutorial()).setVillager(villager); - ((TutorialGladiators) e.getTutorial()).setPurple(purple); - } - - private GameProfile stealGameProfile() - { - List steal = Arrays.asList("Chiss", "Sigils", "Mysticate", "b2_mp", "Bitjump"); - String random = steal.get(new Random().nextInt(steal.size())); - return new ProfileLoader(UUIDFetcher.getUUIDOf(random).toString(), random).loadProfile(); - } - - @EventHandler - public void tutorialUpdate(UpdateEvent e) - { - if (e.getType() != UpdateType.FASTEST) - return; - - if (GetState() != GameState.Prepare) - return; - - if (GetTeamList().get(0).getTutorial() == null) - return; - - TutorialGladiators tutorial = (TutorialGladiators) GetTeamList().get(0).getTutorial(); - - if (tutorial == null) - { - System.out.println("tutorial object null"); - - if (GetTeamList().get(0).getTutorial() == null) - System.out.println("tutorial is null"); - - if (!(GetTeamList().get(0).getTutorial() instanceof TutorialGladiators)) - System.out.println("its not a gladiators one"); - - return; - } - - if (tutorial.hasEnded()) - return; - - if (tutorial.isParticleStage()) - { - if (tutorial.getZombie() != null) - tutorial.getZombie().damage(200); - - UtilEnt.CreatureMoveFast(tutorial.getVillager(), tutorial.getPink(), 1F); - - for (Location loc : UtilShapes.getLinesDistancedPoints(tutorial.getVillager().getLocation(), tutorial.getPink(), 0.2)) - { - UtilParticle.PlayParticle(UtilParticle.ParticleType.HAPPY_VILLAGER, loc, 0.03f, 0.03f, 0.03f, 0, 3, - UtilParticle.ViewDist.LONG, UtilServer.getPlayers()); - } - } + e.getTutorial().getPhase(1).setLocation(loc.add(0, 50, 0)); + e.getTutorial().getPhase(1).setTarget(loc); } @Override @@ -773,6 +682,8 @@ public class Gladiators extends SoloGame } else if (_roundState.equals(RoundState.STARTING_2)) { + _roundState = RoundState.STARTING_1; + for (Arena a : _gameArenaSet) { if (a.getState() != ArenaState.FIGHTING) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java index f26bbe8d2..3829cc68d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java @@ -22,14 +22,6 @@ public class TutorialGladiators extends GameTutorial private Gladiators _host; - private Location _pink, _orange, _purple; - private Zombie _zombie; - private Golem _villager; - - private boolean _particleStage; - - private boolean hasHit1, hasHit2; - public TutorialGladiators(ArcadeManager manager) { super(manager, new TutorialPhase[]{ @@ -38,116 +30,12 @@ public class TutorialGladiators extends GameTutorial TeleportOnEnd = false; - hasHit1 = false; - hasHit2 = false; - - _particleStage = false; - _host = (Gladiators) manager.GetGame(); } - public Location getPink() - { - return _pink; - } - - public void setPink(Location pink) - { - _pink = pink; - } - - public Location getOrange() - { - return _orange; - } - - public void setOrange(Location orange) - { - _orange = orange; - } - - public Zombie getZombie() - { - return _zombie; - } - - public void setZombie(Zombie zombie) - { - _zombie = zombie; - } - - public Golem getVillager() - { - return _villager; - } - - public void setVillager(Golem villager) - { - _villager = villager; - } - - public boolean isHasHit1() - { - return hasHit1; - } - - public void setHasHit1(boolean hasHit1) - { - this.hasHit1 = hasHit1; - } - - public boolean isHasHit2() - { - return hasHit2; - } - - public void setHasHit2(boolean hasHit2) - { - this.hasHit2 = hasHit2; - } - - public Location getPurple() - { - return _purple; - } - - public void setPurple(Location purple) - { - _purple = purple; - } - - public boolean isParticleStage() - { - return _particleStage; - } - - public void setParticleStage(boolean particleStage) - { - _particleStage = particleStage; - } - @Override public void onEnd() { - Gladiators game = (Gladiators) Manager.GetGame(); - - for (Player p : game.GetPlayers(true)) - { - p.teleport(game.GetTeam(p).GetSpawn().clone()); - } - - if (_zombie != null) - _zombie.remove(); - - if (_villager != null) - _villager.remove(); - - Arena gateArena = _host.getArenaByMid(getOrange()); - for (Location loc : gateArena.getDoorBlocks()) - loc.getBlock().setType(Material.FENCE); // Manual door close. - - // Spawns - _host.GetTeamList().get(0).GetSpawns().clear(); for (Arena a : _host.getGameArenaSet()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java index ca18b6c09..105119a83 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -11,14 +11,10 @@ import nautilus.game.arcade.gametutorial.TutorialText; public class TutorialPhaseGladiators extends TutorialPhase { - private static final TutorialText TUT1 = new TutorialText(C.cGreen + "Defeat your opponent!", 20 * 3, 1); - private static final TutorialText TUT2 = new TutorialText("", 20 * 4, 2); - private static final TutorialText TUT3 = new TutorialText(C.cGreen + "To the next arena!", C.cGreen + "Follow the particles", 20 * 3, 3); - public TutorialPhaseGladiators() { super(new TutorialText[]{ - TUT1, TUT2, TUT3 + new TutorialText(C.cGreen + "Defeat your opponent to advance", C.cGreen + "Gladiators!", 20 * 5, 1) }); } @@ -27,13 +23,4 @@ public class TutorialPhaseGladiators extends TutorialPhase { return 1; } - - @Override - public void onMessageDisplay(TutorialText text) - { - if (text.equals(TUT3)) - { - ((TutorialGladiators)getTutorial()).setParticleStage(true); - } - } } \ No newline at end of file From f8d7aeb5eaae5ddb59fd1ba1d5da5e58fabef5e0 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 01:32:32 +0000 Subject: [PATCH 134/223] before revert --- .../nautilus/game/arcade/game/games/gladiators/Gladiators.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 6b82e972a..deaa8ace6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -130,7 +130,7 @@ public class Gladiators extends SoloGame Location loc = WorldData.GetDataLocs("RED").get(0); - e.getTutorial().getPhase(1).setLocation(loc.add(0, 50, 0)); + e.getTutorial().getPhase(1).setLocation(loc.clone().add(0, 50, 0)); e.getTutorial().getPhase(1).setTarget(loc); } From 16f39c1e712445f17769d86f2fa34ad9960159cf Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 20:51:34 -0500 Subject: [PATCH 135/223] Pushing changes to go help william --- .../src/mineplex/core/common/util/F.java | 5 +++ .../mineplex/core/cosmetic/ui/page/Menu.java | 30 +++++++------- .../core/treasure/TreasureManager.java | 7 ++++ .../mineplex/core/treasure/TreasureType.java | 2 +- .../core/treasure/gui/TreasurePage.java | 39 +++++++++++++------ 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java index db1e528f3..fd2a34ec6 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java @@ -106,6 +106,11 @@ public class F return rank.getTag(false, false); } + public static String value(String variable, int value) + { + return value(variable, "" + value); + } + public static String value(String variable, String value) { return value(0, variable, value); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index a0ecf9001..3d213582d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -65,8 +65,8 @@ public class Menu extends ShopPageBase addButton(37, new ShopItem(Material.GOLD_HELMET, "Hats", 1, false), new OpenHats(this)); addButton(39, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); - addButton(42, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); - addButton(44, new ShopItem(Material.NAME_TAG, "Taunts", 1, false), new IButton() + addButton(41, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); + addButton(43, new ShopItem(Material.NAME_TAG, "Taunts", 1, false), new IButton() { @Override public void onClick(Player player, ClickType clickType) @@ -84,37 +84,37 @@ public class Menu extends ShopPageBase switch (type) { case Particle: - slot = 10; + slot = 1; break; case ArrowTrail: - slot = 12; + slot = 3; break; case DoubleJump: - slot = 14; + slot = 5; break; case Death: - slot = 16; + slot = 7; break; case Item: - slot = 28; + slot = 19; break; case Morph: - slot = 30; + slot = 21; break; case Hat: - slot = 46; + slot = 37; break; case Costume: - slot = 48; + slot = 39; break; case MusicDisc: - slot = 50; + slot = 41; break; case Taunt: - slot = 52; + slot = 43; break; default: - slot = 10; + slot = 1; break; } slot += 9; @@ -134,7 +134,7 @@ public class Menu extends ShopPageBase { final Mount mount = getPlugin().getMountManager().getActive(getPlayer()); - addButton(32 + 9, + addButton(23 + 9, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), C.mItem + mount.GetName(), new String[0], 1, false, false), new IButton() { @@ -151,7 +151,7 @@ public class Menu extends ShopPageBase { Creature activePet = getPlugin().getPetManager().getActivePet(getPlayer().getName()); String petName = activePet.getType() == EntityType.WITHER ? "Widder" : activePet.getCustomName(); - addButton(34 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), C.mItem + petName, new String[0], 1, false, false), + addButton(25 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), C.mItem + petName, new String[0], 1, false, false), new IButton() { public void onClick(Player player, ClickType clickType) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java index c37885de1..935b772c5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java @@ -29,6 +29,7 @@ import mineplex.core.status.ServerStatusManager; */ public class TreasureManager extends MiniPlugin { + private CoreClientManager _clientManager; private RewardManager _rewardManager; private InventoryManager _inventoryManager; private BlockRestore _blockRestore; @@ -40,6 +41,7 @@ public class TreasureManager extends MiniPlugin { super("Treasure", plugin); + _clientManager = clientManager; _inventoryManager = inventoryManager; _blockRestore = blockRestore; _hologramManager = hologramManager; @@ -155,4 +157,9 @@ public class TreasureManager extends MiniPlugin { return _blockRestore; } + + public CoreClientManager getClientManager() + { + return _clientManager; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java index ab8660490..39566892d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureType.java @@ -13,7 +13,7 @@ public enum TreasureType MYTHICAL(C.cRed + "Mythical Chest", "Mythical Chest", "Mythical", RewardType.MythicalChest, Material.ENDER_CHEST, TreasureStyle.MYTHICAL), - CHRISTMAS(C.cAqua + "Christmas Chest", "Christmas Chest", "Christmas", RewardType.MythicalChest, Material.CHEST, TreasureStyle.CHRISTMAS); + CHRISTMAS(C.cDGreen + "Winter Holiday Chest", "Winter Chest", "Christmas", RewardType.MythicalChest, Material.CHEST, TreasureStyle.CHRISTMAS); private final String _name; private final RewardType _rewardType; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java index a4823f5d2..a466fb6f2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java @@ -6,10 +6,12 @@ import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilSkull; import mineplex.core.donation.DonationManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.shop.item.ShopItem; @@ -25,7 +27,7 @@ public class TreasurePage extends ShopPageBase public TreasurePage(TreasureManager plugin, TreasureShop shop, TreasureLocation treasureLocation, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, Player player) { - super(plugin, shop, clientManager, donationManager, "Open Treasure", player, 9); + super(plugin, shop, clientManager, donationManager, "Open Treasure", player, 54); _treasureLocation = treasureLocation; _inventoryManager = inventoryManager; @@ -36,11 +38,21 @@ public class TreasurePage extends ShopPageBase @Override protected void buildPage() { + int treasureShards = getDonationManager().Get(getPlayer()).getCoins(); + int basicCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.OLD.getItemName()); int heroicCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.ANCIENT.getItemName()); int legendaryCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.MYTHICAL.getItemName()); int christmasCount = _inventoryManager.Get(getPlayer()).getItemCount(TreasureType.CHRISTMAS.getItemName()); + List shardLore = new ArrayList(); + shardLore.add(" "); + shardLore.add(F.value("Treasure Shards", "" + treasureShards)); + shardLore.add(" "); + shardLore.add(C.cGray + "Useless by itself, Treasure Shards"); + shardLore.add(C.cGray + "can be combined to forge new"); + shardLore.add(C.cGray + "and undiscovered treasures."); + List basicLore = new ArrayList(); basicLore.add(" "); basicLore.add(F.value("Old Chests Owned", "" + basicCount)); @@ -118,21 +130,24 @@ public class TreasurePage extends ShopPageBase christmasLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } + ShopItem shards = new ShopItem(Material.PRISMARINE_SHARD, C.cAqua + C.Bold + "Treasure Shards", shardLore.toArray(new String[0]), 0, false); ShopItem basic = new ShopItem(Material.CHEST, C.cGreen + C.Bold + "Old Chest", basicLore.toArray(new String[0]), 0, false, false); ShopItem heroic = new ShopItem(Material.TRAPPED_CHEST, C.cGold + C.Bold + "Ancient Chest", heroicLore.toArray(new String[0]), 0, false, false); ShopItem legendary = new ShopItem(Material.ENDER_CHEST, C.cRed + C.Bold + "Mythical Chest", legendaryLore.toArray(new String[0]), 0, false, false); - ShopItem christmas = new ShopItem(Material.SNOW_BALL, C.cAqua + C.Bold + "Christmas Chest", christmasLore.toArray(new String[0]), 0, false, false); + ItemStack christmas = UtilSkull.getPlayerHead("MHF_Present2", C.cDGreen + C.Bold + "Winter Holiday Chest", christmasLore); - if (basicCount > 0) addButton(1, basic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.OLD)); - else addButton(1, basic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Old Chest", Material.CHEST, 1000)); - - if (heroicCount > 0) addButton(3, heroic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.ANCIENT)); - else addButton(3, heroic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Ancient Chest", Material.CHEST, 5000)); - - if (legendaryCount > 0) addButton(5, legendary, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.MYTHICAL)); - else addButton(5, legendary, new BuyChestButton(getPlayer(), _inventoryManager, this, "Mythical Chest", Material.ENDER_CHEST, 10000)); + addItem(40, shards); - if (christmasCount > 0) addButton(6, christmas, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.CHRISTMAS)); - else addButton(6, christmas, new BuyChestButton(getPlayer(), _inventoryManager, this, "Christmas Chest", Material.SNOW_BALL, 10000)); + if (basicCount > 0) addButton(20, basic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.OLD)); + else addButton(20, basic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Old Chest", Material.CHEST, 1000)); + + if (heroicCount > 0) addButton(22, heroic, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.ANCIENT)); + else addButton(22, heroic, new BuyChestButton(getPlayer(), _inventoryManager, this, "Ancient Chest", Material.CHEST, 5000)); + + if (legendaryCount > 0) addButton(24, legendary, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.MYTHICAL)); + else addButton(24, legendary, new BuyChestButton(getPlayer(), _inventoryManager, this, "Mythical Chest", Material.ENDER_CHEST, 10000)); + + if (christmasCount > 0) addButton(4, christmas, new OpenTreasureButton(getPlayer(), _treasureLocation, TreasureType.CHRISTMAS)); + else addButton(4, christmas, new BuyChestButton(getPlayer(), _inventoryManager, this, "Winter Holiday Chest", Material.SNOW_BALL, 10000)); } } From 4d05bd5c50a5f82db4ad8038d32e134364331532 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 20:53:38 -0500 Subject: [PATCH 136/223] Player count for chiss --- .../core/playerCount/PlayerCountManager.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java new file mode 100644 index 000000000..c73f87d00 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java @@ -0,0 +1,73 @@ +package mineplex.core.playerCount; + +import org.bukkit.event.EventHandler; +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.MiniPlugin; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.serverdata.Region; +import mineplex.serverdata.data.BungeeServer; +import mineplex.serverdata.data.DataRepository; +import mineplex.serverdata.redis.RedisDataRepository; +import mineplex.serverdata.servers.ConnectionData; +import mineplex.serverdata.servers.ServerManager; + +public class PlayerCountManager extends MiniPlugin +{ + private Region _region; + private DataRepository _repository; + private DataRepository _secondRepository; + + private volatile int _playerCount; + + public PlayerCountManager(JavaPlugin plugin) + { + super("PlayerCount", plugin); + + _region = plugin.getConfig().getBoolean("serverstatus.us") ? Region.US : Region.EU; + + _repository = new RedisDataRepository(ServerManager.getConnection(true, ServerManager.SERVER_STATUS_LABEL), ServerManager.getConnection(false, ServerManager.SERVER_STATUS_LABEL), + Region.ALL, BungeeServer.class, "bungeeServers"); + + if (_region == Region.US) + _secondRepository = new RedisDataRepository(new ConnectionData("10.81.1.156", 6379, ConnectionData.ConnectionType.MASTER, "ServerStatus"), new ConnectionData("10.81.1.156", 6377, ConnectionData.ConnectionType.SLAVE, "ServerStatus"), + Region.ALL, BungeeServer.class, "bungeeServers"); + else + _secondRepository = new RedisDataRepository(new ConnectionData("10.33.53.16", 6379, ConnectionData.ConnectionType.MASTER, "ServerStatus"), new ConnectionData("10.33.53.16", 6377, ConnectionData.ConnectionType.SLAVE, "ServerStatus"), + Region.ALL, BungeeServer.class, "bungeeServers"); + + updatePlayerCount(); + } + + private void updatePlayerCount() + { + int totalPlayers = 0; + for (BungeeServer server : _repository.getElements()) + { + totalPlayers += server.getPlayerCount(); + } + + for (BungeeServer server : _secondRepository.getElements()) + { + totalPlayers += server.getPlayerCount(); + } + + _playerCount = totalPlayers; + } + + public int getPlayerCount() + { + return _playerCount; + } + + @EventHandler + public void refresh(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + runAsync(this::updatePlayerCount); + } + +} From 2694787590ec3c836feb3861b03a4e976abc2d35 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 20:59:57 -0500 Subject: [PATCH 137/223] Reverting --- .../mineplex/core/common/util/UtilItem.java | 9 - .../mineplex/core/gadget/GadgetManager.java | 9 - .../arcade/game/games/gladiators/Arena.java | 16 +- .../game/games/gladiators/Gladiators.java | 250 +++++++++++------- .../trackers/UntouchableTracker.java | 2 +- .../tutorial/TutorialGladiators.java | 89 ++++++- .../tutorial/TutorialPhaseGladiators.java | 5 +- .../arcade/gametutorial/TutorialPhase.java | 2 +- .../arcade/gametutorial/TutorialText.java | 25 +- 9 files changed, 255 insertions(+), 152 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java index 5a300322c..c82d37f9f 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java @@ -12,7 +12,6 @@ import java.util.Map.Entry; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import mineplex.core.common.structs.ItemContainer; @@ -1117,12 +1116,4 @@ public class UtilItem { return _materials.containsKey(material); } - - public static ItemStack makeUnbreakable(ItemStack i) - { - ItemMeta im = i.getItemMeta(); - im.spigot().setUnbreakable(true); - i.setItemMeta(im); - return i; - } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index f6ae08bb5..bb17d1e2f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -298,15 +298,6 @@ public class GadgetManager extends MiniPlugin } } } - - public void DisableParticles() - { - for (Gadget gadget : _gadgets.get(GadgetType.Particle)) - { - for (Player player : UtilServer.getPlayers()) - gadget.Disable(player); - } - } public void DisableAll() { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 63191e213..52079b41d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -44,8 +44,6 @@ public class Arena private HashMap> _particles; - private ArrayList _sentParticles; - public Arena(Gladiators host, Location mid, ArenaType colour) { _host = host; @@ -61,7 +59,6 @@ public class Arena _stateTime = System.currentTimeMillis(); _particles = new HashMap<>(); _doBye = false; - _sentParticles = new ArrayList<>(); setupSpawns(); } @@ -259,8 +256,6 @@ public class Arena { _isOpenDoor = true; - _sentParticles.clear(); - _host.Manager.getScheduler().scheduleSyncDelayedTask(_host.Manager.getPlugin(), () -> { for (Location loc : _doorBlocks) @@ -286,11 +281,7 @@ public class Arena for (Player p : getPastPlayers()) { - if (_sentParticles.contains(p)) - continue; - - UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20 * 100, 0, p); - _sentParticles.add(p); + UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20, 0, p); } } else if (_state.equals(ArenaState.FIGHTING)) @@ -317,10 +308,7 @@ public class Arena { for (Player p : getPastPlayers()) { - if (_sentParticles.contains(p)) - continue; - - UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20 * 100, 0, p); + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20, 0, p); } if (UtilTime.elapsed(_stateTime, 15000)) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index deaa8ace6..260f7bd2c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -5,26 +5,21 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; -import java.util.List; import java.util.Map; import java.util.Queue; -import java.util.Random; +import java.util.UUID; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; -import org.bukkit.entity.Entity; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.EntityType; -import org.bukkit.entity.Golem; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Villager; import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -41,7 +36,6 @@ import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; @@ -126,12 +120,153 @@ public class Gladiators extends SoloGame @EventHandler public void tutorialStart(GameTutorialStartEvent e) { - Manager.getCosmeticManager().getGadgetManager().DisableParticles(); // Particles blocking tutorial... + Location white = WorldData.GetDataLocs("WHITE").get(0); + Location orange = UtilAlg.findClosest(white, WorldData.GetDataLocs("ORANGE")); + Location pink = UtilAlg.findClosest(orange, WorldData.GetDataLocs("PINK")); + ArrayList spawns = new ArrayList<>(WorldData.GetDataLocs("BROWN")); + Location spawn1 = spawns.get(0); + spawns.remove(spawn1); + Location spawn2 = spawns.get(0); - Location loc = WorldData.GetDataLocs("RED").get(0); + e.getTutorial().getPhase(1).setLocation(white); + e.getTutorial().getPhase(1).setTarget(orange); - e.getTutorial().getPhase(1).setLocation(loc.clone().add(0, 50, 0)); - e.getTutorial().getPhase(1).setTarget(loc); + CreatureAllowOverride = true; + Zombie zombie1 = (Zombie) WorldData.World.spawnEntity(spawn1, EntityType.ZOMBIE); + Zombie zombie2 = (Zombie) WorldData.World.spawnEntity(spawn2, EntityType.ZOMBIE); + CreatureAllowOverride = false; + for (Zombie zombie : Arrays.asList(zombie1, zombie2)) + { + GameProfile tiger = new ProfileLoader(UUIDFetcher.getUUIDOf("WilliamTiger").toString(), "WilliamTiger").loadProfile(); + GameProfile random = stealGameProfile(); + DisguisePlayer player = new DisguisePlayer(zombie, (zombie.equals(zombie1) ? tiger : random)); + Manager.GetDisguise().disguise(player); + + UtilEnt.Vegetate(zombie); + zombie.getEquipment().setHelmet(ArenaType.ORANGE.getLoadout().getHelmet()); + zombie.getEquipment().setChestplate(ArenaType.ORANGE.getLoadout().getChestplate()); + zombie.getEquipment().setLeggings(ArenaType.ORANGE.getLoadout().getLeggings()); + zombie.getEquipment().setBoots(ArenaType.ORANGE.getLoadout().getBoots()); + zombie.getEquipment().setItemInHand(ArenaType.ORANGE.getLoadout().getSword()); + + UtilEnt.CreatureMoveFast(zombie, orange, 1); + } + + ((TutorialGladiators)e.getTutorial()).setOrange(orange); + ((TutorialGladiators)e.getTutorial()).setPink(pink); + ((TutorialGladiators)e.getTutorial()).setZombie1(zombie1); + ((TutorialGladiators)e.getTutorial()).setZombie2(zombie2); + } + + private GameProfile stealGameProfile() + { + Player random = UtilServer.getPlayers()[0]; + GameProfile gp = new GameProfile(UUID.randomUUID(), random.getName()); + gp.getProperties().putAll(((CraftPlayer)random).getHandle().getProfile().getProperties()); + return gp; + } + + @EventHandler + public void tutorialUpdate(UpdateEvent e) + { + if (e.getType() != UpdateType.FASTEST) + return; + + if (GetState() != GameState.Prepare) + return; + + if (GetTeamList().get(0).getTutorial() == null) + return; + + TutorialGladiators tutorial = (TutorialGladiators) GetTeamList().get(0).getTutorial(); + + if (tutorial == null) + { + System.out.println("tutorial object null"); + + if (GetTeamList().get(0).getTutorial() == null) + System.out.println("tutorial is null"); + + if (!(GetTeamList().get(0).getTutorial() instanceof TutorialGladiators)) + System.out.println("its not a gladiators one"); + + return; + } + + if (tutorial.hasEnded()) + return; + + UtilEnt.CreatureMoveFast(tutorial.getZombie1(), tutorial.getOrange(), 1); + UtilEnt.CreatureMoveFast(tutorial.getZombie2(), tutorial.getOrange(), 1); + + if (tutorial.getRunning() >= 2000 && !tutorial.isHasHit1()) + { + tutorial.setHasHit1(true); + + // Zombie hit one + + PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); + packet.a = Manager.GetDisguise().getDisguise(tutorial.getZombie1()).GetEntityId(); + packet.b = 0; + + for (Player p : UtilServer.getPlayers()) + { + UtilPlayer.sendPacket(p, packet); // Attack effect + } + + tutorial.getZombie2().damage(1); // Hurt effect + + return; + } + + if (tutorial.getRunning() >= 4000 && !tutorial.isHasHit2()) + { + tutorial.setHasHit2(true); + + // Zombie hit two + + PacketPlayOutAnimation packet = new PacketPlayOutAnimation(); + packet.a = Manager.GetDisguise().getDisguise(tutorial.getZombie1()).GetEntityId(); + packet.b = 0; + + for (Player p : UtilServer.getPlayers()) + { + UtilPlayer.sendPacket(p, packet); // Attack effect + } + + tutorial.getZombie2().damage(1); // Hurt effect + + return; + } + + if (tutorial.getRunning() >= 5000 && !tutorial.getZombie2().isDead()) + { + // Zombie remove time + + tutorial.getZombie2().damage(1); + UtilFirework.playFirework(tutorial.getZombie2().getLocation(), FireworkEffect.Type.BALL, Color.ORANGE, false, false); + tutorial.getZombie2().remove(); + + Arena gateArena = getArenaByMid(tutorial.getOrange()); + for (Location loc : gateArena.getDoorBlocks()) + loc.getBlock().setType(Material.AIR); // Manual door open. + } + + if (tutorial.getRunning() > 5000) + { + // Particles + + if (tutorial.getZombie1() == null || tutorial.getPink() == null) + return; + + UtilEnt.CreatureMoveFast(tutorial.getZombie1(), tutorial.getPink(), 1); + + for (Location loc : UtilShapes.getLinesDistancedPoints(tutorial.getZombie1().getLocation(), tutorial.getPink(), 0.2)) + { + UtilParticle.PlayParticle(UtilParticle.ParticleType.HAPPY_VILLAGER, loc, 0.03f, 0.03f, 0.03f, 0, 3, + UtilParticle.ViewDist.LONG, UtilServer.getPlayers()); + } + } } @Override @@ -428,8 +563,8 @@ public class Gladiators extends SoloGame for (Player p : a.getPastPlayers()) { p.sendMessage(ArcadeFormat.Line); - p.sendMessage(" " + C.cWhite + C.Bold + "Please Wait!"); - p.sendMessage(" " + C.cGreen + "Your fight will begin next round."); + p.sendMessage(" " + C.cWhite + C.Bold + "You have a bye!"); + p.sendMessage(" " + C.cGreen + "You automatically go through this round."); p.sendMessage(ArcadeFormat.Line); } } @@ -562,8 +697,8 @@ public class Gladiators extends SoloGame p.getInventory().clear(); p.getInventory().setArmorContents(null); - p.getInventory().setItem(0, UtilItem.makeUnbreakable(type.getLoadout().getSword())); - p.getInventory().setItem(1, UtilItem.makeUnbreakable(type.getLoadout().getRod())); + p.getInventory().setItem(0, type.getLoadout().getSword()); + p.getInventory().setItem(1, type.getLoadout().getRod()); p.getInventory().setItem(2, type.getLoadout().getBow()); p.getInventory().setItem(8, type.getLoadout().getArrows()); @@ -659,96 +794,38 @@ public class Gladiators extends SoloGame else if (_roundState.equals(RoundState.STARTING_3)) { _roundState = RoundState.STARTING_2; + UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); - for (Arena a : _gameArenaSet) - { - if (a.getState() != ArenaState.FIGHTING) - continue; - - for (Player p : a.getPastPlayers()) - { - UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); - p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); - } - } - - for (Player p : GetPlayers(false)) - { - UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + for (Player p : UtilServer.getPlayers()) p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); - } - return; } else if (_roundState.equals(RoundState.STARTING_2)) { _roundState = RoundState.STARTING_1; + UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); - for (Arena a : _gameArenaSet) - { - if (a.getState() != ArenaState.FIGHTING) - continue; - - for (Player p : a.getPastPlayers()) - { - UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); - p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); - } - } - - for (Player p : GetPlayers(false)) - { - UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + for (Player p : UtilServer.getPlayers()) p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); - } - return; } else if (_roundState.equals(RoundState.STARTING_1)) { _roundState = RoundState.STARTED; - for (Arena a : _gameArenaSet) - { - if (a.getState() != ArenaState.FIGHTING) - continue; + UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); - for (Player p : a.getPastPlayers()) - { - UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); - p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); - } - } - - for (Player p : GetPlayers(false)) - { - UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); + for (Player p : UtilServer.getPlayers()) p.playSound(p.getLocation(), Sound.NOTE_STICKS, 1f, 1f); - } - return; } else if (_roundState.equals(RoundState.STARTED)) { _roundState = RoundState.FIGHTING; - for (Arena a : _gameArenaSet) - { - if (a.getState() != ArenaState.FIGHTING) - continue; - - for (Player p : a.getPastPlayers()) - { - UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); - p.playSound(p.getLocation(), Sound.NOTE_BASS, 1f, 1f); - } - } - - for (Player p : GetPlayers(false)) - { - UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0, p); - p.playSound(p.getLocation(), Sound.NOTE_BASS, 1f, 1f); - } + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 40, 0); + for (Player p : UtilServer.getPlayers()) + p.playSound(p.getLocation(), Sound.NOTE_PLING, 2f, 2f); return; } } @@ -916,11 +993,4 @@ public class Gladiators extends SoloGame } } } - - @EventHandler - public void tutorialDie(EntityDeathEvent e) - { - e.getDrops().clear(); - e.setDroppedExp(0); - } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java index 44115ca72..bd9f68e61 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java @@ -44,7 +44,7 @@ public class UntouchableTracker extends StatTracker for (Player p : getGame().GetPlayers(true)) { if (_noWin.contains(p.getName())) - continue; + return; addStat(p, "Untouchable", 1, false, false); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java index 3829cc68d..48bfebcba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialGladiators.java @@ -2,9 +2,7 @@ package nautilus.game.arcade.game.games.gladiators.tutorial; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.Golem; import org.bukkit.entity.Player; -import org.bukkit.entity.Villager; import org.bukkit.entity.Zombie; import nautilus.game.arcade.ArcadeManager; @@ -22,6 +20,11 @@ public class TutorialGladiators extends GameTutorial private Gladiators _host; + private Location _pink, _orange; + private Zombie _zombie1, _zombie2; + + private boolean hasHit1, hasHit2; + public TutorialGladiators(ArcadeManager manager) { super(manager, new TutorialPhase[]{ @@ -30,12 +33,94 @@ public class TutorialGladiators extends GameTutorial TeleportOnEnd = false; + hasHit1 = false; + hasHit2 = false; + _host = (Gladiators) manager.GetGame(); } + public Location getPink() + { + return _pink; + } + + public void setPink(Location pink) + { + _pink = pink; + } + + public Location getOrange() + { + return _orange; + } + + public void setOrange(Location orange) + { + _orange = orange; + } + + public Zombie getZombie1() + { + return _zombie1; + } + + public void setZombie1(Zombie zombie1) + { + _zombie1 = zombie1; + } + + public Zombie getZombie2() + { + return _zombie2; + } + + public void setZombie2(Zombie zombie2) + { + _zombie2 = zombie2; + } + + public boolean isHasHit1() + { + return hasHit1; + } + + public void setHasHit1(boolean hasHit1) + { + this.hasHit1 = hasHit1; + } + + public boolean isHasHit2() + { + return hasHit2; + } + + public void setHasHit2(boolean hasHit2) + { + this.hasHit2 = hasHit2; + } + @Override public void onEnd() { + Gladiators game = (Gladiators) Manager.GetGame(); + + for (Player p : game.GetPlayers(true)) + { + p.teleport(game.GetTeam(p).GetSpawn().clone()); + } + + if (_zombie1 != null) + _zombie1.remove(); + + if (_zombie2 != null) + _zombie2.remove(); + + Arena gateArena = _host.getArenaByMid(getOrange()); + for (Location loc : gateArena.getDoorBlocks()) + loc.getBlock().setType(Material.FENCE); // Manual door close. + + // Spawns + _host.GetTeamList().get(0).GetSpawns().clear(); for (Arena a : _host.getGameArenaSet()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java index 105119a83..80ff77bca 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -1,6 +1,5 @@ package nautilus.game.arcade.game.games.gladiators.tutorial; -import mineplex.core.common.util.C; import nautilus.game.arcade.gametutorial.TutorialPhase; import nautilus.game.arcade.gametutorial.TutorialText; @@ -14,7 +13,9 @@ public class TutorialPhaseGladiators extends TutorialPhase public TutorialPhaseGladiators() { super(new TutorialText[]{ - new TutorialText(C.cGreen + "Defeat your opponent to advance", C.cGreen + "Gladiators!", 20 * 5, 1) + new TutorialText("Defeat your opponent!", 20 * 4, 1), + new TutorialText("", 20 * 2, 2), + new TutorialText("To the next arena!", "Follow the particles", 20 * 4, 3) }); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java index 222028622..b140b79bc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialPhase.java @@ -136,7 +136,7 @@ public abstract class TutorialPhase i++; } displayMessage(text); - UtilTextMiddle.display((text.getBigText() == null ? "" : text.getBigText()), text.getText(), 0, text.getStayTime(), 0, players); + UtilTextMiddle.display("", text.getText(), 0, text.getStayTime(), 0, players); try { Thread.sleep(text.getStayTime() * 50); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java index cc438d484..dba1d39a6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -7,7 +7,6 @@ public class TutorialText { private String _text; - private String _bigText; private int _stayTime; private int _id; private Sound _sound; @@ -34,24 +33,6 @@ public class TutorialText { this(text, stayTime, id, Sound.NOTE_PLING); } - - public TutorialText(String text, String bigText, int id) - { - this(text, (int) (Math.round(1.5 * text.length()) + 25), id, Sound.NOTE_PLING); - _bigText = bigText; - } - - public TutorialText(String text, String bigText, int id, Sound sound) - { - this(text, (int) (Math.round(1.5 * text.length()) + 25), id, sound); - _bigText = bigText; - } - - public TutorialText(String text, String bigText, int stayTime, int id) - { - this(text, stayTime, id, Sound.NOTE_PLING); - _bigText = bigText; - } public String getText() { @@ -77,9 +58,5 @@ public class TutorialText { _text = text; } - - public String getBigText() - { - return _bigText; - } + } From 31cea3342e027ca591b4c022060bac278ea7eb0f Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 13:17:38 +1100 Subject: [PATCH 138/223] some gadget stuff --- .../core/cosmetic/ui/page/GadgetPage.java | 23 +++++++++++------ .../arrowtrail/ArrowTrailCandyCane.java | 2 +- .../arrowtrail/ArrowTrailFrostLord.java | 2 +- .../gadgets/arrowtrail/ArrowTrailTitan.java | 2 +- .../gadget/gadgets/death/DeathCandyCane.java | 2 +- .../gadget/gadgets/death/DeathFrostLord.java | 2 +- .../core/gadget/gadgets/death/DeathTitan.java | 2 +- .../doublejump/DoubleJumpCandyCane.java | 2 +- .../doublejump/DoubleJumpFrostLord.java | 2 +- .../gadgets/doublejump/DoubleJumpTitan.java | 2 +- .../core/gadget/gadgets/hat/HatCoal.java | 2 +- .../core/gadget/gadgets/hat/HatPresent.java | 2 +- .../core/gadget/gadgets/hat/HatSanta.java | 2 +- .../core/gadget/gadgets/hat/HatSnowman.java | 2 +- .../core/gadget/gadgets/item/ItemCoal.java | 6 ++--- .../gadget/gadgets/item/ItemFreezeCannon.java | 4 +-- .../gadget/gadgets/item/ItemPartyPopper.java | 25 ++++++++++--------- .../gadget/gadgets/item/ItemSnowball.java | 4 +-- .../gadget/gadgets/morph/MorphSnowman.java | 2 +- .../core/gadget/gadgets/morph/MorphTitan.java | 5 +--- .../gadgets/particle/ParticleCandyCane.java | 2 +- .../gadgets/particle/ParticleFrostLord.java | 4 +-- .../gadgets/particle/ParticleLegend.java | 2 +- .../gadgets/particle/ParticleTitan.java | 2 +- .../core/mount/types/MountBabyReindeer.java | 2 +- 25 files changed, 56 insertions(+), 51 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 317f6503c..d94654926 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import net.md_5.bungee.api.ChatColor; + import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -83,22 +85,29 @@ public class GadgetPage extends ShopPageBase List itemLore = new ArrayList(); + + itemLore.add(C.cBlack); + itemLore.addAll(Arrays.asList(gadget.GetDescription())); + if (gadget.GetCost(CurrencyType.Coins) >= 0) { - itemLore.add(C.cYellow + gadget.GetCost(CurrencyType.Coins) + " Coins"); + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Cost: " + ChatColor.RESET + gadget.GetCost(CurrencyType.Coins) + " Treasure Shards"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -1) + { + //Nothing } else if (gadget.GetCost(CurrencyType.Coins) == -2) { - itemLore.add(C.cGold + "Found in Treasure Chests."); + itemLore.add(C.cBlack); + itemLore.add(C.cGray + "Found in Treasure Chests"); } else if (gadget.GetCost(CurrencyType.Coins) == -3) { - + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Found in Winter Holiday Treasure Chests"); } - - - itemLore.add(C.cBlack); - itemLore.addAll(Arrays.asList(gadget.GetDescription())); if (gadget instanceof ItemGadget) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java index 1b9741cfe..85cb085d6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java @@ -21,7 +21,7 @@ public class ArrowTrailCandyCane extends ArrowEffectGadget { C.cWhite + "We whish you a marry " + C.Scramble + "christmas" + C.cWhite + ".", }, - 1, + -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java index 41659abca..020cac190 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java @@ -21,7 +21,7 @@ public class ArrowTrailFrostLord extends ArrowEffectGadget C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", }, - 10, + -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java index 534d7f3b0..051684e25 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java @@ -26,7 +26,7 @@ public class ArrowTrailTitan extends ArrowEffectGadget " ", C.cRed + "Unlocked with Titan Rank", }, - -3, + -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java index 524b45244..8a82b7519 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java @@ -21,7 +21,7 @@ public class DeathCandyCane extends DeathEffectGadget C.cWhite + "COLORS FTW!", C.cWhite + "Take damage with SWAG B)", }, - 10, + -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java index f0e5d5d42..2896ca7af 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java @@ -18,7 +18,7 @@ public class DeathFrostLord extends DeathEffectGadget C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", }, - 10, + -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java index e7f205cf6..fe8dc0982 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java @@ -22,7 +22,7 @@ public class DeathTitan extends DeathEffectGadget " ", C.cRed + "Unlocked with Titan Rank", }, - -3, + -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java index 090963762..8a4e17a29 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java @@ -20,7 +20,7 @@ public class DoubleJumpCandyCane extends DoubleJumpEffectGadget { C.cWhite + "We whish you a marry " + C.Scramble + "christmas" + C.cWhite + ".", }, - 1, + -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java index ab1047715..d40c8388d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java @@ -19,7 +19,7 @@ public class DoubleJumpFrostLord extends DoubleJumpEffectGadget { C.cWhite + "More snow incomming.", }, - 1, + -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java index ed418db96..7749ce217 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -27,7 +27,7 @@ public class DoubleJumpTitan extends DoubleJumpEffectGadget " ", C.cRed + "Unlocked with Titan Rank", }, - -3, + -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java index 5a58edd2e..4bc85b096 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java @@ -12,7 +12,7 @@ public class HatCoal extends HatGadget public HatCoal(GadgetManager manager) { - super(manager, "Coal Hat", new String[]{C.cWhite + "Coal Hat"}, 10, new ItemStack(Material.COAL_BLOCK)); + super(manager, "Coal Hat", new String[]{C.cWhite + "Coal Hat"}, -3, new ItemStack(Material.COAL_BLOCK)); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java index 393f956b2..41f74c93e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java @@ -9,7 +9,7 @@ public class HatPresent extends HatGadget public HatPresent(GadgetManager manager) { - super(manager, "Present Hat", new String[]{C.cWhite + "Present Hat"}, 10, "christmasgift"); + super(manager, "Present Hat", new String[]{C.cWhite + "Present Hat"}, -3, "christmasgift"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java index 618e1005e..f2fa35bbc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java @@ -9,7 +9,7 @@ public class HatSanta extends HatGadget public HatSanta(GadgetManager manager) { - super(manager, "Santa Hat", new String[]{C.cWhite + "Santa Hat"}, 10, "Presents"); + super(manager, "Santa Hat", new String[]{C.cWhite + "Santa Hat"}, -3, "Presents"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java index 69a2ca1f5..209d78015 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java @@ -9,7 +9,7 @@ public class HatSnowman extends HatGadget public HatSnowman(GadgetManager manager) { - super(manager, "Snowman Hat", new String[]{C.cWhite + "Snowman Hat"}, 10, "snowman002"); + super(manager, "Snowman Hat", new String[]{C.cWhite + "Snowman Hat"}, -3, "snowman002"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index b0fae1e93..4d5c06203 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -45,12 +45,12 @@ public class ItemCoal extends ItemGadget C.cDGray + "Exclusive Coal!", C.cDGray + "Earned by beeing naughty" } - , -1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] + , 1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] { C.cDGray + "Exclusive Coal!", C.cDGray + "Earned by beeing naughty" } - , 100, 100)); + , 1, 1)); } @Override @@ -65,7 +65,7 @@ public class ItemCoal extends ItemGadget { if(data) { - player.sendMessage(F.main("Coal", "You unlocked " + C.cDGray + "COAL FUMES!")); + player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Fumes" + C.cGray + ".")); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java index d8ac3177e..c630f69cb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java @@ -51,10 +51,10 @@ public class ItemFreezeCannon extends ItemGadget implements IThrown { C.cWhite + "Freeze your nemesis inside a block of ice!" } - , -1, Material.ICE, (byte) 0, 2000, new Ammo("Freeze Cannon", "100 Ice Blocks", Material.ICE, (byte) 0, new String[] + , 1, Material.ICE, (byte) 0, 2000, new Ammo("Freeze Cannon", "100 Ice Blocks", Material.ICE, (byte) 0, new String[] { C.cWhite + "100 Ice Blocks for you to launch!" - }, 500, 100)); + }, -1, 1)); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java index 2a44e16da..2338a8424 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java @@ -9,6 +9,7 @@ import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAction; @@ -33,29 +34,29 @@ public class ItemPartyPopper extends ItemGadget implements IThrown super(manager, "Confetti Bomb", new String[] { C.cWhite + "POP BANG!", - }, -1, Material.GOLDEN_CARROT, (byte) 0, 1000, new Ammo("Confetti Bomb", "100 Party Poppers", Material.DIAMOND_BARDING, + }, 1, Material.GOLDEN_CARROT, (byte) 0, 1000, new Ammo("Confetti Bomb", "1 Party Popper", Material.GOLDEN_CARROT, (byte) 0, new String[] { C.cWhite + "100 Party Poppers for you to shoot!" - }, 500, 100)); + }, -2, 1)); } @Override public void ActivateCustom(Player player) { - Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), - ItemStackFactory.Instance.CreateStack(Material.REDSTONE_LAMP_OFF, (byte)0, 1, "Lamp" + Math.random())); +// Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), +// ItemStackFactory.Instance.CreateStack(Material.REDSTONE_LAMP_OFF, (byte)0, 1, "Lamp" + Math.random())); +// +// UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.1), 1, false, 0, 0.2, 10, false); +// +// Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); - UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.1), 1, false, 0, 0.2, 10, false); - Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); - - /* for(int data : new int[]{1,2,4,5,6,9,10,11,12,13,14,15}) { UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), null, 0.4f, 50, ViewDist.LONG); - /* + for(int i = 0; i < 10; i++) { Vector v = new Vector(Math.random() - 0.5, Math.random() - 0.3, Math.random() - 0.5); @@ -67,7 +68,7 @@ public class ItemPartyPopper extends ItemGadget implements IThrown UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), v, 1, 0, ViewDist.LONG); } - /* + Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(Material.INK_SACK, (byte)data, 1, "Ink" + Math.random())); _items.add(ent); @@ -79,8 +80,8 @@ public class ItemPartyPopper extends ItemGadget implements IThrown UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.3).add(random), 1 + 0.4 * Math.random(), false, 0, 0.2, 10, false); Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); - */ -// } + + } // Sound for(int i = 0; i < 3; i++) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java index ce1f5dc79..8c5a232d3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java @@ -29,11 +29,11 @@ public class ItemSnowball extends ItemGadget C.cWhite + "Throw snowball!", C.cWhite + "Start epic snowfights!" } - , -1, Material.SNOW_BALL, (byte) 0, 1, new Ammo("Snowball", "50 Snowballs", Material.SNOW_BALL, (byte) 0, new String[] + , 1, Material.SNOW_BALL, (byte) 0, 1, new Ammo("Snowball", "1 Snowball", Material.SNOW_BALL, (byte) 0, new String[] { C.cWhite + "50 Snowballs for you to throw!" } - , 100, 50)); + , -3, 1)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java index 40a7ff8cd..4451b7b72 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java @@ -42,7 +42,7 @@ public class MorphSnowman extends MorphGadget super(manager, "Snowman Morph", new String[]{ C.cWhite + "Do you wanna build a snowman?", C.cWhite + "It doesn't have to be a snowman...", C.cWhite + "Or... it kind of does...", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Snowball", }, - 6000, Material.SNOW_BALL, (byte) 0); + -3, Material.SNOW_BALL, (byte) 0); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java index 1e36b454e..213332edf 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java @@ -9,9 +9,7 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; @@ -19,7 +17,6 @@ import org.bukkit.util.Vector; import mineplex.core.common.Rank; import mineplex.core.common.util.C; -import mineplex.core.common.util.MapUtil; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; @@ -54,7 +51,7 @@ public class MorphTitan extends MorphGadget C.cRed + "Unlocked with Titan Rank", }, -1, - Material.PRISMARINE_SHARD, (byte)0); + Material.PRISMARINE_CRYSTALS, (byte)0); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java index 110cbc4e8..b28852051 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java @@ -25,7 +25,7 @@ public class ParticleCandyCane extends ParticleGadget public ParticleCandyCane(GadgetManager manager) { - super(manager, "Candy Cane Particle", new String[]{"Christmas. Nuf said."}, 10, Material.CHEST, (byte)0); + super(manager, "Candy Cane Particle", new String[]{"Christmas. Nuf said."}, -3, Material.CHEST, (byte)0); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index e01e24201..7b5005624 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -23,8 +23,6 @@ import mineplex.core.updater.event.UpdateEvent; public class ParticleFrostLord extends ParticleGadget { - private HashSet _arrows = new HashSet(); - public ParticleFrostLord(GadgetManager manager) { super(manager, "Wind of the Frost Lord", new String[] @@ -33,7 +31,7 @@ public class ParticleFrostLord extends ParticleGadget C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", }, - 10, + -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java index 6c510f664..639d85d23 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java @@ -26,7 +26,7 @@ public class ParticleLegend extends ParticleGadget " ", C.cGreen + "Unlocked with Legend Rank", }, - -3, + -1, Material.ENDER_PORTAL_FRAME, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index 12353e872..7d5aa7025 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -32,7 +32,7 @@ public class ParticleTitan extends ParticleGadget " ", C.cRed + "Unlocked with Titan Rank", }, - -3, + -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java index 0c5b84e98..04559e60e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java @@ -33,7 +33,7 @@ public class MountBabyReindeer extends HorseMount { C.cWhite + "One of Santa's baby reindeers", C.cWhite + "Still trying to learn how to fly" - }, Material.SNOW_BALL, (byte) 0, 10, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); + }, Material.SNOW_BALL, (byte) 0, -3, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); } @EventHandler From 1661c056c1dda8d8c9560255a4ef595b6a4088d6 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 11 Dec 2015 15:21:05 +1300 Subject: [PATCH 139/223] Added line stuff --- .../mineplex/core/common/util/UtilText.java | 591 ++++++++++++++++-- 1 file changed, 530 insertions(+), 61 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index 771b1ec52..c5a805558 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -1,52 +1,469 @@ package mineplex.core.common.util; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; + +import javax.imageio.ImageIO; + +import mineplex.core.common.CurrencyType; import org.apache.commons.lang.WordUtils; -import org.bukkit.Material; +import org.bukkit.ChatColor; -public class UtilText { - public static String listToString(Collection inputList, boolean comma) { - String out = ""; +public class UtilText +{ + private static HashMap _characters = new HashMap(); - for (T cur : inputList) { - out += cur.toString() + (comma ? ", " : " "); + public static enum LineFormat + { + LORE(200), CHAT(319); + + private int _length; + + private LineFormat(int length) + { + _length = length; } - if (out.length() > 0) { - out = out.substring(0, out.length() - (comma ? 2 : 1)); + public int getLength() + { + return _length; } - - return out; } - - public static int upperCaseCount(String input) { - int count = 0; - - for (int k = 0; k < input.length(); k++) { - - - char ch = input.charAt(k); - if (Character.isUpperCase(ch)) - count++; - + + static + { + try + { + InputStream inputStream = CurrencyType.class.getResourceAsStream("ascii.png"); + BufferedImage image = ImageIO.read(inputStream); + + char[] text = new char[] + { + ' ', + '!', + '"', + '#', + '$', + '%', + '&', + '\'', + '(', + ')', + '*', + '+', + ',', + '-', + '.', + '/', + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + ':', + ';', + '<', + '=', + '>', + '?', + '@', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + '[', + '\\', + ']', + '^', + '_', + '`', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + '{', + '|', + '}', + '~' + }; + + int x = 0; + int y = 16; + + for (char c : text) + { + grab(c, image, x, y); + + if (x < 15 * 8) + { + x += 8; + } + else + { + x = 0; + y += 8; + } + } + + inputStream.close(); + } + catch (IOException e) + { + e.printStackTrace(); } - - return count; } - public static int lowerCaseCount(String input) { - int count = 0; - - for (int k = 0; k < input.length(); k++) { - - - char ch = input.charAt(k); - if (Character.isLowerCase(ch)) - count++; - + + public static String center(String string, LineFormat lineFormat) + { + int length = getLength(string); + + if (length > lineFormat.getLength()) + { + return string; } - - return count; + + // Get the number of empty pixels on both sides of the string + int div = (int) Math.floor((lineFormat.getLength() - length) / 2D); + + div -= 2; // For the gap between the strings + + return fillLine(" ", div) + string + fillLine(" ", div); + } + + public static String alignRight(String string, LineFormat lineFormat) + { + int length = getLength(string); + + if (length > lineFormat.getLength()) + { + return string; + } + + // Get the number of empty pixels on both sides of the string + int div = lineFormat.getLength() - length; + + div -= 1; // For the gap between the strings + + return fillLine(" ", div) + string; + } + + public static String centerChat(String string, LineFormat lineFormat) + { + int length = getLength(string); + + if (length > lineFormat.getLength()) + { + return string; + } + + // Get the number of empty pixels on both sides of the string + int div = (int) Math.floor(((lineFormat.getLength() + 10) - length) / 2D); + + div -= 2; // For the gap between the strings + + return fillLine(" ", div) + string; + } + + public static String substringPixels(String string, int cutoff) + { + int len = 0; + + char[] array = string.toCharArray(); + boolean bold = false; + + for (int i = 0; i < array.length; i++) + { + char c = array[i]; + + if (c == '�') + { + if (++i < array.length) + { + ChatColor color = ChatColor.getByChar(array[i]); + + if (color != null) + { + if (color.equals(ChatColor.BOLD)) + { + bold = true; + } + else if (color.equals(ChatColor.RESET) || color.isColor()) + { + bold = false; + } + } + } + + continue; + } + + if (!_characters.containsKey(c)) + { + continue; + } + + int toAdd = _characters.get(c); + + if (bold) + { + toAdd++; + } + + if (len + toAdd > cutoff) + { + return string.substring(0, Math.max(0, i - 1)); + } + + if (i + 1 < array.length) + { + len++; + } + } + + return string; + } + + public static ArrayList splitLines(String[] strings, LineFormat lineFormat) + { + ArrayList lines = new ArrayList(); + + for (String s : strings) + { + lines.addAll(splitLine(s, lineFormat)); + } + + return lines; + } + + public static ArrayList splitLine(String string, LineFormat lineFormat) + { + ArrayList strings = new ArrayList(); + String current = ""; + int currentLength = 0; + String[] split = string.split(" "); + String colors = ""; + + for (int i = 0; i < split.length; i++) + { + String word = split[i]; + int wordLength = getLength(colors + word); + + if (currentLength + wordLength + 4 > lineFormat.getLength() && !current.isEmpty()) + { + strings.add(current); + current = colors + word; + currentLength = wordLength + 1; + continue; + } + + if (i != 0) + { + current += " "; + currentLength += 4; + } + + current += word; + currentLength += wordLength; + colors = ChatColor.getLastColors(current); + } + + if (!current.isEmpty()) + { + strings.add(current); + } + + return strings; + } + + public static String fillLine(String filler, int maxPixels) + { + int pixels = getLength(filler); + + if (pixels <= 0) + { + return ""; + } + + String toReturn = ""; + int currentLen = 0; + + int offset = maxPixels % 4; + boolean isOffset = false; + + if (offset > 0) + { + toReturn += C.Bold; + } + + while (currentLen + pixels <= maxPixels) + { + currentLen += pixels + 1; + toReturn += filler; + + if (offset-- > 0) + { + currentLen++; + + if (offset == 0) + { + isOffset = false; + toReturn += ChatColor.RESET; + } + } + } + + if (isOffset) + { + toReturn += ChatColor.RESET; + } + + return toReturn; + } + + public static boolean fitsOneLine(String string, LineFormat lineFormat) + { + return getLength(string) <= lineFormat.getLength(); + } + + public static int getLength(String string) + { + int len = 0; + + char[] array = string.toCharArray(); + boolean bold = false; + + for (int i = 0; i < array.length; i++) + { + char c = array[i]; + + if (c == '�') + { + if (++i < array.length) + { + ChatColor color = ChatColor.getByChar(array[i]); + + if (color != null) + { + if (color.equals(ChatColor.BOLD)) + { + bold = true; + } + else if (color.equals(ChatColor.RESET) || color.isColor()) + { + bold = false; + } + } + } + + continue; + } + + if (!_characters.containsKey(c)) + { + continue; + } + + len += _characters.get(c); + + if (bold) + { + len++; + } + + if (i + 1 < array.length) + { + len++; + } + } + + return len; + } + + private static void grab(Character character, BufferedImage image, int imageX, int imageY) + { + if (character == ' ') + { + _characters.put(character, 3); + return; + } + + for (int x = 0; x < 8; x++) + { + boolean isTransparentLine = true; + + for (int y = 0; y < 8; y++) + { + int pixel = image.getRGB(imageX + x, imageY + y); + + if ((pixel >> 24) != 0x00) + { + isTransparentLine = false; + break; + } + } + + if (isTransparentLine) + { + _characters.put(character, x); + return; + } + } + + _characters.put(character, 8); } public static boolean isStringSimilar(String newString, String oldString, float matchRequirement) @@ -55,84 +472,136 @@ public class UtilText { { return newString.toLowerCase().equals(oldString.toLowerCase()); } - - for (int i=0 ; i < newString.length() * matchRequirement ; i++) + + for (int i = 0; i < newString.length() * matchRequirement; i++) { int matchFromIndex = 0; - - //Look for substrings starting at i - for (int j=0 ; j < oldString.length() ; j++) + + // Look for substrings starting at i + for (int j = 0; j < oldString.length(); j++) { - //End of newString - if (i+j >= newString.length()) + // End of newString + if (i + j >= newString.length()) { break; } - - //Matched - if (newString.charAt(i+j) == oldString.charAt(j)) + + // Matched + if (newString.charAt(i + j) == oldString.charAt(j)) { matchFromIndex++; - + if (matchFromIndex >= newString.length() * matchRequirement) return true; } - //No Match > Reset + // No Match > Reset else { break; } } } - + return false; } - + + public static String listToString(Collection inputList, boolean comma) + { + String out = ""; + + for (T cur : inputList) + { + out += cur.toString() + (comma ? ", " : " "); + } + + if (out.length() > 0) + { + out = out.substring(0, out.length() - (comma ? 2 : 1)); + } + + return out; + } + + public static int lowerCaseCount(String input) + { + int count = 0; + + for (int k = 0; k < input.length(); k++) + { + + char ch = input.charAt(k); + if (Character.isLowerCase(ch)) + count++; + + } + + return count; + } + + public static int upperCaseCount(String input) + { + int count = 0; + + for (int k = 0; k < input.length(); k++) + { + + char ch = input.charAt(k); + if (Character.isUpperCase(ch)) + count++; + + } + + return count; + } + public static String[] wrap(String text, int lineLength) { return wrap(text, lineLength, true); } - - public static String[] wrap(String text, int lineLength, boolean wrapLongerWords) { + + public static String[] wrap(String text, int lineLength, boolean wrapLongerWords) + { return WordUtils.wrap(text, lineLength, "\00D0", wrapLongerWords).split("\00D0"); } - + public static String repeat(String txt, int times) { return new String(new byte[times]).replace("\0", txt); } - - public static boolean plural(int x){ + + public static boolean plural(int x) + { return x <= 0 ? true : x > 1; } - public static String trim(int maxLength, String s) { + public static String trim(int maxLength, String s) + { return s.length() <= maxLength ? s : s.substring(0, maxLength); } public static String arrayToString(X[] array, String delimiter) { StringBuilder string = new StringBuilder(); - + int index = 0; for (X x : array) { string.append(x.toString()); - + if (index != array.length - 1) { string.append(delimiter); } - + index++; } - + return string.toString(); } - + public static String arrayToString(X[] array) { return arrayToString(array, null); } -} +} \ No newline at end of file From 563a0f0ec7081b079acf69d05e951250cf5e0e7a Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 02:30:44 +0000 Subject: [PATCH 140/223] remove tutorial and no flicker --- .../mineplex/core/common/util/UtilItem.java | 9 ++++++ .../arcade/game/games/gladiators/Arena.java | 29 +++++++++++++++++-- .../game/games/gladiators/Gladiators.java | 25 ++++++++-------- .../trackers/UntouchableTracker.java | 2 +- .../tutorial/TutorialPhaseGladiators.java | 1 - 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java index c82d37f9f..5a300322c 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java @@ -12,6 +12,7 @@ import java.util.Map.Entry; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import mineplex.core.common.structs.ItemContainer; @@ -1116,4 +1117,12 @@ public class UtilItem { return _materials.containsKey(material); } + + public static ItemStack makeUnbreakable(ItemStack i) + { + ItemMeta im = i.getItemMeta(); + im.spigot().setUnbreakable(true); + i.setItemMeta(im); + return i; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index 52079b41d..c63c4e922 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -42,6 +42,9 @@ public class Arena private ArenaState _state; private long _stateTime; + private boolean _alertedAlready; + private boolean _alertedAlready2; + private HashMap> _particles; public Arena(Gladiators host, Location mid, ArenaType colour) @@ -59,6 +62,8 @@ public class Arena _stateTime = System.currentTimeMillis(); _particles = new HashMap<>(); _doBye = false; + _alertedAlready = false; + _alertedAlready2 = false; setupSpawns(); } @@ -169,6 +174,16 @@ public class Arena return null; } + public boolean isAlertedAlready() + { + return _alertedAlready; + } + + public void setAlertedAlready(boolean alertedAlready) + { + _alertedAlready = alertedAlready; + } + private void setupSpawns() { ArrayList possible = (ArrayList) _host.WorldData.GetDataLocs("BLACK").clone(); @@ -279,10 +294,15 @@ public class Arena if (_host.getRoundState() != RoundState.FIGHTING) return; + if (_alertedAlready) + return; + for (Player p : getPastPlayers()) { - UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20, 0, p); + UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20 * 100, 0, p); } + + _alertedAlready = true; } else if (_state.equals(ArenaState.FIGHTING)) { @@ -306,11 +326,16 @@ public class Arena } else if (_state.equals(ArenaState.RUNNING)) { + if (_alertedAlready2) + return; + for (Player p : getPastPlayers()) { - UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20, 0, p); + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20 * 100, 0, p); } + _alertedAlready2 = true; + if (UtilTime.elapsed(_stateTime, 15000)) handleSlowMovers(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 260f7bd2c..dad8ea6b9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -36,6 +36,7 @@ import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; @@ -102,7 +103,7 @@ public class Gladiators extends SoloGame DamageTeamSelf = true; HungerSet = 20; DontAllowOverfill = true; - EnableTutorials = true; + EnableTutorials = false; registerStatTrackers( new BrawlerTracker(this), @@ -333,7 +334,7 @@ public class Gladiators extends SoloGame { _gameArenaSet = new ArrayList<>(); - //GetTeamList().get(0).GetSpawns().clear(); // Clear the original game spawns. + GetTeamList().get(0).GetSpawns().clear(); // Clear the original game spawns. int neededSpawns = Math.min(GetPlayers(true).size(), 16); // Quick fix Arena masterNode = getArenasOfType(ArenaType.RED).get(0); @@ -414,16 +415,14 @@ public class Gladiators extends SoloGame } } - // Moved the below to tutorial + for (Arena a : _gameArenaSet) + { + if (a.getCapacity() <= 0) + continue; -// for (Arena a : _gameArenaSet) -// { -// if (a.getCapacity() <= 0) -// continue; -// -// for (Location l : a.capacitySpawns()) -// GetTeamList().get(0).GetSpawns().add(l); -// } + for (Location l : a.capacitySpawns()) + GetTeamList().get(0).GetSpawns().add(l); + } } public ArrayList getGameArenaSet() @@ -697,8 +696,8 @@ public class Gladiators extends SoloGame p.getInventory().clear(); p.getInventory().setArmorContents(null); - p.getInventory().setItem(0, type.getLoadout().getSword()); - p.getInventory().setItem(1, type.getLoadout().getRod()); + p.getInventory().setItem(0, UtilItem.makeUnbreakable(type.getLoadout().getSword())); + p.getInventory().setItem(1, UtilItem.makeUnbreakable(type.getLoadout().getRod())); p.getInventory().setItem(2, type.getLoadout().getBow()); p.getInventory().setItem(8, type.getLoadout().getArrows()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java index bd9f68e61..44115ca72 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java @@ -44,7 +44,7 @@ public class UntouchableTracker extends StatTracker for (Player p : getGame().GetPlayers(true)) { if (_noWin.contains(p.getName())) - return; + continue; addStat(p, "Untouchable", 1, false, false); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java index 80ff77bca..1839b204a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/tutorial/TutorialPhaseGladiators.java @@ -15,7 +15,6 @@ public class TutorialPhaseGladiators extends TutorialPhase super(new TutorialText[]{ new TutorialText("Defeat your opponent!", 20 * 4, 1), new TutorialText("", 20 * 2, 2), - new TutorialText("To the next arena!", "Follow the particles", 20 * 4, 3) }); } From d6aed5dff701ea300299ba9bb8e351336968651d Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 21:32:10 -0500 Subject: [PATCH 141/223] More work --- .../core/playerCount/PlayerCountManager.java | 2 +- .../mineplex/core/treasure/gui/TreasurePage.java | 2 +- .../Mineplex.Hub/src/mineplex/hub/HubManager.java | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java index c73f87d00..826cf7636 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java @@ -64,7 +64,7 @@ public class PlayerCountManager extends MiniPlugin @EventHandler public void refresh(UpdateEvent event) { - if (event.getType() != UpdateType.SEC) + if (event.getType() != UpdateType.SLOW) return; runAsync(this::updatePlayerCount); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java index a466fb6f2..2a028405e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java @@ -112,7 +112,7 @@ public class TreasurePage extends ShopPageBase List christmasLore = new ArrayList(); christmasLore.add(" "); - christmasLore.add(F.value("Christmas Chests Owned", "" + christmasCount)); + christmasLore.add(F.value("Winter Holiday Chests Owned", "" + christmasCount)); christmasLore.add(" "); christmasLore.add(C.cGray + "All our previous adventurers have"); christmasLore.add(C.cGray + "perished in search of these chests."); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 6eaf1149a..b2b31a380 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -55,6 +55,7 @@ import mineplex.core.party.Party; import mineplex.core.party.PartyManager; import mineplex.core.personalServer.PersonalServerManager; import mineplex.core.pet.PetManager; +import mineplex.core.playerCount.PlayerCountManager; import mineplex.core.poll.PollManager; import mineplex.core.portal.Portal; import mineplex.core.preferences.PreferencesManager; @@ -157,6 +158,7 @@ public class HubManager extends MiniClientPlugin private PetManager _petManager; private PacketHandler _packetHandler; private PersonalServerManager _personalServerManager; + private PlayerCountManager _playerCountManager; // private HalloweenSpookinessManager _halloweenManager; // private TrickOrTreatManager _trickOrTreatManager; @@ -246,6 +248,8 @@ public class HubManager extends MiniClientPlugin // NotificationManager notificationManager = new NotificationManager(plugin, clientManager, donationManager); // new MailManager(_plugin, notificationManager); + _playerCountManager = new PlayerCountManager(plugin); + _songs = new ArrayList(); try @@ -729,14 +733,11 @@ public class HubManager extends MiniClientPlugin obj.getScore(" ").setScore(line--); //Players + int playerCount = _playerCountManager.getPlayerCount(); obj.getScore(C.cYellow + C.Bold + "Players").setScore(line--); - player.getScoreboard().resetScores(_lastPlayerCount + ""); - - _lastPlayerCount++; - - obj.getScore(_lastPlayerCount + "").setScore(line--); - + obj.getScore(playerCount + "").setScore(line--); + _lastPlayerCount = playerCount; //Space obj.getScore(" ").setScore(line--); From 1607345f045515b6aa8e4856985701b48ee9664f Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 02:41:44 +0000 Subject: [PATCH 142/223] title + debug --- .../game/games/gladiators/Gladiators.java | 25 ++++++++++++++++++- .../gladiators/trackers/FlawlessTracker.java | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index dad8ea6b9..798763d67 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -82,6 +82,8 @@ public class Gladiators extends SoloGame private ArenaType _furthestOutCurrent; + private boolean _firstRound; + public Gladiators(ArcadeManager manager) { super(manager, GameType.Gladiators, @@ -116,6 +118,7 @@ public class Gladiators extends SoloGame _playerArenas = new HashMap<>(); _roundState = RoundState.WAITING; + _firstRound = true; } @EventHandler @@ -516,6 +519,8 @@ public class Gladiators extends SoloGame a.setState(ArenaState.WAITING); } + UtilTextMiddle.display(C.cGreen + "Gladiators!", C.cGreen + "Defeat your opponent to advance", 20, 60, 20); + return; } @@ -656,7 +661,7 @@ public class Gladiators extends SoloGame if (Recharge.Instance.use(p, "Arena Bounce", 500, false, false)) { //p.sendMessage("bounce. closest = " + closest.toString() + " player arena = " + _playerArenas.get(p).toString()); - UtilAction.velocity(p, UtilAlg.getTrajectory2d(e.getTo(), p.getLocation()), 1.7, true, 0.5, 0, 5, true); + UtilAction.velocity(p, UtilAlg.getTrajectory2d(e.getTo(), p.getLocation()), 1.7, true, 0.2, 0, 3, true); } return; @@ -793,6 +798,10 @@ public class Gladiators extends SoloGame else if (_roundState.equals(RoundState.STARTING_3)) { _roundState = RoundState.STARTING_2; + + if (_firstRound) + return; + UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); for (Player p : UtilServer.getPlayers()) @@ -802,6 +811,10 @@ public class Gladiators extends SoloGame else if (_roundState.equals(RoundState.STARTING_2)) { _roundState = RoundState.STARTING_1; + + if (_firstRound) + return; + UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); for (Player p : UtilServer.getPlayers()) @@ -811,6 +824,10 @@ public class Gladiators extends SoloGame else if (_roundState.equals(RoundState.STARTING_1)) { _roundState = RoundState.STARTED; + + if (_firstRound) + return; + UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); for (Player p : UtilServer.getPlayers()) @@ -821,6 +838,12 @@ public class Gladiators extends SoloGame { _roundState = RoundState.FIGHTING; + if (_firstRound) + { + _firstRound = false; + return; + } + UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 40, 0); for (Player p : UtilServer.getPlayers()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java index 088a428aa..ebdbad1cf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java @@ -34,6 +34,8 @@ public class FlawlessTracker extends StatTracker if (e.isCancelled()) return; + System.out.println(e.getEventName() + " took damage by " + e.getCause().toString()); + if (e.getEntity() instanceof Player) { _noWin.add(((Player)e.getEntity()).getName()); From 7a597d90b783350df54802f686259dfd961cd937 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 02:48:06 +0000 Subject: [PATCH 143/223] final push goodnight --- .../src/mineplex/core/achievement/Achievement.java | 10 +++++----- .../game/arcade/game/games/gladiators/Gladiators.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index cc80b6904..026355cf1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -795,11 +795,11 @@ public enum Achievement new int[]{10}, AchievementCategory.GLADIATORS), - GLADIATORS_FLAWLESS("Flawless", 1000, - new String[]{"Gladiators.Flawless"}, - new String[]{"Win a game of gladiators", "without taking any damage"}, - new int[]{1}, - AchievementCategory.GLADIATORS), +// GLADIATORS_FLAWLESS("Flawless", 1000, +// new String[]{"Gladiators.Flawless"}, +// new String[]{"Win a game of gladiators", "without taking any damage"}, +// new int[]{1}, +// AchievementCategory.GLADIATORS), GLADIATORS_PRECISION("Precision", 800, new String[]{"Gladiators.Precision"}, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 798763d67..f4bec1e85 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -110,7 +110,7 @@ public class Gladiators extends SoloGame registerStatTrackers( new BrawlerTracker(this), new UntouchableTracker(this), - new FlawlessTracker(this), + //new FlawlessTracker(this), new PrecisionTracker(this), new SwiftKillTracker(this) ); From a760dba78310548bd3b4e5c4a6a9acd4fcd9ac3d Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 02:59:16 +0000 Subject: [PATCH 144/223] i lied. --- .../src/mineplex/core/achievement/Achievement.java | 10 +++++----- .../game/arcade/game/games/gladiators/Gladiators.java | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 026355cf1..ee32d3854 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -789,11 +789,11 @@ public enum Achievement new int[]{3}, AchievementCategory.GLADIATORS), - GLADIATORS_UNTOUCHABLE("Untouchable", 1500, - new String[]{"Gladiators.Untouchable"}, - new String[]{"Kill 10 Gladiators", "without taking any damage"}, - new int[]{10}, - AchievementCategory.GLADIATORS), +// GLADIATORS_UNTOUCHABLE("Untouchable", 1500, +// new String[]{"Gladiators.Untouchable"}, +// new String[]{"Kill 10 Gladiators", "without taking any damage"}, +// new int[]{10}, +// AchievementCategory.GLADIATORS), // GLADIATORS_FLAWLESS("Flawless", 1000, // new String[]{"Gladiators.Flawless"}, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index f4bec1e85..9fa85f642 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -109,7 +109,7 @@ public class Gladiators extends SoloGame registerStatTrackers( new BrawlerTracker(this), - new UntouchableTracker(this), + //new UntouchableTracker(this), //new FlawlessTracker(this), new PrecisionTracker(this), new SwiftKillTracker(this) @@ -548,6 +548,10 @@ public class Gladiators extends SoloGame if (_roundState == RoundState.WAITING) { _roundState = RoundState.STARTING_5; + + if (_firstRound) + return; + UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); _furthestOutCurrent = getFurthestOut(); // Find furthest out for fight. From 4cfa7c436b619491bc3f167124c791a8f6838c23 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 11 Dec 2015 16:48:40 +1300 Subject: [PATCH 145/223] Add missing file --- .../src/mineplex/core/common/ascii.png | Bin 0 -> 2516 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/ascii.png diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/ascii.png b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/ascii.png new file mode 100644 index 0000000000000000000000000000000000000000..587966dc34dccb49992236660b344f46c66c965c GIT binary patch literal 2516 zcmV;_2`l!AP)_m$LuoG-{_;|FwLyek9-e9{o+0 zt{v=kxUxLj#$TG<{@vsA(t+;4Y`%iR(R_=0csqm{AF?AYF2&A2N`T$69)+sEz4oK| z-fw1)Pdy(<`QJ;5%uk!KNS=&l^Pip=vC!iJAC%$T4oX$sKV$WQ6*}Vtat%YEgsQg zy+yY2@3I3tW^ug*M1K?AVJl4d*K+`Naj$hma5=j}k#CE`d^-mSp@5979Z`ai-+T2~ zD8RENe6#GA!oUm+L$uhdIaRHRzuC^!}-@-{%kNL6V{FC&2H0HW4HRD66h2e_U4Si2J;4r`Lp1yCuv z>P48LTTpGx5CJR-U_`*(D4?1EHne^L%&tt3SFi^mR9>x!U%l5x#;?E9E4Lb^A!W?| zM_Fu?MMn)e8JM_|S8#TRvyP$J@i(L*%MhY)=tRy3tlj(cgC3N-j>cr&nsUc~-Fb{b zC1dMX_{}pA6R|@maQF-zAT|E$psH-`=mJ(;oM2H#wbG_UTG9Lu%O*X)cCTZ{C9Mo& zkfZ2K|1A-VY>=qa&3`&T#9CIxP8pk6zJfc*t z_>C%+**lNO?oErLyK%htyBYmaTx?;+ukv}wD3~o{?NaLit7zw=zM(k#4u$aCX2u@S z6pP~70jli;s!3$}#$x;Qi>r5Sc}F_iq7Q+iLzzI;E9yC zVBTF0A=TmNXXqB^|3^fv{8jp2Wh|n{rw+?DJE8}>qh{I}stAC27qKZI&1#Dtg={n1ueJt8 z39u=yZZWW_IzRgSdUSjYL|cJCnum+o^ZHDAWqxLS%KXPc!MEf2pPlrRgoHA!v;#0W z8fjmt1ZU=6Wr!--0PJz@6YLDtmO#dQ+VDMk9%_aRM`U{~|a&9BrG-SG;P55Z`_;APHfs(8}yF4mm*Yhdt9F8Y|!WZRTCT zS?~T;?GQ!0|D6h9Up1GAycfWD6=zWzWJzNTB~ib6wtUsAVygFvE5w8{(B*RH>BzMw zl_?sXydJh^okCRc15&?>?4Y|0Jyo`d=#woG%UzVsXXc;f0Bv?yGBsXTD3O-ZcD~rc zDrr>;o^>|@f`JSNKv`^7MnCO~M*s^eu zt)IFcety~N`rVT;fB*K%ZMOBC)UFHN`?iRnrz|OnVAh*{5hYS)h84^cTfSKfk8psi zc6??-3XONxn|>L@5Us!0j{2>J+c`jw8&q1ynEYr2w9JBK-bPlU1dpg`4scaIqHIld zFf?k@(^1&^(eZixi*S%^e%B+&QvOCp28-SA)2wGD8U^&MTuL2ar%5QlV}T>q$v#@7 zEQ{(LmaM$$GQGaB*XO(lBAE@8E&thj;LAC{+pU_a$X^w&k$C;9vJssB{z?LZxz@(VhE|&;mmuxnYWNLy2`BjLj=H5UgUYS73x@-k57(vceN7wgnJfS3EXKDz)lN1 z9GP{Mn%%xC27zLHUYv!<`Nol%Bt*s`%2`hyv(6CKH>x8<^_!Xc1=IK5w>v@Tsxj_-rq9_Dr&vFet*y%i2D0m;m$HpafB!$h{1AOJJ;{^gAJwI zTW||8jpn@9&usrby@?scv#Y|~PcXn7r(_YYwV^79`MH>Wm z5DH=nu9^p>{H`E`VW98IF5hsZmqhEMG64`0000 Date: Thu, 10 Dec 2015 22:52:15 -0500 Subject: [PATCH 146/223] Treasure Shards! --- .../src/mineplex/core/treasure/gui/TreasurePage.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java index 2a028405e..889765b9b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java @@ -68,7 +68,7 @@ public class TreasurePage extends ShopPageBase basicLore.add(ChatColor.RESET + C.cGreen + "Click to Open!"); else { - basicLore.add(ChatColor.RESET + "Click to Purchase for " + C.cYellow + "1000 Coins"); + basicLore.add(ChatColor.RESET + "Click to Purchase for " + C.cAqua + "1000 Treasure Shards"); basicLore.add(" "); basicLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } @@ -85,7 +85,7 @@ public class TreasurePage extends ShopPageBase heroicLore.add(ChatColor.RESET + C.cGreen + "Click to Open!"); else { - heroicLore.add(ChatColor.RESET + "Click to Purchase for " + C.cYellow + "5000 Coins"); + heroicLore.add(ChatColor.RESET + "Click to Purchase for " + C.cAqua + "5000 Treasure Shards"); heroicLore.add(" "); heroicLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } @@ -105,7 +105,7 @@ public class TreasurePage extends ShopPageBase legendaryLore.add(ChatColor.RESET + C.cGreen + "Click to Open!"); else { - legendaryLore.add(ChatColor.RESET + "Click to Purchase for " + C.cYellow + "10000 Coins"); + legendaryLore.add(ChatColor.RESET + "Click to Purchase for " + C.cAqua + "10000 Treasure Shards"); legendaryLore.add(" "); legendaryLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } @@ -125,7 +125,7 @@ public class TreasurePage extends ShopPageBase christmasLore.add(ChatColor.RESET + C.cGreen + "Click to Open!"); else { - christmasLore.add(ChatColor.RESET + "Click to Purchase for " + C.cYellow + "10000 Coins"); + christmasLore.add(ChatColor.RESET + "Click to Purchase for " + C.cAqua + "10000 Treasure Shards"); christmasLore.add(" "); christmasLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } From 3cd187ff044a624d39ed2d5de6ee4325136dde81 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 11 Dec 2015 16:57:21 +1300 Subject: [PATCH 147/223] Move LineFormat.java --- .../mineplex/core/common/util/LineFormat.java | 18 ++++++++++++++++++ .../mineplex/core/common/util/UtilText.java | 17 ----------------- 2 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java new file mode 100644 index 000000000..8f5f7320e --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java @@ -0,0 +1,18 @@ +package mineplex.core.common.util; + +public enum LineFormat +{ + LORE(200), CHAT(319); + + private int _length; + + private LineFormat(int length) + { + _length = length; + } + + public int getLength() + { + return _length; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index c5a805558..86826296e 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -18,23 +18,6 @@ public class UtilText { private static HashMap _characters = new HashMap(); - public static enum LineFormat - { - LORE(200), CHAT(319); - - private int _length; - - private LineFormat(int length) - { - _length = length; - } - - public int getLength() - { - return _length; - } - } - static { try From 21c8a669178939e681e998df899a1173fb0fc17b Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Thu, 10 Dec 2015 23:15:35 -0500 Subject: [PATCH 148/223] Fix imports --- .../src/mineplex/core/bonuses/BonusRepository.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java index d2b7613af..6c150e409 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java @@ -7,29 +7,21 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; -import java.util.Map; -import com.sun.org.apache.xpath.internal.operations.Bool; -import mineplex.core.bonuses.gui.SpinGui; import mineplex.core.common.Pair; import mineplex.core.common.util.Callback; -import mineplex.core.common.util.F; -import mineplex.core.common.util.UtilPlayer; import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; -import mineplex.core.database.column.ColumnInt; import mineplex.core.donation.DonationManager; import mineplex.core.recharge.Recharge; import mineplex.database.Tables; import mineplex.database.tables.records.BonusRecord; -import org.jooq.Configuration; import org.jooq.DSLContext; import org.jooq.Record2; import org.jooq.SQLDialect; import org.jooq.TableField; import org.jooq.impl.DSL; -import org.jooq.impl.DefaultConfiguration; import org.bukkit.Bukkit; import org.bukkit.entity.Player; From c5f0624bf73f51c39eca9550a74a5def760800a4 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 11 Dec 2015 17:17:52 +1300 Subject: [PATCH 149/223] Add build file --- Plugins/BuildFiles/common.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/BuildFiles/common.xml b/Plugins/BuildFiles/common.xml index 6c5db05db..4200a7c8a 100644 --- a/Plugins/BuildFiles/common.xml +++ b/Plugins/BuildFiles/common.xml @@ -66,10 +66,10 @@ - + From a5b28422cd1d0761f99b8b2b000a8e55b1968add Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 15:19:20 +1100 Subject: [PATCH 150/223] cosmetics --- .../src/mineplex/core/common/util/UtilText.java | 13 +++++++++++++ Plugins/Mineplex.Core/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +++--- .../src/mineplex/core/bonuses/BonusRepository.java | 1 - .../mineplex/core/cosmetic/ui/page/CostumePage.java | 2 -- .../gadgets/arrowtrail/ArrowTrailCandyCane.java | 8 ++++---- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index c5a805558..a3bd9cdf9 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -288,6 +288,19 @@ public class UtilText return lines; } + + public static String[] splitLineToArray(String string, LineFormat lineFormat) + { + ArrayList lineList = splitLine(string, lineFormat); + + String[] lineArray = new String[lineList.size()]; + lineArray = lineList.toArray(lineArray); + + for (String cur : lineArray) + System.out.println(cur); + + return lineArray; + } public static ArrayList splitLine(String string, LineFormat lineFormat) { diff --git a/Plugins/Mineplex.Core/.classpath b/Plugins/Mineplex.Core/.classpath index 1b29691dd..c43f4d9b1 100644 --- a/Plugins/Mineplex.Core/.classpath +++ b/Plugins/Mineplex.Core/.classpath @@ -1,7 +1,7 @@ - + diff --git a/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs index d17b6724d..a698e5967 100644 --- a/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs +++ b/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java index d2b7613af..5d7440096 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java @@ -9,7 +9,6 @@ import java.sql.Timestamp; import java.sql.Types; import java.util.Map; -import com.sun.org.apache.xpath.internal.operations.Bool; import mineplex.core.bonuses.gui.SpinGui; import mineplex.core.common.Pair; import mineplex.core.common.util.Callback; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java index 803f8705f..8e32e2707 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java @@ -9,8 +9,6 @@ import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; -import com.sun.org.glassfish.gmbal.ManagedAttribute; - import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.C; import mineplex.core.cosmetic.CosmeticManager; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java index 85cb085d6..692fff6ff 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java @@ -8,6 +8,8 @@ import mineplex.core.common.util.C; 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.UtilText; +import mineplex.core.common.util.UtilText.LineFormat; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.ArrowEffectGadget; @@ -17,10 +19,8 @@ public class ArrowTrailCandyCane extends ArrowEffectGadget public ArrowTrailCandyCane(GadgetManager manager) { - super(manager, "Candy Cane Arrow Effect", new String[] - { - C.cWhite + "We whish you a marry " + C.Scramble + "christmas" + C.cWhite + ".", - }, + super(manager, "Candy Cane Arrows", + UtilText.splitLineToArray(C.cWhite + "The real reason no one visits the North Pole? Santa’s Elves are deadly shots.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0); } From 88f44a293bc1215788e4b725249f8719be2f3507 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 15:31:35 +1100 Subject: [PATCH 151/223] candy! --- .../core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java index 692fff6ff..c02c7f4c5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java @@ -5,11 +5,11 @@ import org.bukkit.Material; import org.bukkit.entity.Arrow; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilText; -import mineplex.core.common.util.UtilText.LineFormat; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.ArrowEffectGadget; From 05a80b23a165365af3b434411fae4fe5142847e0 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 16:07:02 +1100 Subject: [PATCH 152/223] converting gadget text. (kill me now) --- Plugins/BuildFiles/common.xml | 10 + .../mineplex/core/common/util/UtilText.java | 13 +- .../arrowtrail/ArrowTrailFrostLord.java | 10 +- .../gadgets/arrowtrail/ArrowTrailTitan.java | 12 +- .../gadget/gadgets/death/DeathCandyCane.java | 9 +- .../gadget/gadgets/death/DeathFrostLord.java | 10 +- .../core/gadget/gadgets/death/DeathTitan.java | 12 +- .../doublejump/DoubleJumpCandyCane.java | 8 +- .../doublejump/DoubleJumpFrostLord.java | 8 +- .../gadgets/doublejump/DoubleJumpTitan.java | 12 +- .../core/gadget/gadgets/hat/HatCoal.java | 7 +- .../core/gadget/gadgets/hat/HatPresent.java | 7 +- .../core/gadget/gadgets/hat/HatSanta.java | 7 +- .../core/gadget/gadgets/hat/HatSnowman.java | 7 +- .../core/gadget/gadgets/item/ItemBatGun.java | 9 +- .../core/gadget/gadgets/item/ItemCoal.java | 11 +- .../gadget/gadgets/item/ItemCoinBomb.java | 22 +- .../gadgets/item/ItemEtherealPearl.java | 9 +- .../gadget/gadgets/item/ItemFirework.java | 10 +- .../gadget/gadgets/item/ItemFleshHook.java | 10 +- .../gadget/gadgets/item/ItemFreezeCannon.java | 11 +- .../core/gadget/gadgets/item/ItemGemBomb.java | 218 ------------------ .../gadget/gadgets/item/ItemKothSword.java | 5 - .../gadgets/item/ItemMelonLauncher.java | 10 +- .../gadget/gadgets/item/ItemPaintballGun.java | 9 +- .../gadget/gadgets/item/ItemPaintbrush.java | 10 +- .../gadget/gadgets/item/ItemPartyPopper.java | 9 +- .../gadget/gadgets/item/ItemSnowball.java | 11 +- .../core/gadget/gadgets/item/ItemTNT.java | 9 +- .../gadgets/particle/ParticleCandyCane.java | 7 +- .../gadgets/particle/ParticleCoalFumes.java | 9 +- .../gadgets/particle/ParticleFrostLord.java | 10 +- .../gadgets/particle/ParticleTitan.java | 12 +- .../src/mineplex/hub/HubManager.java | 4 +- 34 files changed, 161 insertions(+), 376 deletions(-) delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java diff --git a/Plugins/BuildFiles/common.xml b/Plugins/BuildFiles/common.xml index 4200a7c8a..4b97fdaac 100644 --- a/Plugins/BuildFiles/common.xml +++ b/Plugins/BuildFiles/common.xml @@ -9,6 +9,7 @@ + @@ -110,6 +111,7 @@ + @@ -142,6 +144,7 @@ + @@ -191,6 +194,7 @@ + @@ -239,6 +243,7 @@ + @@ -276,6 +281,7 @@ + @@ -403,6 +409,7 @@ + @@ -435,6 +442,7 @@ + @@ -462,6 +470,7 @@ + @@ -490,6 +499,7 @@ + diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index 79a4dc61e..aec40852a 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -260,6 +260,16 @@ public class UtilText return string; } + public static String[] splitLinesToArray(String[] strings, LineFormat lineFormat) + { + ArrayList lineList = splitLines(strings, lineFormat); + + String[] lineArray = new String[lineList.size()]; + lineArray = lineList.toArray(lineArray); + + return lineArray; + } + public static ArrayList splitLines(String[] strings, LineFormat lineFormat) { ArrayList lines = new ArrayList(); @@ -279,9 +289,6 @@ public class UtilText String[] lineArray = new String[lineList.size()]; lineArray = lineList.toArray(lineArray); - for (String cur : lineArray) - System.out.println(cur); - return lineArray; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java index 020cac190..8503deb02 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java @@ -4,8 +4,10 @@ import org.bukkit.Material; import org.bukkit.entity.Arrow; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.ArrowEffectGadget; @@ -15,12 +17,8 @@ public class ArrowTrailFrostLord extends ArrowEffectGadget { public ArrowTrailFrostLord(GadgetManager manager) { - super(manager, "Arrows of the Frost Lord", new String[] - { - C.cWhite + "You are a mighty frost lord.", - C.cWhite + "Your double jumps and arrows", - C.cWhite + "are enchanted with snow powers.", - }, + super(manager, "Arrows of the Frost Lord", + UtilText.splitLineToArray(C.cWhite + "The Frost Lord’s arrows bring a blast of winter in the wind of their passing.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java index 051684e25..773e5b677 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java @@ -7,8 +7,10 @@ import org.bukkit.event.player.PlayerJoinEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -18,14 +20,8 @@ public class ArrowTrailTitan extends ArrowEffectGadget { public ArrowTrailTitan(GadgetManager manager) { - super(manager, "Arrows of the Titans", new String[] - { - C.cWhite + "These flames are said to be the", - C.cWhite + "souls of a lost civilisation of", - C.cWhite + "Titans, forgotten by time.", - " ", - C.cRed + "Unlocked with Titan Rank", - }, + super(manager, "Arrows of the Titans", + UtilText.splitLineToArray(C.cWhite + "Arrows forged in the Fires of Creation, they leave fiery trails in their wake.", LineFormat.LORE), -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java index 8a82b7519..748accb1a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java @@ -6,7 +6,9 @@ import org.bukkit.event.EventHandler; import mineplex.core.blood.BloodEvent; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.DeathEffectGadget; @@ -16,11 +18,8 @@ public class DeathCandyCane extends DeathEffectGadget { public DeathCandyCane(GadgetManager manager) { - super(manager, "Candy Cane Effect", new String[] - { - C.cWhite + "COLORS FTW!", - C.cWhite + "Take damage with SWAG B)", - }, + super(manager, "Candy Cane Remains", + UtilText.splitLineToArray(C.cWhite + "The biggest enemy of the Holidays, is January.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java index 2896ca7af..2f6bd3b89 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java @@ -5,6 +5,8 @@ import org.bukkit.event.EventHandler; import mineplex.core.blood.BloodEvent; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.types.DeathEffectGadget; import mineplex.core.gadget.GadgetManager; @@ -12,12 +14,8 @@ public class DeathFrostLord extends DeathEffectGadget { public DeathFrostLord(GadgetManager manager) { - super(manager, "Frost Lord Death Effect", new String[] - { - C.cWhite + "You are a mighty frost lord.", - C.cWhite + "Your double jumps and arrows", - C.cWhite + "are enchanted with snow powers.", - }, + super(manager, "Fall of the Frost Lord", + UtilText.splitLineToArray(C.cWhite + "The power of Winter must eventually give way to Spring.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java index fe8dc0982..43c8b326d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java @@ -7,6 +7,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import mineplex.core.blood.BloodEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.DeathEffectGadget; @@ -14,14 +16,8 @@ public class DeathTitan extends DeathEffectGadget { public DeathTitan(GadgetManager manager) { - super(manager, "Ashes of the Titans", new String[] - { - C.cWhite + "These flames are said to be the", - C.cWhite + "souls of a lost civilisation of", - C.cWhite + "Titans, forgotten by time.", - " ", - C.cRed + "Unlocked with Titan Rank", - }, + super(manager, "Ashes of the Titans", + UtilText.splitLineToArray(C.cWhite + "Even a Titan can fall in combat if their opponent is fierce enough.", LineFormat.LORE), -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java index 8a4e17a29..b95ef4ff4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java @@ -5,9 +5,11 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.DoubleJumpEffectGadget; @@ -16,10 +18,8 @@ public class DoubleJumpCandyCane extends DoubleJumpEffectGadget public DoubleJumpCandyCane(GadgetManager manager) { - super(manager, "Candy Cane Jump Effect", new String[] - { - C.cWhite + "We whish you a marry " + C.Scramble + "christmas" + C.cWhite + ".", - }, + super(manager, "Candy Cane Blast", + UtilText.splitLineToArray(C.cWhite + "It is said every time an elf jumps, bits of Candy Cane fall out of their pockets.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java index d40c8388d..4291f9d94 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java @@ -4,7 +4,9 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; @@ -15,10 +17,8 @@ public class DoubleJumpFrostLord extends DoubleJumpEffectGadget { public DoubleJumpFrostLord(GadgetManager manager) { - super(manager, "Boots of the Frost Lord", new String[] - { - C.cWhite + "More snow incomming.", - }, + super(manager, "Gust of the Frost Lord", + UtilText.splitLineToArray(C.cWhite + "Listen, the Frost Lord is a very proper individual. Stop making fart jokes!", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java index 7749ce217..7b75adf3d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -8,8 +8,10 @@ import org.bukkit.event.player.PlayerToggleFlightEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -19,14 +21,8 @@ public class DoubleJumpTitan extends DoubleJumpEffectGadget { public DoubleJumpTitan(GadgetManager manager) { - super(manager, "Leap of the Titans", new String[] - { - C.cWhite + "These flames are said to be the", - C.cWhite + "souls of a lost civilisation of", - C.cWhite + "Titans, forgotten by time.", - " ", - C.cRed + "Unlocked with Titan Rank", - }, + super(manager, "Leap of the Titans", + UtilText.splitLineToArray(C.cWhite + "Out of the frying pan and into the fire.", LineFormat.LORE), -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java index 4bc85b096..a78b88736 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java @@ -4,6 +4,8 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.HatGadget; @@ -12,7 +14,10 @@ public class HatCoal extends HatGadget public HatCoal(GadgetManager manager) { - super(manager, "Coal Hat", new String[]{C.cWhite + "Coal Hat"}, -3, new ItemStack(Material.COAL_BLOCK)); + super(manager, "Lump of Coal", + UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + -3, + new ItemStack(Material.COAL_BLOCK)); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java index 41f74c93e..74005d330 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java @@ -1,6 +1,8 @@ package mineplex.core.gadget.gadgets.hat; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.HatGadget; @@ -9,7 +11,10 @@ public class HatPresent extends HatGadget public HatPresent(GadgetManager manager) { - super(manager, "Present Hat", new String[]{C.cWhite + "Present Hat"}, -3, "christmasgift"); + super(manager, "Present", + UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + -3, + "christmasgift"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java index f2fa35bbc..067f603e5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java @@ -1,6 +1,8 @@ package mineplex.core.gadget.gadgets.hat; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.HatGadget; @@ -9,7 +11,10 @@ public class HatSanta extends HatGadget public HatSanta(GadgetManager manager) { - super(manager, "Santa Hat", new String[]{C.cWhite + "Santa Hat"}, -3, "Presents"); + super(manager, "Santa", + UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + -3, + "Presents"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java index 209d78015..1e6ab44a4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java @@ -1,6 +1,8 @@ package mineplex.core.gadget.gadgets.hat; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.HatGadget; @@ -9,7 +11,10 @@ public class HatSnowman extends HatGadget public HatSnowman(GadgetManager manager) { - super(manager, "Snowman Hat", new String[]{C.cWhite + "Snowman Hat"}, -3, "snowman002"); + super(manager, "Snowmans Head", + UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + -3, + "snowman002"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java index 8cfcae673..62b8b2b39 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java @@ -13,12 +13,14 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; @@ -37,11 +39,8 @@ public class ItemBatGun extends ItemGadget public ItemBatGun(GadgetManager manager) { - super(manager, "Bat Blaster", new String[] - { - C.cWhite + "Launch waves of annoying bats", - C.cWhite + "at people you don't like!", - }, + super(manager, "Bat Blaster", + UtilText.splitLineToArray(C.cWhite + "Unleash waves of terrifying bats at people you don't like!", LineFormat.LORE), -1, Material.IRON_BARDING, (byte)0, 5000, new Ammo("Bat Blaster", "50 Bats", Material.IRON_BARDING, (byte)0, new String[] { C.cWhite + "50 Bats for your Bat Blaster!" }, 500, 50)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index 4d5c06203..098d136ff 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -11,6 +11,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilInv; @@ -19,6 +20,7 @@ import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; import mineplex.core.gadget.gadgets.Ammo; @@ -40,12 +42,9 @@ public class ItemCoal extends ItemGadget public ItemCoal(GadgetManager manager) { - super(manager, "Coal", new String[] - { - C.cDGray + "Exclusive Coal!", - C.cDGray + "Earned by beeing naughty" - } - , 1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] + super(manager, "Coal", + UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE) + , -1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] { C.cDGray + "Exclusive Coal!", C.cDGray + "Earned by beeing naughty" diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java index e68345215..d0039cd87 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoinBomb.java @@ -17,10 +17,12 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTime; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; @@ -35,27 +37,23 @@ public class ItemCoinBomb extends ItemGadget public ItemCoinBomb(GadgetManager manager) { - super(manager, "Coin Party Bomb", new String[] - { - C.cWhite + "It's party time! You will be", - C.cWhite + "everyones favourite player", - C.cWhite + "when you use one of these!", - }, + super(manager, "Treasure Party Bomb", + UtilText.splitLineToArray(C.cWhite + "It's party time! You'll be everyones favourite player when you use one of these!", LineFormat.LORE), -1, - Material.getMaterial(175), (byte)0, - 30000, new Ammo("Coin Party Bomb", "1 Coin Party Bomb", Material.getMaterial(175), (byte)0, new String[] { C.cWhite + "1 Coin Party Bomb to PARTY!" }, 2000, 1)); + Material.PRISMARINE, (byte)0, + 30000, new Ammo("Treasure Party Bomb", "1 Coin Party Bomb", Material.PRISMARINE, (byte)0, new String[] { C.cWhite + "1 Treasure Party Bomb" }, 2000, 1)); } @Override public void ActivateCustom(Player player) { - Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), new ItemStack(Material.GOLD_BLOCK)); + Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), new ItemStack(Material.PRISMARINE)); UtilAction.velocity(item, player.getLocation().getDirection(), 1, false, 0, 0.2, 1, false); _active.put(item, System.currentTimeMillis()); //Inform for (Player other : UtilServer.getPlayers()) - UtilPlayer.message(other, C.cYellow + C.Bold + player.getName() + C.cWhite + C.Bold + " has thrown a " + C.cYellow + C.Bold + "Coin Party Bomb" + C.cWhite + C.Bold + "!"); + UtilPlayer.message(other, C.cAqua + C.Bold + player.getName() + C.cWhite + C.Bold + " has thrown a " + C.cAqua + C.Bold + "Treasure Party Bomb" + C.cWhite + C.Bold + "!"); } @EventHandler @@ -74,11 +72,11 @@ public class ItemCoinBomb extends ItemGadget if (UtilTime.elapsed(time, 3000)) { if (Math.random() > 0.80) - UtilFirework.playFirework(item.getLocation(), FireworkEffect.builder().flicker(false).withColor(Color.YELLOW).with(Type.BURST).trail(false).build()); + UtilFirework.playFirework(item.getLocation(), FireworkEffect.builder().flicker(false).withColor(Color.AQUA).with(Type.BURST).trail(false).build()); else item.getWorld().playSound(item.getLocation(), Sound.FIREWORK_LAUNCH, 1f, 1f); - Item coin = item.getWorld().dropItem(item.getLocation().add(0, 1, 0), new ItemStack(Material.getMaterial(175))); + Item coin = item.getWorld().dropItem(item.getLocation().add(0, 1, 0), new ItemStack(Material.PRISMARINE_SHARD)); //Velocity long passed = System.currentTimeMillis() - time; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java index 2c07ba486..7f0b83cba 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemEtherealPearl.java @@ -19,10 +19,12 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; @@ -35,11 +37,8 @@ public class ItemEtherealPearl extends ItemGadget public ItemEtherealPearl(GadgetManager manager) { - super(manager, "Ethereal Pearl", new String[] - { - C.cWhite + "Take a ride through the skies", - C.cWhite + "on your very own Ethereal Pearl!", - }, + super(manager, "Ethereal Pearl", + UtilText.splitLineToArray(C.cWhite + "These Pearls are stolen from sleeping Endermen!", LineFormat.LORE), -1, Material.ENDER_PEARL, (byte)0, 500, new Ammo("Ethereal Pearl", "50 Pearls", Material.ENDER_PEARL, (byte)0, new String[] { C.cWhite + "50 Pearls to get around with!" }, 500, 50)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java index 1f7463054..597dc0a2a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFirework.java @@ -11,9 +11,11 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; @@ -22,12 +24,8 @@ public class ItemFirework extends ItemGadget { public ItemFirework(GadgetManager manager) { - super(manager, "Fireworks", new String[] - { - C.cWhite + "Need to celebrate?!", - C.cWhite + "Use some fireworks!", - C.cWhite + "Pew pew pew!", - }, + super(manager, "Fireworks", + UtilText.splitLineToArray(C.cWhite + "Need to celebrate? These fireworks should do the trick!", LineFormat.LORE), -1, Material.FIREWORK, (byte)0, 500, new Ammo("Fireworks", "50 Fireworks", Material.FIREWORK, (byte)0, new String[] { C.cWhite + "50 Fireworks for you to launch!" }, 500, 50)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java index e4bd3554a..a35ab819d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFleshHook.java @@ -11,9 +11,11 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; @@ -27,12 +29,8 @@ public class ItemFleshHook extends ItemGadget implements IThrown { public ItemFleshHook(GadgetManager manager) { - super(manager, "Flesh Hook", new String[] - { - C.cWhite + "Make new friends by throwing a hook", - C.cWhite + "into their face and pulling them", - C.cWhite + "towards you!", - }, + super(manager, "Flesh Hook", + UtilText.splitLineToArray(C.cWhite + "Make new friends by throwing a hook into their face and pulling them towards you!", LineFormat.LORE), -1, Material.getMaterial(131), (byte)0, 2000, new Ammo("Flesh Hook", "50 Flesh Hooks", Material.getMaterial(131), (byte)0, new String[] { C.cWhite + "50 Flesh Hooks for you to use!" }, 1000, 50)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java index c630f69cb..9c177ef3b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemFreezeCannon.java @@ -27,10 +27,12 @@ import org.bukkit.potion.PotionEffectType; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; @@ -47,11 +49,10 @@ public class ItemFreezeCannon extends ItemGadget implements IThrown public ItemFreezeCannon(GadgetManager manager) { - super(manager, "Freeze Cannon", new String[] - { - C.cWhite + "Freeze your nemesis inside a block of ice!" - } - , 1, Material.ICE, (byte) 0, 2000, new Ammo("Freeze Cannon", "100 Ice Blocks", Material.ICE, (byte) 0, new String[] + super(manager, "Freeze Cannon", + UtilText.splitLineToArray(C.cWhite + "Let someone cool off inside their very own ice cube!", LineFormat.LORE), + -1, + Material.ICE, (byte) 0, 2000, new Ammo("Freeze Cannon", "100 Ice Blocks", Material.ICE, (byte) 0, new String[] { C.cWhite + "100 Ice Blocks for you to launch!" }, -1, 1)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java deleted file mode 100644 index 0510dbf11..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemGemBomb.java +++ /dev/null @@ -1,218 +0,0 @@ -package mineplex.core.gadget.gadgets.item; - -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 org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.FireworkEffect; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.FireworkEffect.Type; -import org.bukkit.entity.Item; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - -import mineplex.core.common.CurrencyType; -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.UtilFirework; -import mineplex.core.common.util.UtilGear; -import mineplex.core.common.util.UtilInv; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; -import mineplex.core.gadget.gadgets.Ammo; -import mineplex.core.gadget.types.ItemGadget; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.recharge.Recharge; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; - -public class ItemGemBomb extends ItemGadget -{ - private HashMap _activeBombs = new HashMap(); - private HashSet _gems = new HashSet(); - - public ItemGemBomb(GadgetManager manager) - { - super(manager, "Gem Party Bomb", new String[] - { - C.cWhite + "It's party time! You will be", - C.cWhite + "everyones favourite player", - C.cWhite + "when you use one of these!", - " ", - C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "This uses 2000 Gems" - }, - -1, - Material.EMERALD, (byte)0, - 30000, new Ammo("Gem Party Bomb", "10 Gem Party Bomb", Material.EMERALD, (byte)0, new String[] { C.cWhite + "10 Coin Party Bomb to PARTY!" }, 10, 10)); - } - - @Override - @EventHandler - public void Activate(PlayerInteractEvent event) - { - if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) - return; - - if (UtilBlock.usable(event.getClickedBlock())) - return; - - if (!UtilGear.isMat(event.getPlayer().getItemInHand(), this.GetDisplayMaterial())) - return; - - Player player = event.getPlayer(); - - if (!IsActive(player)) - return; - - event.setCancelled(true); - - //Stock - if (Manager.getInventoryManager().Get(player).getItemCount(GetName()) <= 0) - { - - UtilPlayer.message(player, F.main("Gadget", "You do not have any " + GetName() + " left.")); - - ItemGadgetOutOfAmmoEvent ammoEvent = new ItemGadgetOutOfAmmoEvent(event.getPlayer(), this); - Bukkit.getServer().getPluginManager().callEvent(ammoEvent); - - return; - } - - //Gems - if (Manager.getDonationManager().Get(player.getName()).GetBalance(CurrencyType.Gems) < 2000) - { - UtilPlayer.message(player, F.main("Inventory", "You do not have the required " + C.cGreen + "2000 Gems") + "."); - return; - } - - //Already In Use - if (!_activeBombs.isEmpty()) - { - UtilPlayer.message(player, F.main("Inventory", "There is already a " + F.elem(C.cGreen + "Gem Bomb")) + " being used."); - return; - } - - //Recharge - if (!Recharge.Instance.use(player, GetName(), _recharge, _recharge > 1000, false)) - { - UtilInv.Update(player); - return; - } - - //Use Stock/Gems - Manager.getInventoryManager().addItemToInventory(player, GetName(), -1); - Manager.getDonationManager().RewardGems(null, GetName(), event.getPlayer().getName(), event.getPlayer().getUniqueId(), -2000); - - player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(GetName()))); - - ActivateCustom(event.getPlayer()); - } - - @Override - public void ActivateCustom(Player player) - { - Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), new ItemStack(Material.EMERALD_BLOCK)); - UtilAction.velocity(item, player.getLocation().getDirection(), 1, false, 0, 0.2, 1, false); - _activeBombs.put(item, System.currentTimeMillis()); - - //Inform - for (Player other : UtilServer.getPlayers()) - UtilPlayer.message(other, C.cGreen + C.Bold + player.getName() + C.cWhite + C.Bold + " has thrown a " + C.cGreen + C.Bold + "Gem Party Bomb" + C.cWhite + C.Bold + "!"); - } - - @EventHandler - public void Update(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; - - Iterator itemIterator = _activeBombs.keySet().iterator(); - - while (itemIterator.hasNext()) - { - Item item = itemIterator.next(); - long time = _activeBombs.get(item); - - if (UtilTime.elapsed(time, 3000)) - { - if (Math.random() > 0.80) - UtilFirework.playFirework(item.getLocation(), FireworkEffect.builder().flicker(false).withColor(Color.GREEN).with(Type.BURST).trail(false).build()); - else - item.getWorld().playSound(item.getLocation(), Sound.FIREWORK_LAUNCH, 1f, 1f); - - Item gem = item.getWorld().dropItem(item.getLocation().add(0, 1, 0), new ItemStack(Material.EMERALD)); - - //Velocity - long passed = System.currentTimeMillis() - time; - Vector vel = new Vector(Math.sin(passed/300d), 0, Math.cos(passed/300d)); - - UtilAction.velocity(gem, vel, Math.abs(Math.sin(passed/3000d)), false, 0, 0.2 + Math.abs(Math.cos(passed/3000d))*0.8, 1, false); - - gem.setPickupDelay(40); - - _gems.add(gem); - } - - if (UtilTime.elapsed(time, 23000)) - { - item.remove(); - itemIterator.remove(); - } - } - } - - @EventHandler - public void Pickup(PlayerPickupItemEvent event) - { - if (_activeBombs.keySet().contains(event.getItem())) - { - event.setCancelled(true); - } - else if (_gems.contains(event.getItem())) - { - event.setCancelled(true); - event.getItem().remove(); - - Manager.getDonationManager().RewardGemsLater(GetName() + " Pickup", event.getPlayer(), 4); - - event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ORB_PICKUP, 1f, 2f); - } - } - - @EventHandler - public void Clean(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - Iterator gemIterator = _gems.iterator(); - - while (gemIterator.hasNext()) - { - Item gem = gemIterator.next(); - - if (!gem.isValid() || gem.getTicksLived() > 1200) - { - gem.remove(); - gemIterator.remove(); - } - } - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java deleted file mode 100644 index 6c694ba4c..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemKothSword.java +++ /dev/null @@ -1,5 +0,0 @@ -package mineplex.core.gadget.gadgets.item; - -public class ItemKothSword { - -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java index ebe4d779e..78269f173 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemMelonLauncher.java @@ -20,10 +20,12 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; @@ -39,12 +41,8 @@ public class ItemMelonLauncher extends ItemGadget implements IThrown public ItemMelonLauncher(GadgetManager manager) { - super(manager, "Melon Launcher", new String[] - { - C.cWhite + "Deliciously fun!", - C.cWhite + "Eat the melon slices for a", - C.cWhite + "temporary speed boost!", - }, + super(manager, "Melon Launcher", + UtilText.splitLineToArray(C.cWhite + "Because who doesn't want to shoot watermelons at people?!", LineFormat.LORE), -1, Material.MELON_BLOCK, (byte)0, 1000, new Ammo("Melon Launcher", "100 Melons", Material.MELON_BLOCK, (byte)0, new String[] { C.cWhite + "100 Melons for you to launch!" }, 500, 100)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java index ce6f5d28e..c6ad69ce8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintballGun.java @@ -21,9 +21,11 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; @@ -40,10 +42,9 @@ public class ItemPaintballGun extends ItemGadget public ItemPaintballGun(GadgetManager manager) { - super(manager, "Paintball Gun", new String[] - { - C.cWhite + "PEW PEW PEW PEW!", - }, -1, Material.GOLD_BARDING, (byte) 0, 200, new Ammo("Paintball Gun", "100 Paintballs", Material.GOLD_BARDING, + super(manager, "Paintball Gun", + UtilText.splitLineToArray(C.cWhite + "PEW PEW PEW!", LineFormat.LORE), + -1, Material.GOLD_BARDING, (byte) 0, 200, new Ammo("Paintball Gun", "100 Paintballs", Material.GOLD_BARDING, (byte) 0, new String[] { C.cWhite + "100 Paintballs for you to shoot!" diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java index a7cbba607..9fa4d783b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java @@ -18,6 +18,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEvent; @@ -25,6 +26,7 @@ import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; @@ -43,12 +45,8 @@ public class ItemPaintbrush extends ItemGadget public ItemPaintbrush(GadgetManager manager) { - super(manager, "Paintbrush", new String[] - { - C.cWhite + "Unleash your inner creativity!", - C.cWhite + "", - C.cGreen + "Activated at a Painter NPC", - }, + super(manager, "Paintbrush", + UtilText.splitLineToArray(C.cWhite + "Unleash your inner Bob Ross! Happy little trees!", LineFormat.LORE), -3, Material.WOOD_SWORD, (byte)0, 200, new Ammo("Paint", "100 Pixels", Material.INK_SACK, (byte)0, new String[] { C.cWhite + "100 Pixels worth of Paint!" }, 500, 100)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java index 2338a8424..460533834 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java @@ -12,8 +12,10 @@ import org.bukkit.event.EventHandler; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -31,10 +33,9 @@ public class ItemPartyPopper extends ItemGadget implements IThrown public ItemPartyPopper(GadgetManager manager) { - super(manager, "Confetti Bomb", new String[] - { - C.cWhite + "POP BANG!", - }, 1, Material.GOLDEN_CARROT, (byte) 0, 1000, new Ammo("Confetti Bomb", "1 Party Popper", Material.GOLDEN_CARROT, + super(manager, "Party Popper", + UtilText.splitLineToArray(C.cWhite + "Celebrate by blasting confetti into peoples eyes!", LineFormat.LORE), + 1, Material.GOLDEN_CARROT, (byte) 0, 1000, new Ammo("Party Popper", "1 Party Popper", Material.GOLDEN_CARROT, (byte) 0, new String[] { C.cWhite + "100 Party Poppers for you to shoot!" diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java index 8c5a232d3..f1a52b32c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java @@ -11,7 +11,9 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetCollideEntityEvent; import mineplex.core.gadget.gadgets.Ammo; @@ -24,12 +26,9 @@ public class ItemSnowball extends ItemGadget public ItemSnowball(GadgetManager manager) { - super(manager, "Snowball", new String[] - { - C.cWhite + "Throw snowball!", - C.cWhite + "Start epic snowfights!" - } - , 1, Material.SNOW_BALL, (byte) 0, 1, new Ammo("Snowball", "1 Snowball", Material.SNOW_BALL, (byte) 0, new String[] + super(manager, "Snowball", + UtilText.splitLineToArray(C.cWhite + "Join in on the festive fun by throwing snow at people!", LineFormat.LORE), + -1, Material.SNOW_BALL, (byte) 0, 1, new Ammo("Snowball", "1 Snowball", Material.SNOW_BALL, (byte) 0, new String[] { C.cWhite + "50 Snowballs for you to throw!" } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java index 0bf4a04d3..e3b5f01f9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemTNT.java @@ -12,11 +12,13 @@ import org.bukkit.event.entity.EntityExplodeEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -31,11 +33,8 @@ public class ItemTNT extends ItemGadget public ItemTNT(GadgetManager manager) { - super(manager, "TNT", new String[] - { - C.cWhite + "Blow some people up!", - C.cWhite + "KABOOM!", - }, + super(manager, "TNT", + UtilText.splitLineToArray(C.cWhite + "Throwing TNT at Mineplex Staff is highly encouraged.", LineFormat.LORE), -1, Material.TNT, (byte)0, 1000, new Ammo("TNT", "20 TNT", Material.TNT, (byte)0, new String[] { C.cWhite + "20 TNT for you to explode!" }, 500, 20)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java index b28852051..557bdfd95 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java @@ -10,7 +10,10 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.util.Vector; +import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -25,7 +28,9 @@ public class ParticleCandyCane extends ParticleGadget public ParticleCandyCane(GadgetManager manager) { - super(manager, "Candy Cane Particle", new String[]{"Christmas. Nuf said."}, -3, Material.CHEST, (byte)0); + super(manager, "Crushed Candy Cane", + UtilText.splitLineToArray(C.cWhite + "There’s no such thing as too much Christmas Candy. Don’t listen to your dentist.", LineFormat.LORE), + -3, Material.CHEST, (byte)0); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java index 04ccec81d..03f93f17d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java @@ -5,7 +5,9 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -18,10 +20,9 @@ public class ParticleCoalFumes extends ParticleGadget public ParticleCoalFumes(GadgetManager manager) { - super(manager, "Coal Fumes", new String[] - { - C.cDGray + "Nothing to read here. Please move on." - }, -1, Material.COAL, (byte) 0); + super(manager, "Coal Fumes", + UtilText.splitLineToArray(C.cWhite + "Being on the Naughty List does have some perks... if you love coal, that is...", LineFormat.LORE), + -1, Material.COAL, (byte) 0); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index 7b5005624..3155b40af 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -9,7 +9,9 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; @@ -25,12 +27,8 @@ public class ParticleFrostLord extends ParticleGadget { public ParticleFrostLord(GadgetManager manager) { - super(manager, "Wind of the Frost Lord", new String[] - { - C.cWhite + "You are a mighty frost lord.", - C.cWhite + "Your double jumps and arrows", - C.cWhite + "are enchanted with snow powers.", - }, + super(manager, "Wind of the Frost Lord", + UtilText.splitLineToArray(C.cWhite + "He’s not passing wind okay? HE HAS A CONDITION!", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index 7d5aa7025..9fffc21fd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -9,7 +9,9 @@ import org.bukkit.util.Vector; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; @@ -24,14 +26,8 @@ public class ParticleTitan extends ParticleGadget public ParticleTitan(GadgetManager manager) { - super(manager, "Flame of the Titans", new String[] - { - C.cWhite + "These flames are said to be the", - C.cWhite + "souls of a lost civilisation of", - C.cWhite + "Titans, forgotten by time.", - " ", - C.cRed + "Unlocked with Titan Rank", - }, + super(manager, "Flame of the Titans", + UtilText.splitLineToArray(C.cWhite + "Only the legendary warriors known as Titans can survive the fiery pits of Hades.", LineFormat.LORE), -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index b2b31a380..3583b5df5 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -453,8 +453,8 @@ public class HubManager extends MiniClientPlugin String playerName = player.getName(); // April Fools - if (AprilFoolsManager.Instance.isActive()) - playerName = AprilFoolsManager.Instance.getName(player); +// if (AprilFoolsManager.Instance.isActive()) +// playerName = AprilFoolsManager.Instance.getName(player); //Public Message event.setJoinMessage(null); From fe7ce40783acff4d3b960be7c235c2d0c7df4716 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 16:31:15 +1100 Subject: [PATCH 153/223] finished cosmetic names --- .../core/cosmetic/ui/page/GadgetPage.java | 43 ++++++++--- .../core/gadget/gadgets/morph/MorphBat.java | 18 +++-- .../core/gadget/gadgets/morph/MorphBlaze.java | 13 ++-- .../core/gadget/gadgets/morph/MorphBlock.java | 6 +- .../core/gadget/gadgets/morph/MorphBunny.java | 10 +-- .../gadget/gadgets/morph/MorphChicken.java | 6 +- .../core/gadget/gadgets/morph/MorphCow.java | 6 +- .../gadget/gadgets/morph/MorphCreeper.java | 12 +-- .../gadget/gadgets/morph/MorphEnderman.java | 8 +- .../core/gadget/gadgets/morph/MorphGeno.java | 75 ------------------- .../core/gadget/gadgets/morph/MorphNotch.java | 70 ----------------- .../core/gadget/gadgets/morph/MorphPig.java | 10 +-- .../gadgets/morph/MorphPumpkinKing.java | 14 ++-- .../core/gadget/gadgets/morph/MorphSlime.java | 8 +- .../gadget/gadgets/morph/MorphSnowman.java | 15 +++- .../core/gadget/gadgets/morph/MorphTitan.java | 16 ++-- .../gadget/gadgets/morph/MorphVillager.java | 6 +- .../gadget/gadgets/morph/MorphWither.java | 12 +-- .../gadgets/particle/ParticleEnchant.java | 11 +-- .../gadgets/particle/ParticleFireRings.java | 10 +-- .../gadget/gadgets/particle/ParticleFoot.java | 11 +-- .../gadgets/particle/ParticleGreen.java | 10 +-- .../gadgets/particle/ParticleHeart.java | 10 +-- .../gadgets/particle/ParticleHelix.java | 10 +-- .../gadgets/particle/ParticleLegend.java | 11 +-- .../gadget/gadgets/particle/ParticleRain.java | 10 +-- 26 files changed, 157 insertions(+), 274 deletions(-) delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java delete mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index d94654926..7370cb2ce 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -22,7 +22,6 @@ import mineplex.core.cosmetic.ui.button.DeactivateGadgetButton; import mineplex.core.cosmetic.ui.button.GadgetButton; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.gadgets.morph.MorphBlock; -import mineplex.core.gadget.gadgets.morph.MorphNotch; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; @@ -71,14 +70,8 @@ public class GadgetPage extends ShopPageBase protected void addGadget(Gadget gadget, int slot) { - if (gadget instanceof MorphNotch) - { - //setItem(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), "Disabled " + gadget.GetName(), new String[] { "Sorry! Currently disabled until fix is made for 1.8 players!" }, 1, false, false)); - //return; - } - else if (gadget instanceof MorphBlock) + if (gadget instanceof MorphBlock) { - //Prevent stacker bug if (getPlayer().getPassenger() != null) return; } @@ -98,6 +91,7 @@ public class GadgetPage extends ShopPageBase { //Nothing } + //Chest Unlocks else if (gadget.GetCost(CurrencyType.Coins) == -2) { itemLore.add(C.cBlack); @@ -106,7 +100,38 @@ public class GadgetPage extends ShopPageBase else if (gadget.GetCost(CurrencyType.Coins) == -3) { itemLore.add(C.cBlack); - itemLore.add(C.cRed + "Found in Winter Holiday Treasure Chests"); + itemLore.add(C.cWhite + "Found in Winter Holiday Treasure"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -4) + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhite + "Found in Halloween Pumpkin Treasure"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -5) + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhite + "Found in Easter Holiday Treasure"); + } + //Rank Unlocks + else if (gadget.GetCost(CurrencyType.Coins) == -10) + { + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -11) + { + itemLore.add(C.cBlack); + itemLore.add(C.cPurple + "Unlocked with Hero Rank"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Unlocked with Legend Rank"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Unlocked with Titan Rank"); } if (gadget instanceof ItemGadget) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java index 77e253f93..039027011 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java @@ -19,12 +19,14 @@ import org.bukkit.potion.PotionEffectType; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; 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.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.disguise.disguises.DisguiseBat; import mineplex.core.projectile.IThrown; @@ -40,15 +42,15 @@ public class MorphBat extends MorphGadget implements IThrown { public MorphBat(GadgetManager manager) { - super(manager, "Bat Morph", new String[] + super(manager, "Bat Morph", + UtilText.splitLinesToArray(new String[] { - C.cWhite + "Flap around and annoy people by", - C.cWhite + "screeching loudly into their ears!", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Screech", - C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", - C.cYellow + "Tap Sneak" + C.cGray + " to use " + C.cGreen + "Poop", - }, + C.cWhite + "Flap around and annoy people by screeching loudly into their ears!", + " ", + C.cYellow + "Left-Click" + C.cGray + " to " + C.cGreen + "Screech", + C.cYellow + "Double Jump" + C.cGray + " to " + C.cGreen + "Flap", + C.cYellow + "Sneak" + C.cGray + " to " + C.cGreen + "Poop", + }, LineFormat.LORE), 40000, Material.SKULL_ITEM, (byte)1); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java index 67afa8bcb..2514a515f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java @@ -9,9 +9,11 @@ import org.bukkit.event.player.PlayerJoinEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.disguise.disguises.DisguiseBlaze; @@ -24,15 +26,14 @@ public class MorphBlaze extends MorphGadget { public MorphBlaze(GadgetManager manager) { - super(manager, "Blaze Morph", new String[] + super(manager, "Blaze Morph", + UtilText.splitLinesToArray(new String[] { - C.cWhite + "Transforms the wearer into a fiery Blaze!", + C.cWhite + "Transform into a fiery Blaze, straight from the Nether!", " ", C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Firefly", - " ", - C.cPurple + "Unlocked with Hero Rank", - }, - -1, + }, LineFormat.LORE), + -11, Material.BLAZE_POWDER, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java index 208618c10..210e8aae5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java @@ -14,9 +14,11 @@ import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.player.PlayerInteractEvent; 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.UtilMath; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.event.StackerEvent; import mineplex.core.gadget.GadgetManager; @@ -32,13 +34,13 @@ public class MorphBlock extends MorphGadget public MorphBlock(GadgetManager manager) { - super(manager, "Block Morph", new String[] + super(manager, "Block Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "The blockiest block that ever blocked.", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Change Block", C.cYellow + "Stay Still" + C.cGray + " to use " + C.cGreen + "Solidify", - }, + }, LineFormat.LORE), 30000, Material.EMERALD_BLOCK, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java index 056f1e33a..31e971ecc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java @@ -24,12 +24,14 @@ import org.bukkit.potion.PotionEffectType; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; @@ -50,7 +52,7 @@ public class MorphBunny extends MorphGadget public MorphBunny(GadgetManager manager) { - super(manager, "Easter Bunny Morph", new String[] + super(manager, "Easter Bunny Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Happy Easter!", " ", @@ -58,10 +60,8 @@ public class MorphBunny extends MorphGadget C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Hide Easter Egg", " ", C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Hide Easter Egg uses 500 Coins" , - " ", - C.cPurple + "No longer available", - }, - -1, + }, LineFormat.LORE), + -5, Material.MONSTER_EGG, (byte)98); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java index dcf03e51c..2f782c036 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java @@ -17,10 +17,12 @@ import org.bukkit.util.Vector; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.disguise.disguises.DisguiseChicken; import mineplex.core.recharge.Recharge; @@ -33,13 +35,13 @@ public class MorphChicken extends MorphGadget { public MorphChicken(GadgetManager manager) { - super(manager, "Chicken Morph", new String[] + super(manager, "Chicken Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Soar through the air like a fat Chicken!", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Egg Shot", C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", - }, + }, LineFormat.LORE), 20000, Material.FEATHER, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java index f16a35bce..70b56b04f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java @@ -7,7 +7,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.*; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.disguise.disguises.DisguiseCow; import mineplex.core.recharge.Recharge; @@ -18,12 +20,12 @@ public class MorphCow extends MorphGadget { public MorphCow(GadgetManager manager) { - super(manager, "Cow Morph", new String[] + super(manager, "Cow Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "How now brown cow?", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Moo", - }, + }, LineFormat.LORE), 6000, Material.LEATHER, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java index d2d5b0954..d6f4cd78f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java @@ -13,11 +13,13 @@ import org.bukkit.event.player.PlayerQuitEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.disguise.disguises.DisguiseBase; @@ -33,15 +35,13 @@ public class MorphCreeper extends MorphGadget public MorphCreeper(GadgetManager manager) { - super(manager, "Creeper Morph", new String[] + super(manager, "Creeper Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Transforms the wearer into a creepy Creeper!", + C.cWhite + "Become the creepiest of Creepers that ever creeped!", " ", C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Detonate", - " ", - C.cPurple + "Unlocked with Hero Rank", - }, - -1, + }, LineFormat.LORE), + -11, Material.SKULL_ITEM, (byte)4); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java index e6341e98b..f5305b19f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java @@ -16,8 +16,10 @@ import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilText; import mineplex.core.disguise.disguises.DisguiseEnderman; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.MorphGadget; @@ -29,12 +31,12 @@ public class MorphEnderman extends MorphGadget { public MorphEnderman(GadgetManager manager) { - super(manager, "Enderman Morph", new String[] + super(manager, "Enderman Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Transforms the wearer into an Enderman!", + C.cWhite + "Using morph is the ultimate diet! Guaranteed instant results!", " ", C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Blink", - }, + }, LineFormat.LORE), 30000, Material.ENDER_PEARL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java deleted file mode 100644 index 0eb48894d..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphGeno.java +++ /dev/null @@ -1,75 +0,0 @@ -package mineplex.core.gadget.gadgets.morph; - -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.*; - -import com.mojang.authlib.GameProfile; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.ProfileLoader; -import mineplex.core.common.util.UUIDFetcher; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.recharge.Recharge; -import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.types.MorphGadget; - -public class MorphGeno extends MorphGadget -{ - private GameProfile _profile = null; - - public MorphGeno(GadgetManager manager) - { - super(manager, "Genocide604", new String[] - { - "Say goodbye to Genocide604 by burping", - "and eating a lot.", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Burp", - " ", - C.cRed + C.Bold + "WARNING: " + ChatColor.RESET + "This is a temporary item!", - }, - 10, - Material.SKULL_ITEM, (byte)3); - - _profile = new ProfileLoader(UUIDFetcher.getUUIDOf("Genocide604").toString(), "Genocide604").loadProfile(); - } - - @Override - public void EnableCustom(final Player player) - { - this.ApplyArmor(player); - - DisguisePlayer disguise = new DisguisePlayer(player, _profile); - Manager.getDisguiseManager().disguise(disguise); - } - - @Override - public void DisableCustom(Player player) - { - this.RemoveArmor(player); - Manager.getDisguiseManager().undisguise(player); - } - - @EventHandler - public void Action(PlayerInteractEvent event) - { - Player player = event.getPlayer(); - - if (!IsActive(player)) - return; - - if (!UtilEvent.isAction(event, ActionType.L)) - return; - - if (!Recharge.Instance.use(player, GetName(), 1500, false, false)) - return; - - player.getWorld().playSound(player.getEyeLocation(), Sound.BURP, 1f, (float) (0.8f + Math.random() * 0.4f)); - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java deleted file mode 100644 index 7671cd11c..000000000 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphNotch.java +++ /dev/null @@ -1,70 +0,0 @@ -package mineplex.core.gadget.gadgets.morph; - -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.*; - -import com.mojang.authlib.GameProfile; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.ProfileLoader; -import mineplex.core.common.util.UUIDFetcher; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; -import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.recharge.Recharge; -import mineplex.core.gadget.GadgetManager; -import mineplex.core.gadget.types.MorphGadget; - -public class MorphNotch extends MorphGadget -{ - private GameProfile _notchProfile = null; - - public MorphNotch(GadgetManager manager) - { - super(manager, "Notch", new String[] - { - "Who wouldn't want to be Notch?!", - //C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Enforce EULA", - }, - 50000, - Material.SKULL_ITEM, (byte)3); - - _notchProfile = new ProfileLoader(UUIDFetcher.getUUIDOf("Notch").toString(), "Notch").loadProfile(); - } - - @Override - public void EnableCustom(final Player player) - { - this.ApplyArmor(player); - - DisguisePlayer disguise = new DisguisePlayer(player, _notchProfile); - Manager.getDisguiseManager().disguise(disguise); - } - - @Override - public void DisableCustom(Player player) - { - this.RemoveArmor(player); - Manager.getDisguiseManager().undisguise(player); - } - - //@EventHandler - public void Action(PlayerInteractEvent event) - { - Player player = event.getPlayer(); - - if (!IsActive(player)) - return; - - if (!UtilEvent.isAction(event, ActionType.L)) - return; - - if (!Recharge.Instance.use(player, GetName(), 1500, false, false)) - return; - - player.sendMessage("You have enforced the EULA."); - - } -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java index 5a44e8322..65475ef7b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java @@ -11,11 +11,13 @@ import org.bukkit.event.player.*; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilMath; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.disguises.DisguisePig; @@ -31,16 +33,14 @@ public class MorphPig extends MorphGadget public MorphPig(GadgetManager manager) { - super(manager, "Pig Morph", new String[] + super(manager, "Pig Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Oink. Oink. Oink.... Oink?", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Oink", C.cYellow + "Collide" + C.cGray + " to use " + C.cGreen + "Pig Bounce", - " ", - C.cAqua + "Unlocked with Ultra Rank", - }, - -1, + }, LineFormat.LORE), + -10, Material.PORK, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java index 1e155f20c..cf0016bbb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java @@ -7,7 +7,9 @@ import org.bukkit.entity.Skeleton.SkeletonType; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.disguise.disguises.DisguiseSkeleton; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.MorphGadget; @@ -17,15 +19,11 @@ public class MorphPumpkinKing extends MorphGadget { public MorphPumpkinKing(GadgetManager manager) { - super(manager, "Pumpkin Kings Head", new String[] + super(manager, "Pumpkin Kings Head", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Transforms the wearer into", - C.cWhite + "the dreaded Pumpkin King!", - "", - C.cYellow + "Earned by defeating the Pumpkin King", - C.cYellow + "in the 2013 Halloween Horror Event.", - }, - -1, + C.cWhite + "Transforms the wearer into the dreaded Pumpkin King!", + }, LineFormat.LORE), + -4, Material.PUMPKIN, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java index 6813bbcb3..6f0f8f89f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java @@ -9,9 +9,11 @@ import org.bukkit.event.player.*; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.disguise.disguises.DisguiseSlime; import mineplex.core.recharge.Recharge; @@ -25,14 +27,14 @@ public class MorphSlime extends MorphGadget public MorphSlime(GadgetManager manager, AchievementManager achievements) { - super(manager, "Big Larry Morph", new String[] + super(manager, "Big Larry Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Become a slime like Big Larry!", + C.cWhite + "Have you ever looked at Big Larry and thought, \'I really want to be that guy!\'? Well, today is your lucky day!", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Bounce", " ", C.cWhite + "+1 Slime Size for every 10 Mineplex Levels", - }, + }, LineFormat.LORE), 80000, Material.SLIME_BALL, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java index 4451b7b72..e9a4ee54c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java @@ -14,10 +14,12 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; @@ -39,9 +41,16 @@ public class MorphSnowman extends MorphGadget public MorphSnowman(GadgetManager manager) { - super(manager, "Snowman Morph", - new String[]{ C.cWhite + "Do you wanna build a snowman?", C.cWhite + "It doesn't have to be a snowman...", - C.cWhite + "Or... it kind of does...", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Snowball", }, + super(manager, "Olaf Morph", + UtilText.splitLinesToArray(new String[] + { + C.cWhite + "Do you wanna build a snowman?", + C.cWhite + "It doesn't have to be a snowman...", + C.cWhite + "Or... it kind of does...", + " ", + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Blizzard", + C.cYellow + "Sneak" + C.cGray + " to use " + C.cGreen + "Snow Slide", + }, LineFormat.LORE), -3, Material.SNOW_BALL, (byte) 0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java index 213332edf..91ba7a3f8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java @@ -17,11 +17,13 @@ import org.bukkit.util.Vector; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; @@ -42,15 +44,13 @@ public class MorphTitan extends MorphGadget public MorphTitan(GadgetManager manager) { - super(manager, "Elder Guardian Morph", new String[] + super(manager, "Elder Guardian Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "From the depths of the sea, the", - C.cWhite + "Elder Guardian posseses powers", - C.cWhite + "more amazing than any seen before!", - " ", - C.cRed + "Unlocked with Titan Rank", - }, - -1, + C.cWhite + "From the depths of the sea, the Elder Guardian posseses powers more amazing than any seen before!", + " ", + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Guardians Laser", + }, LineFormat.LORE), + -13, Material.PRISMARINE_CRYSTALS, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java index def1ee383..3c537f731 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java @@ -19,10 +19,12 @@ import org.bukkit.util.Vector; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.disguise.disguises.DisguiseVillager; @@ -40,14 +42,14 @@ public class MorphVillager extends MorphGadget implements IThrown public MorphVillager(GadgetManager manager) { - super(manager, "Villager Morph", new String[] + super(manager, "Villager Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "HURRRR! MURR HURRR!", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Gem Throw", " ", C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Gem Throw uses 20 Gems" - }, + }, LineFormat.LORE), 12000, Material.EMERALD, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java index 1d2bde3bb..0bf2c6695 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java @@ -6,10 +6,12 @@ import java.util.Iterator; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilText; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -43,15 +45,13 @@ public class MorphWither extends MorphGadget public MorphWither(GadgetManager manager) { - super(manager, "Wither Morph", new String[] + super(manager, "Wither Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Become a legendary Wither!", + C.cWhite + "Legends have foretold the coming of a powerful Wither...", " ", C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Wither Skull", - " ", - C.cGreen + "Unlocked with Legend Rank", - }, - -1, + }, LineFormat.LORE), + -12, Material.SKULL_ITEM, (byte)1); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java index 38a505914..a388a0d3d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java @@ -6,8 +6,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.ParticleGadget; @@ -19,13 +21,8 @@ public class ParticleEnchant extends ParticleGadget { public ParticleEnchant(GadgetManager manager) { - super(manager, "Enchanted", new String[] - { - C.cWhite + "The wisdom of the universe", - C.cWhite + "suddenly finds you extremely", - C.cWhite + "attractive, and wants to", - C.cWhite + "\'enchant\' you.", - }, + super(manager, "Enchanted", + UtilText.splitLineToArray(C.cWhite + "The wisdom of the universe suddenly find you extremely attractive, and wants to \'enchant\' you.", LineFormat.LORE), -2, Material.BOOK, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java index ba639675a..0de43a6da 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java @@ -7,8 +7,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.ParticleGadget; @@ -21,12 +23,8 @@ public class ParticleFireRings extends ParticleGadget public ParticleFireRings(GadgetManager manager) { - super(manager, "Flame Rings", new String[] - { - C.cWhite + "Forged from the burning ashes", - C.cWhite + "of 1000 Blazes by the infamous", - C.cWhite + "Flame King of the Nether realm.", - }, + super(manager, "Flame Rings", + UtilText.splitLineToArray(C.cWhite + "Forged from the blazing rods of 1000 Blazes by the infamous Nether King.", LineFormat.LORE), -2, Material.BLAZE_POWDER, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java index e156de492..af9fd1155 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java @@ -14,11 +14,13 @@ import org.bukkit.event.EventHandler; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; 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.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; @@ -35,13 +37,8 @@ public class ParticleFoot extends ParticleGadget public ParticleFoot(GadgetManager manager) { - super(manager, "Shadow Walk", new String[] - { - C.cWhite + "In a world where footprints", - C.cWhite + "do not exist, leaving your", - C.cWhite + "shadow behind is the next", - C.cWhite + "best thing.", - }, + super(manager, "Shadow Walk", + UtilText.splitLineToArray(C.cWhite + "In a world where footprints do not exist, leaving your shadow behind is the next best thing!", LineFormat.LORE), -2, Material.LEATHER_BOOTS, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java index 920de097b..1a524c676 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java @@ -7,8 +7,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.ParticleGadget; @@ -21,12 +23,8 @@ public class ParticleGreen extends ParticleGadget public ParticleGreen(GadgetManager manager) { - super(manager, "Green Ring", new String[] - { - C.cWhite + "With these sparkles, you", - C.cWhite + "can now sparkle while you", - C.cWhite + "sparkle with CaptainSparklez.", - }, + super(manager, "Green Ring", + UtilText.splitLineToArray(C.cWhite + "With these sparkles, you can sparkle while sparkle with CaptainSparklez!", LineFormat.LORE), -2, Material.EMERALD, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java index d4160c997..64ddaf216 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java @@ -13,11 +13,13 @@ import org.bukkit.event.player.PlayerQuitEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.ParticleGadget; @@ -31,12 +33,8 @@ public class ParticleHeart extends ParticleGadget { public ParticleHeart(GadgetManager manager) { - super(manager, "I Heart You", new String[] - { - C.cWhite + "With these particles, you can", - C.cWhite + "show off how much you heart", - C.cWhite + "everyone on Mineplex!", - }, + super(manager, "I Heart You", + UtilText.splitLineToArray(C.cWhite + "Show off how much you love Mineplex and everyone on it!", LineFormat.LORE), -2, Material.APPLE, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java index 26e47dae7..7ccaed9c4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java @@ -7,7 +7,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; @@ -21,12 +23,8 @@ public class ParticleHelix extends ParticleGadget public ParticleHelix(GadgetManager manager) { - super(manager, "Blood Helix", new String[] - { - C.cWhite + "Ancient legend says this magic", - C.cWhite + "empowers the blood of its user,", - C.cWhite + "giving them godly powers.", - }, + super(manager, "Blood Helix", + UtilText.splitLineToArray(C.cWhite + "Blood magic is very dangerous... but also very cool!", LineFormat.LORE), -2, Material.REDSTONE, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java index 639d85d23..329e15b6b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java @@ -8,6 +8,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.types.ParticleGadget; import mineplex.core.inventory.ClientItem; import mineplex.core.inventory.data.Item; @@ -19,13 +21,8 @@ public class ParticleLegend extends ParticleGadget { public ParticleLegend(GadgetManager manager) { - super(manager, "Legendary Aura", new String[] - { - C.cWhite + "These mystic particle attach to", - C.cWhite + "only the most legendary of players!", - " ", - C.cGreen + "Unlocked with Legend Rank", - }, + super(manager, "Legendary Aura", + UtilText.splitLineToArray(C.cWhite + "This particle will be updated soon! Yay!", LineFormat.LORE), -1, Material.ENDER_PORTAL_FRAME, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java index 8d6755b3c..068cd7db7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java @@ -7,8 +7,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.types.ParticleGadget; @@ -21,12 +23,8 @@ public class ParticleRain extends ParticleGadget public ParticleRain(GadgetManager manager) { - super(manager, "Rain Cloud", new String[] - { - C.cWhite + "Your very own rain cloud!", - C.cWhite + "Now you never have to worry", - C.cWhite + "about not being wet. Woo...", - }, + super(manager, "Rain Cloud", + UtilText.splitLineToArray(C.cWhite + "Bring your sadness wherever you go, with your very own portable rain cloud!", LineFormat.LORE), -2, Material.INK_SACK, (byte)4); } From 7f8c9c02bc34bdee9ae5b5a4ca6d6e84595c2803 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 16:38:44 +1100 Subject: [PATCH 154/223] and the mounts --- .../gadget/gadgets/particle/ParticleTitan.java | 2 +- .../core/mount/types/MountBabyReindeer.java | 10 +++++----- .../src/mineplex/core/mount/types/MountCart.java | 10 +++++----- .../mineplex/core/mount/types/MountDragon.java | 14 +++++--------- .../src/mineplex/core/mount/types/MountFrost.java | 10 ++++------ .../src/mineplex/core/mount/types/MountMule.java | 9 +++++---- .../src/mineplex/core/mount/types/MountSheep.java | 9 +++++---- .../src/mineplex/core/mount/types/MountSlime.java | 10 +++++----- .../mineplex/core/mount/types/MountSpider.java | 14 +++++++------- .../src/mineplex/core/mount/types/MountTitan.java | 13 +++++-------- .../mineplex/core/mount/types/MountUndead.java | 10 ++++------ .../mineplex/core/mount/types/MountZombie.java | 15 +++++---------- 12 files changed, 56 insertions(+), 70 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index 9fffc21fd..49724dfbe 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -27,7 +27,7 @@ public class ParticleTitan extends ParticleGadget public ParticleTitan(GadgetManager manager) { super(manager, "Flame of the Titans", - UtilText.splitLineToArray(C.cWhite + "Only the legendary warriors known as Titans can survive the fiery pits of Hades.", LineFormat.LORE), + UtilText.splitLineToArray(C.cWhite + "These flames are said to be the spirit of a Titan.", LineFormat.LORE), -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java index 04559e60e..f5e7eef9b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java @@ -13,8 +13,10 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.mount.HorseMount; @@ -29,11 +31,9 @@ public class MountBabyReindeer extends HorseMount public MountBabyReindeer(MountManager manager) { - super(manager, "Baby Rainder", new String[] - { - C.cWhite + "One of Santa's baby reindeers", - C.cWhite + "Still trying to learn how to fly" - }, Material.SNOW_BALL, (byte) 0, -3, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); + super(manager, "Baby Rainder", + UtilText.splitLineToArray(C.cWhite + "One of Santas baby reindeers. He's still learning how to fly...", LineFormat.LORE), + Material.SNOW_BALL, (byte) 0, -3, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java index f5aa7f809..144289439 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java @@ -11,12 +11,15 @@ import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.vehicle.VehicleDamageEvent; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.mount.Mount; import mineplex.core.mount.MountManager; import mineplex.core.mount.SingleEntityMountData; @@ -28,11 +31,8 @@ public class MountCart extends Mount> { public MountCart(MountManager manager) { - super(manager, "Minecart", Material.MINECART, (byte)0, new String[] - { - ChatColor.RESET + "Cruise around town in your", - ChatColor.RESET + "new Minecart VX Turbo!", - }, + super(manager, "Minecart", Material.MINECART, (byte)0, + UtilText.splitLineToArray(C.cWhite + "Cruise around town in your shiny new Minecart RX Turbo!", LineFormat.LORE), 15000); KnownPackage = false; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java index efb19dcf5..0bdddc6be 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java @@ -10,7 +10,9 @@ import org.bukkit.event.player.PlayerJoinEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -24,17 +26,11 @@ public class MountDragon extends DragonMount { public MountDragon(MountManager manager) { - super(manager, "Ethereal Dragon", new String[] - { - C.cWhite + "From the distant ether realm,", - C.cWhite + "this prized dragon is said to", - C.cWhite + "obey only true Heroes!", - " ", - C.cPurple + "Unlocked with Hero Rank", - }, + super(manager, "Ethereal Dragon", + UtilText.splitLineToArray(C.cWhite + "From the distant Ether Realm, this prized dragon is said to only obey true Heroes!", LineFormat.LORE), Material.DRAGON_EGG, (byte)0, - -1); + -11); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java index e948ca9e3..6b978f050 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java @@ -8,7 +8,9 @@ import org.bukkit.entity.Horse.Variant; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.mount.HorseMount; @@ -21,12 +23,8 @@ public class MountFrost extends HorseMount { public MountFrost(MountManager manager) { - super(manager, "Glacial Steed", new String[] - { - C.cWhite + "Born in the North Pole,", - C.cWhite + "it leaves a trail of frost", - C.cWhite + "as it moves!", - }, + super(manager, "Glacial Steed", + UtilText.splitLineToArray(C.cWhite + "Born in the North Pole, it leaves a trail of frost as it moves!", LineFormat.LORE), Material.SNOW_BALL, (byte)0, 15000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java index be87f0fd1..d8536e772 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java @@ -6,6 +6,9 @@ import org.bukkit.entity.Horse.Color; import org.bukkit.entity.Horse.Style; import org.bukkit.entity.Horse.Variant; +import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.mount.HorseMount; import mineplex.core.mount.MountManager; @@ -13,10 +16,8 @@ public class MountMule extends HorseMount { public MountMule(MountManager manager) { - super(manager, "Mount Mule", new String[] - { - ChatColor.RESET + "Muley muley!" - }, + super(manager, "Mount Mule", + UtilText.splitLineToArray(C.cWhite + "Your very own trusty pack mule!", LineFormat.LORE), Material.HAY_BLOCK, (byte)0, 3000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java index c2697c771..f3b84ce99 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java @@ -11,8 +11,11 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.inventory.ItemStack; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseSheep; import mineplex.core.mount.HorseMount; @@ -25,10 +28,8 @@ public class MountSheep extends HorseMount { public MountSheep(MountManager manager) { - super(manager, "Techno Sheep", new String[] - { - ChatColor.RESET + "Muley muley!" - }, + super(manager, "Techno Sheep", + UtilText.splitLineToArray(C.cWhite + "Baaaaa with all the colors of the rainbow!", LineFormat.LORE), Material.WOOL, (byte)14, 3000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java index e8a1bd649..37b418d1a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java @@ -11,12 +11,15 @@ import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.util.Vector; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.mount.Mount; import mineplex.core.mount.MountManager; import mineplex.core.mount.SingleEntityMountData; @@ -28,11 +31,8 @@ public class MountSlime extends Mount> { public MountSlime(MountManager manager) { - super(manager, "Slime Mount", Material.SLIME_BALL, (byte)0, new String[] - { - ChatColor.RESET + "Bounce around on your very", - ChatColor.RESET + "own personal slime friend!", - }, + super(manager, "Slime Mount", Material.SLIME_BALL, (byte)0, + UtilText.splitLineToArray(C.cWhite + "Bounce around on your very own slime friend!", LineFormat.LORE), 15000); KnownPackage = false; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java index 57ca4045b..0e4058aa4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java @@ -19,11 +19,13 @@ import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilAction; 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.UtilText; import mineplex.core.disguise.disguises.DisguiseSpider; import mineplex.core.mount.HorseMount; import mineplex.core.mount.MountManager; @@ -41,17 +43,15 @@ public class MountSpider extends HorseMount public MountSpider(MountManager manager) { - super(manager, "Spider Mount", new String[] + super(manager, "Spider Mount", + UtilText.splitLinesToArray(new String[] { - C.cWhite + "Why ride a horse when you can", - C.cWhite + "ride a cute and cuddly spider!", + C.cWhite + "Why ride a horse when you can ride a cute and cuddly spider!", C.cBlack, C.cYellow + "Look Up" + C.cGray + " to use " + C.cGreen + "Wall Climb", C.cYellow + "Jump" + C.cGray + " to use " + C.cGreen + "Leap", - C.cBlack, - C.cPurple + "Only available during " + C.Line + "Halloween 2015", - C.cPurple + "Purchase at " + C.Line + "www.mineplex.com/shop" - }, Material.WEB, (byte) 0, -1, Color.BLACK, Style.NONE, Variant.HORSE, 2.0, Material.AIR); + }, LineFormat.LORE), + Material.WEB, (byte) 0, -4, Color.BLACK, Style.NONE, Variant.HORSE, 2.0, Material.AIR); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java index 49bd13513..89927e4d1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -13,7 +13,9 @@ import org.bukkit.event.player.PlayerJoinEvent; import mineplex.core.common.Rank; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilText; import mineplex.core.mount.Mount; import mineplex.core.mount.MountManager; import mineplex.core.updater.UpdateType; @@ -23,14 +25,9 @@ public class MountTitan extends Mount { public MountTitan(MountManager manager) { - super(manager, "Molten Snake", Material.MAGMA_CREAM, (byte)0, new String[] - { - C.cWhite + "Deep under the earths surface, there", - C.cWhite + "exists a mythical species of Molten", - C.cWhite + "Snakes. This one will serve you eternally.", - " ", - C.cRed + "Unlocked with Titan Rank", - }, -1); + super(manager, "Molten Snake", Material.MAGMA_CREAM, (byte)0, + UtilText.splitLineToArray(C.cWhite + "Deep under the earths surface, there exists a mythical species of Molten Snakes. This one will serve you eternally.", LineFormat.LORE), + -13); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java index 3bf4bb80e..bd5bbd1af 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java @@ -8,7 +8,9 @@ import org.bukkit.entity.Horse.Variant; import org.bukkit.event.EventHandler; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.mount.HorseMount; @@ -21,12 +23,8 @@ public class MountUndead extends HorseMount { public MountUndead(MountManager manager) { - super(manager, "Infernal Horror", new String[] - { - C.cWhite + "The most ghastly horse in", - C.cWhite + "existance, from the pits of", - C.cWhite + "the Nether.", - }, + super(manager, "Infernal Horror", + UtilText.splitLineToArray(C.cWhite + "The most ghastly horse in existance, from the pits of the Nether.", LineFormat.LORE), Material.BONE, (byte)0, 20000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java index 9b396f6b5..e734e1df8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java @@ -6,6 +6,8 @@ import org.bukkit.entity.Horse.Style; import org.bukkit.entity.Horse.Variant; import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.mount.HorseMount; import mineplex.core.mount.MountManager; @@ -13,18 +15,11 @@ public class MountZombie extends HorseMount { public MountZombie(MountManager manager) { - super(manager, "Decrepit Warhorse", new String[] - { - C.cWhite + "Once a fierce warhorse, this", - C.cWhite + "undead beast will send fear", - C.cWhite + "into the hearts of your enemies.", - " ", - C.cYellow + "Earned by defeating the Pumpkin King", - C.cYellow + "in the 2015 Halloween Horror Event.", - }, + super(manager, "Decrepit Warhorse", + UtilText.splitLineToArray(C.cWhite + "Once a fierce warhorse, this undead beast will send fear into the hearts of your enemies.", LineFormat.LORE), Material.ROTTEN_FLESH, (byte)0, - -1, + -4, Color.BLACK, Style.BLACK_DOTS, Variant.UNDEAD_HORSE, 0.8, null); } } From 98e91d29f6ff143082b4bb66caf57783bf370efc Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 17:21:54 +1100 Subject: [PATCH 155/223] more cosmetic stuff :) --- .../src/mineplex/core/common/util/C.java | 2 ++ .../mineplex/core/common/util/LineFormat.java | 2 +- .../mineplex/core/common/util/UtilText.java | 15 ++++++++++++++ .../gadgets/arrowtrail/ArrowTrailTitan.java | 2 +- .../core/gadget/gadgets/death/DeathTitan.java | 2 +- .../gadgets/doublejump/DoubleJumpTitan.java | 2 +- .../core/gadget/gadgets/hat/HatGrinch.java | 20 +++++++++++++++++++ .../core/gadget/gadgets/morph/MorphBat.java | 8 ++++---- .../core/gadget/gadgets/morph/MorphBlaze.java | 4 ++-- .../core/gadget/gadgets/morph/MorphBlock.java | 6 +++--- .../core/gadget/gadgets/morph/MorphBunny.java | 10 +++++----- .../gadget/gadgets/morph/MorphChicken.java | 6 +++--- .../core/gadget/gadgets/morph/MorphCow.java | 4 ++-- .../gadget/gadgets/morph/MorphCreeper.java | 2 +- .../gadget/gadgets/morph/MorphEnderman.java | 4 ++-- .../core/gadget/gadgets/morph/MorphPig.java | 6 +++--- .../core/gadget/gadgets/morph/MorphSlime.java | 8 ++++---- .../gadget/gadgets/morph/MorphSnowman.java | 6 +++--- .../core/gadget/gadgets/morph/MorphTitan.java | 4 ++-- .../gadget/gadgets/morph/MorphVillager.java | 8 ++++---- .../gadget/gadgets/morph/MorphWither.java | 4 ++-- .../core/mount/types/MountSpider.java | 6 +++--- .../core/playerCount/PlayerCountManager.java | 4 ++-- 23 files changed, 86 insertions(+), 49 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/C.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/C.java index 7d5f00c91..bab76df51 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/C.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/C.java @@ -4,6 +4,8 @@ import org.bukkit.ChatColor; public class C { + public static final String blankLine = ChatColor.RESET + " "; + public static String Scramble = "§k"; public static String Bold = "§l"; public static String Strike = "§m"; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java index 8f5f7320e..2db7d259f 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/LineFormat.java @@ -2,7 +2,7 @@ package mineplex.core.common.util; public enum LineFormat { - LORE(200), CHAT(319); + LORE(220), CHAT(319); private int _length; diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index aec40852a..38e540824 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -295,6 +295,21 @@ public class UtilText public static ArrayList splitLine(String string, LineFormat lineFormat) { ArrayList strings = new ArrayList(); + + //Ignore lines with # + if (string.startsWith("#")) + { + strings.add(string.substring(1, string.length())); + return strings; + } + + //Empty + if (string.equals("") || string.equals(" ")) + { + strings.add(string); + return strings; + } + String current = ""; int currentLength = 0; String[] split = string.split(" "); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java index 773e5b677..eb9043ba5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java @@ -22,7 +22,7 @@ public class ArrowTrailTitan extends ArrowEffectGadget { super(manager, "Arrows of the Titans", UtilText.splitLineToArray(C.cWhite + "Arrows forged in the Fires of Creation, they leave fiery trails in their wake.", LineFormat.LORE), - -1, + -13, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java index 43c8b326d..52f7edda8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java @@ -18,7 +18,7 @@ public class DeathTitan extends DeathEffectGadget { super(manager, "Ashes of the Titans", UtilText.splitLineToArray(C.cWhite + "Even a Titan can fall in combat if their opponent is fierce enough.", LineFormat.LORE), - -1, + -13, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java index 7b75adf3d..c86fe06dc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -23,7 +23,7 @@ public class DoubleJumpTitan extends DoubleJumpEffectGadget { super(manager, "Leap of the Titans", UtilText.splitLineToArray(C.cWhite + "Out of the frying pan and into the fire.", LineFormat.LORE), - -1, + -13, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java new file mode 100644 index 000000000..502ff74cb --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java @@ -0,0 +1,20 @@ +package mineplex.core.gadget.gadgets.hat; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.HatGadget; + +public class HatGrinch extends HatGadget +{ + + public HatGrinch(GadgetManager manager) + { + super(manager, "The Grinch", + UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + -3, + "christmasgift"); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java index 039027011..febe7172e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java @@ -46,10 +46,10 @@ public class MorphBat extends MorphGadget implements IThrown UtilText.splitLinesToArray(new String[] { C.cWhite + "Flap around and annoy people by screeching loudly into their ears!", - " ", - C.cYellow + "Left-Click" + C.cGray + " to " + C.cGreen + "Screech", - C.cYellow + "Double Jump" + C.cGray + " to " + C.cGreen + "Flap", - C.cYellow + "Sneak" + C.cGray + " to " + C.cGreen + "Poop", + C.blankLine, + "#" + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Screech", + "#" + C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", + "#" + C.cYellow + "Sneak" + C.cGray + " to use " + C.cGreen + "Poop", }, LineFormat.LORE), 40000, Material.SKULL_ITEM, (byte)1); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java index 2514a515f..62fc9d54b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java @@ -30,8 +30,8 @@ public class MorphBlaze extends MorphGadget UtilText.splitLinesToArray(new String[] { C.cWhite + "Transform into a fiery Blaze, straight from the Nether!", - " ", - C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Firefly", + C.blankLine, + "#" + C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Firefly", }, LineFormat.LORE), -11, Material.BLAZE_POWDER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java index 210e8aae5..2a99353b3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java @@ -37,9 +37,9 @@ public class MorphBlock extends MorphGadget super(manager, "Block Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "The blockiest block that ever blocked.", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Change Block", - C.cYellow + "Stay Still" + C.cGray + " to use " + C.cGreen + "Solidify", + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Change Block", + "#" + C.cYellow + "Stay Still" + C.cGray + " to use " + C.cGreen + "Solidify", }, LineFormat.LORE), 30000, Material.EMERALD_BLOCK, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java index 31e971ecc..8958d958a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java @@ -55,11 +55,11 @@ public class MorphBunny extends MorphGadget super(manager, "Easter Bunny Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Happy Easter!", - " ", - C.cYellow + "Charge Crouch" + C.cGray + " to use " + C.cGreen + "Super Jump", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Hide Easter Egg", - " ", - C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Hide Easter Egg uses 500 Coins" , + C.blankLine, + "#" + C.cYellow + "Charge Crouch" + C.cGray + " to use " + C.cGreen + "Super Jump", + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Hide Easter Egg", + C.blankLine, + "#" + C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Hide Easter Egg uses 500 Coins" , }, LineFormat.LORE), -5, Material.MONSTER_EGG, (byte)98); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java index 2f782c036..5589776ba 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java @@ -38,9 +38,9 @@ public class MorphChicken extends MorphGadget super(manager, "Chicken Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Soar through the air like a fat Chicken!", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Egg Shot", - C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Egg Shot", + "#" + C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", }, LineFormat.LORE), 20000, Material.FEATHER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java index 70b56b04f..8c46bd98b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java @@ -23,8 +23,8 @@ public class MorphCow extends MorphGadget super(manager, "Cow Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "How now brown cow?", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Moo", + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Moo", }, LineFormat.LORE), 6000, Material.LEATHER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java index d6f4cd78f..cfe013647 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java @@ -38,7 +38,7 @@ public class MorphCreeper extends MorphGadget super(manager, "Creeper Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Become the creepiest of Creepers that ever creeped!", - " ", + C.blankLine, C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Detonate", }, LineFormat.LORE), -11, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java index f5305b19f..a7c75fb33 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java @@ -34,8 +34,8 @@ public class MorphEnderman extends MorphGadget super(manager, "Enderman Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Using morph is the ultimate diet! Guaranteed instant results!", - " ", - C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Blink", + C.blankLine, + "#" + C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Blink", }, LineFormat.LORE), 30000, Material.ENDER_PEARL, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java index 65475ef7b..90cb4478e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java @@ -36,9 +36,9 @@ public class MorphPig extends MorphGadget super(manager, "Pig Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Oink. Oink. Oink.... Oink?", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Oink", - C.cYellow + "Collide" + C.cGray + " to use " + C.cGreen + "Pig Bounce", + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Oink", + "#" + C.cYellow + "Collide" + C.cGray + " to use " + C.cGreen + "Pig Bounce", }, LineFormat.LORE), -10, Material.PORK, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java index 6f0f8f89f..cd6b8b24e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java @@ -30,10 +30,10 @@ public class MorphSlime extends MorphGadget super(manager, "Big Larry Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Have you ever looked at Big Larry and thought, \'I really want to be that guy!\'? Well, today is your lucky day!", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Bounce", - " ", - C.cWhite + "+1 Slime Size for every 10 Mineplex Levels", + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Bounce", + C.blankLine, + "#" + C.cGreen + "+1 Size per 10 Mineplex Levels", }, LineFormat.LORE), 80000, Material.SLIME_BALL, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java index e9a4ee54c..bd06315e5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java @@ -47,9 +47,9 @@ public class MorphSnowman extends MorphGadget C.cWhite + "Do you wanna build a snowman?", C.cWhite + "It doesn't have to be a snowman...", C.cWhite + "Or... it kind of does...", - " ", - C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Blizzard", - C.cYellow + "Sneak" + C.cGray + " to use " + C.cGreen + "Snow Slide", + C.blankLine, + "#" + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Blizzard", + "#" + C.cYellow + "Sneak" + C.cGray + " to use " + C.cGreen + "Snow Slide", }, LineFormat.LORE), -3, Material.SNOW_BALL, (byte) 0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java index 91ba7a3f8..cedd467ee 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java @@ -47,8 +47,8 @@ public class MorphTitan extends MorphGadget super(manager, "Elder Guardian Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "From the depths of the sea, the Elder Guardian posseses powers more amazing than any seen before!", - " ", - C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Guardians Laser", + C.blankLine, + "#" + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Guardians Laser", }, LineFormat.LORE), -13, Material.PRISMARINE_CRYSTALS, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java index 3c537f731..61944df22 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java @@ -45,10 +45,10 @@ public class MorphVillager extends MorphGadget implements IThrown super(manager, "Villager Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "HURRRR! MURR HURRR!", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Gem Throw", - " ", - C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Gem Throw uses 20 Gems" + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Gem Throw", + C.blankLine, + "#" + C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Gem Throw uses 20 Gems" }, LineFormat.LORE), 12000, Material.EMERALD, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java index 0bf2c6695..664b088f7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java @@ -48,8 +48,8 @@ public class MorphWither extends MorphGadget super(manager, "Wither Morph", UtilText.splitLinesToArray(new String[] { C.cWhite + "Legends have foretold the coming of a powerful Wither...", - " ", - C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Wither Skull", + C.blankLine, + "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Wither Skull", }, LineFormat.LORE), -12, Material.SKULL_ITEM, (byte)1); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java index 0e4058aa4..c658c14e2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java @@ -47,9 +47,9 @@ public class MountSpider extends HorseMount UtilText.splitLinesToArray(new String[] { C.cWhite + "Why ride a horse when you can ride a cute and cuddly spider!", - C.cBlack, - C.cYellow + "Look Up" + C.cGray + " to use " + C.cGreen + "Wall Climb", - C.cYellow + "Jump" + C.cGray + " to use " + C.cGreen + "Leap", + C.blankLine, + "#" + C.cYellow + "Look Up" + C.cGray + " to use " + C.cGreen + "Wall Climb", + "#" + C.cYellow + "Jump" + C.cGray + " to use " + C.cGreen + "Leap", }, LineFormat.LORE), Material.WEB, (byte) 0, -4, Color.BLACK, Style.NONE, Variant.HORSE, 2.0, Material.AIR); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java b/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java index 826cf7636..71595c42a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/playerCount/PlayerCountManager.java @@ -19,7 +19,7 @@ public class PlayerCountManager extends MiniPlugin private DataRepository _repository; private DataRepository _secondRepository; - private volatile int _playerCount; + private volatile int _playerCount = 0; public PlayerCountManager(JavaPlugin plugin) { @@ -37,7 +37,7 @@ public class PlayerCountManager extends MiniPlugin _secondRepository = new RedisDataRepository(new ConnectionData("10.33.53.16", 6379, ConnectionData.ConnectionType.MASTER, "ServerStatus"), new ConnectionData("10.33.53.16", 6377, ConnectionData.ConnectionType.SLAVE, "ServerStatus"), Region.ALL, BungeeServer.class, "bungeeServers"); - updatePlayerCount(); + //updatePlayerCount(); } private void updatePlayerCount() From b5c157c12326a096fa446d6fc620ea6a0effa7ef Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Fri, 11 Dec 2015 01:24:16 -0500 Subject: [PATCH 156/223] Changed PlayerCache to Cache --- Plugins/Mineplex.Bungee.Mineplexer/.classpath | 2 +- .../src/mineplex/bungee/playerStats/PlayerStats.java | 4 ++-- .../mineplex/bungee/playerStats/PlayerStatsRepository.java | 2 +- Plugins/Mineplex.Core/.classpath | 2 +- .../src/mineplex/core/account/CoreClientManager.java | 5 +++-- .../src/mineplex/core/cosmetic/ui/page/PetTagPage.java | 2 +- .../src/mineplex/core/donation/DonationManager.java | 3 ++- .../src/mineplex/core/inventory/InventoryManager.java | 2 +- .../src/mineplex/core/preferences/PreferencesRepository.java | 1 - .../src/mineplex/core/reward/rewards/PetReward.java | 2 +- .../Mineplex.Core/src/mineplex/core/stats/StatsManager.java | 2 +- .../Mineplex.Core/src/mineplex/core/task/TaskManager.java | 2 +- Plugins/Mineplex.Game.Clans.Core/.classpath | 2 +- Plugins/Mineplex.PlayerCache/.project | 2 +- .../mineplex/{playerCache => cache/player}/PlayerCache.java | 2 +- .../mineplex/{playerCache => cache/player}/PlayerInfo.java | 2 +- 16 files changed, 19 insertions(+), 18 deletions(-) rename Plugins/Mineplex.PlayerCache/src/mineplex/{playerCache => cache/player}/PlayerCache.java (97%) rename Plugins/Mineplex.PlayerCache/src/mineplex/{playerCache => cache/player}/PlayerInfo.java (97%) diff --git a/Plugins/Mineplex.Bungee.Mineplexer/.classpath b/Plugins/Mineplex.Bungee.Mineplexer/.classpath index 40645fe06..c06b6c559 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/.classpath +++ b/Plugins/Mineplex.Bungee.Mineplexer/.classpath @@ -8,6 +8,6 @@ - + diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java index fcae65a57..cc805cbe2 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java @@ -5,8 +5,8 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; import mineplex.bungee.playerStats.data.IpInfo; -import mineplex.playerCache.PlayerCache; -import mineplex.playerCache.PlayerInfo; +import mineplex.cache.player.PlayerCache; +import mineplex.cache.player.PlayerInfo; import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.event.PostLoginEvent; import net.md_5.bungee.api.plugin.Listener; diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java index 1e9f765f5..5227ab818 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java @@ -9,7 +9,7 @@ import java.sql.Statement; import java.util.UUID; import mineplex.bungee.playerStats.data.IpInfo; -import mineplex.playerCache.PlayerInfo; +import mineplex.cache.player.PlayerInfo; public class PlayerStatsRepository { diff --git a/Plugins/Mineplex.Core/.classpath b/Plugins/Mineplex.Core/.classpath index 1b29691dd..ea3a54132 100644 --- a/Plugins/Mineplex.Core/.classpath +++ b/Plugins/Mineplex.Core/.classpath @@ -13,7 +13,7 @@ - + diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index 3c01d37a3..26859a6b3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -9,6 +9,9 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import com.google.gson.Gson; + +import mineplex.cache.player.PlayerCache; +import mineplex.cache.player.PlayerInfo; import mineplex.core.MiniPlugin; import mineplex.core.account.command.TestRank; import mineplex.core.account.command.UpdateRank; @@ -24,8 +27,6 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.timing.TimingManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.playerCache.PlayerCache; -import mineplex.playerCache.PlayerInfo; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java index 84da7d074..2ca6490f6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java @@ -1,5 +1,6 @@ package mineplex.core.cosmetic.ui.page; +import mineplex.cache.player.PlayerCache; import mineplex.core.account.CoreClientManager; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; @@ -16,7 +17,6 @@ import mineplex.core.pet.repository.token.PetChangeToken; import mineplex.core.pet.repository.token.PetToken; import mineplex.core.shop.page.ConfirmationPage; import mineplex.core.shop.page.ShopPageBase; -import mineplex.playerCache.PlayerCache; import net.minecraft.server.v1_8_R3.ItemStack; import net.minecraft.server.v1_8_R3.Items; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java index 54209e7db..813873d73 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java @@ -10,6 +10,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.plugin.java.JavaPlugin; import com.google.gson.Gson; + +import mineplex.cache.player.PlayerCache; import mineplex.core.MiniDbClientPlugin; import mineplex.core.account.CoreClientManager; import mineplex.core.account.event.ClientWebResponseEvent; @@ -24,7 +26,6 @@ import mineplex.core.donation.repository.token.DonorTokenWrapper; import mineplex.core.server.util.TransactionResponse; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.playerCache.PlayerCache; public class DonationManager extends MiniDbClientPlugin { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java index 82becc622..7df564134 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java @@ -22,6 +22,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.cache.player.PlayerCache; import mineplex.core.MiniDbClientPlugin; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.Callback; @@ -31,7 +32,6 @@ import mineplex.core.inventory.data.InventoryRepository; import mineplex.core.inventory.data.Item; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.playerCache.PlayerCache; public class InventoryManager extends MiniDbClientPlugin { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java index 7449c83c9..94749ce2f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java @@ -122,7 +122,6 @@ public class PreferencesRepository extends RepositoryBase preferences.PendingFriendRequests = resultSet.getBoolean(11); preferences.friendDisplayInventoryUI = resultSet.getBoolean(12); preferences.ClanTips = resultSet.getBoolean(13); - System.out.println("<< " + resultSet.getBoolean(13)); } return preferences; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/PetReward.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/PetReward.java index 113f8a6cf..c683c100f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/PetReward.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/PetReward.java @@ -5,6 +5,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import mineplex.cache.player.PlayerCache; import mineplex.core.donation.DonationManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.pet.PetManager; @@ -13,7 +14,6 @@ import mineplex.core.pet.repository.token.PetToken; import mineplex.core.reward.RewardData; import mineplex.core.reward.RewardRarity; import mineplex.core.reward.RewardType; -import mineplex.playerCache.PlayerCache; /** * Created by shaun on 14-09-18. diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 4b60646f1..f2edadcc1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.cache.player.PlayerCache; import mineplex.core.MiniDbClientPlugin; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.NautHashMap; @@ -16,7 +17,6 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.stats.command.GiveStatCommand; import mineplex.core.stats.command.TimeCommand; import mineplex.core.stats.event.StatChangeEvent; -import mineplex.playerCache.PlayerCache; public class StatsManager extends MiniDbClientPlugin { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/task/TaskManager.java b/Plugins/Mineplex.Core/src/mineplex/core/task/TaskManager.java index 3a9e8601f..85608613e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/task/TaskManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/task/TaskManager.java @@ -5,12 +5,12 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; +import mineplex.cache.player.PlayerCache; import mineplex.core.MiniDbClientPlugin; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.Callback; import mineplex.core.common.util.NautHashMap; import mineplex.core.task.repository.TaskRepository; -import mineplex.playerCache.PlayerCache; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Game.Clans.Core/.classpath b/Plugins/Mineplex.Game.Clans.Core/.classpath index fa4ddd8ed..c6a118cbe 100644 --- a/Plugins/Mineplex.Game.Clans.Core/.classpath +++ b/Plugins/Mineplex.Game.Clans.Core/.classpath @@ -1,7 +1,7 @@ - + diff --git a/Plugins/Mineplex.PlayerCache/.project b/Plugins/Mineplex.PlayerCache/.project index 0abebe638..5321c2157 100644 --- a/Plugins/Mineplex.PlayerCache/.project +++ b/Plugins/Mineplex.PlayerCache/.project @@ -1,6 +1,6 @@ - Mineplex.PlayerCache + Mineplex.Cache diff --git a/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerCache.java b/Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerCache.java similarity index 97% rename from Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerCache.java rename to Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerCache.java index cf320dbde..e83eabf74 100644 --- a/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerCache.java +++ b/Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerCache.java @@ -1,4 +1,4 @@ -package mineplex.playerCache; +package mineplex.cache.player; import java.util.UUID; diff --git a/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerInfo.java b/Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerInfo.java similarity index 97% rename from Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerInfo.java rename to Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerInfo.java index 3ab44b0d5..c7cf6faec 100644 --- a/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerInfo.java +++ b/Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerInfo.java @@ -1,4 +1,4 @@ -package mineplex.playerCache; +package mineplex.cache.player; import java.util.UUID; From 222173ab17c12a879b0397979c2c2a8083ebac12 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Fri, 11 Dec 2015 01:24:59 -0500 Subject: [PATCH 157/223] Improved and implemented GameProfile caching. --- .../ProfileCacheLookupCallback.java | 29 +++ .../profileCache/ProfileCacheManager.java | 215 +++++++++++------- .../Mineplex.Hub/src/mineplex/hub/Hub.java | 3 + .../src/mineplex/staffServer/StaffServer.java | 5 +- .../src/nautilus/game/arcade/Arcade.java | 3 + 5 files changed, 173 insertions(+), 82 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheLookupCallback.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheLookupCallback.java b/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheLookupCallback.java new file mode 100644 index 000000000..81d62ada2 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheLookupCallback.java @@ -0,0 +1,29 @@ +package mineplex.core.profileCache; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.ProfileLookupCallback; + +public class ProfileCacheLookupCallback implements ProfileLookupCallback +{ + private ProfileCacheManager _profileCacheManager; + private ProfileLookupCallback _profileLookupCallback; + + public ProfileCacheLookupCallback(ProfileCacheManager profileCacheManager, ProfileLookupCallback profileLookupCallback) + { + _profileCacheManager = profileCacheManager; + _profileLookupCallback = profileLookupCallback; + } + + @Override + public void onProfileLookupFailed(GameProfile gameProfile, Exception exception) + { + _profileLookupCallback.onProfileLookupFailed(gameProfile, exception); + } + + @Override + public void onProfileLookupSucceeded(GameProfile gameProfile) + { + _profileCacheManager.cacheProfile(gameProfile); + _profileLookupCallback.onProfileLookupSucceeded(gameProfile); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheManager.java b/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheManager.java index 3f2af0ea7..102df1712 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/profileCache/ProfileCacheManager.java @@ -1,81 +1,134 @@ -//package mineplex.core.profileCache; -// -//import java.util.UUID; -// -//import org.bukkit.plugin.java.JavaPlugin; -//import net.minecraft.util.com.google.gson.Gson; -//import net.minecraft.util.com.google.gson.GsonBuilder; -//import net.minecraft.util.com.mojang.authlib.GameProfile; -//import net.minecraft.util.com.mojang.authlib.properties.PropertyMap; -//import net.minecraft.util.com.mojang.authlib.yggdrasil.ProfileCache; -//import net.minecraft.util.com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository; -//import net.minecraft.util.com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; -//import net.minecraft.util.com.mojang.authlib.yggdrasil.response.ProfileSearchResultsResponse; -//import net.minecraft.util.com.mojang.util.UUIDTypeAdapter; -// -//import mineplex.core.MiniPlugin; -//import mineplex.serverdata.Region; -//import mineplex.serverdata.redis.RedisDataRepository; -//import mineplex.serverdata.servers.ServerManager; -// -//public class ProfileCacheManager extends MiniPlugin implements ProfileCache -//{ -// private RedisDataRepository _profileRepository; -// private Gson _gson; -// -// public ProfileCacheManager(JavaPlugin plugin) -// { -// super("Profile Cache", plugin); -// -// _profileRepository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(), -// Region.ALL, ProfileData.class, "profileCacheRepo"); -// -// GsonBuilder builder = new GsonBuilder(); -// builder.registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()); -// builder.registerTypeAdapter(UUID.class, new UUIDTypeAdapter()); -// builder.registerTypeAdapter(ProfileSearchResultsResponse.class, new net.minecraft.util.com.mojang.authlib.yggdrasil.response.ProfileSearchResultsResponse.Serializer()); -// _gson = builder.create(); -// -// try -// { -// YggdrasilMinecraftSessionService.setProfileCache(this); -// YggdrasilGameProfileRepository.setProfileCache(this); -// } -// catch (Exception e) -// { -// System.out.println("================================================"); -// System.out.println("Failed to load Profile Cache (Skins)"); -// System.out.println("Are you using the correct modified Craftbukkit?"); -// System.out.println("================================================"); -// } -// } -// -// -// @Override -// public GameProfile attemptToLoadProfile(String playerName) -// { -// ProfileData profile = _profileRepository.getElement(playerName.toLowerCase()); -// -// if (profile != null) -// { -// PropertyMap propertyMap = _gson.fromJson(profile.getPropertyMap(), PropertyMap.class); -// GameProfile gameProfile = new GameProfile(profile.getUuid(), profile.getPlayerName()); -// gameProfile.getProperties().putAll(propertyMap); -// -//// System.out.println("Loaded profile " + playerName + " from repository!"); -// return gameProfile; -// } -// -//// System.out.println("Profile Null"); -// -// return null; -// } -// -// @Override -// public void cacheProfile(GameProfile profile) -// { -//// System.out.println("Cached profile: " + profile.getName()); -// ProfileData data = new ProfileData(profile.getId(), profile.getName(), _gson.toJson(profile.getProperties())); -// _profileRepository.addElement(data, 60 * 60 * 24); // 1 day -// } -//} +package mineplex.core.profileCache; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.event.EventHandler; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.mojang.authlib.Agent; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.GameProfileRepository; +import com.mojang.authlib.ProfileLookupCallback; +import com.mojang.authlib.properties.PropertyMap; +import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository; +import com.mojang.authlib.yggdrasil.response.ProfileSearchResultsResponse; +import com.mojang.util.UUIDTypeAdapter; + +import mineplex.core.MiniPlugin; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.serverdata.Region; +import mineplex.serverdata.redis.RedisDataRepository; +import mineplex.serverdata.servers.ServerManager; + +public class ProfileCacheManager extends MiniPlugin implements GameProfileRepository +{ + private YggdrasilGameProfileRepository _mojangProfileRepository; + private RedisDataRepository _profileRepository; + private Gson _gson; + + public ProfileCacheManager(JavaPlugin plugin) + { + super("Profile Cache", plugin); + + _profileRepository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(), + Region.ALL, ProfileData.class, "profileCacheRepo"); + + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()); + builder.registerTypeAdapter(UUID.class, new UUIDTypeAdapter()); + builder.registerTypeAdapter(ProfileSearchResultsResponse.class, new com.mojang.authlib.yggdrasil.response.ProfileSearchResultsResponse.Serializer()); + _gson = builder.create(); + + try + { + Field mojangProfileRepo = net.minecraft.server.v1_8_R3.MinecraftServer.class.getDeclaredField("Y"); + + mojangProfileRepo.setAccessible(true); + + _mojangProfileRepository = (YggdrasilGameProfileRepository) mojangProfileRepo.get(((CraftServer)Bukkit.getServer()).getServer()); + mojangProfileRepo.set(((CraftServer)Bukkit.getServer()).getServer(), this); + } + catch (Exception e) + { + e.printStackTrace(); + System.out.println("================================================"); + System.out.println("Failed to load Profile Cache (Skins)"); + System.out.println("Are you using the correct modified Craftbukkit?"); + System.out.println("================================================"); + } + } + + + public GameProfile attemptToLoadProfile(String playerName) + { + ProfileData profile = _profileRepository.getElement(playerName.toLowerCase()); + + if (profile != null) + { + PropertyMap propertyMap = _gson.fromJson(profile.getPropertyMap(), PropertyMap.class); + GameProfile gameProfile = new GameProfile(profile.getUuid(), profile.getPlayerName()); + gameProfile.getProperties().putAll(propertyMap); + return gameProfile; + } + + return null; + } + + public void cacheProfile(final GameProfile profile) + { + if (Bukkit.isPrimaryThread()) + { + runAsync(new Runnable() + { + public void run() + { + cacheProfileSafely(profile); + } + }); + } + else + cacheProfileSafely(profile); + } + + @Override + public void findProfilesByNames(String[] profileNames, Agent agent, ProfileLookupCallback profileLookupCallback) + { + List uncachedProfileNames = new ArrayList<>(); + + for (String profileName : profileNames) + { + GameProfile profile = attemptToLoadProfile(profileName); + + if (profile == null) + uncachedProfileNames.add(profileName); + else + profileLookupCallback.onProfileLookupSucceeded(profile); + } + + _mojangProfileRepository.findProfilesByNames(uncachedProfileNames.toArray(new String[uncachedProfileNames.size()]), agent, new ProfileCacheLookupCallback(this, profileLookupCallback)); + } + + @EventHandler + public void clearRepository(UpdateEvent event) + { + if (event.getType() != UpdateType.MIN_10) + return; + + _profileRepository.clean(); + } + + private void cacheProfileSafely(GameProfile profile) + { + ProfileData data = new ProfileData(profile.getId(), profile.getName(), _gson.toJson(profile.getProperties())); + _profileRepository.addElement(data, 60 * 60 * 24); // 1 day + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index f52155acb..9940694cc 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -38,6 +38,7 @@ import mineplex.core.pet.PetManager; import mineplex.core.poll.PollManager; import mineplex.core.portal.Portal; import mineplex.core.preferences.PreferencesManager; +import mineplex.core.profileCache.ProfileCacheManager; import mineplex.core.projectile.ProjectileManager; import mineplex.core.punish.Punish; import mineplex.core.recharge.Recharge; @@ -182,6 +183,8 @@ public class Hub extends JavaPlugin implements IRelation new ClassCombatShop(shopManager, clientManager, donationManager, false, "Knight", classManager.GetClass("Knight"), true); new ClassCombatShop(shopManager, clientManager, donationManager, false, "Assassin", classManager.GetClass("Assassin"), true); + new ProfileCacheManager(this); + //Updates getServer().getScheduler().scheduleSyncRepeatingTask(this, new Updater(this), 1, 1); } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java index c1c98cf3b..cdb02169a 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java @@ -15,6 +15,7 @@ import mineplex.core.monitor.LagMeter; import mineplex.core.npc.NpcManager; import mineplex.core.portal.Portal; import mineplex.core.preferences.PreferencesManager; +import mineplex.core.profileCache.ProfileCacheManager; import mineplex.core.punish.Punish; import mineplex.core.recharge.Recharge; import mineplex.core.stats.StatsManager; @@ -88,6 +89,8 @@ public class StaffServer extends JavaPlugin ((CraftServer)getServer()).getHandle().addOp(new GameProfile(UUID.fromString("377bdea3-badc-448d-81c1-65db43b17ea4"), "Strutt20")); ((CraftServer)getServer()).getHandle().addOp(new GameProfile(UUID.fromString("efaf9a17-2304-4f42-8433-421523c308dc"), "B2_mp")); - ((CraftServer)getServer()).getHandle().addOp(new GameProfile(UUID.fromString("cf85f470-5248-4978-8208-435736fa136e"), "RustyRoo")); + ((CraftServer)getServer()).getHandle().addOp(new GameProfile(UUID.fromString("cf85f470-5248-4978-8208-435736fa136e"), "RustyRoo")); + + new ProfileCacheManager(this); } } 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 7a710683b..aa1468fdf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -45,6 +45,7 @@ import mineplex.core.pet.PetManager; import mineplex.core.poll.PollManager; import mineplex.core.portal.Portal; import mineplex.core.preferences.PreferencesManager; +import mineplex.core.profileCache.ProfileCacheManager; import mineplex.core.projectile.ProjectileManager; import mineplex.core.punish.Punish; import mineplex.core.recharge.Recharge; @@ -160,6 +161,8 @@ public class Arcade extends JavaPlugin new PacketsInteractionFix(this, packetHandler); new FoodDupeFix(this); + new ProfileCacheManager(this); + //Updates getServer().getScheduler().scheduleSyncRepeatingTask(this, new Updater(this), 1, 1); From 66011cde8cbced8adf50b23ed833953cd16d2286 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 17:25:23 +1100 Subject: [PATCH 158/223] fixed player count --- Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 3583b5df5..52abd753e 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -697,6 +697,8 @@ public class HubManager extends MiniClientPlugin if (_scoreboardTick != 0) return; + int playerCount = _playerCountManager.getPlayerCount(); + for (Player player : UtilServer.getPlayers()) { //Dont Waste Time @@ -733,11 +735,10 @@ public class HubManager extends MiniClientPlugin obj.getScore(" ").setScore(line--); //Players - int playerCount = _playerCountManager.getPlayerCount(); obj.getScore(C.cYellow + C.Bold + "Players").setScore(line--); player.getScoreboard().resetScores(_lastPlayerCount + ""); obj.getScore(playerCount + "").setScore(line--); - _lastPlayerCount = playerCount; + //Space obj.getScore(" ").setScore(line--); @@ -770,6 +771,8 @@ public class HubManager extends MiniClientPlugin obj.getScore("www.mineplex.com").setScore(line--); obj.getScore("----------------").setScore(line--); } + + _lastPlayerCount = playerCount; } @Override From 523c1875ef12e84f002401469e80378216ca19e6 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 06:58:11 +0000 Subject: [PATCH 159/223] fix --- .../nautilus/game/arcade/game/games/gladiators/Arena.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index c63c4e922..a4dca2dcc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -326,11 +326,11 @@ public class Arena } else if (_state.equals(ArenaState.RUNNING)) { - if (_alertedAlready2) - return; - for (Player p : getPastPlayers()) { + if (_alertedAlready2) + continue; + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20 * 100, 0, p); } From 61a8d2825e7fb01be56fa3f8f688e1694494a020 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 19:20:13 +1100 Subject: [PATCH 160/223] gadget gui overhaul --- .../core/cosmetic/ui/page/GadgetPage.java | 58 ++++++---- .../core/cosmetic/ui/page/MountPage.java | 89 +++++++++++++-- .../core/cosmetic/ui/page/PetPage.java | 105 +++++++++++++----- .../arrowtrail/ArrowTrailCandyCane.java | 2 +- .../arrowtrail/ArrowTrailFrostLord.java | 2 +- .../gadgets/arrowtrail/ArrowTrailTitan.java | 2 +- .../gadget/gadgets/death/DeathCandyCane.java | 2 +- .../gadget/gadgets/death/DeathFrostLord.java | 2 +- .../core/gadget/gadgets/death/DeathTitan.java | 2 +- .../doublejump/DoubleJumpCandyCane.java | 2 +- .../doublejump/DoubleJumpFrostLord.java | 2 +- .../gadgets/doublejump/DoubleJumpTitan.java | 2 +- .../core/gadget/gadgets/hat/HatCoal.java | 2 +- .../core/gadget/gadgets/hat/HatGrinch.java | 2 +- .../core/gadget/gadgets/hat/HatPresent.java | 2 +- .../core/gadget/gadgets/hat/HatSanta.java | 2 +- .../core/gadget/gadgets/hat/HatSnowman.java | 2 +- .../core/gadget/gadgets/item/ItemBatGun.java | 2 +- .../core/gadget/gadgets/item/ItemCoal.java | 2 +- .../core/gadget/gadgets/morph/MorphBat.java | 8 +- .../core/gadget/gadgets/morph/MorphBlaze.java | 4 +- .../core/gadget/gadgets/morph/MorphBlock.java | 6 +- .../core/gadget/gadgets/morph/MorphBunny.java | 6 +- .../gadget/gadgets/morph/MorphChicken.java | 6 +- .../core/gadget/gadgets/morph/MorphCow.java | 4 +- .../gadget/gadgets/morph/MorphCreeper.java | 4 +- .../gadget/gadgets/morph/MorphEnderman.java | 4 +- .../core/gadget/gadgets/morph/MorphPig.java | 6 +- .../gadgets/morph/MorphPumpkinKing.java | 2 +- .../core/gadget/gadgets/morph/MorphSlime.java | 6 +- .../gadget/gadgets/morph/MorphSnowman.java | 10 +- .../core/gadget/gadgets/morph/MorphTitan.java | 4 +- .../gadget/gadgets/morph/MorphVillager.java | 4 +- .../gadget/gadgets/morph/MorphWither.java | 4 +- .../gadgets/particle/ParticleCandyCane.java | 2 +- .../gadgets/particle/ParticleCoalFumes.java | 2 +- .../gadgets/particle/ParticleEnchant.java | 2 +- .../gadgets/particle/ParticleFairy.java | 6 +- .../gadgets/particle/ParticleFireRings.java | 2 +- .../gadget/gadgets/particle/ParticleFoot.java | 2 +- .../gadgets/particle/ParticleFrostLord.java | 2 +- .../gadgets/particle/ParticleGreen.java | 2 +- .../gadgets/particle/ParticleHeart.java | 2 +- .../gadgets/particle/ParticleHelix.java | 2 +- .../gadgets/particle/ParticleKronos.java | 6 +- .../gadgets/particle/ParticleLegend.java | 2 +- .../gadget/gadgets/particle/ParticleRain.java | 2 +- .../gadgets/particle/ParticleTitan.java | 2 +- .../core/mount/types/MountBabyReindeer.java | 2 +- .../mineplex/core/mount/types/MountCart.java | 2 +- .../core/mount/types/MountDragon.java | 2 +- .../mineplex/core/mount/types/MountFrost.java | 2 +- .../mineplex/core/mount/types/MountMule.java | 2 +- .../mineplex/core/mount/types/MountSheep.java | 2 +- .../mineplex/core/mount/types/MountSlime.java | 2 +- .../core/mount/types/MountSpider.java | 6 +- .../mineplex/core/mount/types/MountTitan.java | 2 +- .../core/mount/types/MountUndead.java | 2 +- .../core/mount/types/MountZombie.java | 2 +- .../src/mineplex/core/pet/PetFactory.java | 4 +- .../src/mineplex/core/pet/types/Elf.java | 2 +- .../src/mineplex/core/pet/types/Pumpkin.java | 2 +- 62 files changed, 283 insertions(+), 149 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 7370cb2ce..0d265f3ea 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -78,16 +78,10 @@ public class GadgetPage extends ShopPageBase List itemLore = new ArrayList(); - itemLore.add(C.cBlack); itemLore.addAll(Arrays.asList(gadget.GetDescription())); - - if (gadget.GetCost(CurrencyType.Coins) >= 0) - { - itemLore.add(C.cBlack); - itemLore.add(C.cAqua + "Cost: " + ChatColor.RESET + gadget.GetCost(CurrencyType.Coins) + " Treasure Shards"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -1) + + if (gadget.GetCost(CurrencyType.Coins) == -1) { //Nothing } @@ -95,22 +89,22 @@ public class GadgetPage extends ShopPageBase else if (gadget.GetCost(CurrencyType.Coins) == -2) { itemLore.add(C.cBlack); - itemLore.add(C.cGray + "Found in Treasure Chests"); + itemLore.add(C.cBlue + "Found in Treasure Chests"); } else if (gadget.GetCost(CurrencyType.Coins) == -3) { itemLore.add(C.cBlack); - itemLore.add(C.cWhite + "Found in Winter Holiday Treasure"); + itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); } else if (gadget.GetCost(CurrencyType.Coins) == -4) { itemLore.add(C.cBlack); - itemLore.add(C.cWhite + "Found in Halloween Pumpkin Treasure"); + itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); } else if (gadget.GetCost(CurrencyType.Coins) == -5) { itemLore.add(C.cBlack); - itemLore.add(C.cWhite + "Found in Easter Holiday Treasure"); + itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); } //Rank Unlocks else if (gadget.GetCost(CurrencyType.Coins) == -10) @@ -128,7 +122,7 @@ public class GadgetPage extends ShopPageBase itemLore.add(C.cBlack); itemLore.add(C.cGreen + "Unlocked with Legend Rank"); } - else if (gadget.GetCost(CurrencyType.Coins) == -12) + else if (gadget.GetCost(CurrencyType.Coins) == -13) { itemLore.add(C.cBlack); itemLore.add(C.cRed + "Unlocked with Titan Rank"); @@ -147,19 +141,45 @@ public class GadgetPage extends ShopPageBase { if (gadget.GetActive().contains(getPlayer())) { - addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), "Deactivate " + gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivateGadgetButton(gadget, this)); + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Disable"); + + addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivateGadgetButton(gadget, this)); } else { - addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), "Activate " + gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateGadgetButton(gadget, this)); + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Enable"); + + addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateGadgetButton(gadget, this)); } } - else - { + else + { + if (gadget.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhiteB + "Cost: " + C.cAqua + gadget.GetCost(CurrencyType.Coins) + " Treasure Shards"); + } + if (gadget.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= gadget.GetCost(CurrencyType.Coins)) - addButton(slot, new ShopItem(Material.INK_SACK, (byte) 8, (gadget.GetCost(CurrencyType.Coins) < 0 ? "" : "Purchase ") + gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new GadgetButton(gadget, this)); + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to craft " + gadget.GetName()); + + addButton(slot, new ShopItem(Material.INK_SACK, (byte) 8, gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new GadgetButton(gadget, this)); + } + else if (gadget.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Not enough Treasure Shards."); + + setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } else - setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, (gadget.GetCost(CurrencyType.Coins) < 0 ? "" : "Purchase ") + gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + { + setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java index 2ed930507..77e87179c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java @@ -57,31 +57,100 @@ public class MountPage extends ShopPageBase { List itemLore = new ArrayList(); - if (mount.GetCost(CurrencyType.Coins) != -1) - { - itemLore.add(C.cYellow + mount.GetCost(CurrencyType.Coins) + " Coins"); - } - itemLore.add(C.cBlack); itemLore.addAll(Arrays.asList(mount.GetDescription())); + if (mount.GetCost(CurrencyType.Coins) == -1) + { + //Nothing + } + //Chest Unlocks + else if (mount.GetCost(CurrencyType.Coins) == -2) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Treasure Chests"); + } + else if (mount.GetCost(CurrencyType.Coins) == -3) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); + } + else if (mount.GetCost(CurrencyType.Coins) == -4) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); + } + else if (mount.GetCost(CurrencyType.Coins) == -5) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); + } + //Rank Unlocks + else if (mount.GetCost(CurrencyType.Coins) == -10) + { + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); + } + else if (mount.GetCost(CurrencyType.Coins) == -11) + { + itemLore.add(C.cBlack); + itemLore.add(C.cPurple + "Unlocked with Hero Rank"); + } + else if (mount.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Unlocked with Legend Rank"); + } + else if (mount.GetCost(CurrencyType.Coins) == -13) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Unlocked with Titan Rank"); + } + + if (getDonationManager().Get(getPlayer().getName()).OwnsUnknownPackage(mount.GetName())) { if (mount.GetActive().containsKey(getPlayer())) { - addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), "Deactivate " + mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivateMountButton(mount, this)); + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Disable"); + + addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivateMountButton(mount, this)); } else { - addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), "Activate " + mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateMountButton(mount, this)); + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Enable"); + + addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateMountButton(mount, this)); } } else { - if (mount.GetCost(CurrencyType.Coins) != -1 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= mount.GetCost(CurrencyType.Coins)) - addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), (mount.GetCost(CurrencyType.Coins) < 0 ? "" : "Purchase ") + mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new MountButton(mount, this)); + if (mount.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhiteB + "Cost: " + C.cAqua + mount.GetCost(CurrencyType.Coins) + " Treasure Shards"); + } + + if (mount.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= mount.GetCost(CurrencyType.Coins)) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to craft " + mount.GetName()); + + addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new MountButton(mount, this)); + } + else if (mount.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Not enough Treasure Shards."); + + setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } else - setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), (mount.GetCost(CurrencyType.Coins) < 0 ? "" : "Purchase ") + mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + { + setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java index cd562f903..7d40cab01 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java @@ -61,26 +61,54 @@ public class PetPage extends ShopPageBase { List itemLore = new ArrayList(); - //Halloween Name + itemLore.add(C.cBlack); + itemLore.add(C.cGray + "Your very own " + pet.GetName() + "!"); + if (pet.GetCost(CurrencyType.Coins) == -1) { - if (pet instanceof Pumpkin) - { - itemLore.add(C.cBlack); - itemLore.add(ChatColor.RESET + C.cYellow + "Earned by defeating the Pumpkin King"); - itemLore.add(ChatColor.RESET + C.cYellow + "in the 2014 Halloween Horror Event."); - } - if (pet instanceof Elf) - { - itemLore.add(C.cBlack); - itemLore.add(ChatColor.RESET + C.cYellow + "Earned by defeating the Pumpkin King"); - itemLore.add(ChatColor.RESET + C.cYellow + "in the 2014 Christmas Chaos Event."); - } - if (pet.GetPetType() == EntityType.WITHER) - { - itemLore.add(C.cBlack); - itemLore.add(ChatColor.RESET + C.cGreen + "Unlocked with Legend Rank"); - } + //Nothing + } + //Chest Unlocks + else if (pet.GetCost(CurrencyType.Coins) == -2) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Treasure Chests"); + } + else if (pet.GetCost(CurrencyType.Coins) == -3) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); + } + else if (pet.GetCost(CurrencyType.Coins) == -4) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); + } + else if (pet.GetCost(CurrencyType.Coins) == -5) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); + } + //Rank Unlocks + else if (pet.GetCost(CurrencyType.Coins) == -10) + { + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); + } + else if (pet.GetCost(CurrencyType.Coins) == -11) + { + itemLore.add(C.cBlack); + itemLore.add(C.cPurple + "Unlocked with Hero Rank"); + } + else if (pet.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Unlocked with Legend Rank"); + } + else if (pet.GetCost(CurrencyType.Coins) == -13) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Unlocked with Titan Rank"); } //Owned @@ -94,35 +122,52 @@ public class PetPage extends ShopPageBase if (getPlugin().getPetManager().hasActivePet(getPlayer().getName()) && getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType() == pet.GetPetType()) { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Disable"); + addButton(slot, new ShopItem(Material.MONSTER_EGG, (byte) pet.GetPetType().getTypeId(), - "Deactivate " + pet.GetPetName() + " (" + C.cWhite + petName + C.cGreen + ")", + pet.GetPetName() + " (" + C.cWhite + petName + C.cGreen + ")", itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivatePetButton(this, getPlugin().getPetManager())); addGlow(slot); } else { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Enable"); + addButton(slot, new ShopItem(Material.MONSTER_EGG, (byte) pet.GetPetType().getTypeId(), - "Activate " + pet.GetPetName() + " (" + C.cWhite + petName + C.cGreen + ")", + pet.GetPetName() + " (" + C.cWhite + petName + C.cGreen + ")", itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivatePetButton(pet, this)); } } //Not Owned else { - //Cost Lore if (pet.GetCost(CurrencyType.Coins) > 0) - { - itemLore.add(C.cYellow + pet.GetCost(CurrencyType.Coins) + " Coins"); - itemLore.add(C.cBlack); - } + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhiteB + "Cost: " + C.cAqua + pet.GetCost(CurrencyType.Coins) + " Treasure Shards"); + } - if (pet.GetCost(CurrencyType.Coins) == -1) - setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); - else if (getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= pet.GetCost(CurrencyType.Coins)) - addButton(slot, new ShopItem(Material.INK_SACK, (byte) 8, "Purchase " + pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new PetButton(pet, this)); - else + if (pet.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= pet.GetCost(CurrencyType.Coins)) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to craft " + pet.GetName()); + + addButton(slot, new ShopItem(Material.INK_SACK, (byte) 8, pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new PetButton(pet, this)); + } + else if (pet.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Not enough Treasure Shards."); + setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, "Purchase " + pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } + else + { + setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } } slot++; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java index c02c7f4c5..0b4f11e18 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailCandyCane.java @@ -20,7 +20,7 @@ public class ArrowTrailCandyCane extends ArrowEffectGadget public ArrowTrailCandyCane(GadgetManager manager) { super(manager, "Candy Cane Arrows", - UtilText.splitLineToArray(C.cWhite + "The real reason no one visits the North Pole? Santa’s Elves are deadly shots.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "The real reason no one visits the North Pole? Santa’s Elves are deadly shots.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java index 8503deb02..171860cd5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailFrostLord.java @@ -18,7 +18,7 @@ public class ArrowTrailFrostLord extends ArrowEffectGadget public ArrowTrailFrostLord(GadgetManager manager) { super(manager, "Arrows of the Frost Lord", - UtilText.splitLineToArray(C.cWhite + "The Frost Lord’s arrows bring a blast of winter in the wind of their passing.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "The Frost Lord’s arrows bring a blast of winter in the wind of their passing.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java index eb9043ba5..e84e26318 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/arrowtrail/ArrowTrailTitan.java @@ -21,7 +21,7 @@ public class ArrowTrailTitan extends ArrowEffectGadget public ArrowTrailTitan(GadgetManager manager) { super(manager, "Arrows of the Titans", - UtilText.splitLineToArray(C.cWhite + "Arrows forged in the Fires of Creation, they leave fiery trails in their wake.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Arrows forged in the Fires of Creation, they leave fiery trails in their wake.", LineFormat.LORE), -13, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java index 748accb1a..c677d638e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathCandyCane.java @@ -19,7 +19,7 @@ public class DeathCandyCane extends DeathEffectGadget public DeathCandyCane(GadgetManager manager) { super(manager, "Candy Cane Remains", - UtilText.splitLineToArray(C.cWhite + "The biggest enemy of the Holidays, is January.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "The biggest enemy of the Holidays, is January.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java index 2f6bd3b89..7e90ac02d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathFrostLord.java @@ -15,7 +15,7 @@ public class DeathFrostLord extends DeathEffectGadget public DeathFrostLord(GadgetManager manager) { super(manager, "Fall of the Frost Lord", - UtilText.splitLineToArray(C.cWhite + "The power of Winter must eventually give way to Spring.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "The power of Winter must eventually give way to Spring.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java index 52f7edda8..cce291dc1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/death/DeathTitan.java @@ -17,7 +17,7 @@ public class DeathTitan extends DeathEffectGadget public DeathTitan(GadgetManager manager) { super(manager, "Ashes of the Titans", - UtilText.splitLineToArray(C.cWhite + "Even a Titan can fall in combat if their opponent is fierce enough.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Even a Titan can fall in combat if their opponent is fierce enough.", LineFormat.LORE), -13, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java index b95ef4ff4..80afc825b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpCandyCane.java @@ -19,7 +19,7 @@ public class DoubleJumpCandyCane extends DoubleJumpEffectGadget public DoubleJumpCandyCane(GadgetManager manager) { super(manager, "Candy Cane Blast", - UtilText.splitLineToArray(C.cWhite + "It is said every time an elf jumps, bits of Candy Cane fall out of their pockets.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "It is said every time an elf jumps, bits of Candy Cane fall out of their pockets.", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java index 4291f9d94..64cc9f962 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpFrostLord.java @@ -18,7 +18,7 @@ public class DoubleJumpFrostLord extends DoubleJumpEffectGadget public DoubleJumpFrostLord(GadgetManager manager) { super(manager, "Gust of the Frost Lord", - UtilText.splitLineToArray(C.cWhite + "Listen, the Frost Lord is a very proper individual. Stop making fart jokes!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Listen, the Frost Lord is a very proper individual. Stop making fart jokes!", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java index c86fe06dc..31cf84cce 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/doublejump/DoubleJumpTitan.java @@ -22,7 +22,7 @@ public class DoubleJumpTitan extends DoubleJumpEffectGadget public DoubleJumpTitan(GadgetManager manager) { super(manager, "Leap of the Titans", - UtilText.splitLineToArray(C.cWhite + "Out of the frying pan and into the fire.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Out of the frying pan and into the fire.", LineFormat.LORE), -13, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java index a78b88736..9a39e59f5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java @@ -15,7 +15,7 @@ public class HatCoal extends HatGadget public HatCoal(GadgetManager manager) { super(manager, "Lump of Coal", - UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "When life gives you coal, make a wierd cube hat out it!", LineFormat.LORE), -3, new ItemStack(Material.COAL_BLOCK)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java index 502ff74cb..d48320d58 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java @@ -12,7 +12,7 @@ public class HatGrinch extends HatGadget public HatGrinch(GadgetManager manager) { super(manager, "The Grinch", - UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Grinchtastic", LineFormat.LORE), -3, "christmasgift"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java index 74005d330..16d6fdd2f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java @@ -12,7 +12,7 @@ public class HatPresent extends HatGadget public HatPresent(GadgetManager manager) { super(manager, "Present", - UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "WHAT IN THE PRESENT? Oh, it's just you...", LineFormat.LORE), -3, "christmasgift"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java index 067f603e5..fa572fed3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java @@ -12,7 +12,7 @@ public class HatSanta extends HatGadget public HatSanta(GadgetManager manager) { super(manager, "Santa", - UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Now you can work the Mall circuit!", LineFormat.LORE), -3, "Presents"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java index 1e6ab44a4..9d02dd720 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java @@ -12,7 +12,7 @@ public class HatSnowman extends HatGadget public HatSnowman(GadgetManager manager) { super(manager, "Snowmans Head", - UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Do you want to be a snowman?", LineFormat.LORE), -3, "snowman002"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java index 62b8b2b39..72af832fd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemBatGun.java @@ -40,7 +40,7 @@ public class ItemBatGun extends ItemGadget public ItemBatGun(GadgetManager manager) { super(manager, "Bat Blaster", - UtilText.splitLineToArray(C.cWhite + "Unleash waves of terrifying bats at people you don't like!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Unleash waves of terrifying bats at people you don't like!", LineFormat.LORE), -1, Material.IRON_BARDING, (byte)0, 5000, new Ammo("Bat Blaster", "50 Bats", Material.IRON_BARDING, (byte)0, new String[] { C.cWhite + "50 Bats for your Bat Blaster!" }, 500, 50)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index 098d136ff..157ed982b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -43,7 +43,7 @@ public class ItemCoal extends ItemGadget public ItemCoal(GadgetManager manager) { super(manager, "Coal", - UtilText.splitLineToArray(C.cWhite + "", LineFormat.LORE) + UtilText.splitLineToArray(C.cGray + "", LineFormat.LORE) , -1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] { C.cDGray + "Exclusive Coal!", diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java index febe7172e..c6a61b789 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBat.java @@ -45,11 +45,11 @@ public class MorphBat extends MorphGadget implements IThrown super(manager, "Bat Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Flap around and annoy people by screeching loudly into their ears!", + C.cGray + "Flap around and annoy people by screeching loudly into their ears!", C.blankLine, - "#" + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Screech", - "#" + C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", - "#" + C.cYellow + "Sneak" + C.cGray + " to use " + C.cGreen + "Poop", + "#" + C.cWhite + "Left-Click to use Screech", + "#" + C.cWhite + "Double Jump to use Flap", + "#" + C.cWhite + "Sneak to use Poop", }, LineFormat.LORE), 40000, Material.SKULL_ITEM, (byte)1); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java index 62fc9d54b..1ea72b7e4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlaze.java @@ -29,9 +29,9 @@ public class MorphBlaze extends MorphGadget super(manager, "Blaze Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Transform into a fiery Blaze, straight from the Nether!", + C.cGray + "Transform into a fiery Blaze, straight from the Nether!", C.blankLine, - "#" + C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Firefly", + "#" + C.cWhite + "Crouch to use Firefly", }, LineFormat.LORE), -11, Material.BLAZE_POWDER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java index 2a99353b3..dea95636a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBlock.java @@ -36,10 +36,10 @@ public class MorphBlock extends MorphGadget { super(manager, "Block Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "The blockiest block that ever blocked.", + C.cGray + "The blockiest block that ever blocked.", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Change Block", - "#" + C.cYellow + "Stay Still" + C.cGray + " to use " + C.cGreen + "Solidify", + "#" + C.cWhite + "Left Click to use Change Block", + "#" + C.cWhite + "Stay Still to use Solidify", }, LineFormat.LORE), 30000, Material.EMERALD_BLOCK, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java index 8958d958a..55f67dc0d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphBunny.java @@ -54,10 +54,10 @@ public class MorphBunny extends MorphGadget { super(manager, "Easter Bunny Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Happy Easter!", + C.cGray + "Happy Easter!", C.blankLine, - "#" + C.cYellow + "Charge Crouch" + C.cGray + " to use " + C.cGreen + "Super Jump", - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Hide Easter Egg", + "#" + C.cWhite + "Charge Crouch to use Super Jump", + "#" + C.cWhite + "Left Click to use Hide Easter Egg", C.blankLine, "#" + C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Hide Easter Egg uses 500 Coins" , }, LineFormat.LORE), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java index 5589776ba..5d989f5e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphChicken.java @@ -37,10 +37,10 @@ public class MorphChicken extends MorphGadget { super(manager, "Chicken Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Soar through the air like a fat Chicken!", + C.cGray + "Soar through the air like a fat Chicken!", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Egg Shot", - "#" + C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Flap", + "#" + C.cWhite + "Left Click to use Egg Shot", + "#" + C.cWhite + "Double Jump to use Flap", }, LineFormat.LORE), 20000, Material.FEATHER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java index 8c46bd98b..95ce07b35 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCow.java @@ -22,9 +22,9 @@ public class MorphCow extends MorphGadget { super(manager, "Cow Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "How now brown cow?", + C.cGray + "How now brown cow?", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Moo", + "#" + C.cWhite + "Left Click to use Moo", }, LineFormat.LORE), 6000, Material.LEATHER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java index cfe013647..ee5a33290 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphCreeper.java @@ -37,9 +37,9 @@ public class MorphCreeper extends MorphGadget { super(manager, "Creeper Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Become the creepiest of Creepers that ever creeped!", + C.cGray + "Become the creepiest of Creepers that ever creeped!", C.blankLine, - C.cYellow + "Crouch" + C.cGray + " to use " + C.cGreen + "Detonate", + C.cWhite + "Crouch to use Detonate", }, LineFormat.LORE), -11, Material.SKULL_ITEM, (byte)4); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java index a7c75fb33..b833b52bb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphEnderman.java @@ -33,9 +33,9 @@ public class MorphEnderman extends MorphGadget { super(manager, "Enderman Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Using morph is the ultimate diet! Guaranteed instant results!", + C.cGray + "Using this morph is the ultimate diet! Guaranteed instant results!", C.blankLine, - "#" + C.cYellow + "Double Jump" + C.cGray + " to use " + C.cGreen + "Blink", + "#" + C.cWhite + "Double Jump to use Blink", }, LineFormat.LORE), 30000, Material.ENDER_PEARL, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java index 90cb4478e..59ed09fa0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPig.java @@ -35,10 +35,10 @@ public class MorphPig extends MorphGadget { super(manager, "Pig Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Oink. Oink. Oink.... Oink?", + C.cGray + "Oink. Oink. Oink.... Oink?", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Oink", - "#" + C.cYellow + "Collide" + C.cGray + " to use " + C.cGreen + "Pig Bounce", + "#" + C.cWhite + "Left Click to use Oink", + "#" + C.cWhite + "Collide to use Pig Bounce", }, LineFormat.LORE), -10, Material.PORK, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java index cf0016bbb..ed425a5de 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphPumpkinKing.java @@ -21,7 +21,7 @@ public class MorphPumpkinKing extends MorphGadget { super(manager, "Pumpkin Kings Head", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Transforms the wearer into the dreaded Pumpkin King!", + C.cGray + "Transforms the wearer into the dreaded Pumpkin King!", }, LineFormat.LORE), -4, Material.PUMPKIN, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java index cd6b8b24e..7a8430173 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSlime.java @@ -29,11 +29,11 @@ public class MorphSlime extends MorphGadget { super(manager, "Big Larry Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Have you ever looked at Big Larry and thought, \'I really want to be that guy!\'? Well, today is your lucky day!", + C.cGray + "Have you ever looked at Big Larry and thought, \'I really want to be that guy!\'? Well, today is your lucky day!", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Bounce", + "#" + C.cWhite + "Left Click to use Bounce", C.blankLine, - "#" + C.cGreen + "+1 Size per 10 Mineplex Levels", + "#" + C.cWhite + "+1 Size per 10 Mineplex Levels", }, LineFormat.LORE), 80000, Material.SLIME_BALL, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java index bd06315e5..75e5ad743 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphSnowman.java @@ -44,12 +44,12 @@ public class MorphSnowman extends MorphGadget super(manager, "Olaf Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Do you wanna build a snowman?", - C.cWhite + "It doesn't have to be a snowman...", - C.cWhite + "Or... it kind of does...", + C.cGray + "Do you wanna build a snowman?", + C.cGray + "It doesn't have to be a snowman...", + C.cGray + "Or... it kind of does...", C.blankLine, - "#" + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Blizzard", - "#" + C.cYellow + "Sneak" + C.cGray + " to use " + C.cGreen + "Snow Slide", + "#" + C.cWhite + "Left-Click to use Blizzard", + "#" + C.cWhite + "Sneak to use Snow Slide", }, LineFormat.LORE), -3, Material.SNOW_BALL, (byte) 0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java index cedd467ee..13fe0ee14 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphTitan.java @@ -46,9 +46,9 @@ public class MorphTitan extends MorphGadget { super(manager, "Elder Guardian Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "From the depths of the sea, the Elder Guardian posseses powers more amazing than any seen before!", + C.cGray + "From the depths of the sea, the Elder Guardian posseses powers more amazing than any seen before!", C.blankLine, - "#" + C.cYellow + "Left-Click" + C.cGray + " to use " + C.cGreen + "Guardians Laser", + "#" + C.cWhite + "Left-Click to use Guardians Laser", }, LineFormat.LORE), -13, Material.PRISMARINE_CRYSTALS, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java index 61944df22..f327f0551 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphVillager.java @@ -44,9 +44,9 @@ public class MorphVillager extends MorphGadget implements IThrown { super(manager, "Villager Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "HURRRR! MURR HURRR!", + C.cGray + "HURRRR! MURR HURRR!", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Gem Throw", + "#" + C.cWhite + "Left Click to use Gem Throw", C.blankLine, "#" + C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Gem Throw uses 20 Gems" }, LineFormat.LORE), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java index 664b088f7..a2d68070f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/morph/MorphWither.java @@ -47,9 +47,9 @@ public class MorphWither extends MorphGadget { super(manager, "Wither Morph", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Legends have foretold the coming of a powerful Wither...", + C.cGray + "Legends have foretold the coming of a powerful Wither...", C.blankLine, - "#" + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Wither Skull", + "#" + C.cWhite + "Left Click to use Wither Skull", }, LineFormat.LORE), -12, Material.SKULL_ITEM, (byte)1); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java index 557bdfd95..95d5e746f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCandyCane.java @@ -29,7 +29,7 @@ public class ParticleCandyCane extends ParticleGadget public ParticleCandyCane(GadgetManager manager) { super(manager, "Crushed Candy Cane", - UtilText.splitLineToArray(C.cWhite + "There’s no such thing as too much Christmas Candy. Don’t listen to your dentist.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "There’s no such thing as too much Christmas Candy. Don’t listen to your dentist.", LineFormat.LORE), -3, Material.CHEST, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java index 03f93f17d..d81c1c6f3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java @@ -21,7 +21,7 @@ public class ParticleCoalFumes extends ParticleGadget public ParticleCoalFumes(GadgetManager manager) { super(manager, "Coal Fumes", - UtilText.splitLineToArray(C.cWhite + "Being on the Naughty List does have some perks... if you love coal, that is...", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Being on the Naughty List does have some perks... if you love coal, that is...", LineFormat.LORE), -1, Material.COAL, (byte) 0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java index a388a0d3d..230705505 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleEnchant.java @@ -22,7 +22,7 @@ public class ParticleEnchant extends ParticleGadget public ParticleEnchant(GadgetManager manager) { super(manager, "Enchanted", - UtilText.splitLineToArray(C.cWhite + "The wisdom of the universe suddenly find you extremely attractive, and wants to \'enchant\' you.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "The wisdom of the universe suddenly find you extremely attractive, and wants to \'enchant\' you.", LineFormat.LORE), -2, Material.BOOK, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java index 742355fe0..5bc8b9381 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFairy.java @@ -23,9 +23,9 @@ public class ParticleFairy extends ParticleGadget { super(manager, "Flame Fairy", new String[] { - C.cWhite + "HEY! LISTEN!", - C.cWhite + "HEY! LISTEN!", - C.cWhite + "HEY! LISTEN!", + C.cGray + "HEY! LISTEN!", + C.cGray + "HEY! LISTEN!", + C.cGray + "HEY! LISTEN!", }, -2, Material.BLAZE_POWDER, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java index 0de43a6da..99a79c36d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFireRings.java @@ -24,7 +24,7 @@ public class ParticleFireRings extends ParticleGadget public ParticleFireRings(GadgetManager manager) { super(manager, "Flame Rings", - UtilText.splitLineToArray(C.cWhite + "Forged from the blazing rods of 1000 Blazes by the infamous Nether King.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Forged from the blazing rods of 1000 Blazes by the infamous Nether King.", LineFormat.LORE), -2, Material.BLAZE_POWDER, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java index af9fd1155..44448a375 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFoot.java @@ -38,7 +38,7 @@ public class ParticleFoot extends ParticleGadget public ParticleFoot(GadgetManager manager) { super(manager, "Shadow Walk", - UtilText.splitLineToArray(C.cWhite + "In a world where footprints do not exist, leaving your shadow behind is the next best thing!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "In a world where footprints do not exist, leaving your shadow behind is the next best thing!", LineFormat.LORE), -2, Material.LEATHER_BOOTS, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index 3155b40af..faa25065f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -28,7 +28,7 @@ public class ParticleFrostLord extends ParticleGadget public ParticleFrostLord(GadgetManager manager) { super(manager, "Wind of the Frost Lord", - UtilText.splitLineToArray(C.cWhite + "He’s not passing wind okay? HE HAS A CONDITION!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "He’s not passing wind okay? HE HAS A CONDITION!", LineFormat.LORE), -3, Material.SNOW_BALL, (byte)0, "Frost Lord"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java index 1a524c676..a9bd2739d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleGreen.java @@ -24,7 +24,7 @@ public class ParticleGreen extends ParticleGadget public ParticleGreen(GadgetManager manager) { super(manager, "Green Ring", - UtilText.splitLineToArray(C.cWhite + "With these sparkles, you can sparkle while sparkle with CaptainSparklez!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "With these sparkles, you can sparkle while sparkle with CaptainSparklez!", LineFormat.LORE), -2, Material.EMERALD, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java index 64ddaf216..d07a2b01a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHeart.java @@ -34,7 +34,7 @@ public class ParticleHeart extends ParticleGadget { public ParticleHeart(GadgetManager manager) { super(manager, "I Heart You", - UtilText.splitLineToArray(C.cWhite + "Show off how much you love Mineplex and everyone on it!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Show off how much you love Mineplex and everyone on it!", LineFormat.LORE), -2, Material.APPLE, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java index 7ccaed9c4..a9336927b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleHelix.java @@ -24,7 +24,7 @@ public class ParticleHelix extends ParticleGadget public ParticleHelix(GadgetManager manager) { super(manager, "Blood Helix", - UtilText.splitLineToArray(C.cWhite + "Blood magic is very dangerous... but also very cool!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Blood magic is very dangerous... but also very cool!", LineFormat.LORE), -2, Material.REDSTONE, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java index 02ed4ac3b..733424255 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleKronos.java @@ -25,9 +25,9 @@ public class ParticleKronos extends ParticleGadget { super(manager, "Titanic Aura", new String[] { - C.cWhite + "A symbol of Titan power", - C.cWhite + "whos ancestry traces back to Kronos,", - C.cWhite + "Titan Lord of Time.", + C.cGray + "A symbol of Titan power", + C.cGray + "whos ancestry traces back to Kronos,", + C.cGray + "Titan Lord of Time.", " ", C.cRed + "???" //When purchasable: C.cRed + "Unlocked with Titan Rank" diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java index 329e15b6b..6d48bb67d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleLegend.java @@ -22,7 +22,7 @@ public class ParticleLegend extends ParticleGadget public ParticleLegend(GadgetManager manager) { super(manager, "Legendary Aura", - UtilText.splitLineToArray(C.cWhite + "This particle will be updated soon! Yay!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "This particle will be updated soon! Yay!", LineFormat.LORE), -1, Material.ENDER_PORTAL_FRAME, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java index 068cd7db7..0e0b43109 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleRain.java @@ -24,7 +24,7 @@ public class ParticleRain extends ParticleGadget public ParticleRain(GadgetManager manager) { super(manager, "Rain Cloud", - UtilText.splitLineToArray(C.cWhite + "Bring your sadness wherever you go, with your very own portable rain cloud!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Bring your sadness wherever you go, with your very own portable rain cloud!", LineFormat.LORE), -2, Material.INK_SACK, (byte)4); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index 49724dfbe..d8270ec62 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -27,7 +27,7 @@ public class ParticleTitan extends ParticleGadget public ParticleTitan(GadgetManager manager) { super(manager, "Flame of the Titans", - UtilText.splitLineToArray(C.cWhite + "These flames are said to be the spirit of a Titan.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "These flames are said to be the spirit of a Titan.", LineFormat.LORE), -1, Material.FIREBALL, (byte)0); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java index f5e7eef9b..e126889f4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java @@ -32,7 +32,7 @@ public class MountBabyReindeer extends HorseMount public MountBabyReindeer(MountManager manager) { super(manager, "Baby Rainder", - UtilText.splitLineToArray(C.cWhite + "One of Santas baby reindeers. He's still learning how to fly...", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "One of Santas baby reindeers. He's still learning how to fly...", LineFormat.LORE), Material.SNOW_BALL, (byte) 0, -3, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java index 144289439..3af133864 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountCart.java @@ -32,7 +32,7 @@ public class MountCart extends Mount> public MountCart(MountManager manager) { super(manager, "Minecart", Material.MINECART, (byte)0, - UtilText.splitLineToArray(C.cWhite + "Cruise around town in your shiny new Minecart RX Turbo!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Cruise around town in your shiny new Minecart RX Turbo!", LineFormat.LORE), 15000); KnownPackage = false; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java index 0bdddc6be..918585528 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountDragon.java @@ -27,7 +27,7 @@ public class MountDragon extends DragonMount public MountDragon(MountManager manager) { super(manager, "Ethereal Dragon", - UtilText.splitLineToArray(C.cWhite + "From the distant Ether Realm, this prized dragon is said to only obey true Heroes!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "From the distant Ether Realm, this prized dragon is said to only obey true Heroes!", LineFormat.LORE), Material.DRAGON_EGG, (byte)0, -11); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java index 6b978f050..5a8617699 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountFrost.java @@ -24,7 +24,7 @@ public class MountFrost extends HorseMount public MountFrost(MountManager manager) { super(manager, "Glacial Steed", - UtilText.splitLineToArray(C.cWhite + "Born in the North Pole, it leaves a trail of frost as it moves!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Born in the North Pole, it leaves a trail of frost as it moves!", LineFormat.LORE), Material.SNOW_BALL, (byte)0, 15000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java index d8536e772..cecedd632 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountMule.java @@ -17,7 +17,7 @@ public class MountMule extends HorseMount public MountMule(MountManager manager) { super(manager, "Mount Mule", - UtilText.splitLineToArray(C.cWhite + "Your very own trusty pack mule!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Your very own trusty pack mule!", LineFormat.LORE), Material.HAY_BLOCK, (byte)0, 3000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java index f3b84ce99..7cecd08b0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSheep.java @@ -29,7 +29,7 @@ public class MountSheep extends HorseMount public MountSheep(MountManager manager) { super(manager, "Techno Sheep", - UtilText.splitLineToArray(C.cWhite + "Baaaaa with all the colors of the rainbow!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Baaaaa with all the colors of the rainbow!", LineFormat.LORE), Material.WOOL, (byte)14, 3000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java index 37b418d1a..92e90a12b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSlime.java @@ -32,7 +32,7 @@ public class MountSlime extends Mount> public MountSlime(MountManager manager) { super(manager, "Slime Mount", Material.SLIME_BALL, (byte)0, - UtilText.splitLineToArray(C.cWhite + "Bounce around on your very own slime friend!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Bounce around on your very own slime friend!", LineFormat.LORE), 15000); KnownPackage = false; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java index c658c14e2..25884d4b2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountSpider.java @@ -46,10 +46,10 @@ public class MountSpider extends HorseMount super(manager, "Spider Mount", UtilText.splitLinesToArray(new String[] { - C.cWhite + "Why ride a horse when you can ride a cute and cuddly spider!", + C.cGray + "Why ride a horse when you can ride a cute and cuddly spider!", C.blankLine, - "#" + C.cYellow + "Look Up" + C.cGray + " to use " + C.cGreen + "Wall Climb", - "#" + C.cYellow + "Jump" + C.cGray + " to use " + C.cGreen + "Leap", + "#" + C.cWhite + "Look Up to use Wall Climb", + "#" + C.cWhite + "Jump to use Leap", }, LineFormat.LORE), Material.WEB, (byte) 0, -4, Color.BLACK, Style.NONE, Variant.HORSE, 2.0, Material.AIR); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java index 89927e4d1..5e9747e8d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -26,7 +26,7 @@ public class MountTitan extends Mount public MountTitan(MountManager manager) { super(manager, "Molten Snake", Material.MAGMA_CREAM, (byte)0, - UtilText.splitLineToArray(C.cWhite + "Deep under the earths surface, there exists a mythical species of Molten Snakes. This one will serve you eternally.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Deep under the earths surface, there exists a mythical species of Molten Snakes. This one will serve you eternally.", LineFormat.LORE), -13); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java index bd5bbd1af..fead4b102 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountUndead.java @@ -24,7 +24,7 @@ public class MountUndead extends HorseMount public MountUndead(MountManager manager) { super(manager, "Infernal Horror", - UtilText.splitLineToArray(C.cWhite + "The most ghastly horse in existance, from the pits of the Nether.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "The most ghastly horse in existance, from the pits of the Nether.", LineFormat.LORE), Material.BONE, (byte)0, 20000, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java index e734e1df8..949a50f23 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountZombie.java @@ -16,7 +16,7 @@ public class MountZombie extends HorseMount public MountZombie(MountManager manager) { super(manager, "Decrepit Warhorse", - UtilText.splitLineToArray(C.cWhite + "Once a fierce warhorse, this undead beast will send fear into the hearts of your enemies.", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Once a fierce warhorse, this undead beast will send fear into the hearts of your enemies.", LineFormat.LORE), Material.ROTTEN_FLESH, (byte)0, -4, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java index de3a66e5e..71048a36c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java @@ -39,8 +39,8 @@ public class PetFactory _pets.put(EntityType.WOLF, new Pet("Dog", EntityType.WOLF, 8000)); _pets.put(EntityType.OCELOT, new Pet("Cat", EntityType.OCELOT, 6000)); _pets.put(EntityType.MUSHROOM_COW, new Pet("Mooshroom", EntityType.MUSHROOM_COW, 5000)); - _pets.put(EntityType.WITHER, new Pet("Widder", EntityType.WITHER, -1)); - _pets.put(EntityType.SKELETON, new Pet("Guardian", EntityType.SKELETON, -1)); + _pets.put(EntityType.WITHER, new Pet("Widder", EntityType.WITHER, -12)); + _pets.put(EntityType.SKELETON, new Pet("Guardian", EntityType.SKELETON, -13)); } private void CreatePetExtras() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Elf.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Elf.java index 6a67a37ea..9f3e3c3ee 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Elf.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Elf.java @@ -8,7 +8,7 @@ public class Elf extends Pet { public Elf() { - super("Christmas Elf", EntityType.VILLAGER, -1); + super("Christmas Elf", EntityType.VILLAGER, -4); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Pumpkin.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Pumpkin.java index 71b561f2c..a2f3acc17 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Pumpkin.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/Pumpkin.java @@ -8,6 +8,6 @@ public class Pumpkin extends Pet { public Pumpkin() { - super("Pumpling", EntityType.ZOMBIE, -1); + super("Pumpling", EntityType.ZOMBIE, -5); } } From d8a5edf9e94e2a793354f830d98d21af80b41d98 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 19:24:19 +1100 Subject: [PATCH 161/223] fixed up gui items --- .../src/mineplex/core/cosmetic/ui/page/GadgetPage.java | 2 +- .../src/mineplex/core/cosmetic/ui/page/MountPage.java | 2 +- .../src/mineplex/core/cosmetic/ui/page/PetPage.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 0d265f3ea..595ab5a17 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -165,7 +165,7 @@ public class GadgetPage extends ShopPageBase if (gadget.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= gadget.GetCost(CurrencyType.Coins)) { itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Click to craft " + gadget.GetName()); + itemLore.add(C.cGreen + "Click to Purchase"); addButton(slot, new ShopItem(Material.INK_SACK, (byte) 8, gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new GadgetButton(gadget, this)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java index 77e87179c..fa7b1c76a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java @@ -136,7 +136,7 @@ public class MountPage extends ShopPageBase if (mount.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= mount.GetCost(CurrencyType.Coins)) { itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Click to craft " + mount.GetName()); + itemLore.add(C.cGreen + "Click to Purchase"); addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new MountButton(mount, this)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java index 7d40cab01..0d3ac5bf6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java @@ -153,7 +153,7 @@ public class PetPage extends ShopPageBase if (pet.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= pet.GetCost(CurrencyType.Coins)) { itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Click to craft " + pet.GetName()); + itemLore.add(C.cGreen + "Click to Purchase"); addButton(slot, new ShopItem(Material.INK_SACK, (byte) 8, pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new PetButton(pet, this)); } @@ -162,7 +162,7 @@ public class PetPage extends ShopPageBase itemLore.add(C.cBlack); itemLore.add(C.cRed + "Not enough Treasure Shards."); - setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, "Purchase " + pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, pet.GetPetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); } else { From a6f664006f2f1c379331d4714a9ad55865bd1964 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 20:01:54 +1100 Subject: [PATCH 162/223] set display in gui --- .../core/cosmetic/ui/page/GadgetPage.java | 100 ++++--- .../core/cosmetic/ui/page/MountPage.java | 245 +++++++++--------- .../core/cosmetic/ui/page/PetPage.java | 93 +++---- .../mineplex/core/gadget/GadgetManager.java | 4 + .../core/gadget/gadgets/hat/HatGrinch.java | 2 +- .../core/gadget/set/SetCandyCane.java | 38 +++ .../mineplex/core/gadget/set/SetTitan.java | 38 +++ .../mineplex/core/gadget/types/Gadget.java | 15 +- .../mineplex/core/gadget/types/GadgetSet.java | 5 + 9 files changed, 330 insertions(+), 210 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 595ab5a17..3746ce66d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -81,51 +81,67 @@ public class GadgetPage extends ShopPageBase itemLore.add(C.cBlack); itemLore.addAll(Arrays.asList(gadget.GetDescription())); - if (gadget.GetCost(CurrencyType.Coins) == -1) + if (!gadget.ownsGadget(getPlayer())) { - //Nothing + if (gadget.GetCost(CurrencyType.Coins) == -1) + { + //Nothing + } + //Chest Unlocks + else if (gadget.GetCost(CurrencyType.Coins) == -2 || gadget.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Treasure Chests"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -3) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -4) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -5) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); + } + //Rank Unlocks + else if (gadget.GetCost(CurrencyType.Coins) == -10) + { + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -11) + { + itemLore.add(C.cBlack); + itemLore.add(C.cPurple + "Unlocked with Hero Rank"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Unlocked with Legend Rank"); + } + else if (gadget.GetCost(CurrencyType.Coins) == -13) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Unlocked with Titan Rank"); + } } - //Chest Unlocks - else if (gadget.GetCost(CurrencyType.Coins) == -2) + else { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Treasure Chests"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -3) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -4) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -5) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); - } - //Rank Unlocks - else if (gadget.GetCost(CurrencyType.Coins) == -10) - { - itemLore.add(C.cBlack); - itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -11) - { - itemLore.add(C.cBlack); - itemLore.add(C.cPurple + "Unlocked with Hero Rank"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -12) - { - itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Unlocked with Legend Rank"); - } - else if (gadget.GetCost(CurrencyType.Coins) == -13) - { - itemLore.add(C.cBlack); - itemLore.add(C.cRed + "Unlocked with Titan Rank"); + if (gadget.getSet() != null) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGray + "Set Cosmetics;"); + + for (Gadget cur : gadget.getSet()) + { + itemLore.add(" "+ (cur.IsActive(getPlayer()) ? C.cGreen : C.cGray) + cur.GetName()); + } + } } if (gadget instanceof ItemGadget) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java index fa7b1c76a..356635962 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/MountPage.java @@ -24,134 +24,137 @@ import mineplex.core.shop.page.ShopPageBase; public class MountPage extends ShopPageBase { - public MountPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player) - { - super(plugin, shop, clientManager, donationManager, name, player, 54); - - buildPage(); - } - - protected void buildPage() - { - int slot = 19; - - for (Mount mount : getPlugin().getMountManager().getMounts()) - { - addMount(mount, slot); - slot++; - - if (slot == 26) - slot = 28; - } - - addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() + public MountPage(CosmeticManager plugin, CosmeticShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player) + { + super(plugin, shop, clientManager, donationManager, name, player, 54); + + buildPage(); + } + + protected void buildPage() + { + int slot = 19; + + for (Mount mount : getPlugin().getMountManager().getMounts()) + { + addMount(mount, slot); + slot++; + + if (slot == 26) + slot = 28; + } + + addButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]{}, 1, false), new IButton() { public void onClick(Player player, ClickType clickType) { getShop().openPageForPlayer(getPlayer(), new Menu(getPlugin(), getShop(), getClientManager(), getDonationManager(), player)); } }); - } - - protected void addMount(Mount mount, int slot) - { - List itemLore = new ArrayList(); - - itemLore.add(C.cBlack); - itemLore.addAll(Arrays.asList(mount.GetDescription())); - - if (mount.GetCost(CurrencyType.Coins) == -1) - { - //Nothing - } - //Chest Unlocks - else if (mount.GetCost(CurrencyType.Coins) == -2) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Treasure Chests"); - } - else if (mount.GetCost(CurrencyType.Coins) == -3) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); - } - else if (mount.GetCost(CurrencyType.Coins) == -4) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); - } - else if (mount.GetCost(CurrencyType.Coins) == -5) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); - } - //Rank Unlocks - else if (mount.GetCost(CurrencyType.Coins) == -10) - { - itemLore.add(C.cBlack); - itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); - } - else if (mount.GetCost(CurrencyType.Coins) == -11) - { - itemLore.add(C.cBlack); - itemLore.add(C.cPurple + "Unlocked with Hero Rank"); - } - else if (mount.GetCost(CurrencyType.Coins) == -12) - { - itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Unlocked with Legend Rank"); - } - else if (mount.GetCost(CurrencyType.Coins) == -13) - { - itemLore.add(C.cBlack); - itemLore.add(C.cRed + "Unlocked with Titan Rank"); - } - + } - if (getDonationManager().Get(getPlayer().getName()).OwnsUnknownPackage(mount.GetName())) - { - if (mount.GetActive().containsKey(getPlayer())) - { - itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Click to Disable"); - - addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivateMountButton(mount, this)); - } - else - { - itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Click to Enable"); - - addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateMountButton(mount, this)); - } - } - else - { - if (mount.GetCost(CurrencyType.Coins) > 0) + protected void addMount(Mount mount, int slot) + { + List itemLore = new ArrayList(); + + itemLore.add(C.cBlack); + itemLore.addAll(Arrays.asList(mount.GetDescription())); + + if (!getDonationManager().Get(getPlayer().getName()).OwnsUnknownPackage(mount.GetName())) + { + if (mount.GetCost(CurrencyType.Coins) == -1) { - itemLore.add(C.cBlack); - itemLore.add(C.cWhiteB + "Cost: " + C.cAqua + mount.GetCost(CurrencyType.Coins) + " Treasure Shards"); + //Nothing } - - if (mount.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= mount.GetCost(CurrencyType.Coins)) - { - itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Click to Purchase"); - - addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new MountButton(mount, this)); - } - else if (mount.GetCost(CurrencyType.Coins) > 0) - { - itemLore.add(C.cBlack); - itemLore.add(C.cRed + "Not enough Treasure Shards."); - - setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); - } - else - { - setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); - } - } - - } + //Chest Unlocks + else if (mount.GetCost(CurrencyType.Coins) == -2 || mount.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Treasure Chests"); + } + else if (mount.GetCost(CurrencyType.Coins) == -3) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); + } + else if (mount.GetCost(CurrencyType.Coins) == -4) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); + } + else if (mount.GetCost(CurrencyType.Coins) == -5) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); + } + //Rank Unlocks + else if (mount.GetCost(CurrencyType.Coins) == -10) + { + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); + } + else if (mount.GetCost(CurrencyType.Coins) == -11) + { + itemLore.add(C.cBlack); + itemLore.add(C.cPurple + "Unlocked with Hero Rank"); + } + else if (mount.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Unlocked with Legend Rank"); + } + else if (mount.GetCost(CurrencyType.Coins) == -13) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Unlocked with Titan Rank"); + } + } + + + if (getDonationManager().Get(getPlayer().getName()).OwnsUnknownPackage(mount.GetName())) + { + if (mount.GetActive().containsKey(getPlayer())) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Disable"); + + addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new DeactivateMountButton(mount, this)); + } + else + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Enable"); + + addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateMountButton(mount, this)); + } + } + else + { + if (mount.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhiteB + "Cost: " + C.cAqua + mount.GetCost(CurrencyType.Coins) + " Treasure Shards"); + } + + if (mount.GetCost(CurrencyType.Coins) > 0 && getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= mount.GetCost(CurrencyType.Coins)) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Purchase"); + + addButton(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new MountButton(mount, this)); + } + else if (mount.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Not enough Treasure Shards."); + + setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } + else + { + setItem(slot, new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), mount.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); + } + } + + } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java index 0d3ac5bf6..4e796c47e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetPage.java @@ -64,52 +64,57 @@ public class PetPage extends ShopPageBase itemLore.add(C.cBlack); itemLore.add(C.cGray + "Your very own " + pet.GetName() + "!"); - if (pet.GetCost(CurrencyType.Coins) == -1) - { - //Nothing - } //Chest Unlocks - else if (pet.GetCost(CurrencyType.Coins) == -2) + if (!getPlugin().getPetManager().Get(getPlayer()).GetPets().containsKey(pet.GetPetType())) { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Treasure Chests"); - } - else if (pet.GetCost(CurrencyType.Coins) == -3) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); - } - else if (pet.GetCost(CurrencyType.Coins) == -4) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); - } - else if (pet.GetCost(CurrencyType.Coins) == -5) - { - itemLore.add(C.cBlack); - itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); - } - //Rank Unlocks - else if (pet.GetCost(CurrencyType.Coins) == -10) - { - itemLore.add(C.cBlack); - itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); - } - else if (pet.GetCost(CurrencyType.Coins) == -11) - { - itemLore.add(C.cBlack); - itemLore.add(C.cPurple + "Unlocked with Hero Rank"); - } - else if (pet.GetCost(CurrencyType.Coins) == -12) - { - itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Unlocked with Legend Rank"); - } - else if (pet.GetCost(CurrencyType.Coins) == -13) - { - itemLore.add(C.cBlack); - itemLore.add(C.cRed + "Unlocked with Titan Rank"); - } + if (pet.GetCost(CurrencyType.Coins) == -1) + { + //Nothing + } + + else if (pet.GetCost(CurrencyType.Coins) == -2 || pet.GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Treasure Chests"); + } + else if (pet.GetCost(CurrencyType.Coins) == -3) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Winter Holiday Treasure"); + } + else if (pet.GetCost(CurrencyType.Coins) == -4) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Halloween Pumpkin Treasure"); + } + else if (pet.GetCost(CurrencyType.Coins) == -5) + { + itemLore.add(C.cBlack); + itemLore.add(C.cBlue + "Found in Easter Holiday Treasure"); + } + + //Rank Unlocks + else if (pet.GetCost(CurrencyType.Coins) == -10) + { + itemLore.add(C.cBlack); + itemLore.add(C.cAqua + "Unlocked with Ultra Rank"); + } + else if (pet.GetCost(CurrencyType.Coins) == -11) + { + itemLore.add(C.cBlack); + itemLore.add(C.cPurple + "Unlocked with Hero Rank"); + } + else if (pet.GetCost(CurrencyType.Coins) == -12) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Unlocked with Legend Rank"); + } + else if (pet.GetCost(CurrencyType.Coins) == -13) + { + itemLore.add(C.cBlack); + itemLore.add(C.cRed + "Unlocked with Titan Rank"); + } + } //Owned if (getPlugin().getPetManager().Get(getPlayer()).GetPets().containsKey(pet.GetPetType())) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 4f1852000..c817ad7c5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -90,7 +90,9 @@ import mineplex.core.gadget.gadgets.particle.ParticleHelix; import mineplex.core.gadget.gadgets.particle.ParticleLegend; import mineplex.core.gadget.gadgets.particle.ParticleRain; import mineplex.core.gadget.gadgets.particle.ParticleTitan; +import mineplex.core.gadget.set.SetCandyCane; import mineplex.core.gadget.set.SetFrostLord; +import mineplex.core.gadget.set.SetTitan; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetSet; import mineplex.core.gadget.types.GadgetType; @@ -154,6 +156,8 @@ public class GadgetManager extends MiniPlugin private void createSets() { addSet(new SetFrostLord(this)); + addSet(new SetCandyCane(this)); + addSet(new SetTitan(this)); } private void CreateGadgets() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java index d48320d58..aee21df5b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java @@ -12,7 +12,7 @@ public class HatGrinch extends HatGadget public HatGrinch(GadgetManager manager) { super(manager, "The Grinch", - UtilText.splitLineToArray(C.cGray + "Grinchtastic", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Great! Now where’s the Roast Beast?!", LineFormat.LORE), -3, "christmasgift"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java new file mode 100644 index 000000000..ef898899a --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java @@ -0,0 +1,38 @@ +package mineplex.core.gadget.set; + +import org.bukkit.entity.Player; + +import mineplex.core.common.util.F; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane; +import mineplex.core.gadget.gadgets.death.DeathCandyCane; +import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane; +import mineplex.core.gadget.gadgets.particle.ParticleCandyCane; +import mineplex.core.gadget.types.GadgetSet; + +public class SetCandyCane extends GadgetSet +{ + + public SetCandyCane(GadgetManager manager) + { + super(manager, + manager.getGadget(ArrowTrailCandyCane.class), + manager.getGadget(DeathCandyCane.class), + manager.getGadget(DoubleJumpCandyCane.class), + manager.getGadget(ParticleCandyCane.class)); + } + + @Override + public void customEnable(Player player) + { + player.sendMessage(F.main("GadgetSet", "Enabled full set of " + F.elem("Candy Cane"))); + } + + @Override + public void customDisable(Player player) + { + player.sendMessage(F.main("GadgetSet", "Disabled full set of " + F.elem("Candy Cane"))); + + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java new file mode 100644 index 000000000..f2d6b86df --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java @@ -0,0 +1,38 @@ +package mineplex.core.gadget.set; + +import org.bukkit.entity.Player; + +import mineplex.core.common.util.F; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailTitan; +import mineplex.core.gadget.gadgets.death.DeathTitan; +import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan; +import mineplex.core.gadget.gadgets.particle.ParticleTitan; +import mineplex.core.gadget.types.GadgetSet; + +public class SetTitan extends GadgetSet +{ + + public SetTitan(GadgetManager manager) + { + super(manager, + manager.getGadget(ArrowTrailTitan.class), + manager.getGadget(DeathTitan.class), + manager.getGadget(DoubleJumpTitan.class), + manager.getGadget(ParticleTitan.class)); + } + + @Override + public void customEnable(Player player) + { + player.sendMessage(F.main("GadgetSet", "Enabled full set of " + F.elem("Titan"))); + } + + @Override + public void customDisable(Player player) + { + player.sendMessage(F.main("GadgetSet", "Disabled full set of " + F.elem("Titan"))); + + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java index fae816a3f..e5b0667a1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java @@ -1,5 +1,6 @@ package mineplex.core.gadget.types; +import java.util.ArrayList; import java.util.HashSet; import mineplex.core.common.CurrencyType; @@ -26,6 +27,8 @@ public abstract class Gadget extends SalesPackageBase implements Listener protected HashSet _active = new HashSet(); + protected Gadget[] _set = null; + private String[] _alternativePackageNames; public Gadget(GadgetManager manager, GadgetType gadgetType, String name, String[] desc, int cost, Material mat, byte data) @@ -36,7 +39,7 @@ public abstract class Gadget extends SalesPackageBase implements Listener public Gadget(GadgetManager manager, GadgetType gadgetType, String name, String[] desc, int cost, Material mat, byte data, int quantity, String... alternativesalepackageNames) { super(name, mat, data, desc, cost, quantity); - + _gadgetType = gadgetType; KnownPackage = false; @@ -128,5 +131,13 @@ public abstract class Gadget extends SalesPackageBase implements Listener return false; } - + public void setSet(Gadget[] gadgets) + { + _set = gadgets; + } + + public Gadget[] getSet() + { + return _set; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java index 94e7dde71..381c33660 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java @@ -25,6 +25,11 @@ public abstract class GadgetSet implements Listener Manager = manager; _gadgets = gadgets; + for (Gadget gadget : gadgets) + { + gadget.setSet(gadgets); + } + Bukkit.getPluginManager().registerEvents(this, Manager.getPlugin()); } From 0cda29e135c9afcad3760f1195c22ff7a8466d87 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 20:08:36 +1100 Subject: [PATCH 163/223] improved cosmetic set implementation --- .../mineplex/core/cosmetic/ui/page/GadgetPage.java | 6 +++--- .../src/mineplex/core/gadget/set/SetCandyCane.java | 2 +- .../src/mineplex/core/gadget/set/SetFrostLord.java | 2 +- .../src/mineplex/core/gadget/set/SetTitan.java | 2 +- .../src/mineplex/core/gadget/types/Gadget.java | 8 ++++---- .../src/mineplex/core/gadget/types/GadgetSet.java | 13 +++++++++---- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 3746ce66d..76a6b8e52 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -135,11 +135,11 @@ public class GadgetPage extends ShopPageBase if (gadget.getSet() != null) { itemLore.add(C.cBlack); - itemLore.add(C.cGray + "Set Cosmetics;"); + itemLore.add(C.cGray + gadget.getSet().getName() + " Set Cosmetics;"); - for (Gadget cur : gadget.getSet()) + for (Gadget cur : gadget.getSet().getGadgets()) { - itemLore.add(" "+ (cur.IsActive(getPlayer()) ? C.cGreen : C.cGray) + cur.GetName()); + itemLore.add(" ●"+ (cur.IsActive(getPlayer()) ? C.cGreen : C.cGray) + cur.GetName()); } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java index ef898899a..377340a76 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java @@ -15,7 +15,7 @@ public class SetCandyCane extends GadgetSet public SetCandyCane(GadgetManager manager) { - super(manager, + super(manager, "Candy Cane", manager.getGadget(ArrowTrailCandyCane.class), manager.getGadget(DeathCandyCane.class), manager.getGadget(DoubleJumpCandyCane.class), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java index ce34dfc65..03882bcb4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java @@ -15,7 +15,7 @@ public class SetFrostLord extends GadgetSet public SetFrostLord(GadgetManager manager) { - super(manager, + super(manager, "Frost Lord", manager.getGadget(ArrowTrailFrostLord.class), manager.getGadget(DeathFrostLord.class), manager.getGadget(DoubleJumpFrostLord.class), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java index f2d6b86df..3005b348f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java @@ -15,7 +15,7 @@ public class SetTitan extends GadgetSet public SetTitan(GadgetManager manager) { - super(manager, + super(manager, "The Titans", manager.getGadget(ArrowTrailTitan.class), manager.getGadget(DeathTitan.class), manager.getGadget(DoubleJumpTitan.class), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java index e5b0667a1..6998e2a51 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java @@ -27,7 +27,7 @@ public abstract class Gadget extends SalesPackageBase implements Listener protected HashSet _active = new HashSet(); - protected Gadget[] _set = null; + protected GadgetSet _set = null; private String[] _alternativePackageNames; @@ -131,12 +131,12 @@ public abstract class Gadget extends SalesPackageBase implements Listener return false; } - public void setSet(Gadget[] gadgets) + public void setSet(GadgetSet set) { - _set = gadgets; + _set = set; } - public Gadget[] getSet() + public GadgetSet getSet() { return _set; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java index 381c33660..84632846e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java @@ -13,6 +13,7 @@ import mineplex.core.gadget.event.GadgetDisableEvent; public abstract class GadgetSet implements Listener { + private String _name; private Gadget[] _gadgets; @@ -20,15 +21,14 @@ public abstract class GadgetSet implements Listener HashSet _active = new HashSet<>(); - public GadgetSet(GadgetManager manager, Gadget... gadgets) + public GadgetSet(GadgetManager manager, String name, Gadget... gadgets) { Manager = manager; _gadgets = gadgets; + _name = name; for (Gadget gadget : gadgets) - { - gadget.setSet(gadgets); - } + gadget.setSet(this); Bukkit.getPluginManager().registerEvents(this, Manager.getPlugin()); } @@ -92,6 +92,11 @@ public abstract class GadgetSet implements Listener } return false; } + + public String getName() { + // TODO Auto-generated method stub + return null; + } From f717a5f8ccaba9f55dc5f6138c18dce36b1f4e91 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 20:30:41 +1100 Subject: [PATCH 164/223] more set stuff --- .../core/cosmetic/ui/page/GadgetPage.java | 32 +++++++++-------- .../gadgets/particle/ParticleFrostLord.java | 4 +-- .../gadgets/particle/ParticleTitan.java | 4 +++ .../core/gadget/set/SetCandyCane.java | 16 +-------- .../core/gadget/set/SetFrostLord.java | 16 +-------- .../mineplex/core/gadget/set/SetTitan.java | 16 +-------- .../mineplex/core/gadget/types/GadgetSet.java | 36 ++++++++++++++----- 7 files changed, 54 insertions(+), 70 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 76a6b8e52..6e0e39eb6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -81,6 +81,23 @@ public class GadgetPage extends ShopPageBase itemLore.add(C.cBlack); itemLore.addAll(Arrays.asList(gadget.GetDescription())); + if (gadget.getSet() != null) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGray + gadget.getSet().getName() + " Set;"); + + //Elements + for (Gadget cur : gadget.getSet().getGadgets()) + itemLore.add(" "+ (cur.ownsGadget(getPlayer()) ? C.cDGreen + '▪' : C.cDRed + '▪' ) + (cur.IsActive(getPlayer()) ? C.cGreen : C.cGray) + cur.GetName()); + + itemLore.add(C.cBlack); + + //Bonus + itemLore.add(C.cGray + gadget.getSet().getName() + " Set Bonus;"); + for (String bonus : gadget.getSet().getBonus()) + itemLore.add(" " + (gadget.getSet().isActive(getPlayer()) ? C.cGreen : C.cGray) + bonus); + } + if (!gadget.ownsGadget(getPlayer())) { if (gadget.GetCost(CurrencyType.Coins) == -1) @@ -130,20 +147,7 @@ public class GadgetPage extends ShopPageBase itemLore.add(C.cRed + "Unlocked with Titan Rank"); } } - else - { - if (gadget.getSet() != null) - { - itemLore.add(C.cBlack); - itemLore.add(C.cGray + gadget.getSet().getName() + " Set Cosmetics;"); - - for (Gadget cur : gadget.getSet().getGadgets()) - { - itemLore.add(" ●"+ (cur.IsActive(getPlayer()) ? C.cGreen : C.cGray) + cur.GetName()); - } - } - } - + if (gadget instanceof ItemGadget) { itemLore.add(C.cBlack); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java index faa25065f..035615c59 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleFrostLord.java @@ -57,8 +57,8 @@ public class ParticleFrostLord extends ParticleGadget int amount = 4; - GadgetSet set = Manager.getGadgetSet(SetFrostLord.class); - if(set.isActive(player)) amount = 6; + if(getSet() != null && getSet().isActive(player)) + amount = 6; double ang = Math.PI*2/amount; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java index d8270ec62..b751709ac 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleTitan.java @@ -48,6 +48,10 @@ public class ParticleTitan extends ParticleGadget continue; double total = 3; + + if(getSet() != null && getSet().isActive(player)) + total = 4; + double step = (1/total)*Math.PI*2; double offset1 = (step/20)*_tick%20; double offset2 = (step/31)*_tick%31; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java index 377340a76..8a1acaf71 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetCandyCane.java @@ -15,24 +15,10 @@ public class SetCandyCane extends GadgetSet public SetCandyCane(GadgetManager manager) { - super(manager, "Candy Cane", + super(manager, "Candy Cane", "Coming Soon...", manager.getGadget(ArrowTrailCandyCane.class), manager.getGadget(DeathCandyCane.class), manager.getGadget(DoubleJumpCandyCane.class), manager.getGadget(ParticleCandyCane.class)); } - - @Override - public void customEnable(Player player) - { - player.sendMessage(F.main("GadgetSet", "Enabled full set of " + F.elem("Candy Cane"))); - } - - @Override - public void customDisable(Player player) - { - player.sendMessage(F.main("GadgetSet", "Disabled full set of " + F.elem("Candy Cane"))); - - } - } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java index 03882bcb4..fec0b8950 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetFrostLord.java @@ -15,24 +15,10 @@ public class SetFrostLord extends GadgetSet public SetFrostLord(GadgetManager manager) { - super(manager, "Frost Lord", + super(manager, "Frost Lord", "Improved Wind of the Frost Lord", manager.getGadget(ArrowTrailFrostLord.class), manager.getGadget(DeathFrostLord.class), manager.getGadget(DoubleJumpFrostLord.class), manager.getGadget(ParticleFrostLord.class)); } - - @Override - public void customEnable(Player player) - { - player.sendMessage(F.main("GadgetSet", "Enabled full set of " + F.elem("Frost Lord"))); - } - - @Override - public void customDisable(Player player) - { - player.sendMessage(F.main("GadgetSet", "Disabled full set of " + F.elem("Frost Lord"))); - - } - } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java index 3005b348f..bc18e252a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java @@ -15,24 +15,10 @@ public class SetTitan extends GadgetSet public SetTitan(GadgetManager manager) { - super(manager, "The Titans", + super(manager, "The Titans", "Improved Flame of the Frost Lord", manager.getGadget(ArrowTrailTitan.class), manager.getGadget(DeathTitan.class), manager.getGadget(DoubleJumpTitan.class), manager.getGadget(ParticleTitan.class)); } - - @Override - public void customEnable(Player player) - { - player.sendMessage(F.main("GadgetSet", "Enabled full set of " + F.elem("Titan"))); - } - - @Override - public void customDisable(Player player) - { - player.sendMessage(F.main("GadgetSet", "Disabled full set of " + F.elem("Titan"))); - - } - } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java index 84632846e..a2f6df54e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java @@ -7,6 +7,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetEnableEvent; import mineplex.core.gadget.event.GadgetDisableEvent; @@ -14,6 +18,7 @@ import mineplex.core.gadget.event.GadgetDisableEvent; public abstract class GadgetSet implements Listener { private String _name; + private String[] _bonus; private Gadget[] _gadgets; @@ -21,11 +26,13 @@ public abstract class GadgetSet implements Listener HashSet _active = new HashSet<>(); - public GadgetSet(GadgetManager manager, String name, Gadget... gadgets) + public GadgetSet(GadgetManager manager, String name, String bonus, Gadget... gadgets) { Manager = manager; _gadgets = gadgets; + _name = name; + _bonus = UtilText.splitLineToArray(bonus, LineFormat.LORE); for (Gadget gadget : gadgets) gadget.setSet(this); @@ -44,7 +51,8 @@ public abstract class GadgetSet implements Listener if(enable && g.equals(gadget)) continue; _active.remove(player); - if(wasActive) customDisable(player); + if(wasActive) + customDisable(player); return; } } @@ -72,10 +80,16 @@ public abstract class GadgetSet implements Listener return _active.contains(player); } - public abstract void customEnable(Player player); - - - public abstract void customDisable(Player player); + public void customEnable(Player player) + { + player.sendMessage(F.main("Gadget", "Set Enabled: " + F.elem(C.cGreen + getName()))); + } + + public void customDisable(Player player) + { + player.sendMessage(F.main("Gadget", "Set Disabled: " + F.elem(C.cRed + getName()))); + + } public Gadget[] getGadgets() { @@ -93,11 +107,15 @@ public abstract class GadgetSet implements Listener return false; } - public String getName() { - // TODO Auto-generated method stub - return null; + public String getName() + { + return _name; } + public String[] getBonus() + { + return _bonus; + } } From 7fc08f34a7c3909cdf1272dffbe7bd9fd4665c41 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 20:34:01 +1100 Subject: [PATCH 165/223] fixed typo --- .../Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java index bc18e252a..f2012131b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetTitan.java @@ -15,7 +15,7 @@ public class SetTitan extends GadgetSet public SetTitan(GadgetManager manager) { - super(manager, "The Titans", "Improved Flame of the Frost Lord", + super(manager, "The Titans", "Improved Flame of the Titans", manager.getGadget(ArrowTrailTitan.class), manager.getGadget(DeathTitan.class), manager.getGadget(DoubleJumpTitan.class), From d7f39bdfd8919b8456d64fd88c4992e9a730c6bd Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 20:59:55 +1100 Subject: [PATCH 166/223] costume sets --- .../core/cosmetic/ui/page/CostumePage.java | 20 ++-- .../mineplex/core/gadget/GadgetManager.java | 91 +++++-------------- .../gadget/gadgets/item/ItemDuelingSword.java | 2 +- .../gadget/gadgets/item/ItemPaintbrush.java | 2 +- .../gadgets/outfit/OutfitRaveSuitBoots.java | 15 +++ .../outfit/OutfitRaveSuitChestplate.java | 15 +++ .../gadgets/outfit/OutfitRaveSuitHelmet.java | 15 +++ .../outfit/OutfitRaveSuitLeggings.java | 15 +++ .../gadgets/outfit/OutfitSpaceSuitBoots.java | 15 +++ .../outfit/OutfitSpaceSuitChestplate.java | 15 +++ .../gadgets/outfit/OutfitSpaceSuitHelmet.java | 15 +++ .../outfit/OutfitSpaceSuitLeggings.java | 15 +++ .../gadget/gadgets/outfit/OutfitTeam.java | 2 +- .../mineplex/core/gadget/set/SetRaveSuit.java | 17 ++++ .../core/gadget/set/SetSpaceSuit.java | 17 ++++ .../core/gadget/types/ArrowEffectGadget.java | 2 +- .../core/gadget/types/DeathEffectGadget.java | 2 +- .../gadget/types/DoubleJumpEffectGadget.java | 2 +- .../mineplex/core/gadget/types/GadgetSet.java | 5 +- .../mineplex/core/gadget/types/HatGadget.java | 2 +- .../core/gadget/types/ItemGadget.java | 2 +- .../core/gadget/types/MorphGadget.java | 2 +- .../core/gadget/types/OutfitGadget.java | 2 +- .../core/gadget/types/ParticleGadget.java | 2 +- .../hub/commands/DisguiseCommand.java | 2 +- .../game/arcade/command/DisguiseCommand.java | 2 +- 26 files changed, 206 insertions(+), 90 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitBoots.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitChestplate.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitHelmet.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitLeggings.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java index 8e32e2707..bed2836d0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java @@ -1,6 +1,7 @@ package mineplex.core.cosmetic.ui.page; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import org.bukkit.Bukkit; @@ -10,10 +11,13 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import mineplex.core.account.CoreClientManager; +import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; import mineplex.core.cosmetic.CosmeticManager; import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.gadgets.outfit.OutfitRaveSuit; +import mineplex.core.gadget.gadgets.outfit.OutfitSpaceSuit; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.ItemGadget; @@ -37,19 +41,19 @@ public class CostumePage extends GadgetPage { int slot; - List costumeClasses = new ArrayList(); - for (Gadget gadget : getPlugin().getGadgetManager().getGadgets(GadgetType.Costume)) { + if (gadget.GetCost(CurrencyType.Coins) == -1) + continue; + OutfitGadget outfitGadget = ((OutfitGadget) gadget); - Class clazz = gadget.getClass(); - if (!costumeClasses.contains(clazz)) - { - costumeClasses.add(clazz); - } + int offset = 0; + + if (gadget instanceof OutfitRaveSuit) offset = 0; + else if (gadget instanceof OutfitSpaceSuit) offset = 1; - slot = (costumeClasses.indexOf(clazz) * 2) + 3 + 18; + slot = offset + 1 + 18; //1 buffer to left, 18 = 2 lines down if (outfitGadget.GetSlot() == OutfitGadget.ArmorSlot.Chest) slot += 9; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index c817ad7c5..8439e08cb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -32,66 +32,18 @@ import mineplex.core.disguise.DisguiseManager; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.event.GadgetCollideEntityEvent; import mineplex.core.gadget.event.GadgetEnableEvent; -import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane; -import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord; -import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailTitan; -import mineplex.core.gadget.gadgets.death.DeathCandyCane; -import mineplex.core.gadget.gadgets.death.DeathFrostLord; -import mineplex.core.gadget.gadgets.death.DeathTitan; -import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane; -import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord; -import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan; -import mineplex.core.gadget.gadgets.hat.HatCoal; -import mineplex.core.gadget.gadgets.hat.HatPresent; -import mineplex.core.gadget.gadgets.hat.HatSanta; -import mineplex.core.gadget.gadgets.hat.HatSnowman; -import mineplex.core.gadget.gadgets.item.ItemBatGun; -import mineplex.core.gadget.gadgets.item.ItemCoal; -import mineplex.core.gadget.gadgets.item.ItemCoinBomb; -import mineplex.core.gadget.gadgets.item.ItemDuelingSword; -import mineplex.core.gadget.gadgets.item.ItemEtherealPearl; -import mineplex.core.gadget.gadgets.item.ItemFirework; -import mineplex.core.gadget.gadgets.item.ItemFleshHook; -import mineplex.core.gadget.gadgets.item.ItemFreezeCannon; -import mineplex.core.gadget.gadgets.item.ItemMelonLauncher; -import mineplex.core.gadget.gadgets.item.ItemPaintballGun; -import mineplex.core.gadget.gadgets.item.ItemPaintbrush; -import mineplex.core.gadget.gadgets.item.ItemPartyPopper; -import mineplex.core.gadget.gadgets.item.ItemSnowball; -import mineplex.core.gadget.gadgets.item.ItemTNT; -import mineplex.core.gadget.gadgets.morph.MorphBat; -import mineplex.core.gadget.gadgets.morph.MorphBlaze; -import mineplex.core.gadget.gadgets.morph.MorphBlock; -import mineplex.core.gadget.gadgets.morph.MorphBunny; -import mineplex.core.gadget.gadgets.morph.MorphChicken; -import mineplex.core.gadget.gadgets.morph.MorphCow; -import mineplex.core.gadget.gadgets.morph.MorphCreeper; -import mineplex.core.gadget.gadgets.morph.MorphEnderman; -import mineplex.core.gadget.gadgets.morph.MorphPig; -import mineplex.core.gadget.gadgets.morph.MorphPumpkinKing; -import mineplex.core.gadget.gadgets.morph.MorphSlime; -import mineplex.core.gadget.gadgets.morph.MorphSnowman; -import mineplex.core.gadget.gadgets.morph.MorphTitan; -import mineplex.core.gadget.gadgets.morph.MorphVillager; -import mineplex.core.gadget.gadgets.morph.MorphWither; -import mineplex.core.gadget.gadgets.outfit.OutfitRaveSuit; -import mineplex.core.gadget.gadgets.outfit.OutfitSpaceSuit; -import mineplex.core.gadget.gadgets.outfit.OutfitTeam; -import mineplex.core.gadget.gadgets.particle.ParticleCandyCane; -import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes; -import mineplex.core.gadget.gadgets.particle.ParticleEnchant; -import mineplex.core.gadget.gadgets.particle.ParticleFairy; -import mineplex.core.gadget.gadgets.particle.ParticleFireRings; -import mineplex.core.gadget.gadgets.particle.ParticleFoot; -import mineplex.core.gadget.gadgets.particle.ParticleFrostLord; -import mineplex.core.gadget.gadgets.particle.ParticleGreen; -import mineplex.core.gadget.gadgets.particle.ParticleHeart; -import mineplex.core.gadget.gadgets.particle.ParticleHelix; -import mineplex.core.gadget.gadgets.particle.ParticleLegend; -import mineplex.core.gadget.gadgets.particle.ParticleRain; -import mineplex.core.gadget.gadgets.particle.ParticleTitan; +import mineplex.core.gadget.gadgets.arrowtrail.*; +import mineplex.core.gadget.gadgets.death.*; +import mineplex.core.gadget.gadgets.doublejump.*; +import mineplex.core.gadget.gadgets.hat.*; +import mineplex.core.gadget.gadgets.item.*; +import mineplex.core.gadget.gadgets.morph.*; +import mineplex.core.gadget.gadgets.outfit.*; +import mineplex.core.gadget.gadgets.particle.*; import mineplex.core.gadget.set.SetCandyCane; import mineplex.core.gadget.set.SetFrostLord; +import mineplex.core.gadget.set.SetRaveSuit; +import mineplex.core.gadget.set.SetSpaceSuit; import mineplex.core.gadget.set.SetTitan; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetSet; @@ -155,9 +107,14 @@ public class GadgetManager extends MiniPlugin private void createSets() { + //Particles addSet(new SetFrostLord(this)); addSet(new SetCandyCane(this)); addSet(new SetTitan(this)); + + //Costumes + addSet(new SetRaveSuit(this)); + addSet(new SetSpaceSuit(this)); } private void CreateGadgets() @@ -181,15 +138,15 @@ public class GadgetManager extends MiniPlugin addGadget(new ItemSnowball(this)); // Costume - addGadget(new OutfitRaveSuit(this, "Rave Hat", -2, ArmorSlot.Helmet, Material.LEATHER_HELMET, (byte)0)); - addGadget(new OutfitRaveSuit(this, "Rave Shirt", -2, ArmorSlot.Chest, Material.LEATHER_CHESTPLATE, (byte)0)); - addGadget(new OutfitRaveSuit(this, "Rave Pants", -2, ArmorSlot.Legs, Material.LEATHER_LEGGINGS, (byte)0)); - addGadget(new OutfitRaveSuit(this, "Rave Boots", -2, ArmorSlot.Boots, Material.LEATHER_BOOTS, (byte)0)); + addGadget(new OutfitRaveSuitHelmet(this)); + addGadget(new OutfitRaveSuitChestplate(this)); + addGadget(new OutfitRaveSuitLeggings(this)); + addGadget(new OutfitRaveSuitBoots(this)); - addGadget(new OutfitSpaceSuit(this, "Space Helmet", -2, ArmorSlot.Helmet, Material.GLASS, (byte)0)); - addGadget(new OutfitSpaceSuit(this, "Space Jacket", -2, ArmorSlot.Chest, Material.GOLD_CHESTPLATE, (byte)0)); - addGadget(new OutfitSpaceSuit(this, "Space Pants", -2, ArmorSlot.Legs, Material.GOLD_LEGGINGS, (byte)0)); - addGadget(new OutfitSpaceSuit(this, "Space Boots", -2, ArmorSlot.Boots, Material.GOLD_BOOTS, (byte)0)); + addGadget(new OutfitSpaceSuitHelmet(this)); + addGadget(new OutfitSpaceSuitChestplate(this)); + addGadget(new OutfitSpaceSuitLeggings(this)); + addGadget(new OutfitSpaceSuitBoots(this)); addGadget(new OutfitTeam(this, "Team Helmet", -1, ArmorSlot.Helmet, Material.LEATHER_HELMET, (byte)0)); addGadget(new OutfitTeam(this, "Team Shirt", -1, ArmorSlot.Chest, Material.LEATHER_CHESTPLATE, (byte)0)); @@ -351,7 +308,7 @@ public class GadgetManager extends MiniPlugin } } - public void removeGadetType(Player player, GadgetType type) + public void removeGadgetType(Player player, GadgetType type) { List gadgets = _gadgets.get(type); if(gadgets == null) return; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java index 99a7d217f..c8ced1f05 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemDuelingSword.java @@ -28,7 +28,7 @@ public class ItemDuelingSword extends ItemGadget @Override public void ApplyItem(Player player, boolean inform) { - Manager.removeGadetType(player, GadgetType.Item); + Manager.removeGadgetType(player, GadgetType.Item); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java index 9fa4d783b..2815a9b5e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java @@ -55,7 +55,7 @@ public class ItemPaintbrush extends ItemGadget @Override public void ApplyItem(Player player, boolean inform) { - Manager.removeGadetType(player, GadgetType.Item); + Manager.removeGadgetType(player, GadgetType.Item); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitBoots.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitBoots.java new file mode 100644 index 000000000..b74eda769 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitBoots.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitRaveSuitBoots extends OutfitRaveSuit +{ + + public OutfitRaveSuitBoots(GadgetManager manager) + { + super(manager, "Rave Boots", -2, ArmorSlot.Boots, Material.LEATHER_BOOTS, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitChestplate.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitChestplate.java new file mode 100644 index 000000000..df3b5577e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitChestplate.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitRaveSuitChestplate extends OutfitRaveSuit +{ + + public OutfitRaveSuitChestplate(GadgetManager manager) + { + super(manager, "Rave Shirt", -2, ArmorSlot.Chest, Material.LEATHER_CHESTPLATE, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitHelmet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitHelmet.java new file mode 100644 index 000000000..122ea157d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitHelmet.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitRaveSuitHelmet extends OutfitRaveSuit +{ + + public OutfitRaveSuitHelmet(GadgetManager manager) + { + super(manager, "Rave Hat", -2, ArmorSlot.Helmet, Material.LEATHER_HELMET, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitLeggings.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitLeggings.java new file mode 100644 index 000000000..b4b14df9d --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuitLeggings.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitRaveSuitLeggings extends OutfitRaveSuit +{ + + public OutfitRaveSuitLeggings(GadgetManager manager) + { + super(manager, "Rave Pants", -2, ArmorSlot.Legs, Material.LEATHER_LEGGINGS, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java new file mode 100644 index 000000000..58a02b36b --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitSpaceSuitBoots extends OutfitRaveSuit +{ + + public OutfitSpaceSuitBoots(GadgetManager manager) + { + super(manager, "Space Boots", -2, ArmorSlot.Boots, Material.GOLD_BOOTS, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java new file mode 100644 index 000000000..5a6d3f807 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitSpaceSuitChestplate extends OutfitRaveSuit +{ + + public OutfitSpaceSuitChestplate(GadgetManager manager) + { + super(manager, "Space Jacket", -2, ArmorSlot.Chest, Material.GOLD_CHESTPLATE, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java new file mode 100644 index 000000000..09fb5ddbb --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitSpaceSuitHelmet extends OutfitRaveSuit +{ + + public OutfitSpaceSuitHelmet(GadgetManager manager) + { + super(manager, "Space Helmet", -2, ArmorSlot.Helmet, Material.GLASS, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java new file mode 100644 index 000000000..650aea844 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java @@ -0,0 +1,15 @@ +package mineplex.core.gadget.gadgets.outfit; + +import mineplex.core.gadget.GadgetManager; + +import org.bukkit.Material; + +public class OutfitSpaceSuitLeggings extends OutfitRaveSuit +{ + + public OutfitSpaceSuitLeggings(GadgetManager manager) + { + super(manager, "Space Pants", -2, ArmorSlot.Legs, Material.GOLD_LEGGINGS, (byte)0); + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java index 6b598c419..8abec4a35 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitTeam.java @@ -56,7 +56,7 @@ public class OutfitTeam extends OutfitGadget @Override public void ApplyArmor(Player player) { - Manager.removeGadetType(player, GadgetType.Morph); + Manager.removeGadgetType(player, GadgetType.Morph); Manager.RemoveOutfit(player, _slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java new file mode 100644 index 000000000..8dd0f874c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java @@ -0,0 +1,17 @@ +package mineplex.core.gadget.set; + +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.outfit.*; +import mineplex.core.gadget.types.GadgetSet; + +public class SetRaveSuit extends GadgetSet +{ + public SetRaveSuit(GadgetManager manager) + { + super(manager, "Rave Suit", "Coming Soon...", + manager.getGadget(OutfitRaveSuitHelmet.class), + manager.getGadget(OutfitRaveSuitChestplate.class), + manager.getGadget(OutfitRaveSuitLeggings.class), + manager.getGadget(OutfitRaveSuitBoots.class)); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java new file mode 100644 index 000000000..27f7390e7 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java @@ -0,0 +1,17 @@ +package mineplex.core.gadget.set; + +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.outfit.*; +import mineplex.core.gadget.types.GadgetSet; + +public class SetSpaceSuit extends GadgetSet +{ + public SetSpaceSuit(GadgetManager manager) + { + super(manager, "Space Suit", "Coming Soon...", + manager.getGadget(OutfitSpaceSuitHelmet.class), + manager.getGadget(OutfitSpaceSuitChestplate.class), + manager.getGadget(OutfitSpaceSuitLeggings.class), + manager.getGadget(OutfitSpaceSuitBoots.class)); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java index 3513506a9..a32e05163 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ArrowEffectGadget.java @@ -28,7 +28,7 @@ public abstract class ArrowEffectGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.removeGadetType(player, GadgetType.ArrowTrail); + Manager.removeGadgetType(player, GadgetType.ArrowTrail); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java index 4e04cb807..5e337586c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DeathEffectGadget.java @@ -17,7 +17,7 @@ public abstract class DeathEffectGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.removeGadetType(player, GadgetType.Death); + Manager.removeGadgetType(player, GadgetType.Death); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java index 59575b97f..f59c0ed50 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/DoubleJumpEffectGadget.java @@ -19,7 +19,7 @@ public abstract class DoubleJumpEffectGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.removeGadetType(player, GadgetType.DoubleJump); + Manager.removeGadgetType(player, GadgetType.DoubleJump); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java index a2f6df54e..234bbc2dd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GadgetSet.java @@ -5,6 +5,7 @@ import java.util.HashSet; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import mineplex.core.common.util.C; @@ -63,13 +64,13 @@ public abstract class GadgetSet implements Listener } } - @EventHandler + @EventHandler(priority = EventPriority.MONITOR) public void onActivate(GadgetEnableEvent event) { checkPlayer(event.getPlayer(), event.getGadget(), true); } - @EventHandler + @EventHandler(priority = EventPriority.MONITOR) public void onDeativate(GadgetDisableEvent event) { checkPlayer(event.getPlayer(), event.getGadget(), false); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java index e7ad0ea37..91d5c2da7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java @@ -33,7 +33,7 @@ public abstract class HatGadget extends OutfitGadget public void ApplyArmor(Player player) { - Manager.removeGadetType(player, GadgetType.Morph); + Manager.removeGadgetType(player, GadgetType.Morph); Manager.RemoveOutfit(player, _slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java index 212964745..639ccea9f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java @@ -64,7 +64,7 @@ public abstract class ItemGadget extends Gadget public void ApplyItem(Player player, boolean inform) { - Manager.removeGadetType(player, GadgetType.Item); + Manager.removeGadgetType(player, GadgetType.Item); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java index c90606af7..96c19d0ad 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java @@ -19,7 +19,7 @@ public abstract class MorphGadget extends Gadget public void ApplyArmor(Player player) { - Manager.removeGadetType(player, GadgetType.Morph); + Manager.removeGadgetType(player, GadgetType.Morph); _active.add(player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java index 83c54ac96..1d778742a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/OutfitGadget.java @@ -34,7 +34,7 @@ public abstract class OutfitGadget extends Gadget public void ApplyArmor(Player player) { - Manager.removeGadetType(player, GadgetType.Morph); + Manager.removeGadgetType(player, GadgetType.Morph); Manager.RemoveOutfit(player, _slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java index 24444a965..bc807eb48 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java @@ -17,7 +17,7 @@ public abstract class ParticleGadget extends Gadget @Override public void EnableCustom(Player player) { - Manager.removeGadetType(player, GadgetType.Particle); + Manager.removeGadgetType(player, GadgetType.Particle); _active.add(player); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java index 16b832c76..bb078b3bb 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/commands/DisguiseCommand.java @@ -178,7 +178,7 @@ public class DisguiseCommand extends CommandBase implements Listener changeName(caller, args[0]); - Plugin.GetGadget().removeGadetType(caller, GadgetType.Item); + Plugin.GetGadget().removeGadgetType(caller, GadgetType.Item); UtilPlayer.message(caller, C.cGreen + C.Bold + "Disguise Active: " + ChatColor.RESET + args[0]); } catch(Exception e) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java index f10a8db0d..7111ae370 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/DisguiseCommand.java @@ -169,7 +169,7 @@ public class DisguiseCommand extends CommandBase implements Liste changeName(caller, args[0], true); - Plugin.getCosmeticManager().getGadgetManager().removeGadetType(caller, GadgetType.Item); + Plugin.getCosmeticManager().getGadgetManager().removeGadgetType(caller, GadgetType.Item); Bukkit.broadcastMessage(ChatColor.DARK_GRAY + "Quit> " + ChatColor.GRAY + _disguisedPlayersNames.get(caller)); UtilPlayer.message(caller, C.cGreen + C.Bold + "Disguise Active: " + ChatColor.RESET + args[0]); From 40c2fdc3fcf8ea3e39fec317bc983f00f2e1a3c8 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 21:11:35 +1100 Subject: [PATCH 167/223] fixed suits --- .../src/mineplex/core/cosmetic/ui/page/CostumePage.java | 3 ++- .../mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java | 6 +++++- .../core/gadget/gadgets/outfit/OutfitSpaceSuit.java | 6 +++++- .../core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java | 2 +- .../gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java | 2 +- .../core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java | 2 +- .../core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java | 2 +- 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java index bed2836d0..47e4ea4ac 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/CostumePage.java @@ -52,7 +52,8 @@ public class CostumePage extends GadgetPage if (gadget instanceof OutfitRaveSuit) offset = 0; else if (gadget instanceof OutfitSpaceSuit) offset = 1; - + else offset = 2; + slot = offset + 1 + 18; //1 buffer to left, 18 = 2 lines down if (outfitGadget.GetSlot() == OutfitGadget.ArmorSlot.Chest) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java index cd43be616..12d8f46ae 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java @@ -12,8 +12,10 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.LeatherArmorMeta; +import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.OutfitGadget; import mineplex.core.updater.UpdateType; @@ -27,7 +29,9 @@ public class OutfitRaveSuit extends OutfitGadget public OutfitRaveSuit(GadgetManager manager, String name, int cost, ArmorSlot slot, Material mat, byte data) { - super(manager, name, new String[] {ChatColor.RESET + "Wear the complete set for",ChatColor.RESET + "awesome bonus effects!", ChatColor.RESET + "Bonus coming soon..."}, cost, slot, mat, data); + super(manager, name, + UtilText.splitLineToArray("There's nothing more suitable for celebration than this high tech flashing outfit!", LineFormat.LORE), + cost, slot, mat, data); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java index c634500b2..7f0d06ccd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java @@ -4,6 +4,8 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.OutfitGadget; @@ -12,7 +14,9 @@ public class OutfitSpaceSuit extends OutfitGadget public OutfitSpaceSuit(GadgetManager manager, String name, int cost, ArmorSlot slot, Material mat, byte data) { - super(manager, name, new String[] {ChatColor.RESET + "Wear the complete set for",ChatColor.RESET + "awesome bonus effects!", ChatColor.RESET + "Bonus coming soon..."}, cost, slot, mat, data); + super(manager, name, + UtilText.splitLineToArray("Designed specifically for combat in space for a sport known as \'Gravity\'", LineFormat.LORE), + cost, slot, mat, data); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java index 58a02b36b..46b242283 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitBoots.java @@ -4,7 +4,7 @@ import mineplex.core.gadget.GadgetManager; import org.bukkit.Material; -public class OutfitSpaceSuitBoots extends OutfitRaveSuit +public class OutfitSpaceSuitBoots extends OutfitSpaceSuit { public OutfitSpaceSuitBoots(GadgetManager manager) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java index 5a6d3f807..f2da731f0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitChestplate.java @@ -4,7 +4,7 @@ import mineplex.core.gadget.GadgetManager; import org.bukkit.Material; -public class OutfitSpaceSuitChestplate extends OutfitRaveSuit +public class OutfitSpaceSuitChestplate extends OutfitSpaceSuit { public OutfitSpaceSuitChestplate(GadgetManager manager) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java index 09fb5ddbb..2d5dabb70 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitHelmet.java @@ -4,7 +4,7 @@ import mineplex.core.gadget.GadgetManager; import org.bukkit.Material; -public class OutfitSpaceSuitHelmet extends OutfitRaveSuit +public class OutfitSpaceSuitHelmet extends OutfitSpaceSuit { public OutfitSpaceSuitHelmet(GadgetManager manager) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java index 650aea844..3f29bced9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuitLeggings.java @@ -4,7 +4,7 @@ import mineplex.core.gadget.GadgetManager; import org.bukkit.Material; -public class OutfitSpaceSuitLeggings extends OutfitRaveSuit +public class OutfitSpaceSuitLeggings extends OutfitSpaceSuit { public OutfitSpaceSuitLeggings(GadgetManager manager) From e01a5369fd627813b7d115f3027991ba47294dc8 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 21:53:39 +1100 Subject: [PATCH 168/223] set bonuses item gadget gui update --- .../src/mineplex/core/antihack/types/Fly.java | 6 +++++ .../core/cosmetic/ui/page/GadgetPage.java | 24 +++++++++++++++---- .../gadget/gadgets/outfit/OutfitRaveSuit.java | 19 ++++++++++++++- .../gadgets/outfit/OutfitSpaceSuit.java | 24 ++++++++++++++++++- .../mineplex/core/gadget/set/SetRaveSuit.java | 2 +- .../core/gadget/set/SetSpaceSuit.java | 2 +- 6 files changed, 68 insertions(+), 9 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Fly.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Fly.java index fd7b557af..0941d4a2a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Fly.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Fly.java @@ -16,6 +16,8 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; public class Fly extends MiniPlugin implements Detector { @@ -128,6 +130,10 @@ public class Fly extends MiniPlugin implements Detector } } + for (PotionEffect effect : player.getActivePotionEffects()) + if (effect.getType() == PotionEffectType.JUMP || effect.getType().equals(PotionEffectType.JUMP)) + nearBlocks = true; + if (nearBlocks) { count = 0; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 6e0e39eb6..e15d9db7b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -150,11 +150,25 @@ public class GadgetPage extends ShopPageBase if (gadget instanceof ItemGadget) { + ItemGadget itemGadget = (ItemGadget)gadget; + + if (itemGadget.getAmmo().GetCost(CurrencyType.Coins) > 0) + { + itemLore.add(C.cBlack); + itemLore.add(C.cWhite + ((ItemGadget)gadget).getAmmo().GetDisplayName() + " for " + C.cYellow + ((ItemGadget)gadget).getAmmo().GetCost(CurrencyType.Coins) + " Coins"); + + if (getDonationManager().Get(getPlayer().getName()).GetBalance(CurrencyType.Coins) >= itemGadget.getAmmo().GetCost(CurrencyType.Coins)) + { + itemLore.add(C.cGreen + "Right-Click To Purchase"); + } + else + { + itemLore.add(C.cRed + "Not Enough Treasure Shards."); + } + } + itemLore.add(C.cBlack); - itemLore.add(C.cGreen + "Right-Click To Purchase:"); - itemLore.add(C.cWhite + ((ItemGadget)gadget).getAmmo().GetDisplayName() + " for " + C.cYellow + ((ItemGadget)gadget).getAmmo().GetCost(CurrencyType.Coins) + " Coins"); - itemLore.add(C.cBlack); - itemLore.add(C.cWhite + "Your Ammo : " + C.cGreen + getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.GetName())); + itemLore.add(C.cWhite + "You Have: " + C.cGreen + getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.GetName())); } if (gadget.ownsGadget(getPlayer())) @@ -196,7 +210,7 @@ public class GadgetPage extends ShopPageBase setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); } - else + else { setItem(slot, new ShopItem(Material.INK_SACK, (byte)8, gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java index 12d8f46ae..7ff4e8986 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java @@ -11,7 +11,10 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilServer; @@ -30,7 +33,7 @@ public class OutfitRaveSuit extends OutfitGadget int cost, ArmorSlot slot, Material mat, byte data) { super(manager, name, - UtilText.splitLineToArray("There's nothing more suitable for celebration than this high tech flashing outfit!", LineFormat.LORE), + UtilText.splitLineToArray(C.cWhite + "There's nothing more suitable for celebration than this high tech flashing outfit!", LineFormat.LORE), cost, slot, mat, data); } @@ -159,4 +162,18 @@ public class OutfitRaveSuit extends OutfitGadget { _colorPhase.remove(event.getPlayer().getName()); } + + @EventHandler + public void setBonus(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + if (GetSlot() != ArmorSlot.Helmet) + return; + + for (Player player : UtilServer.getPlayers()) + if (getSet() != null && getSet().isActive(player)) + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 39, 4, true, false), true); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java index 7f0d06ccd..16cb9a226 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java @@ -3,11 +3,19 @@ package mineplex.core.gadget.gadgets.outfit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.OutfitGadget; +import mineplex.core.gadget.types.OutfitGadget.ArmorSlot; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; public class OutfitSpaceSuit extends OutfitGadget { @@ -15,7 +23,7 @@ public class OutfitSpaceSuit extends OutfitGadget int cost, ArmorSlot slot, Material mat, byte data) { super(manager, name, - UtilText.splitLineToArray("Designed specifically for combat in space for a sport known as \'Gravity\'", LineFormat.LORE), + UtilText.splitLineToArray(C.cWhite + "Designed specifically for combat in deep space for a sport known as \'Gravity\'", LineFormat.LORE), cost, slot, mat, data); } @@ -30,4 +38,18 @@ public class OutfitSpaceSuit extends OutfitGadget { RemoveArmor(player); } + + @EventHandler + public void setBonus(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + if (GetSlot() != ArmorSlot.Helmet) + return; + + for (Player player : UtilServer.getPlayers()) + if (getSet() != null && getSet().isActive(player)) + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 39, 7, true, false), true); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java index 8dd0f874c..ea01fa10a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetRaveSuit.java @@ -8,7 +8,7 @@ public class SetRaveSuit extends GadgetSet { public SetRaveSuit(GadgetManager manager) { - super(manager, "Rave Suit", "Coming Soon...", + super(manager, "Rave Suit", "Hyper Speed", manager.getGadget(OutfitRaveSuitHelmet.class), manager.getGadget(OutfitRaveSuitChestplate.class), manager.getGadget(OutfitRaveSuitLeggings.class), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java index 27f7390e7..492b7a11f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/set/SetSpaceSuit.java @@ -8,7 +8,7 @@ public class SetSpaceSuit extends GadgetSet { public SetSpaceSuit(GadgetManager manager) { - super(manager, "Space Suit", "Coming Soon...", + super(manager, "Space Suit", "Low Gravity", manager.getGadget(OutfitSpaceSuitHelmet.class), manager.getGadget(OutfitSpaceSuitChestplate.class), manager.getGadget(OutfitSpaceSuitLeggings.class), From 7c432461c93379b62cebf603db3629574b1ce291 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 22:25:14 +1100 Subject: [PATCH 169/223] changed coal item rewards to 3 tier :) --- .../core/cosmetic/ui/page/GadgetPage.java | 31 +++- .../core/gadget/gadgets/hat/HatCoal.java | 4 +- .../core/gadget/gadgets/item/ItemCoal.java | 159 +++++++++++++----- .../core/gadget/types/ItemGadget.java | 7 +- .../core/pet/types/PetCoalApparition.java | 2 +- 5 files changed, 158 insertions(+), 45 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index e15d9db7b..8b89c1c83 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -148,10 +148,15 @@ public class GadgetPage extends ShopPageBase } } + //Special case for item gadgets! if (gadget instanceof ItemGadget) { ItemGadget itemGadget = (ItemGadget)gadget; + itemLore.add(C.cBlack); + itemLore.add(C.cWhite + "You Have: " + C.cGreen + getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.GetName())); + + boolean canAffordAmmo = true; if (itemGadget.getAmmo().GetCost(CurrencyType.Coins) > 0) { itemLore.add(C.cBlack); @@ -164,13 +169,26 @@ public class GadgetPage extends ShopPageBase else { itemLore.add(C.cRed + "Not Enough Treasure Shards."); + canAffordAmmo = false; } } - itemLore.add(C.cBlack); - itemLore.add(C.cWhite + "You Have: " + C.cGreen + getPlugin().getInventoryManager().Get(getPlayer()).getItemCount(gadget.GetName())); + if (itemGadget.hasAmmo(getPlayer())) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Left-Click to Enable"); + + addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, false, false), new ActivateGadgetButton(gadget, this)); + } + else + { + addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), gadget.GetName(), itemLore.toArray(new String[itemLore.size()]), 1, true, false), new ActivateGadgetButton(gadget, this)); + } + + return; } + //Standard if (gadget.ownsGadget(getPlayer())) { if (gadget.GetActive().contains(getPlayer())) @@ -219,6 +237,15 @@ public class GadgetPage extends ShopPageBase public void purchaseGadget(final Player player, final Gadget gadget) { + //Dont allow purchase! + if (gadget instanceof ItemGadget) + { + ItemGadget itemGadget = (ItemGadget)gadget; + + if (itemGadget.getAmmo().GetCost(CurrencyType.Coins) < 0) + return; + } + if(getClientManager().Get(player).isDisguised()) { UtilPlayer.message(player, F.main("Disguise", "You cant buy things while you are disguised!")); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java index 9a39e59f5..7897272a8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatCoal.java @@ -14,9 +14,9 @@ public class HatCoal extends HatGadget public HatCoal(GadgetManager manager) { - super(manager, "Lump of Coal", + super(manager, "Lump of Coal Hat", UtilText.splitLineToArray(C.cGray + "When life gives you coal, make a wierd cube hat out it!", LineFormat.LORE), - -3, + -1, new ItemStack(Material.COAL_BLOCK)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index 157ed982b..7358fe3da 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -3,6 +3,7 @@ package mineplex.core.gadget.gadgets.item; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; @@ -24,67 +25,147 @@ import mineplex.core.common.util.UtilText; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; import mineplex.core.gadget.gadgets.Ammo; +import mineplex.core.gadget.gadgets.hat.HatCoal; +import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; public class ItemCoal extends ItemGadget { - + public String[] Messages = new String[] { - "Maybe you could.... eat it?", - "Yep, you're holding some coal...", - "This sure is a nice piece of coal!", - "Na na na na Na na na na " + C.cDGray + "BLACK COAL" + C.mBody + "!", - "Did you know that coal can be used for " + C.Scramble + "nothing" + C.mBody + "!", + "Maybe you could.... eat it?", + "Yep, you're holding some coal...", + "This sure is a nice piece of coal!", + "Na na na na, Na na na na, " + C.cDGray + "BLACK COAL" + C.cGray + "!", + "Did you know that coal can be used for " + C.Scramble + "nothing" + C.mBody + "!", + "Now... if only you had a furnace.", + "I hope you didn’t miss any diamonds.", + "With 9 of these you could make a block!", + "Were you really that naughty this year?", + "With a few more of these you could make a snowman face!", + "Lava is hotter but Coal is quicker.", + "What do you even need Coal for on a Minigame server?", + "Maybe if I got more I could start a really big fire.", + "Maybe you can give this to your siblings next Christmas.", + "Did you know a diamond is formed from coal?", + "Coal is a word that sounds weird if you say it too much.", + "Who do you think mined the first block of coal?" }; public ItemCoal(GadgetManager manager) { super(manager, "Coal", - UtilText.splitLineToArray(C.cGray + "", LineFormat.LORE) - , -1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] - { - C.cDGray + "Exclusive Coal!", + UtilText.splitLineToArray(C.cGray + "Just a large chunk of coal. Maybe you were naughty or something?", LineFormat.LORE) + , -1, Material.COAL, (byte) 0, 1000, new Ammo("Coal", "1 Piece of Coal", Material.COAL, (byte) 0, new String[] + { + C.cDGray + "Exclusive Coal!", C.cDGray + "Earned by beeing naughty" - } - , 1, 1)); + } + , -1, 1)); } @Override public void ActivateCustom(final Player player) { - if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) + //Coal Hat + if (!Manager.getGadget(HatCoal.class).ownsGadget(player)) { - Manager.getInventoryManager().addItemToInventory(new Callback() + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 50) { - @Override - public void run(Boolean data) - { - if(data) + Manager.getInventoryManager().addItemToInventory(new Callback() + { + @Override + public void run(Boolean data) { - player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Fumes" + C.cGray + ".")); - UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); - UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); - player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); - - Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); - player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); - } else { - player.sendMessage("Something went wrong..."); + if(data) + { + player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Hat" + C.cGray + ".")); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.1f, 0.5f, 0.1f, 0, 100, ViewDist.LONG); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 0.5f, 0.0f, 0.5f, 0, 100, ViewDist.LONG); + player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); + + Manager.getInventoryManager().addItemToInventory(player, GetName(), -50); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + } + else + { + player.sendMessage("Something went wrong..."); + } } - } - }, player, "Coal Fumes", 1); - return; + }, player, "Lump of Coal Hat", 1); + return; + } } - + + //Coal Apparition + if (!Manager.getPetManager().Get(player).GetPets().containsKey(EntityType.PIG_ZOMBIE)) + { + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 500) + { + Manager.getInventoryManager().addItemToInventory(new Callback() + { + @Override + public void run(Boolean data) + { + if(data) + { + player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Apparition Pet" + C.cGray + ".")); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.15f, 0.5f, 0.15f, 0, 250, ViewDist.LONG); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1f, 0.0f, 1f, 0, 250, ViewDist.LONG); + player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); + + Manager.getInventoryManager().addItemToInventory(player, GetName(), -500); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + } + else + { + player.sendMessage("Something went wrong..."); + } + } + }, player, "Coal Apparition", 1); + return; + } + } + + //Coal Particle + if (!Manager.getGadget(ParticleCoalFumes.class).ownsGadget(player)) + { + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) + { + Manager.getInventoryManager().addItemToInventory(new Callback() + { + @Override + public void run(Boolean data) + { + if(data) + { + player.sendMessage(F.main("Coal", "You unlocked " + C.cRed + "Mythical Coal Fumes Particle" + C.cGray + ".")); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); + player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); + + Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + } + else + { + player.sendMessage("Something went wrong..."); + } + } + }, player, "Coal Fumes", 1); + return; + } + } + int i = UtilMath.r(Messages.length); String msg = Messages[i]; player.sendMessage(F.main("Coal", msg)); player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 0.2f, 1.5f*(i/(float)Messages.length)); } - + @EventHandler @Override public void Activate(PlayerInteractEvent event) { @@ -101,21 +182,21 @@ public class ItemCoal extends ItemGadget if (!IsActive(player)) return; - + event.setCancelled(true); - + //Stock if (Manager.getInventoryManager().Get(player).getItemCount(GetName()) <= 0) { - + UtilPlayer.message(player, F.main("Gadget", "You do not have any " + GetName() + " left.")); - + ItemGadgetOutOfAmmoEvent ammoEvent = new ItemGadgetOutOfAmmoEvent(event.getPlayer(), this); Bukkit.getServer().getPluginManager().callEvent(ammoEvent); - + return; } - + //Recharge if (!Recharge.Instance.use(player, GetName(), GetName(), _recharge, _recharge > 1000, true, false, true, "Cosmetics")) { @@ -124,7 +205,7 @@ public class ItemCoal extends ItemGadget } player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); - + ActivateCustom(event.getPlayer()); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java index 639ccea9f..b0d7bdae6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java @@ -141,7 +141,7 @@ public abstract class ItemGadget extends Gadget event.setCancelled(true); //Stock - if (Manager.getInventoryManager().Get(player).getItemCount(GetName()) <= 0) + if (!hasAmmo(player)) { UtilPlayer.message(player, F.main("Gadget", "You do not have any " + GetName() + " left.")); @@ -165,6 +165,11 @@ public abstract class ItemGadget extends Gadget ActivateCustom(event.getPlayer()); } + + public boolean hasAmmo(Player player) + { + return Manager.getInventoryManager().Get(player).getItemCount(GetName()) > 0; + } public abstract void ActivateCustom(Player player); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java index 5c0b7ed82..7d787f744 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/types/PetCoalApparition.java @@ -8,7 +8,7 @@ public class PetCoalApparition extends Pet { public PetCoalApparition() { - super("Coal Apparition", EntityType.PIG_ZOMBIE, 10); + super("Coal Apparition", EntityType.PIG_ZOMBIE, -1); } } From 39f5f70a5f1acf5c4dac27c1c9fc813b103dd71c Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 22:43:34 +1100 Subject: [PATCH 170/223] fixing up coal things --- .../core/gadget/gadgets/item/ItemCoal.java | 43 +++++++++++++------ .../core/inventory/InventoryManager.java | 13 +++++- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index 7358fe3da..a9e9ea591 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -30,6 +30,9 @@ import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; +import mineplex.core.reward.RewardData; +import mineplex.core.reward.RewardRarity; +import mineplex.core.reward.rewards.PetReward; public class ItemCoal extends ItemGadget { @@ -75,6 +78,9 @@ public class ItemCoal extends ItemGadget { if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 50) { + Recharge.Instance.recharge(player, GetName()); + Recharge.Instance.use(player, GetName(), 60000, true, true); + Manager.getInventoryManager().addItemToInventory(new Callback() { @Override @@ -89,6 +95,8 @@ public class ItemCoal extends ItemGadget Manager.getInventoryManager().addItemToInventory(player, GetName(), -50); player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + + Manager.getDonationManager().Get(player).AddUnknownSalesPackagesOwned("Lump of Coal Hat"); } else { @@ -105,12 +113,20 @@ public class ItemCoal extends ItemGadget { if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 500) { - Manager.getInventoryManager().addItemToInventory(new Callback() - { - @Override - public void run(Boolean data) - { - if(data) + Recharge.Instance.recharge(player, GetName()); + Recharge.Instance.use(player, GetName(), 60000, true, true); + + PetReward reward = new PetReward( + Manager.getPetManager(), + Manager.getInventoryManager(), + Manager.getDonationManager(), + "Coal Apparition", "Coal Apparition", EntityType.PIG_ZOMBIE, RewardRarity.OTHER, 0); + + if (reward.canGiveReward(player)) + reward.giveReward(null, player, new Callback() + { + @Override + public void run(RewardData data) { player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Apparition Pet" + C.cGray + ".")); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.15f, 0.5f, 0.15f, 0, 250, ViewDist.LONG); @@ -119,13 +135,11 @@ public class ItemCoal extends ItemGadget Manager.getInventoryManager().addItemToInventory(player, GetName(), -500); player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); - } - else - { - player.sendMessage("Something went wrong..."); + + Manager.getDonationManager().Get(player).AddUnknownSalesPackagesOwned("Coal Apparition"); } - } - }, player, "Coal Apparition", 1); + }); + return; } } @@ -135,6 +149,9 @@ public class ItemCoal extends ItemGadget { if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) { + Recharge.Instance.recharge(player, GetName()); + Recharge.Instance.use(player, GetName(), 60000, true, true); + Manager.getInventoryManager().addItemToInventory(new Callback() { @Override @@ -149,6 +166,8 @@ public class ItemCoal extends ItemGadget Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + + Manager.getDonationManager().Get(player).AddUnknownSalesPackagesOwned("Coal Fumes"); } else { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java index 0a32aa977..a1d19bd53 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java @@ -138,7 +138,18 @@ public class InventoryManager extends MiniDbClientPlugin { public void run() { - addItemToInventoryForOffline(callback, PlayerCache.getInstance().getPlayer(uuid).getAccountId(), item, count); + try + { + addItemToInventoryForOffline(callback, PlayerCache.getInstance().getPlayer(uuid).getAccountId(), item, count); + } + catch (Exception e) + { + e.printStackTrace(); + + System.out.println("-----DEBUG-----"); + System.out.println("PlayerCache Instance: " + (PlayerCache.getInstance() == null)); + System.out.println("PlayerCache Player Object: " + (PlayerCache.getInstance().getPlayer(uuid) == null)); + } } }); } From d5612a8f2758e5e6f94e9e4df66c12346eea58d3 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 23:09:06 +1100 Subject: [PATCH 171/223] added a hint to how many more coal you need to your next prize. --- .../core/gadget/gadgets/item/ItemCoal.java | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index a9e9ea591..5126b1f92 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -73,13 +73,17 @@ public class ItemCoal extends ItemGadget @Override public void ActivateCustom(final Player player) { + int goal = -1; + //Coal Hat if (!Manager.getGadget(HatCoal.class).ownsGadget(player)) { - if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 50) + goal = 250; + + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 250) { Recharge.Instance.recharge(player, GetName()); - Recharge.Instance.use(player, GetName(), 60000, true, true); + Recharge.Instance.use(player, GetName(), 30000, true, true); Manager.getInventoryManager().addItemToInventory(new Callback() { @@ -88,12 +92,12 @@ public class ItemCoal extends ItemGadget { if(data) { - player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Hat" + C.cGray + ".")); + Bukkit.broadcastMessage(F.main("Treasure", C.cGreen + player.getName() + C.cGray + " crafted " + C.cGreen + "Legendary Coal Hat")); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.1f, 0.5f, 0.1f, 0, 100, ViewDist.LONG); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 0.5f, 0.0f, 0.5f, 0, 100, ViewDist.LONG); player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); - Manager.getInventoryManager().addItemToInventory(player, GetName(), -50); + Manager.getInventoryManager().addItemToInventory(player, GetName(), -250); player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); Manager.getDonationManager().Get(player).AddUnknownSalesPackagesOwned("Lump of Coal Hat"); @@ -111,10 +115,12 @@ public class ItemCoal extends ItemGadget //Coal Apparition if (!Manager.getPetManager().Get(player).GetPets().containsKey(EntityType.PIG_ZOMBIE)) { - if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 500) + goal = 1000; + + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) { Recharge.Instance.recharge(player, GetName()); - Recharge.Instance.use(player, GetName(), 60000, true, true); + Recharge.Instance.use(player, GetName(), 30000, true, true); PetReward reward = new PetReward( Manager.getPetManager(), @@ -128,12 +134,12 @@ public class ItemCoal extends ItemGadget @Override public void run(RewardData data) { - player.sendMessage(F.main("Coal", "You unlocked " + C.cGreen + "Legendary Coal Apparition Pet" + C.cGray + ".")); + Bukkit.broadcastMessage(F.main("Treasure", C.cGreen + player.getName() + C.cGray + " crafted " + C.cGreen + "Legendary Coal Apparition Pet")); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.15f, 0.5f, 0.15f, 0, 250, ViewDist.LONG); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1f, 0.0f, 1f, 0, 250, ViewDist.LONG); player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); - Manager.getInventoryManager().addItemToInventory(player, GetName(), -500); + Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); Manager.getDonationManager().Get(player).AddUnknownSalesPackagesOwned("Coal Apparition"); @@ -147,10 +153,12 @@ public class ItemCoal extends ItemGadget //Coal Particle if (!Manager.getGadget(ParticleCoalFumes.class).ownsGadget(player)) { - if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 1000) + goal = 2500; + + if(Manager.getInventoryManager().Get(player).getItemCount(GetName()) >= 2500) { Recharge.Instance.recharge(player, GetName()); - Recharge.Instance.use(player, GetName(), 60000, true, true); + Recharge.Instance.use(player, GetName(), 30000, true, true); Manager.getInventoryManager().addItemToInventory(new Callback() { @@ -159,12 +167,12 @@ public class ItemCoal extends ItemGadget { if(data) { - player.sendMessage(F.main("Coal", "You unlocked " + C.cRed + "Mythical Coal Fumes Particle" + C.cGray + ".")); + Bukkit.broadcastMessage(F.main("Treasure", C.cRed + player.getName() + C.cGray + " crafted " + C.cRed + "Mythical Coal Fumes Particles")); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation().add(0, 0.5, 0), 0.2f, 0.5f, 0.2f, 0, 500, ViewDist.LONG); UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, player.getLocation(), 1.5f, 0.0f, 1.5f, 0, 500, ViewDist.LONG); player.getWorld().playSound(player.getLocation(), Sound.WITHER_DEATH, 0.8f, 0); - Manager.getInventoryManager().addItemToInventory(player, GetName(), -1000); + Manager.getInventoryManager().addItemToInventory(player, GetName(), -2500); player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); Manager.getDonationManager().Get(player).AddUnknownSalesPackagesOwned("Coal Fumes"); @@ -179,10 +187,23 @@ public class ItemCoal extends ItemGadget } } - int i = UtilMath.r(Messages.length); - String msg = Messages[i]; - player.sendMessage(F.main("Coal", msg)); - player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 0.2f, 1.5f*(i/(float)Messages.length)); + goal -= Manager.getInventoryManager().Get(player).getItemCount(GetName()); + + if (goal > 0 && Math.random() > 0.95) + { + player.sendMessage(F.main("Coal", "Only " + goal + " to go...")); + + player.playSound(player.getLocation(), Sound.IRONGOLEM_DEATH, 0.2f, 0.5f); + } + else + { + + int i = UtilMath.r(Messages.length); + String msg = Messages[i]; + player.sendMessage(F.main("Coal", msg)); + + player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 0.2f, 1.5f*(i/(float)Messages.length)); + } } @EventHandler @Override From 2ffd1d4595d9d3c59209448d27cee59523cf10ef Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 11 Dec 2015 23:11:33 +1100 Subject: [PATCH 172/223] BOB ROSS --- .../src/mineplex/core/gadget/gadgets/item/ItemCoal.java | 3 ++- .../src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java index 5126b1f92..e0585758a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemCoal.java @@ -55,7 +55,8 @@ public class ItemCoal extends ItemGadget "Maybe you can give this to your siblings next Christmas.", "Did you know a diamond is formed from coal?", "Coal is a word that sounds weird if you say it too much.", - "Who do you think mined the first block of coal?" + "Who do you think mined the first block of coal?", + "Maybe if you get enough, something cool will happen! Or perhaps not...", }; public ItemCoal(GadgetManager manager) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java index 2815a9b5e..790a66d44 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPaintbrush.java @@ -200,7 +200,7 @@ public class ItemPaintbrush extends ItemGadget Villager villager = (Villager)event.getRightClicked(); - if (villager.getCustomName() != null && villager.getCustomName().contains("Painter")) + if (villager.getCustomName() != null && villager.getCustomName().contains("Bob Ross")) { Enable(event.getPlayer()); } From ba087d119a0860b13da482aadd5de1753ef53537 Mon Sep 17 00:00:00 2001 From: xGamingDudex Date: Fri, 11 Dec 2015 17:31:05 +0100 Subject: [PATCH 173/223] Small tweaks --- .../src/mineplex/core/cosmetic/ui/page/Menu.java | 4 ++-- .../gadget/gadgets/item/ItemPartyPopper.java | 16 ++++++++-------- .../core/gadget/gadgets/item/ItemSnowball.java | 2 +- .../gadgets/particle/ParticleCoalFumes.java | 9 +++++---- .../core/mount/types/MountBabyReindeer.java | 2 +- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index 143794f24..79edde702 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -47,7 +47,7 @@ public class Menu extends ShopPageBase @Override protected void buildPage() { - Donor donor = getDonationManager().Get(getPlayer()); +// Donor donor = getDonationManager().Get(getPlayer()); // addItem(2, new ShopItem(CurrencyType.Gems.GetDisplayMaterial(), donor.GetGems() + " Gems", new String[] { // " " @@ -83,7 +83,7 @@ public class Menu extends ShopPageBase addButton(46, new ShopItem(Material.GOLD_HELMET, "Hats", 1, false), new OpenHats(this)); addButton(48, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); addButton(50, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); - addButton(52, new ShopItem(Material.NAME_TAG, "Taunts", 1, false), new IButton() + addButton(52, new ShopItem(Material.NAME_TAG, "Taunts", new String[]{C.Bold + "", C.cDGreen + C.Italics + "Coming soon!"}, 1, false), new IButton() { @Override public void onClick(Player player, ClickType clickType) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java index 2a44e16da..ee3530375 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java @@ -9,16 +9,15 @@ import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.util.Vector; import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.gadget.types.ItemGadget; -import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileUser; import mineplex.core.updater.UpdateType; @@ -43,19 +42,20 @@ public class ItemPartyPopper extends ItemGadget implements IThrown @Override public void ActivateCustom(Player player) { - + /* Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(Material.REDSTONE_LAMP_OFF, (byte)0, 1, "Lamp" + Math.random())); UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.1), 1, false, 0, 0.2, 10, false); Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); + */ + - /* for(int data : new int[]{1,2,4,5,6,9,10,11,12,13,14,15}) { - UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), null, 0.4f, 50, ViewDist.LONG); - /* +// UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), null, 0.4f, 50, ViewDist.LONG); + for(int i = 0; i < 10; i++) { Vector v = new Vector(Math.random() - 0.5, Math.random() - 0.3, Math.random() - 0.5); @@ -75,12 +75,12 @@ public class ItemPartyPopper extends ItemGadget implements IThrown Vector random = new Vector(Math.random() - 0.5, Math.random() - 0.3, Math.random() - 0.5); random.normalize(); random.multiply(0.05); - + UtilAction.velocity(ent, player.getLocation().getDirection().normalize().multiply(0.3).add(random), 1 + 0.4 * Math.random(), false, 0, 0.2, 10, false); Manager.getProjectileManager().AddThrow(ent, player, this, 3000, false, false, true, true, 0.5f); */ -// } + } // Sound for(int i = 0; i < 3; i++) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java index ce1f5dc79..447d7ea2e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemSnowball.java @@ -54,7 +54,7 @@ public class ItemSnowball extends ItemGadget if(gevent.isCancelled()) return; - UtilAction.velocity(event.getEntity(), event.getDamager().getVelocity().normalize().add(new Vector(0,0.5,0))); + UtilAction.velocity(event.getEntity(), event.getDamager().getVelocity().normalize().add(new Vector(0,0.5,0)).multiply(0.5)); event.getDamager().getWorld().playSound(event.getDamager().getLocation(), Sound.STEP_SNOW, 1, 0.5f); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java index 04ccec81d..edfb6cf62 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java @@ -29,12 +29,13 @@ public class ParticleCoalFumes extends ParticleGadget { if(event.getType() != UpdateType.TICK) return; - int dur = 200; - int tick = Math.abs(event.getTick()%dur); +// int dur = 200; +// int tick = Math.abs(event.getTick()%dur); - double d = tick/(double)dur; - float xz = (float) Math.sin(d*Math.PI); +// double d = tick/(double)dur; +// float xz = (float) Math.sin(d*Math.PI); + float xz = 2; for(Player p : GetActive()) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java index 0c5b84e98..9293a0636 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountBabyReindeer.java @@ -33,7 +33,7 @@ public class MountBabyReindeer extends HorseMount { C.cWhite + "One of Santa's baby reindeers", C.cWhite + "Still trying to learn how to fly" - }, Material.SNOW_BALL, (byte) 0, 10, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); + }, Material.GOLDEN_CARROT, (byte) 0, 10, Color.CREAMY, Style.WHITEFIELD, Variant.HORSE, 0, null); } @EventHandler From 1dcbf5f7fd0a137b062c5adde0f1596d20c4008f Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 16:34:04 +0000 Subject: [PATCH 174/223] Couple of fixes --- .../game/games/gladiators/Gladiators.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 9fa85f642..c6f39d388 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -1,5 +1,6 @@ package nautilus.game.arcade.game.games.gladiators; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -659,7 +660,7 @@ public class Gladiators extends SoloGame if (closest != _playerArenas.get(p)) { - if (closest.getColour().furtherOut(_playerArenas.get(p).getColour())) + if (closest.getColour().furtherOut(_playerArenas.get(p).getColour()) || (!_playerArenas.get(p).isOpenDoor())) { // No going backwards. Bounce baby bounce. if (Recharge.Instance.use(p, "Arena Bounce", 500, false, false)) @@ -674,6 +675,9 @@ public class Gladiators extends SoloGame //p.sendMessage("ARENA MOVE CHECK METHOD!"); Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), closest, _playerArenas.get(p))); _playerArenas.put(p, closest); + + // Push player a little + UtilAction.velocity(p, UtilAlg.getTrajectory2d(p.getLocation(), closest.getMid()), 1.7, false, 0.2, 0, 3, false); } } @@ -892,8 +896,8 @@ public class Gladiators extends SoloGame if (e.getEntity() instanceof Player) { - ((Player)e.getEntity()).getInventory().addItem(new ItemStack(Material.ARROW, 1)); // Arrow fix. - ((Player)e.getEntity()).updateInventory(); +// ((Player)e.getEntity()).getInventory().addItem(new ItemStack(Material.ARROW, 1)); // Arrow fix. +// ((Player)e.getEntity()).updateInventory(); } } @@ -1007,6 +1011,9 @@ public class Gladiators extends SoloGame { if (_playerArenas.containsKey(e.getPlayer())) { + if (_playerArenas.get(e.getPlayer()).getState() != ArenaState.FIGHTING) + return; + for (Player p : _playerArenas.get(e.getPlayer()).getPastPlayers()) { if (p.equals(e.getPlayer())) @@ -1019,4 +1026,17 @@ public class Gladiators extends SoloGame } } } + + @EventHandler + public void deathHealth(CombatDeathEvent e) + { + if (!(e.GetEvent().getEntity() instanceof Player)) + return; + + if (e.GetLog().GetKiller().IsPlayer()) + { + Player killer = UtilPlayer.searchExact(e.GetLog().GetKiller().GetName()); + ((Player)e.GetEvent().getEntity()).sendMessage(F.main("Game", "Your killer had " + C.cRed + new DecimalFormat("#").format(killer.getHealth()) + "❤" + C.cGray + " left.")); + } + } } From 6456d7bd66f4aab4ce81e2efd3f46131818c8b98 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 16:55:15 +0000 Subject: [PATCH 175/223] Scoreboard change and breaking blocks. --- .../game/games/gladiators/Gladiators.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index c6f39d388..b6080c5ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -4,6 +4,7 @@ import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; @@ -24,7 +25,6 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.ItemStack; import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation; @@ -108,6 +108,10 @@ public class Gladiators extends SoloGame DontAllowOverfill = true; EnableTutorials = false; + BlockBreakAllow.add(Material.SUGAR_CANE_BLOCK.getId()); + BlockBreakAllow.add(Material.GRASS.getId()); + BlockBreakAllow.add(Material.LONG_GRASS.getId()); + registerStatTrackers( new BrawlerTracker(this), //new UntouchableTracker(this), @@ -1039,4 +1043,26 @@ public class Gladiators extends SoloGame ((Player)e.GetEvent().getEntity()).sendMessage(F.main("Game", "Your killer had " + C.cRed + new DecimalFormat("#").format(killer.getHealth()) + "❤" + C.cGray + " left.")); } } + + @EventHandler + public void scoreboardEnd(GameStateChangeEvent e) + { + if (e.GetState() != GameState.End) + return; + + Scoreboard.Reset(); + + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cGreen + C.Bold + "Status"); + Scoreboard.Write(C.cWhite + "Ended"); + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cAqua + C.Bold + "Matches Left"); + Scoreboard.Write(C.cWhite + "0"); + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cYellow + C.Bold + "Players"); + if (getWinners() != null && !getWinners().isEmpty()) + Scoreboard.Write(C.cWhite + getWinners().get(0).getName()); + + Scoreboard.Draw(); + } } From 0d4bd91b573ca251d15471b6454452bd4ebca195 Mon Sep 17 00:00:00 2001 From: William Burns Date: Fri, 11 Dec 2015 22:47:07 +0000 Subject: [PATCH 176/223] lag detection thing --- .../arcade/game/games/gladiators/Arena.java | 19 +++++++++++++++++-- .../game/games/gladiators/Gladiators.java | 10 +++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index a4dca2dcc..ec26ae9e9 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -258,8 +258,23 @@ public class Arena public void closeDoor() { - for (Location loc : _doorBlocks) - loc.getBlock().setType(Material.OBSIDIAN); + _host.Manager.getScheduler().scheduleSyncDelayedTask(_host.Manager.getPlugin(), new Runnable() + { + @Override + public void run() + { + for (Location loc : _doorBlocks) + loc.getBlock().setType(Material.OBSIDIAN); + + // Lag exploit check + for (Player p : getPastPlayers()) + { + Arena closest = _host.getArenaByMid(UtilAlg.findClosest(p.getLocation(), _host.getAllArenaMids())); + if (closest != _host.getPlayerArenas().get(p)) + p.teleport(UtilAlg.findClosest(p.getLocation(), getSpawns())); + } + } + }, 5L); } public boolean isOpenDoor() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index b6080c5ad..b03240656 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -469,6 +469,11 @@ public class Gladiators extends SoloGame return mids; } + public HashMap getPlayerArenas() + { + return _playerArenas; + } + public ArrayList getAllArenaMids() { ArrayList mids = new ArrayList<>(); @@ -664,7 +669,7 @@ public class Gladiators extends SoloGame if (closest != _playerArenas.get(p)) { - if (closest.getColour().furtherOut(_playerArenas.get(p).getColour()) || (!_playerArenas.get(p).isOpenDoor())) + if (closest.getColour().furtherOut(_playerArenas.get(p).getColour())) { // No going backwards. Bounce baby bounce. if (Recharge.Instance.use(p, "Arena Bounce", 500, false, false)) @@ -676,6 +681,9 @@ public class Gladiators extends SoloGame return; } + if (!_playerArenas.get(p).isOpenDoor()) + return; + //p.sendMessage("ARENA MOVE CHECK METHOD!"); Manager.getPluginManager().callEvent(new PlayerChangeArenaEvent(e.getPlayer(), closest, _playerArenas.get(p))); _playerArenas.put(p, closest); From 905842848492083df0f11b39e1ce47a7f00f68ec Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 13 Dec 2015 16:40:46 +1300 Subject: [PATCH 177/223] Change ItemBuilder to have ItemFlag, change hub icons to not display weapon damage --- .../mineplex/core/itemstack/ItemBuilder.java | 151 ++-- .../hub/profile/buttons/ButtonPrefs.java | 29 +- .../hub/server/ui/ServerGameMenu.java | 788 +++++++++--------- .../hub/server/ui/ServerTypePage.java | 51 +- 4 files changed, 530 insertions(+), 489 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java index c1d486795..8ea88cc70 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/itemstack/ItemBuilder.java @@ -2,7 +2,9 @@ package mineplex.core.itemstack; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -12,6 +14,7 @@ import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkEffectMeta; import org.bukkit.inventory.meta.ItemMeta; @@ -19,6 +22,8 @@ import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.potion.Potion; +import mineplex.core.common.util.C; + public class ItemBuilder { @@ -48,20 +53,17 @@ public class ItemBuilder private final HashMap _enchants = new HashMap(); private final List _lore = new ArrayList(); private Material _mat; - // private Potion potion; private String _title = null; private boolean _unbreakable; private String _playerHeadName = null; + private HashSet _itemFlags = new HashSet(); public ItemBuilder(ItemStack item) { this(item.getType(), item.getDurability()); _amount = item.getAmount(); _enchants.putAll(item.getEnchantments()); - if (item.getType() == Material.POTION) - { - // setPotion(Potion.fromItemStack(item)); - } + if (item.hasItemMeta()) { ItemMeta meta = item.getItemMeta(); @@ -81,6 +83,8 @@ public class ItemBuilder setColor(((LeatherArmorMeta) meta).getColor()); } + _itemFlags.addAll(meta.getItemFlags()); + _unbreakable = meta.spigot().isUnbreakable(); } } @@ -107,13 +111,60 @@ public class ItemBuilder this(mat, 1, data); } + public HashSet getItemFlags() + { + return _itemFlags; + } + + public ItemBuilder addItemFlags(ItemFlag... flags) + { + getItemFlags().addAll(Arrays.asList(flags)); + + return this; + } + + public ItemBuilder setItemFlags(ItemFlag... flags) + { + getItemFlags().clear(); + addItemFlags(flags); + + return this; + } + + public ItemBuilder setItemFlags(Collection flags) + { + getItemFlags().clear(); + addItemFlags(flags.toArray(new ItemFlag[0])); + + return this; + } + + public ItemBuilder setHideInfo(boolean hideInfo) + { + if (hideInfo) + { + for (ItemFlag flag : ItemFlag.values()) + { + getItemFlags().add(flag); + } + } + else + { + getItemFlags().clear(); + } + + return this; + } + public ItemBuilder addEnchantment(Enchantment enchant, int level) { if (_enchants.containsKey(enchant)) { _enchants.remove(enchant); } + _enchants.put(enchant, level); + return this; } @@ -121,20 +172,31 @@ public class ItemBuilder { for (String lore : lores) { - _lore.add(ChatColor.GRAY + lore); + _lore.add(C.cGray + lore); } + + return this; + } + + public ItemBuilder setLore(String... lores) + { + _lore.clear(); + _lore.addAll(Arrays.asList(lores)); + return this; } public ItemBuilder addLore(String lore, int maxLength) { _lore.addAll(split(lore, maxLength)); + return this; } public ItemBuilder addLores(List lores) { _lore.addAll(lores); + return this; } @@ -144,6 +206,7 @@ public class ItemBuilder { addLore(lore, maxLength); } + return this; } @@ -155,6 +218,7 @@ public class ItemBuilder public ItemStack build() { Material mat = _mat; + if (mat == null) { mat = Material.AIR; @@ -164,8 +228,10 @@ public class ItemBuilder { Bukkit.getLogger().warning("Air material!"); } + ItemStack item = new ItemStack(mat, _amount, _data); ItemMeta meta = item.getItemMeta(); + if (meta != null) { if (_title != null) @@ -189,14 +255,13 @@ public class ItemBuilder ((FireworkEffectMeta) meta).setEffect(FireworkEffect.builder().withColor(_color).build()); } + meta.addItemFlags(getItemFlags().toArray(new ItemFlag[0])); meta.spigot().setUnbreakable(isUnbreakable()); item.setItemMeta(meta); } item.addUnsafeEnchantments(_enchants); - // if (potion != null) { - // potion.apply(item); - // } + return item; } @@ -263,52 +328,6 @@ public class ItemBuilder return _enchants.containsKey(enchant); } - public boolean isItem(ItemStack item) - { - ItemMeta meta = item.getItemMeta(); - - if (item.getType() != getType()) - { - return false; - } - - if (!meta.hasDisplayName() && getTitle() != null) - { - return false; - } - - if (!meta.getDisplayName().equals(getTitle())) - { - return false; - } - - if (!meta.hasLore() && !getLore().isEmpty()) - { - return false; - } - - if (meta.hasLore()) - { - for (String lore : meta.getLore()) - { - if (!getLore().contains(lore)) - { - return false; - } - } - } - - for (Enchantment enchant : item.getEnchantments().keySet()) - { - if (!hasEnchantment(enchant)) - { - return false; - } - } - - return true; - } - public boolean isUnbreakable() { return _unbreakable; @@ -317,17 +336,14 @@ public class ItemBuilder public ItemBuilder setAmount(int amount) { _amount = amount; + return this; } public ItemBuilder setColor(Color color) { - /* (!_mat.name().contains("LEATHER_")) - { - throw new IllegalArgumentException("Can only dye leather armor!"); - }*/ - _color = color; + return this; } @@ -338,19 +354,10 @@ public class ItemBuilder return this; } - public ItemBuilder setPotion(Potion potion) - { - if (_mat != Material.POTION) - { - _mat = Material.POTION; - } - - return this; - } - public ItemBuilder setRawTitle(String title) { _title = title; + return this; } @@ -378,24 +385,28 @@ public class ItemBuilder } setTitle(title); + return this; } public ItemBuilder setType(Material mat) { _mat = mat; + return this; } public ItemBuilder setUnbreakable(boolean setUnbreakable) { _unbreakable = setUnbreakable; + return this; } public ItemBuilder setPlayerHead(String playerName) { _playerHeadName = playerName; + return this; } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/profile/buttons/ButtonPrefs.java b/Plugins/Mineplex.Hub/src/mineplex/hub/profile/buttons/ButtonPrefs.java index 38652a7c7..1b9c38395 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/profile/buttons/ButtonPrefs.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/profile/buttons/ButtonPrefs.java @@ -2,6 +2,7 @@ package mineplex.hub.profile.buttons; import mineplex.core.common.util.C; import mineplex.core.gui.GuiItem; +import mineplex.core.itemstack.ItemBuilder; import mineplex.core.itemstack.ItemStackFactory; import mineplex.hub.profile.gui.GUIProfile; @@ -17,7 +18,7 @@ public class ButtonPrefs implements GuiItem private GUIProfile _profile; private Player _player; - + public ButtonPrefs(GUIProfile profile, Player player) { _profile = profile; @@ -33,29 +34,27 @@ public class ButtonPrefs implements GuiItem @Override public ItemStack getObject() { - return ItemStackFactory.Instance.CreateStack(Material.REDSTONE_COMPARATOR.getId(), (byte)0, 1, - ChatColor.RESET + C.cYellow + "Preferences", - new String[] - { - "", - C.cWhite + "Set your preferences to your liking", - C.cWhite + "so you can enjoy the game more!", - - "", - C.cWhite + "Type " + C.cGreen + "/prefs" + C.cWhite + " to access this anywhere!" - }); + return new ItemBuilder(Material.REDSTONE_COMPARATOR).setTitle(C.Reset + C.cYellow + "Preferences").addLore(new String[] + { + "", + C.cWhite + "Set your preferences to your liking", + C.cWhite + "so you can enjoy the game more!", + + "", + C.cWhite + "Type " + C.cGreen + "/prefs" + C.cWhite + " to access this anywhere!" + }).build(); } @Override - public void setup() + public void setup() { - + } @Override public void close() { - + } } 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 4e3bc8320..1eb43415a 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -3,7 +3,6 @@ package mineplex.hub.server.ui; import java.util.ArrayList; import java.util.List; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -11,7 +10,7 @@ import org.bukkit.inventory.ItemStack; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.C; import mineplex.core.donation.DonationManager; -import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.itemstack.ItemBuilder; import mineplex.core.shop.page.ShopPageBase; import mineplex.hub.server.ServerManager; import mineplex.hub.server.ui.button.SelectBHButton; @@ -34,17 +33,18 @@ public class ServerGameMenu extends ShopPageBase { private List _superSmashCycle = new ArrayList(); private List _minigameCycle = new ArrayList(); - + private int _ssmIndex; private int _minigameIndex; - - public ServerGameMenu(ServerManager plugin, QuickShop quickShop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player) + + public ServerGameMenu(ServerManager plugin, QuickShop quickShop, CoreClientManager clientManager, + DonationManager donationManager, String name, Player player) { super(plugin, quickShop, clientManager, donationManager, name, player, 47); - + createSuperSmashCycle(); createMinigameCycle(); - + buildPage(); } @@ -52,148 +52,165 @@ public class ServerGameMenu extends ShopPageBase @Override protected void buildPage() { - setItem(0, ItemStackFactory.Instance.CreateStack(Material.IRON_PICKAXE.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "The Bridges " + C.cGray + "4 Team Survival", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "4 Teams get 10 minutes to prepare.", - ChatColor.RESET + "Then the bridges drop, and all hell", - ChatColor.RESET + "breaks loose as you battle to the", - ChatColor.RESET + "death with the other teams.", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("BR") + ChatColor.RESET + " other players!", - })); - - setItem(2, ItemStackFactory.Instance.CreateStack(Material.DIAMOND_SWORD.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Survival Games " + C.cGray + "Solo/Team Survival", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Search for chests to find loot and ", - ChatColor.RESET + "fight others to be the last man standing. ", - ChatColor.RESET + "Stay away from the borders!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + (getPlugin().getGroupTagPlayerCount("HG") + getPlugin().getGroupTagPlayerCount("SG2")) + ChatColor.RESET + " other players!", - })); + setItem(0, new ItemBuilder(Material.IRON_PICKAXE) + .setTitle(C.Reset + C.Bold + C.cYellow + "The Bridges " + C.cGray + "4 Team Survival").addLore(new String[] + { + C.Reset + "", + C.Reset + "4 Teams get 10 minutes to prepare.", + C.Reset + "Then the bridges drop, and all hell", + C.Reset + "breaks loose as you battle to the", + C.Reset + "death with the other teams.", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("BR") + C.Reset + " other players!" + }).setHideInfo(true).build()); - setItem(4, ItemStackFactory.Instance.CreateStack(Material.FEATHER.getId(), (byte) 0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Skywars " + C.cGray + "Solo/Team Survival", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "16 contenders fight for the right to rule the skies!", - ChatColor.RESET + "Spawn on a sky island and build your path!", - ChatColor.RESET + "Find weapons to take your enemies down!", - ChatColor.RESET + "Way up there, death ever looming if you fall..", - ChatColor.RESET + "Can you fight? Can you live? Can you win Skywars?", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + (getPlugin().getGroupTagPlayerCount("SKY") + getPlugin().getGroupTagPlayerCount("SKY2")) + ChatColor.RESET + " other players!", - })); + setItem(2, new ItemBuilder(Material.DIAMOND_SWORD) + .setTitle(C.Reset + C.Bold + C.cYellow + "Survival Games " + C.cGray + "Solo/Team Survival").addLore(new String[] + { + C.Reset + "", + C.Reset + "Search for chests to find loot and ", + C.Reset + "fight others to be the last man standing. ", + C.Reset + "Stay away from the borders!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + + (getPlugin().getGroupTagPlayerCount("HG") + getPlugin().getGroupTagPlayerCount("SG2")) + C.Reset + + " other players!" + }).setHideInfo(true).build()); - setItem(6, ItemStackFactory.Instance.CreateStack(Material.GOLDEN_APPLE.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "UHC " + C.cGray + "Ultra Hardcore Mode", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Extremely hard team-based survival ", - ChatColor.RESET + "Gather materials and fight your way", - ChatColor.RESET + "to become the last team standing!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("UHC") + ChatColor.RESET + " other players!", - })); + setItem(4, new ItemBuilder(Material.FEATHER) + .setTitle(C.Reset + C.Bold + C.cYellow + "Skywars " + C.cGray + "Solo/Team Survival").addLore(new String[] + { + C.Reset + "", + C.Reset + "16 contenders fight to rule the skies!", + C.Reset + "Spawn on a sky island and build your path!", + C.Reset + "Find weapons to take your enemies down!", + C.Reset + "Up in the skies, death looming if you fall..", + C.Reset + "Win! Fight! Send enemies flying in Skywars!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + + (getPlugin().getGroupTagPlayerCount("SKY") + getPlugin().getGroupTagPlayerCount("SKY2")) + C.Reset + + " other players!", + }).setHideInfo(true).build()); - setItem(8, ItemStackFactory.Instance.CreateStack(Material.BLAZE_ROD.getId(), (byte) 0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Wizards " + C.cGray + "Last Man Standing", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Wield powerful spells to fight", - ChatColor.RESET + "against other players in this", - ChatColor.RESET + "exciting free-for-all brawl!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("WIZ") + ChatColor.RESET + " other players!", - })); + setItem(6, new ItemBuilder(Material.GOLDEN_APPLE) + .setTitle(C.Reset + C.Bold + C.cYellow + "UHC " + C.cGray + "Ultra Hardcore Mode").addLore(new String[] + { + C.Reset + "", + C.Reset + "Extremely hard team-based survival ", + C.Reset + "Gather materials and fight your way", + C.Reset + "to become the last team standing!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("UHC") + C.Reset + " other players!", + }).setHideInfo(true).build()); - setItem(18, ItemStackFactory.Instance.CreateStack(Material.DIAMOND_CHESTPLATE, (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Castle Siege " + C.cGray + "Team Game", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Defenders must protect King Sparklez", - ChatColor.RESET + "from the endless waves of Undead", - ChatColor.RESET + "until the sun rises!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("CS") + ChatColor.RESET + " other players!", - })); + setItem(8, new ItemBuilder(Material.BLAZE_ROD) + .setTitle(C.Reset + C.Bold + C.cYellow + "Wizards " + C.cGray + "Last Man Standing").addLore(new String[] + { + C.Reset + "", + C.Reset + "Wield powerful spells to fight", + C.Reset + "against other players in this", + C.Reset + "exciting free-for-all brawl!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("WIZ") + C.Reset + " other players!", + }).setHideInfo(true).build()); - setItem(20, ItemStackFactory.Instance.CreateStack(Material.GRASS.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Block Hunt " + C.cGray + "Cat and Mouse", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Hide as blocks/animals, upgrade your ", - ChatColor.RESET + "weapon and fight to survive against", - ChatColor.RESET + "the Hunters!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("BH") + ChatColor.RESET + " other players!", - })); + setItem(18, new ItemBuilder(Material.DIAMOND_CHESTPLATE) + .setTitle(C.Reset + C.Bold + C.cYellow + "Castle Siege " + C.cGray + "Team Game").addLore(new String[] + { + 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 + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("CS") + C.Reset + " other players!", + }).setHideInfo(true).build()); + + setItem(20, new ItemBuilder(Material.GRASS) + .setTitle(C.Reset + C.Bold + C.cYellow + "Block Hunt " + C.cGray + "Cat and Mouse").addLore(new String[] + { + C.Reset + "", + C.Reset + "Hide as blocks/animals, upgrade your ", + C.Reset + "weapon and fight to survive against", + C.Reset + "the Hunters!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("BH") + C.Reset + " other players!", + }).setHideInfo(true).build()); setItem(22, _superSmashCycle.get(_ssmIndex)); - setItem(24, ItemStackFactory.Instance.CreateStack(Material.TNT.getId(), (byte) 0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Mine-Strike " + C.cGray + "Team Survival", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "One team must defend two bomb sites from", - ChatColor.RESET + "the other team, who are trying to plant a bomb", - ChatColor.RESET + "and blow them up!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("MS") + ChatColor.RESET + " other players!", - })); - - setItem(26, ItemStackFactory.Instance.CreateStack(Material.BOOK_AND_QUILL.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Draw My Thing " + C.cGray + "Pictionary!", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Players take turns at drawing a random", - ChatColor.RESET + "word. Whoever guesses it within the time", - ChatColor.RESET + "limit gets some points!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("DMT") + ChatColor.RESET + " other players!", - })); - - setItem(36, ItemStackFactory.Instance.CreateStack(Material.BEACON.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Dominate " + C.cGray + "Team Game", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Customize one of five exciting champions", - ChatColor.RESET + "and battle with the opposing team for the", - ChatColor.RESET + "control points on the map.", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("DOM") + ChatColor.RESET + " other players!", - })); - - setItem(38, ItemStackFactory.Instance.CreateStack(Material.GOLD_SWORD.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Team Deathmatch " + C.cGray + "Team Game", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Customize one of five exciting champions", - ChatColor.RESET + "and battle with the opposing team to the", - ChatColor.RESET + "last man standing.", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("TDM") + ChatColor.RESET + " other players!", - })); - - setItem(40, ItemStackFactory.Instance.CreateStack(Material.WOOD.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Master Builders " + C.cGray + "Creative Build", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Players are given a Build Theme and ", - ChatColor.RESET + "must use blocks, monsters and more", - ChatColor.RESET + "to create a masterpiece!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + getPlugin().getGroupTagPlayerCount("BLD") + ChatColor.RESET + " other players!", - })); - + setItem(24, new ItemBuilder(Material.TNT) + .setTitle(C.Reset + C.Bold + C.cYellow + "Mine-Strike " + C.cGray + "Team Survival").addLore(new String[] + { + C.Reset + "", + C.Reset + "One team must defend two bomb sites from", + C.Reset + "the other team, who are trying to plant a bomb", + C.Reset + "and blow them up!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("MS") + C.Reset + " other players!", + }).setHideInfo(true).build()); + + setItem(26, new ItemBuilder(Material.BOOK_AND_QUILL) + .setTitle(C.Reset + C.Bold + C.cYellow + "Draw My Thing " + C.cGray + "Pictionary!").addLore(new String[] + { + C.Reset + "", + C.Reset + "Players take turns at drawing a random", + C.Reset + "word. Whoever guesses it within the time", + C.Reset + "limit gets some points!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("DMT") + C.Reset + " other players!", + }).setHideInfo(true).build()); + + setItem(36, new ItemBuilder(Material.BEACON).setTitle(C.Reset + C.Bold + C.cYellow + "Dominate " + C.cGray + "Team Game") + .addLore(new String[] + { + C.Reset + "", + C.Reset + "Customize one of five exciting champions", + C.Reset + "and battle with the opposing team for the", + C.Reset + "control points on the map.", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("DOM") + C.Reset + " other players!", + }).setHideInfo(true).build()); + + setItem(38, new ItemBuilder(Material.GOLD_SWORD) + .setTitle(C.Reset + C.Bold + C.cYellow + "Team Deathmatch " + C.cGray + "Team Game").addLore(new String[] + { + C.Reset + "", + C.Reset + "Customize one of five exciting champions", + C.Reset + "and battle with the opposing team to the", + C.Reset + "last man standing.", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("TDM") + C.Reset + " other players!", + }).setHideInfo(true).build()); + + setItem(40, new ItemBuilder(Material.WOOD) + .setTitle(C.Reset + C.Bold + C.cYellow + "Master Builders " + C.cGray + "Creative Build").addLore(new String[] + { + C.Reset + "", + C.Reset + "Players are given a Build Theme and ", + C.Reset + "must use blocks, monsters and more", + C.Reset + "to create a masterpiece!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + getPlugin().getGroupTagPlayerCount("BLD") + C.Reset + " other players!", + }).setHideInfo(true).build()); + setItem(42, _minigameCycle.get(_minigameIndex)); - setItem(44, ItemStackFactory.Instance.CreateStack(Material.SKULL_ITEM.getId(), (byte) 3, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Player Servers " + C.cGray + "Player Hosted Games", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Join your friends in their own ", - ChatColor.RESET + "Mineplex Player Server. You can play", - ChatColor.RESET + "the games you want, when you want.", - ChatColor.RESET + "", - })); + setItem(44, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 3) + .addLore(C.Reset + C.Bold + C.cYellow + "Player Servers " + C.cGray + "Player Hosted Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Join your friends in their own ", + C.Reset + "Mineplex Player Server. You can play", + C.Reset + "the games you want, when you want.", + C.Reset + "", + }).setHideInfo(true).build()); getButtonMap().put(0, new SelectBRButton(this)); getButtonMap().put(2, new SelectSGButton(this)); getButtonMap().put(4, new SelectSKYButton(this)); getButtonMap().put(6, new SelectUHCButton(this)); getButtonMap().put(8, new SelectWIZButton(this)); - + getButtonMap().put(18, new SelectCSButton(this)); getButtonMap().put(20, new SelectBHButton(this)); getButtonMap().put(22, new SelectSSMButton(this)); @@ -204,271 +221,280 @@ public class ServerGameMenu extends ShopPageBase getButtonMap().put(40, new SelectBLDButton(this)); getButtonMap().put(42, new SelectMINButton(this)); getButtonMap().put(44, new SelectPLAYERButton(this)); -// getButtonMap().put(44, new SelectBETAButton(this)); + // getButtonMap().put(44, new SelectBETAButton(this)); } @SuppressWarnings("deprecation") private void createMinigameCycle() { - int playerCount = getPlugin().getGroupTagPlayerCount("MIN") + - getPlugin().getGroupTagPlayerCount("DR") + - getPlugin().getGroupTagPlayerCount("DE") + - getPlugin().getGroupTagPlayerCount("PB") + - getPlugin().getGroupTagPlayerCount("TF") + - getPlugin().getGroupTagPlayerCount("RUN") + - getPlugin().getGroupTagPlayerCount("SN") + - getPlugin().getGroupTagPlayerCount("DT") + - getPlugin().getGroupTagPlayerCount("SQ") + - getPlugin().getGroupTagPlayerCount("SA") + - getPlugin().getGroupTagPlayerCount("SS") + - getPlugin().getGroupTagPlayerCount("OITQ"); - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(98, (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(Material.GOLD_BOOTS.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(122, (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(Material.BOW, (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(Material.LEATHER_BOOTS.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(Material.MILK_BUCKET.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(Material.MILK_BUCKET.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(Material.DIAMOND_BARDING.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(159, (byte)14, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(309, (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Death Tag", - ChatColor.RESET + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); - - _minigameCycle.add(ItemStackFactory.Instance.CreateStack(319, (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Arcade " + C.cGray + "Mixed Games", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Play all of these fun minigames:", - ChatColor.RESET + "", - ChatColor.RESET + "Super Spleef", - ChatColor.RESET + "Runner", - ChatColor.RESET + "Dragons", - ChatColor.RESET + "One in the Quiver", - ChatColor.RESET + "Dragon Escape", - ChatColor.RESET + "Sneaky Assassins", - ChatColor.RESET + "Micro Battle", - ChatColor.RESET + "Super Paintball", - ChatColor.RESET + "Turf Wars", - ChatColor.RESET + "Death Tag", - ChatColor.RESET + C.Bold + ChatColor.GREEN + "Bacon Brawl", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + playerCount + ChatColor.RESET + " other players!", - })); + int playerCount = getPlugin().getGroupTagPlayerCount("MIN") + getPlugin().getGroupTagPlayerCount("DR") + + getPlugin().getGroupTagPlayerCount("DE") + getPlugin().getGroupTagPlayerCount("PB") + + getPlugin().getGroupTagPlayerCount("TF") + getPlugin().getGroupTagPlayerCount("RUN") + + getPlugin().getGroupTagPlayerCount("SN") + getPlugin().getGroupTagPlayerCount("DT") + + getPlugin().getGroupTagPlayerCount("SQ") + getPlugin().getGroupTagPlayerCount("SA") + + getPlugin().getGroupTagPlayerCount("SS") + getPlugin().getGroupTagPlayerCount("OITQ"); + _minigameCycle.add(new ItemBuilder(Material.SMOOTH_BRICK) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + C.Bold + C.cGreen + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.GOLD_BOOTS) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + C.Bold + C.cGreen + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.DRAGON_EGG) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + C.Bold + C.cGreen + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.BOW) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + C.Bold + C.cGreen + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.LEATHER_BOOTS) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + C.Bold + C.cGreen + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.MILK_BUCKET) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + C.Bold + C.cGreen + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.MILK_BUCKET) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + C.Bold + C.cGreen + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.DIAMOND_BARDING) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + C.Bold + C.cGreen + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.STAINED_CLAY, 1, (byte) 14) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + C.Bold + C.cGreen + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.IRON_BOOTS) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + C.Bold + C.cGreen + "Death Tag", + C.Reset + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); + + _minigameCycle.add(new ItemBuilder(Material.PORK) + .setTitle(C.Reset + C.Bold + C.cYellow + "Arcade " + C.cGray + "Mixed Games").addLore(new String[] + { + C.Reset + "", + C.Reset + "Play all of these fun minigames:", + C.Reset + "", + C.Reset + "Super Spleef", + C.Reset + "Runner", + C.Reset + "Dragons", + C.Reset + "One in the Quiver", + C.Reset + "Dragon Escape", + C.Reset + "Sneaky Assassins", + C.Reset + "Micro Battle", + C.Reset + "Super Paintball", + C.Reset + "Turf Wars", + C.Reset + "Death Tag", + C.Reset + C.Bold + C.cGreen + "Bacon Brawl", + C.Reset + "", + C.Reset + "Join " + C.cGreen + playerCount + C.Reset + " other players!", + }).setHideInfo(true).build()); } private void createSuperSmashCycle() { - String[] desc = new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Pick from a selection of monsters,", - ChatColor.RESET + "then battle other players to the ", - ChatColor.RESET + "death with your monsters skills!", - ChatColor.RESET + "", - ChatColor.RESET + "Join " + ChatColor.GREEN + (getPlugin().getGroupTagPlayerCount("SSM") + getPlugin().getGroupTagPlayerCount("SSM2")) + ChatColor.RESET + " other players!", - }; - - _superSmashCycle.add(ItemStackFactory.Instance.CreateStack(397, (byte)4, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Super Smash Mobs " + C.cGray + "Solo/Team Deathmatch", desc)); + String[] desc = new String[] + { + C.Reset + "", + C.Reset + "Pick from a selection of monsters,", + C.Reset + "then battle other players to the ", + C.Reset + "death with your monsters skills!", + C.Reset + "", + C.Reset + "Join " + C.cGreen + + (getPlugin().getGroupTagPlayerCount("SSM") + getPlugin().getGroupTagPlayerCount("SSM2")) + C.Reset + + " other players!", + }; + + _superSmashCycle.add(new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 4) + .setTitle(C.Reset + C.Bold + C.cYellow + "Super Smash Mobs " + C.cGray + "Solo/Team Deathmatch").addLore(desc) + .setHideInfo(true).build()); } public void Update() { _ssmIndex++; _minigameIndex++; - + if (_ssmIndex >= _superSmashCycle.size()) _ssmIndex = 0; - + if (_minigameIndex >= _minigameCycle.size()) _minigameIndex = 0; - + buildPage(); } @@ -491,12 +517,12 @@ public class ServerGameMenu extends ShopPageBase { getPlugin().getCastleSiegeShop().attemptShopOpen(player); } - + public void OpenBR(Player player) { getPlugin().getBridgesShop().attemptShopOpen(player); } - + public void OpenBH(Player player) { getPlugin().getBlockHuntShop().attemptShopOpen(player); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerTypePage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerTypePage.java index 3c909f545..2f05cb7ad 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerTypePage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerTypePage.java @@ -18,6 +18,7 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.UtilTime; import mineplex.core.donation.DonationManager; import mineplex.core.game.GameDisplay; +import mineplex.core.itemstack.ItemBuilder; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; @@ -35,11 +36,11 @@ public class ServerTypePage extends ShopPageBase private ServerGroup _serverGroup; - public ServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, DonationManager donationManager, - Player player, ServerGroup serverGroup) + public ServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, + DonationManager donationManager, Player player, ServerGroup serverGroup) { super(plugin, shop, clientManager, donationManager, serverGroup.getServerNpcName(), player, 27); - + _serverGroup = serverGroup; buildPage(); @@ -49,23 +50,25 @@ public class ServerTypePage extends ShopPageBase protected void buildPage() { String friendlyName = _serverGroup.getServerNpcName(); - - setItem(12, ItemStackFactory.Instance.CreateStack(Material.SKULL_ITEM.getId(), (byte)3, 1, ChatColor.RESET + C.cYellow + "Solo " + friendlyName, new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + C.cRed + C.Bold + "WARNING: " + ChatColor.RESET + "Teaming in Solo Mode is bannable!", - ChatColor.RESET + "", - ChatColor.RESET + C.cGreen + "Click to Play", - })); - - setItem(14, ItemStackFactory.Instance.CreateStack(Material.SKULL_ITEM.getId(), (byte)3, 2, ChatColor.RESET + C.cYellow + "Team " + friendlyName, new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + C.cGray + "2 Player Teams", - ChatColor.RESET + "", - ChatColor.RESET + C.cGreen + "Click to Play" - })); - + + setItem(12, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 3).setTitle(C.Reset + C.cYellow + "Solo " + friendlyName) + .addLore(new String[] + { + C.Reset + "", + C.Reset + C.cRed + C.Bold + "WARNING: " + C.Reset + "Teaming in Solo Mode is bannable!", + C.Reset + "", + C.Reset + C.cGreen + "Click to Play", + }).build()); + + setItem(14, new ItemBuilder(Material.SKULL_ITEM, 2, (byte) 3).setTitle(C.Reset + C.cYellow + "Team " + friendlyName) + .addLore(new String[] + { + C.Reset + "", + C.Reset + C.cGray + "2 Player Teams", + C.Reset + "", + C.Reset + C.cGreen + "Click to Play" + }).build()); + getButtonMap().put(12, new SelectTypeButton(this, false)); getButtonMap().put(14, new SelectTypeButton(this, true)); } @@ -77,14 +80,16 @@ public class ServerTypePage extends ShopPageBase } public void selectServer(Player player, boolean team) - { + { if (team) { - getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), _serverGroup.getServerNpcName() + " Teams", player, _serverGroup.getTeamServerKey())); + getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), + getDonationManager(), _serverGroup.getServerNpcName() + " Teams", player, _serverGroup.getTeamServerKey())); } else { - getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), _serverGroup.getServerNpcName() + " Solo", player, _serverGroup.getPrefix())); + getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), + getDonationManager(), _serverGroup.getServerNpcName() + " Solo", player, _serverGroup.getPrefix())); } } } From e7213fdb7e212986226022ecdd676df75e78da38 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 13 Dec 2015 16:41:37 +1300 Subject: [PATCH 178/223] Remove project specific settings --- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 12 ------------ .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 11 ----------- .../.settings/org.eclipse.jdt.core.prefs | 15 --------------- 13 files changed, 148 deletions(-) delete mode 100644 Plugins/Mineplex.Bungee.Mineplexer/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.BungeeRotator/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.Core.Common/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.DDoSProtectionSwitcher/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.EnjinTranslator/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.Game.Clans/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.Hub/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.MapParser/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.Minecraft.Game.ClassCombat/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.Minecraft.Game.Core/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Mineplex.PlayerCache/.settings/org.eclipse.jdt.core.prefs delete mode 100644 Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs diff --git a/Plugins/Mineplex.Bungee.Mineplexer/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Bungee.Mineplexer/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.Bungee.Mineplexer/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.BungeeRotator/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.BungeeRotator/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.BungeeRotator/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.Core.Common/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Core.Common/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.Core.Common/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index d17b6724d..000000000 --- a/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.DDoSProtectionSwitcher/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.DDoSProtectionSwitcher/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.DDoSProtectionSwitcher/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.EnjinTranslator/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.EnjinTranslator/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.EnjinTranslator/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.Game.Clans/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Game.Clans/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.Game.Clans/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.Hub/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Hub/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.Hub/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.MapParser/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.MapParser/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.MapParser/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Minecraft.Game.ClassCombat/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.Minecraft.Game.Core/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Minecraft.Game.Core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.Minecraft.Game.Core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Mineplex.PlayerCache/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.PlayerCache/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7341ab168..000000000 --- a/Plugins/Mineplex.PlayerCache/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs b/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bfbbfb4d1..000000000 --- a/Plugins/Nautilus.Game.Arcade/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,15 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert From 011a194dc641a5ae67d76b07c39bf428df0d60a2 Mon Sep 17 00:00:00 2001 From: Cheese Date: Sun, 13 Dec 2015 21:14:57 +1100 Subject: [PATCH 179/223] fixed exploit --- .../src/nautilus/game/arcade/managers/HolidayManager.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java index ba2c0d8cd..2328f93dc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -304,14 +304,16 @@ public class HolidayManager implements Listener if (Manager.GetGame() != null && !Manager.GetGame().IsAlive(event.getPlayer())) return; - if (!_active.contains(event.getClickedBlock())) - return; - specialBlockBreak(event.getPlayer(), event.getClickedBlock()); } private void specialBlockBreak(Player player, final Block block) { + if (!_active.contains(block)) + return; + + _active.remove(block); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, type.getBlockType()); block.setType(Material.AIR); From 4fad564e158ccc47a37ed534c1b70d38b727fe30 Mon Sep 17 00:00:00 2001 From: William Burns Date: Sun, 13 Dec 2015 12:50:06 +0000 Subject: [PATCH 180/223] Bug fixes. Title shortened. --- .../game/games/gladiators/Gladiators.java | 37 +++++++------------ .../gladiators/trackers/FlawlessTracker.java | 9 +++-- .../trackers/UntouchableTracker.java | 7 ++-- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index b03240656..1ce069c88 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -4,7 +4,6 @@ import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; @@ -109,13 +108,13 @@ public class Gladiators extends SoloGame EnableTutorials = false; BlockBreakAllow.add(Material.SUGAR_CANE_BLOCK.getId()); - BlockBreakAllow.add(Material.GRASS.getId()); + BlockBreakAllow.add(Material.DEAD_BUSH.getId()); BlockBreakAllow.add(Material.LONG_GRASS.getId()); registerStatTrackers( new BrawlerTracker(this), - //new UntouchableTracker(this), - //new FlawlessTracker(this), + new UntouchableTracker(this), + new FlawlessTracker(this), new PrecisionTracker(this), new SwiftKillTracker(this) ); @@ -529,8 +528,6 @@ public class Gladiators extends SoloGame a.setState(ArenaState.WAITING); } - UtilTextMiddle.display(C.cGreen + "Gladiators!", C.cGreen + "Defeat your opponent to advance", 20, 60, 20); - return; } @@ -541,6 +538,12 @@ public class Gladiators extends SoloGame //closeUnusedArenas(); } + @EventHandler + public void helpMessage(PlayerPrepareTeleportEvent e) + { + UtilTextMiddle.display(C.cGreen + "Gladiators!", C.cGreen + "Defeat your opponent to advance", 20, 20 * 7, 20); + } + /** *------------------- * MAIN UPDATE METHOD @@ -559,9 +562,6 @@ public class Gladiators extends SoloGame { _roundState = RoundState.STARTING_5; - if (_firstRound) - return; - UtilTextMiddle.display("", C.cGreen + C.Bold + getRoundNotation(), 0, 80 , 0); _furthestOutCurrent = getFurthestOut(); // Find furthest out for fight. @@ -819,9 +819,6 @@ public class Gladiators extends SoloGame { _roundState = RoundState.STARTING_2; - if (_firstRound) - return; - UtilTextMiddle.display(C.cGreen + "3", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); for (Player p : UtilServer.getPlayers()) @@ -832,9 +829,6 @@ public class Gladiators extends SoloGame { _roundState = RoundState.STARTING_1; - if (_firstRound) - return; - UtilTextMiddle.display(C.cYellow + "2", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); for (Player p : UtilServer.getPlayers()) @@ -845,9 +839,6 @@ public class Gladiators extends SoloGame { _roundState = RoundState.STARTED; - if (_firstRound) - return; - UtilTextMiddle.display(C.cGold + "1", C.cGreen + C.Bold + getRoundNotation(), 0, 80, 0); for (Player p : UtilServer.getPlayers()) @@ -858,11 +849,11 @@ public class Gladiators extends SoloGame { _roundState = RoundState.FIGHTING; - if (_firstRound) - { - _firstRound = false; - return; - } +// if (_firstRound) +// { +// _firstRound = false; +// return; +// } UtilTextMiddle.display(C.cRed + "FIGHT", C.cGreen + C.Bold + getRoundNotation(), 0, 40, 0); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java index ebdbad1cf..1d772bbc2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/FlawlessTracker.java @@ -7,6 +7,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.games.gladiators.Gladiators; @@ -29,16 +30,16 @@ public class FlawlessTracker extends StatTracker } @EventHandler - public void onDmg(EntityDamageEvent e) + public void onDmg(CustomDamageEvent e) { if (e.isCancelled()) return; - System.out.println(e.getEventName() + " took damage by " + e.getCause().toString()); + //System.out.println(e.getEventName() + " took damage by " + e.GetCause().toString()); - if (e.getEntity() instanceof Player) + if (e.GetDamageeEntity() instanceof Player) { - _noWin.add(((Player)e.getEntity()).getName()); + _noWin.add(((Player)e.GetDamageeEntity()).getName()); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java index 44115ca72..ef357d6a5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/trackers/UntouchableTracker.java @@ -7,6 +7,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.games.gladiators.Gladiators; import nautilus.game.arcade.game.games.gladiators.events.RoundStartEvent; import nautilus.game.arcade.stats.StatTracker; @@ -27,14 +28,14 @@ public class UntouchableTracker extends StatTracker } @EventHandler - public void onDmg(EntityDamageEvent e) + public void onDmg(CustomDamageEvent e) { if (e.isCancelled()) return; - if (e.getEntity() instanceof Player) + if (e.GetDamageeEntity() instanceof Player) { - _noWin.add(((Player)e.getEntity()).getName()); + _noWin.add(((Player)e.GetDamageeEntity()).getName()); } } From e31124e21274e64b1e1b4cb53ccb9bc54edd48e1 Mon Sep 17 00:00:00 2001 From: William Burns Date: Sun, 13 Dec 2015 13:29:46 +0000 Subject: [PATCH 181/223] Health looks nicer. --- .../nautilus/game/arcade/game/games/gladiators/Gladiators.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index 1ce069c88..d0e777d61 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -1039,7 +1039,7 @@ public class Gladiators extends SoloGame if (e.GetLog().GetKiller().IsPlayer()) { Player killer = UtilPlayer.searchExact(e.GetLog().GetKiller().GetName()); - ((Player)e.GetEvent().getEntity()).sendMessage(F.main("Game", "Your killer had " + C.cRed + new DecimalFormat("#").format(killer.getHealth()) + "❤" + C.cGray + " left.")); + ((Player)e.GetEvent().getEntity()).sendMessage(F.main("Game", "Your killer had " + C.cRed + (new DecimalFormat("#.#").format((killer.getHealth() / 2))) + "❤" + C.cGray + " left.")); } } From 677e95a7fdd25fa11fbbe334374b7ff34f7ab160 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Sun, 13 Dec 2015 14:05:28 -0500 Subject: [PATCH 182/223] Update IntellIJ grouping --- Plugins/.idea/modules.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Plugins/.idea/modules.xml b/Plugins/.idea/modules.xml index a8626a3f1..a734c3f2e 100644 --- a/Plugins/.idea/modules.xml +++ b/Plugins/.idea/modules.xml @@ -8,16 +8,16 @@ - - - - + + + + - + From d91e4ab4f756746b31c7ebdd3e7d33c139ea7d30 Mon Sep 17 00:00:00 2001 From: William Burns Date: Sun, 13 Dec 2015 20:27:37 +0000 Subject: [PATCH 183/223] Another door bug, and a title fix. --- .../arcade/game/games/gladiators/Arena.java | 28 ++++++------------- .../game/games/gladiators/Gladiators.java | 20 +++++++++++++ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java index ec26ae9e9..45e707110 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Arena.java @@ -42,7 +42,7 @@ public class Arena private ArenaState _state; private long _stateTime; - private boolean _alertedAlready; + private ArrayList _alreadyAlertedPleaseWait; private boolean _alertedAlready2; private HashMap> _particles; @@ -62,7 +62,7 @@ public class Arena _stateTime = System.currentTimeMillis(); _particles = new HashMap<>(); _doBye = false; - _alertedAlready = false; + _alreadyAlertedPleaseWait = new ArrayList<>(); _alertedAlready2 = false; setupSpawns(); @@ -174,16 +174,6 @@ public class Arena return null; } - public boolean isAlertedAlready() - { - return _alertedAlready; - } - - public void setAlertedAlready(boolean alertedAlready) - { - _alertedAlready = alertedAlready; - } - private void setupSpawns() { ArrayList possible = (ArrayList) _host.WorldData.GetDataLocs("BLACK").clone(); @@ -309,15 +299,15 @@ public class Arena if (_host.getRoundState() != RoundState.FIGHTING) return; - if (_alertedAlready) - return; - for (Player p : getPastPlayers()) { - UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20 * 100, 0, p); - } + if (_alreadyAlertedPleaseWait.contains(p)) + continue; - _alertedAlready = true; + UtilTextMiddle.display(C.cAqua + "Please Wait", "The next round will start shortly", 0, 20 * 120, 0, p); // 2 min + + _alreadyAlertedPleaseWait.add(p); + } } else if (_state.equals(ArenaState.FIGHTING)) { @@ -346,7 +336,7 @@ public class Arena if (_alertedAlready2) continue; - UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20 * 100, 0, p); + UtilTextMiddle.display(C.cGreen + "Next Battle", "Follow the particles", 0, 20 * 120, 0, p); // 2 min } _alertedAlready2 = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index d0e777d61..ddb562ae1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -676,6 +676,7 @@ public class Gladiators extends SoloGame { //p.sendMessage("bounce. closest = " + closest.toString() + " player arena = " + _playerArenas.get(p).toString()); UtilAction.velocity(p, UtilAlg.getTrajectory2d(e.getTo(), p.getLocation()), 1.7, true, 0.2, 0, 3, true); + sendPlayerArenaBounceCheck(p); } return; @@ -693,6 +694,25 @@ public class Gladiators extends SoloGame } } + private void sendPlayerArenaBounceCheck(final Player p) + { + Manager.getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() + { + @Override + public void run() + { + if (!GetPlayers(true).contains(p)) + return; + + Arena closest = getArenaByMid(UtilAlg.findClosest(p.getLocation(), getAllArenaMids())); + if (closest != _playerArenas.get(p)) + { + p.teleport(UtilAlg.findClosest(p.getLocation(), _playerArenas.get(p).getSpawns())); + } + } + }, 20L); + } + @EventHandler public void arenaChange(PlayerChangeArenaEvent e) { From 64fb2b11d853f0d19aecb984be9285f9e7ebdcde Mon Sep 17 00:00:00 2001 From: xGamingDudex Date: Sun, 13 Dec 2015 23:09:25 +0100 Subject: [PATCH 184/223] Added fake skin data +Moved hats to use fake non-changing skin data +Added Rudolph hat +Added Grinch hat +Added suport for fake skins on DisguisePlayer +Tweaked PartyPopper --- .../mineplex/core/common/skin/SkinData.java | 84 +++++++++++++++++++ .../core/cosmetic/ui/page/GadgetPage.java | 35 +++++++- .../core/cosmetic/ui/page/HatPage.java | 11 --- .../core/disguise/DisguiseManager.java | 63 +++++++------- .../disguise/disguises/DisguisePlayer.java | 33 ++++++-- .../mineplex/core/gadget/GadgetManager.java | 2 + .../core/gadget/gadgets/hat/HatGrinch.java | 3 +- .../core/gadget/gadgets/hat/HatPresent.java | 3 +- .../core/gadget/gadgets/hat/HatRudolph.java | 21 +++++ .../core/gadget/gadgets/hat/HatSanta.java | 3 +- .../core/gadget/gadgets/hat/HatSnowman.java | 3 +- .../gadget/gadgets/item/ItemPartyPopper.java | 2 +- .../mineplex/core/gadget/types/HatGadget.java | 6 ++ 13 files changed, 212 insertions(+), 57 deletions(-) create mode 100644 Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatRudolph.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 new file mode 100644 index 000000000..02e8f476a --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/skin/SkinData.java @@ -0,0 +1,84 @@ +package mineplex.core.common.skin; + +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; + +import net.minecraft.server.v1_8_R3.Item; +import net.minecraft.server.v1_8_R3.MinecraftKey; +import net.minecraft.server.v1_8_R3.NBTTagCompound; +import net.minecraft.server.v1_8_R3.NBTTagList; +import net.minecraft.server.v1_8_R3.NBTTagString; + +public class SkinData +{ + + private static long _nameCount = -99999999999999L; + + public final static SkinData MOOSHROOM = new SkinData("eyJ0aW1lc3RhbXAiOjE0NDk4NzI0OTU0MTcsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzIxOWJlYTU0Y2FkN2Q1OGFiNWRhNDA2YjBhOTJhYjNhODI0MjI1MjY2Nzc3ZTUzNGI3ZGI2YzM3MmRkZmY3ZiJ9fX0=","UoSif81+UyvkcaanU8KAMYBpw9mefAmWehE2liDUFvk+y0X/9NovsxTYVpIDCltTSpLW3sNgamvbj4Ybs+s6DbudPiEkvh0ER7Bv2v29UJw7RzIdr6/1g548X12zcnh5iPGz/P75uNRnSfTFQx0ed8P/GNkPIjWpDuJFxEj6KcPzrCAGMx+BVw1VwryBIYf9cCDHky8z0bxR89rjiIvPTBFI6MRhqI3vgpEBTySHDS+Ki0Hwl5oa3PwS6+jgYx/4RSfFsb+BawcvDk2Xpkt5UimvqZ5BceYLIfCt4KbShYipgLXLfYUZrntjPemd3SxthjxUuA07i44UxRdiC8uqy1twLT/HUS28gpk68lA/id9tKFwu1CUzshgcmvQPt3ghtNViNziR/2t7D/+5D31Vzmhf6n7Pnpdirt/5frMi2BKMMs7pLa0EF8CrrDU7QCwPav+EZVGFvVZbxSkCDq+n3IQ3PUWSCzy6KPxpdOlUjD0pAfLoiNj0P8u4+puQtID76r/St8ExchYl2dodUImu1ZETWeFUClF3ZGat62evx8uRQEI2W4dsVwj40VUfjaAuvyDzuouaKTrCzJXLQZZjR1B8URvuK61fGX0nhW607mEi6DE+nxP2ZoBrROEX4e37Ap6+TQn9Q8tKDPdcxtwSOpPO4Qkncjn/mGtP9lZU/DQ="); + public final static SkinData SANTA = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTAwMTk4Nzk5NDIsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzEzMTgxYWViODQzODk3NzM1ZDQwMmIyNDk2OTQxNmZkYjBjZTM0YTZiOTM3ODE2MjQzNzU2ZTlkYWU1OGUzIn19fQ==","NZvsNu+HQ5uvGWq6O8VNDGq9A145bmk2IkHiz916uRVPMRqqCI/zwhKWNLlFACE/feuLkhYAois29ec6sVVOtHIoNA+S5q1Mb/Vjc3TJQxzqmx2FZOhJiIttFwYuo9WomQKBqrPMSJ9tpQig4wzoqldeeTjWC3dLz7JeX+gkzinryVjG7NNN9L5hXK5/BBxRcrtwmXJfUlSANyrd8RZW7mEUgU8yxlzdqTu0w7bZLjQNd4vciwoF3NelXDorMIIqiHTkuQesG91Njtu25VCUDK3nXbqEnZw2ZtxB5fT5G2Omm/vkNSRXc0P7iqchVowdYQcMlQUsp65xpkBbFS4LwjzDkYIfLmF++hePb8z72Gz77FxhO5sRLGreSH227McyL/0CtWNKm9ZZIfQtZZjEZTj9+eiJMCloCMg3yWa1VBOiLHzz0wY6gGklccIImPyXEg7E0dIK8qYseJMhmmBNZ8pDOkbUDp3mRlrQ2iyClgQkbuR63j79IBUaCxmsa3NnrAtaJklzd9mzkHXfMBh2XT7Gl8AhJS6JK5kCvip1rBBI8yjrsjE/E+lyJFIbC4rXxyMDGZWkcdrd7U4ZFYKiLHbzdFRqX+11qs9xO2BvomGXkATCzYmOf2kQ86R6rNN0+JfE4QpKzj2WWt3C8ky2qpuXZz29p0816E3/qseYtgg="); + public final static SkinData SNOWMAN = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTAwMTk3OTM3NTgsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2MyNTM5ZGFkZDUxYmE5ZTg0YzFhOTE1OTY3NWUxZTJiYWM1NmFlNmFlNTMxNTQyZDI1YTlkM2Q1YzQ2ODZmNiJ9fX0=","gvLc0Vo6+1vl17vrFCbK1eNqa4/ix4xiwcWae7WOCvqiVIX4sdIPagOGUrKsDdEhuWCKkTWILGP1K3wYfC9v/0mXZvbu0sRln+APTOsswMkQmbKcA1zTFTMpwEI+nIMzYJSbIx5wjz28K5hDf/umtHH2GADTENdJGGUtU4CyEdeHTzcqIAEV3bcMLkfTKvwKUWqI5gZbbercqmDeGkmXVS9297a9paRX1NfEL9pFT0pjdH3tCjgvvKfAwGC6tYtvTFbfcJocqgI+PI2f5OFf62A4XjWwWFi4wxCHVYNpqs/XTbfF64K7KVE0d9gsLjJoB8DMZPxlNpMFA0R5OIW6Q7Qjyz9IKxUqEYRCQbuUKpHyNDcmVKcTJRwBpCHeqAbTbweZHd5tzrT/terWhLEMsK1+lH2KBfIRIRB9kd3epyShNjSEKoly6uRXVxU+IJtfcq0aFVZlwgG3c1Ds9jbsNJV158e1n6WCmvT00RLdvpcIekwUKODhi3zFeFkrVvV50tGYqXLRZenitLJvDzx4c0IGK4krALrUS0oybinBS7/GmW3Ktz3xbGKZSzzaDw0EKB7Y6XHdb4yqR1xS7lAWgv4cNDEIUSzUDJ7HpmDCIF2A5kPS4XVYFCclyR6qPGD5e+9apVhBMz4lfYlT1IfRAUQlucO4UpAlkXs7ho3pQXU="); + public final static SkinData PRESENT = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTAwMTk3MDIxNjIsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2U2YzRkZWQwNTdjMjhiMTU0NjVkYzQzNmFmODIyYTNkZTY4NzgyZTZjMzgyOGMzMmFhYWE4ZjRiOTIzOWVjIn19fQ==","rJNlxTqHHmOoWwbXdMQLcj0P9w/PIr/hWKXH0nbhm/S2CFo/zfefffZlnQmpKCgn1Y8tXvcRwLGQ4CLpm9m2ZrKprSWRhrnOtZWYabrhExQESEammS3TY81VoNt+4On0pAGBippz/bRfWLuDne2rDbhuljnqvxjROmxpky7gRCU06VMlm2WLFC5XYJkiAaOXBqzpiHMMRPNnCvtcbtpILKi/Luj302eyN8nRKjHHbbiDmttwvlshxZ8UxJHvALtM506IUHba10Q6QX2zCeDAU5/WYRKa6e19r8plROcgGbKYFSq8JW5cWuWT3/rveZM6FnU6ABn9DWsCyfQ5wr2jdBd+xaevGTAScRHA5J493GqL1bBZYKj9yhQFtxJHCAf0++raAVPCZgyPtwTth4TAQisn8gnhM5R+txnW6xK+oflLy0dwEN1YdPLN/h7yuDnyjSMDe9RZT2NKMjok2C6Kux4WBI0KFXKC5Gqwa3Htku4v3WEOWMaVoWOtchQ9BzpQ/etD0ylmzjALQLB+HtndEEm1Jd3tmob42X4hBE8hCce7C3EtGINB33dlx4CK1xBqyGTJEqi69DJRzVL99u98+7kJ1Db9+MaPOfI4B2RY3XbvnSYwecandY//A3bb19FGSdl299ZXbp4zpm8fivzeB1rUAhhmtaA3Iwu/nEQNMkU="); + public final static SkinData RUDOLPH = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTAwMTk1NjgxODIsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2IzZjdlMjhiNTJkZjJjZjhlZWM2NDk2ZmM0NWFlMGQ2NTM0Njc5OGIxYWRjNzM3ZDcxYzBmOTRlNDIyMSJ9fX0=","uUBOTe63CL+qRvtsb2g4AjB2YzxE3N6AUqIsTv8n0jYyPsuXpuOmZPSMEdgDVONywEJ1L4XRx05sjnGu56A8vuXmGI/uHQWuMZzbOSjiFfT3DkEm8zEl5AWpH9dz/t8nZ1WYUIwy0pN5VrZqIr1DAkF6AMh/Qy+FGDw1GG9ReRr80eJ0JiRskpkCpCZIGGjrgwNKAM8JOuNZ4gCQOTRC3etrcfls3qmUMFcVlhuB4bydxSR01i2w0A4b5KpufsJjLKw4InWn2+m/druo8hl9sYuusTeItW0MQmZqCAqXCc9YBnRPQ0hDXFgnPxOh3RwGWiZvL4MnWUVmLwZWh/Fk9QmyVbd7zVao0lxS8YNsKtP8j5B+hs4l9qNohhf0A07bt4oPeTtd5fQeOU5N87fUGuUAcpC4gP9U5WpVY5FFPBvLvGbXdV5jpuAQz4lLSoo1grsP9baR2IBvdN/0awjQWoPJfGOttegubkBHwz3LNcVqvZLtX/M13IDHZa6zQZEX0wsnMX60LeWgBWfTON1l2cSgaPTerHFS2EifJ2LvTBife3s9/4XR6Zth3FLFqxI3MSlqT2hVFRPLke6rBqfqPoWOj2MCykQ70IAwb3oTHcJDJ86V2DdNaU2bZ8V4TjaP+nRobsLJOImoPYEPq23MP36X8gbXEIjmuu8S5xRlrrc="); + public final static SkinData THE_GRINCH = new SkinData("eyJ0aW1lc3RhbXAiOjE0NTAwMTYxNDMwMDQsInByb2ZpbGVJZCI6ImE5ZDBjMDcyYmYxOTQwYTFhMTkzNjhkMDlkNTAwMjZlIiwicHJvZmlsZU5hbWUiOiJTcGlyaXR1c1NhbmN0dXMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg4ZWRlOTI3ZDQzOWVmMzliMzFhYzFkYzJhODM5NGZlNzlhY2U4NDMyNzBjYmUxMjg2ZGM3NTE3ZjMxYTk2In19fQ==","ELo594vTzPq9ZmPYOtVr4kim/k19gzmoxEIK1ehS87gwgag5HcgM+P1FMnHIyrmSvTVaMh0NxwXmNS+JETFL7OrmgRYNpkxkkO4VBA0pfSn3dA9ujnXpDnDiWEPxKdMgQspIOOI0Z3esNt3pj8qIj6dWPtGwtso48tjHl2o/kazfa82yvGORlFhGkeEJKQMno/Buc12C0foQw39XI8GjvlSkFN2eH4Fp16RLu8/hf7SqJQC3L1KacvzMW1d8BWEIgACCJDni29+YqxflSqSyYrV4Z+D66S0jYvUUL/vM4/q/p/YWX/vs/FtMtHQTj4PCpAmMNTgfkahuhb6rCvKHukbjA+WhUdwyxSqXU5YnpXCu1M2dzZgiXjIi+fnyn4CmXKindWCQtSwu+mCA2ILv/6vEHoYJgdlz+DXyRkFx+DH4Sl74HBCOXTOq5AGjq5h3LYfsre+UjCCUv8VgxbVprOyj35So7K0m+6faCFVSt35T3RgicDQfdiWUrW7kmHQVvJpvaq9Vu+63F/0X93cwqwaR0buMirxRx7qkFrRunSI4T+9fsN02t1fAieeu80lBSv83wr7BFneSsLsdVAND9xttTb6fClg7anr8/XVEVIkylB4B+ZcWQbH61XP1nn7oFP2VBg1h6XuuLp8FGSgYf/LW+54/KZci/MnanqQE6QQ="); + + private Property _skinProperty; + + public SkinData(String value, String signature) + { + _skinProperty = new Property("textures", value, signature); + } + + public SkinData(GameProfile profile) + { + _skinProperty = profile.getProperties().get("textures").iterator().next(); + } + + public SkinData(Player player) + { + this(((CraftPlayer)player).getProfile()); + } + + public ItemStack getSkull() + { + NBTTagCompound arrayElement = new NBTTagCompound(); + arrayElement.setString("Value", _skinProperty.getValue()); + arrayElement.setString("Signature", _skinProperty.getSignature()); + + NBTTagList textures = new NBTTagList(); + textures.add(arrayElement); + + NBTTagCompound properties = new NBTTagCompound(); + properties.set("textures", textures); + + NBTTagCompound skullOwner = new NBTTagCompound(); + skullOwner.set("Properties", properties); + skullOwner.set("Name", new NBTTagString(getUnusedSkullName())); + + NBTTagCompound tag = new NBTTagCompound(); + tag.set("SkullOwner", skullOwner); + + + net.minecraft.server.v1_8_R3.ItemStack nmsItem = new net.minecraft.server.v1_8_R3.ItemStack(Item.REGISTRY.get(new MinecraftKey("skull")), 1, 3); + nmsItem.setTag(tag); + + + return CraftItemStack.asBukkitCopy(nmsItem); + } + + public Property getProperty() + { + return new Property(_skinProperty.getName(), _skinProperty.getValue(), _skinProperty.getSignature()); + } + + public static String getUnusedSkullName() + { + _nameCount++; + return "_" + _nameCount; + } + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index 8b89c1c83..de8ac1f19 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -4,11 +4,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import net.md_5.bungee.api.ChatColor; - +import org.bukkit.Bukkit; import org.bukkit.Material; 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.common.CurrencyType; @@ -24,6 +25,7 @@ import mineplex.core.donation.DonationManager; import mineplex.core.gadget.gadgets.morph.MorphBlock; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; +import mineplex.core.gadget.types.HatGadget; import mineplex.core.gadget.types.ItemGadget; import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; @@ -188,6 +190,35 @@ public class GadgetPage extends ShopPageBase return; } + if(gadget instanceof HatGadget) + { + ItemStack item = ((HatGadget)gadget).getHelmetItem(); + + ItemMeta im = item.getItemMeta(); + im.setDisplayName(C.cGreen + C.Bold + gadget.GetName()); + + if (gadget.GetActive().contains(getPlayer())) + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Disable"); + + im.setLore(itemLore); + item.setItemMeta(im); + addButton(slot, new ShopItem(item, false, false), new DeactivateGadgetButton(gadget, this)); + } + else + { + itemLore.add(C.cBlack); + itemLore.add(C.cGreen + "Click to Enable"); + + im.setLore(itemLore); + item.setItemMeta(im); + addButton(slot, new ShopItem(item, false, false), new ActivateGadgetButton(gadget, this)); + } + + return; + } + //Standard if (gadget.ownsGadget(getPlayer())) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java index 4ff3ded5a..8ea9fff22 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/HatPage.java @@ -5,8 +5,6 @@ import java.util.List; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.SkullMeta; import mineplex.core.account.CoreClientManager; import mineplex.core.common.util.C; @@ -15,7 +13,6 @@ import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; -import mineplex.core.gadget.types.HatGadget; import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; @@ -40,14 +37,6 @@ public class HatPage extends GadgetPage { addGadget(gadget, slot); - ItemStack item = getItem(slot); - if(item.getType() == Material.SKULL_ITEM) - { - SkullMeta data = (SkullMeta) item.getItemMeta(); - data.setOwner(((SkullMeta)((HatGadget)gadget).getHelmetItem().getItemMeta()).getOwner()); - item.setItemMeta(data); - } - if (getPlugin().getGadgetManager().getActive(getPlayer(), GadgetType.Morph) == gadget) addGlow(slot); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java index 4b39e5a77..ee25da25d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java @@ -9,35 +9,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; -import net.minecraft.server.v1_8_R3.Block; -import net.minecraft.server.v1_8_R3.BlockPosition; -import net.minecraft.server.v1_8_R3.Chunk; -import net.minecraft.server.v1_8_R3.ChunkSection; -import net.minecraft.server.v1_8_R3.EntityTrackerEntry; -import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation; -import net.minecraft.server.v1_8_R3.EntityPlayer; -import net.minecraft.server.v1_8_R3.Packet; -import net.minecraft.server.v1_8_R3.PacketPlayOutBed; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntity; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntityStatus; -import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk; -import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunkBulk; -import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn; -import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutRelEntityMove; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutRelEntityMoveLook; -import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo.PlayerInfoData; -import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntity; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntityVelocity; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntityTeleport; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntityMetadata; -import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving; -import net.minecraft.server.v1_8_R3.PacketPlayOutUpdateAttributes; -import net.minecraft.server.v1_8_R3.PacketPlayOutEntityEquipment; -import net.minecraft.server.v1_8_R3.PacketPlayOutNamedSoundEffect; -import net.minecraft.server.v1_8_R3.WorldServer; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -73,11 +44,39 @@ import mineplex.core.disguise.disguises.DisguisePlayer; import mineplex.core.disguise.disguises.DisguiseRabbit; import mineplex.core.packethandler.IPacketHandler; import mineplex.core.packethandler.PacketHandler; -import mineplex.core.packethandler.PacketVerifier; import mineplex.core.packethandler.PacketInfo; +import mineplex.core.packethandler.PacketVerifier; import mineplex.core.timing.TimingManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import net.minecraft.server.v1_8_R3.Block; +import net.minecraft.server.v1_8_R3.BlockPosition; +import net.minecraft.server.v1_8_R3.Chunk; +import net.minecraft.server.v1_8_R3.ChunkSection; +import net.minecraft.server.v1_8_R3.EntityPlayer; +import net.minecraft.server.v1_8_R3.EntityTrackerEntry; +import net.minecraft.server.v1_8_R3.Packet; +import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation; +import net.minecraft.server.v1_8_R3.PacketPlayOutBed; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntity; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutRelEntityMove; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutRelEntityMoveLook; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityEquipment; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityMetadata; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityStatus; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityTeleport; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityVelocity; +import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk; +import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunkBulk; +import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn; +import net.minecraft.server.v1_8_R3.PacketPlayOutNamedSoundEffect; +import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo; +import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo.PlayerInfoData; +import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntity; +import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving; +import net.minecraft.server.v1_8_R3.PacketPlayOutUpdateAttributes; +import net.minecraft.server.v1_8_R3.WorldServer; public class DisguiseManager extends MiniPlugin implements IPacketHandler { @@ -382,9 +381,9 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler for (Player player : players) addViewerToDisguise(disguise, player, false); - if (disguise.GetEntity() instanceof Player && disguise instanceof DisguisePlayer) + if (disguise.GetEntity() instanceof EntityPlayer && disguise instanceof DisguisePlayer) { - if (!((Player) disguise.GetEntity()).getName().equalsIgnoreCase(((DisguisePlayer) disguise).getName())) + if (!((EntityPlayer) disguise.GetEntity()).getName().equalsIgnoreCase(((DisguisePlayer) disguise).getName())) { _blockedNames.add(((Player) disguise.GetEntity()).getName()); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java index d5f933f83..d81a3086e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java @@ -2,29 +2,25 @@ package mineplex.core.disguise.disguises; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.BlockFace; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.entity.Player; import com.mojang.authlib.GameProfile; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; +import mineplex.core.common.skin.SkinData; import net.minecraft.server.v1_8_R3.MathHelper; import net.minecraft.server.v1_8_R3.Packet; -import net.minecraft.server.v1_8_R3.PacketPlayInSettings; import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn; import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo; -import net.minecraft.server.v1_8_R3.WorldSettings; import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo.EnumPlayerInfoAction; +import net.minecraft.server.v1_8_R3.WorldSettings; public class DisguisePlayer extends DisguiseHuman { private GameProfile _profile; private boolean _sneaking; private BlockFace _sleeping; + private boolean _sendSkinToSelf; public DisguisePlayer(org.bukkit.entity.Entity entity) { @@ -46,6 +42,29 @@ public class DisguisePlayer extends DisguiseHuman _profile = newProfile; } + + public GameProfile getProfile() + { + return _profile; + } + + public void setSkinData(SkinData skin) + { + _profile.getProperties().put("textures", skin.getProperty()); + } + + /** + * Currently not working. + */ + public void setSendSkinDataToSelf(boolean sendToSelf) + { + _sendSkinToSelf = sendToSelf; + } + + public boolean getSendSkinDataToSelf() + { + return _sendSkinToSelf; + } public BlockFace getSleepingDirection() { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 8439e08cb..ae95d1832 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -205,6 +205,8 @@ public class GadgetManager extends MiniPlugin addGadget(new HatSnowman(this)); addGadget(new HatPresent(this)); addGadget(new HatCoal(this)); + addGadget(new HatRudolph(this)); + addGadget(new HatGrinch(this)); // Music addGadget(new MusicGadget(this, "13 Disc", new String[] {""}, -2, 2256, 178000)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java index aee21df5b..45cc41fd2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatGrinch.java @@ -1,5 +1,6 @@ package mineplex.core.gadget.gadgets.hat; +import mineplex.core.common.skin.SkinData; import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilText; @@ -14,7 +15,7 @@ public class HatGrinch extends HatGadget super(manager, "The Grinch", UtilText.splitLineToArray(C.cGray + "Great! Now where’s the Roast Beast?!", LineFormat.LORE), -3, - "christmasgift"); + SkinData.THE_GRINCH.getSkull()); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java index 16d6fdd2f..d02b55944 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatPresent.java @@ -1,5 +1,6 @@ package mineplex.core.gadget.gadgets.hat; +import mineplex.core.common.skin.SkinData; import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilText; @@ -14,7 +15,7 @@ public class HatPresent extends HatGadget super(manager, "Present", UtilText.splitLineToArray(C.cGray + "WHAT IN THE PRESENT? Oh, it's just you...", LineFormat.LORE), -3, - "christmasgift"); + SkinData.PRESENT.getSkull()); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatRudolph.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatRudolph.java new file mode 100644 index 000000000..1dfd9fa5c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatRudolph.java @@ -0,0 +1,21 @@ +package mineplex.core.gadget.gadgets.hat; + +import mineplex.core.common.skin.SkinData; +import mineplex.core.common.util.C; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.HatGadget; + +public class HatRudolph extends HatGadget +{ + + public HatRudolph(GadgetManager manager) + { + super(manager, "Rudolph", + UtilText.splitLineToArray(C.cGray + "WHAT IN THE PRESENT? Oh, it's just you...", LineFormat.LORE), + -3, + SkinData.RUDOLPH.getSkull()); + } + +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java index fa572fed3..d49221995 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSanta.java @@ -1,5 +1,6 @@ package mineplex.core.gadget.gadgets.hat; +import mineplex.core.common.skin.SkinData; import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilText; @@ -14,7 +15,7 @@ public class HatSanta extends HatGadget super(manager, "Santa", UtilText.splitLineToArray(C.cGray + "Now you can work the Mall circuit!", LineFormat.LORE), -3, - "Presents"); + SkinData.SANTA.getSkull()); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java index 9d02dd720..1f2b44ab6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/hat/HatSnowman.java @@ -1,5 +1,6 @@ package mineplex.core.gadget.gadgets.hat; +import mineplex.core.common.skin.SkinData; import mineplex.core.common.util.C; import mineplex.core.common.util.LineFormat; import mineplex.core.common.util.UtilText; @@ -14,7 +15,7 @@ public class HatSnowman extends HatGadget super(manager, "Snowmans Head", UtilText.splitLineToArray(C.cGray + "Do you want to be a snowman?", LineFormat.LORE), -3, - "snowman002"); + SkinData.SNOWMAN.getSkull()); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java index 8082041b5..92da2218c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/item/ItemPartyPopper.java @@ -69,7 +69,7 @@ public class ItemPartyPopper extends ItemGadget implements IThrown UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.INK_SACK, data), player.getEyeLocation(), v, 1, 0, ViewDist.LONG); } - + /* Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(Material.INK_SACK, (byte)data, 1, "Ink" + Math.random())); _items.add(ent); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java index 91d5c2da7..9e2ebc269 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/HatGadget.java @@ -4,8 +4,10 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; +import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; @@ -19,6 +21,10 @@ public abstract class HatGadget extends OutfitGadget { super(manager, name, desc, cost, ArmorSlot.Helmet, item.getType(), item.getData().getData()); _hat = item; + + ItemMeta im = _hat.getItemMeta(); + im.setDisplayName(C.cGreen + C.Bold + name); + _hat.setItemMeta(im); } public HatGadget(GadgetManager manager, String name, String[] desc, int cost, String playerName) From 35ab40727bee2035cc21a71f7494b54126d8abd1 Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 18:55:21 -0500 Subject: [PATCH 185/223] XMAS UPDATE OMG :O --- Plugins/Mineplex.Core/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +- .../mineplex/hub/server/ServerManager.java | 2 +- .../hub/server/ui/ServerGameMenu.java | 4 +- .../src/nautilus/game/arcade/game/Game.java | 39 ++- .../nautilus/game/arcade/game/SoloGame.java | 12 +- .../game/games/christmas/Christmas.java | 140 +++++++++-- .../arcade/game/games/christmas/Sleigh.java | 235 +++++++++++------- .../game/games/christmas/SleighHorse.java | 34 +-- .../game/games/christmas/SleighPart.java | 93 ++++--- .../games/christmas/content/BossFloor.java | 24 +- .../game/games/christmas/content/IceMaze.java | 27 +- .../games/christmas/content/SnowmanBoss.java | 16 +- .../games/christmas/content/SnowmanMaze.java | 109 +++++--- .../christmas/content/SnowmanWaypoint.java | 6 + .../game/games/christmas/kits/KitPlayer.java | 19 +- .../game/games/christmas/parts/Part.java | 147 +++++++---- .../game/games/christmas/parts/Part1.java | 36 ++- .../game/games/christmas/parts/Part4.java | 43 ++-- .../game/games/christmas/parts/Part5.java | 37 ++- 20 files changed, 682 insertions(+), 349 deletions(-) diff --git a/Plugins/Mineplex.Core/.classpath b/Plugins/Mineplex.Core/.classpath index ea3a54132..067e728d7 100644 --- a/Plugins/Mineplex.Core/.classpath +++ b/Plugins/Mineplex.Core/.classpath @@ -1,7 +1,7 @@ - + diff --git a/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs index d17b6724d..a698e5967 100644 --- a/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs +++ b/Plugins/Mineplex.Core/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index 10f889fce..83962381a 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -862,7 +862,7 @@ public class ServerManager extends MiniPlugin public ShopBase getMinestrikeShop() { - return _serverNpcShopMap.get("Mine-Strike"); + return _serverNpcShopMap.get("MineStrike"); } public ShopBase getWizardShop() 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 4e3bc8320..f33ab68fe 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.ChatColor; -import org.bukkit.entity.Player; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import mineplex.core.account.CoreClientManager; @@ -127,7 +127,7 @@ public class ServerGameMenu extends ShopPageBase setItem(22, _superSmashCycle.get(_ssmIndex)); - setItem(24, ItemStackFactory.Instance.CreateStack(Material.TNT.getId(), (byte) 0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Mine-Strike " + C.cGray + "Team Survival", new String[] + setItem(24, ItemStackFactory.Instance.CreateStack(Material.TNT.getId(), (byte) 0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "MineStrike" + C.cGray + "Team Survival", new String[] { ChatColor.RESET + "", ChatColor.RESET + "One team must defend two bomb sites from", 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 832053604..1d6947f06 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,6 +1,5 @@ package nautilus.game.arcade.game; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -36,7 +35,6 @@ import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingPlaceEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.WorldLoadEvent; @@ -54,8 +52,8 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTabTitle; -import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.disguises.DisguisePlayer; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.packethandler.IPacketHandler; @@ -72,18 +70,24 @@ 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.gametutorial.GameTutorial; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.managers.GameLobbyManager; import nautilus.game.arcade.scoreboard.GameScoreboard; -import nautilus.game.arcade.stats.*; +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.world.WorldData; import net.minecraft.server.v1_8_R3.EntityItem; import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; -import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardTeam; -import net.minecraft.server.v1_8_R3.ScoreboardTeam; import net.minecraft.server.v1_8_R3.WorldServer; public abstract class Game implements Listener @@ -124,6 +128,7 @@ public abstract class Game implements Listener private boolean _countdownForce = false; private String _customWinLine = ""; + private NautHashMap _customWinMessages = new NautHashMap(); // Kits private Kit[] _kits; @@ -492,6 +497,11 @@ public abstract class Game implements Listener { _customWinLine = line; } + + public void SetCustomWinMessage(Player player, String message) + { + _customWinMessages.put(player, message); + } public GameScoreboard GetScoreboard() { @@ -1156,7 +1166,20 @@ public abstract class Game implements Listener UtilPlayer.message(player, "Nobody won the game!"); } - UtilPlayer.message(player, _customWinLine); + if (_customWinMessages.containsKey(player)) + { + if (!_customWinLine.trim().equalsIgnoreCase("")) + { + UtilPlayer.message(player, _customWinLine); + } + + UtilPlayer.message(player, _customWinMessages.get(player)); + } + else + { + UtilPlayer.message(player, _customWinLine); + } + UtilPlayer.message(player, ""); UtilPlayer.message(player, "§aMap - §f§l" + WorldData.MapName + C.cGray + " created by " + "§f§l" + WorldData.MapAuthor); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/SoloGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/SoloGame.java index 7384a3cc6..3d5ca5cf0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/SoloGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/SoloGame.java @@ -1,8 +1,9 @@ package nautilus.game.arcade.game; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -13,8 +14,6 @@ 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.events.PlayerStateChangeEvent; -import nautilus.game.arcade.game.GameTeam.PlayerState; import nautilus.game.arcade.kit.Kit; public abstract class SoloGame extends Game @@ -36,6 +35,11 @@ public abstract class SoloGame extends Game _players.SetColor(ChatColor.YELLOW); _players.SetName("Players"); } + + public GameTeam getPlayersTeam() + { + return _players; + } @Override public void EndCheck() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java index a508ff1cd..ebe29c61b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java @@ -1,6 +1,5 @@ package nautilus.game.arcade.game.games.christmas; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; @@ -8,9 +7,8 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_8_R3.CraftServer; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.entity.EntityType; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftHorse; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; @@ -18,13 +16,16 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.block.BlockFadeEvent; import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.util.Vector; import mineplex.core.common.util.C; +import mineplex.core.common.util.Callback; +import mineplex.core.common.util.F; import mineplex.core.common.util.MapUtil; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilMath; @@ -34,7 +35,6 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.packethandler.IPacketHandler; import mineplex.core.packethandler.PacketInfo; import mineplex.core.recharge.Recharge; -import mineplex.core.reward.rewards.PetReward; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; @@ -45,14 +45,22 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.games.christmas.kits.KitPlayer; -import nautilus.game.arcade.game.games.christmas.parts.*; +import nautilus.game.arcade.game.games.christmas.parts.Part; +import nautilus.game.arcade.game.games.christmas.parts.Part1; +import nautilus.game.arcade.game.games.christmas.parts.Part2; +import nautilus.game.arcade.game.games.christmas.parts.Part3; +import nautilus.game.arcade.game.games.christmas.parts.Part4; +import nautilus.game.arcade.game.games.christmas.parts.Part5; import nautilus.game.arcade.kit.Kit; +import net.minecraft.server.v1_8_R3.PacketPlayOutAttachEntity; import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy; import net.minecraft.server.v1_8_R3.PacketPlayOutNamedSoundEffect; import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving; public class Christmas extends SoloGame { + private GameTeam _badGuys; + private Sleigh _sleigh; private Location _sleighSpawn; @@ -201,7 +209,7 @@ public class Christmas extends SoloGame for (Location loc : WorldData.GetCustomLocs("129")) { _barrier.add(loc.getBlock().getLocation()); - MapUtil.QuickChangeBlockAt(loc, 65, (byte)3); + MapUtil.QuickChangeBlockAt(loc, 166, (byte)0); } //Parts @@ -250,7 +258,8 @@ public class Christmas extends SoloGame if (event.GetState() != GameState.Live) return; - GetTeamList().add(new GameTeam(this, "Christmas Thieves", ChatColor.RED, WorldData.GetDataLocs("RED"))); + _badGuys = new GameTeam(this, "Christmas Thieves", ChatColor.RED, WorldData.GetDataLocs("RED")); + AddTeam(_badGuys); } @EventHandler @@ -366,7 +375,7 @@ public class Christmas extends SoloGame for (Location loc : _barrier) { - if (UtilMath.offset(GetSleigh().GetLocation(), loc) > 15) + if (UtilMath.offset(GetSleigh().GetLocation(), loc) > 20) continue; breakAt = loc; @@ -458,14 +467,39 @@ public class Christmas extends SoloGame for (Player player : GetPlayers(false)) { - Manager.rewardPet(player, "Christmas Elf", EntityType.VILLAGER); + if (Manager.IsRewardItems()) + { + if (Manager.GetTaskManager().hasCompletedTask(player, "CC Reward 2015")) + { + SetCustomWinMessage(player, "You already earned your reward"); + } + else + { + SetCustomWinMessage(player, "You earned " + C.cYellow + "Winter Chest x2"); + + Manager.GetTaskManager().completedTask(new Callback() + { + @Override + public void run(Boolean data) + { + if (data) + { + Manager.getInventoryManager().addItemToInventory(player, "Winter Chest", 2); + } + else + { + UtilPlayer.message(player, F.main("Inventory", "An error occured while giving you " + C.cRed + "Winter Chest x2" + C.cGray + ".")); + } + } + }, player, "CC Reward 2015"); + } + } Manager.GetGame().AddGems(player, 30, "Slaying the Pumpkin King", false, false); Manager.GetGame().AddGems(player, 10, "Participation", false, false); } - SetCustomWinLine("You earned Christmas Elf Pet!"); - AnnounceEnd(this.GetTeamList().get(0)); + AnnounceEnd(getPlayersTeam()); SetState(GameState.End); } else if (GetPlayers(true).size() == 0) @@ -476,7 +510,7 @@ public class Christmas extends SoloGame } SetCustomWinLine("You all died..."); - AnnounceEnd(this.GetTeamList().get(1)); + AnnounceEnd(_badGuys); SetState(GameState.End); } else if (UtilTime.elapsed(GetStateTime(), _gameTime)) @@ -487,7 +521,7 @@ public class Christmas extends SoloGame } SetCustomWinLine("You did not save Christmas in time."); - AnnounceEnd(this.GetTeamList().get(1)); + AnnounceEnd(_badGuys); SetState(GameState.End); } @@ -504,7 +538,7 @@ public class Christmas extends SoloGame } SetCustomWinLine("Santa Claus was killed by the Giant!"); - AnnounceEnd(this.GetTeamList().get(1)); + AnnounceEnd(_badGuys); SetState(GameState.End); } @@ -572,30 +606,55 @@ public class Christmas extends SoloGame return; if (!IsLive()) + { + Scoreboard.Reset(); + + String line = ""; + for (int i = 0 ; i < 10 ; i++) + line += ((i % 2 == 0 ? C.cRed : C.cDGreen) + "█"); + + Scoreboard.WriteBlank(); + Scoreboard.Write(line); + + Scoreboard.WriteBlank(); + + Scoreboard.Write(C.cWhiteB + "May your winter"); + Scoreboard.Write(C.cWhiteB + "be filled with " + C.cYellowB + "joy" + C.cWhiteB + " and " + C.cYellowB + "cheer" + C.cWhiteB + "."); + + Scoreboard.WriteBlank(); + + Scoreboard.Write(C.cWhite + "Happy Holidays!"); + Scoreboard.Write(C.cWhiteB + "- Your friends at " + C.cGoldB + "MINEPLEX"); + + Scoreboard.WriteBlank(); + Scoreboard.Write(line); + + Scoreboard.Draw(); return; + } //Wipe Last Scoreboard.Reset(); //Rounds Scoreboard.WriteBlank(); - Scoreboard.Write(C.cWhite + "Challenge:"); - Scoreboard.Write(C.cYellow + (5 - _parts.size()) + " of " + 5); + Scoreboard.Write(C.cGoldB + "Challenge"); + Scoreboard.Write(C.cWhite + (5 - _parts.size()) + " of " + 5); //Presents Scoreboard.WriteBlank(); - Scoreboard.Write(C.cWhite + "Presents:"); - Scoreboard.Write(C.cYellow + GetSleigh().GetPresents().size() + " of " + 10); + Scoreboard.Write(C.cGreenB + "Presents"); + Scoreboard.Write(C.cWhite + GetSleigh().GetPresents().size() + " of " + 10); //Players Scoreboard.WriteBlank(); - Scoreboard.Write(C.cWhite + "Players:"); - Scoreboard.Write(C.cYellow + GetPlayers(true).size()); + Scoreboard.Write(C.cYellowB + "Players"); + Scoreboard.Write(C.cWhite + GetPlayers(true).size()); //Time Scoreboard.WriteBlank(); - Scoreboard.Write(C.cWhite + "Time Left:"); - Scoreboard.Write(C.cYellow + UtilTime.MakeStr(_gameTime - (System.currentTimeMillis() - GetStateTime()))); + Scoreboard.Write(C.cYellowB + "Time Left"); + Scoreboard.Write(C.cWhite + UtilTime.MakeStr(_gameTime - (System.currentTimeMillis() - GetStateTime()))); Scoreboard.Draw(); } @@ -679,4 +738,37 @@ public class Christmas extends SoloGame UtilPlayer.sendPacket(player, packet); } } + + @EventHandler + public void updateReigns(UpdateEvent event) + { + if (!InProgress()) + return; + + if (event.getType() != UpdateType.FASTER) + return; + + if (_sleigh == null) + return; + + if (_sleigh.getSanta() == null) + return; + + for (SleighHorse horse : _sleigh.getHorses()) + { + if (horse.Ent == null || !horse.Ent.isValid()) + continue; + + PacketPlayOutAttachEntity packet = new PacketPlayOutAttachEntity(1, ((CraftHorse) horse.Ent).getHandle(), (((CraftEntity) _sleigh.getSanta()).getHandle())); + + for (Player player : UtilServer.getPlayers()) + UtilPlayer.sendPacket(player, packet); + } + } + + @EventHandler + public void preventStand(PlayerInteractAtEntityEvent event) + { + event.setCancelled(true); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java index c4c5e0950..a41031b6c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java @@ -2,30 +2,28 @@ package nautilus.game.arcade.game.games.christmas; import java.util.ArrayList; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.Effect; +import org.bukkit.FireworkEffect; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Chicken; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +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.UtilEnt; import mineplex.core.common.util.UtilFirework; -import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.recharge.Recharge; import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.christmas.parts.Part; - -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Effect; -import org.bukkit.FireworkEffect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.FireworkEffect.Type; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Chicken; -import org.bukkit.entity.Entity; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; public class Sleigh { @@ -41,6 +39,8 @@ public class Sleigh private ArrayList PresentsCollected = new ArrayList();; private Location Target; + + private Entity Santa; public void setupSleigh(Christmas host, Location loc) { @@ -52,24 +52,25 @@ public class Sleigh CentralEntity = loc.getWorld().spawn(loc, Chicken.class); UtilEnt.Vegetate(CentralEntity, true); - UtilEnt.ghost(CentralEntity, true, true); + UtilEnt.ghost(CentralEntity, true, false); + Host.Manager.GetCondition().Factory().Invisible("Sleigh", (LivingEntity) CentralEntity, null, Double.MAX_VALUE, 3, false, false, true); //Presents PresentSlots = new ArrayList(); - PresentSlots.add(new SleighPart(2, 0, 0, loc.clone(), -1, -2)); - PresentSlots.add(new SleighPart(2, 0, 0, loc.clone(), 0, -2)); - PresentSlots.add(new SleighPart(2, 0, 0, loc.clone(), 1, -2)); - PresentSlots.add(new SleighPart(2, 0, 0, loc.clone(), -1, -1)); - PresentSlots.add(new SleighPart(2, 0, 0, loc.clone(), 0, -1)); - PresentSlots.add(new SleighPart(2, 0, 0, loc.clone(), 1, -1)); + PresentSlots.add(new SleighPart(this, 2, 0, 0, loc.clone(), -1, -2)); + PresentSlots.add(new SleighPart(this, 2, 0, 0, loc.clone(), 0, -2)); + PresentSlots.add(new SleighPart(this, 2, 0, 0, loc.clone(), 1, -2)); + PresentSlots.add(new SleighPart(this, 2, 0, 0, loc.clone(), -1, -1)); + PresentSlots.add(new SleighPart(this, 2, 0, 0, loc.clone(), 0, -1)); + PresentSlots.add(new SleighPart(this, 2, 0, 0, loc.clone(), 1, -1)); - PresentSlots.add(new SleighPart(6, 0, 0, loc.clone(), -1, -2)); - PresentSlots.add(new SleighPart(6, 0, 0, loc.clone(), 0, -2)); - PresentSlots.add(new SleighPart(6, 0, 0, loc.clone(), 1, -2)); - PresentSlots.add(new SleighPart(6, 0, 0, loc.clone(), -1, -1)); - PresentSlots.add(new SleighPart(6, 0, 0, loc.clone(), 0, -1)); - PresentSlots.add(new SleighPart(6, 0, 0, loc.clone(), 1, -1)); + PresentSlots.add(new SleighPart(this, 6, 0, 0, loc.clone(), -1, -2)); + PresentSlots.add(new SleighPart(this, 6, 0, 0, loc.clone(), 0, -2)); + PresentSlots.add(new SleighPart(this, 6, 0, 0, loc.clone(), 1, -2)); + PresentSlots.add(new SleighPart(this, 6, 0, 0, loc.clone(), -1, -1)); + PresentSlots.add(new SleighPart(this, 6, 0, 0, loc.clone(), 0, -1)); + PresentSlots.add(new SleighPart(this, 6, 0, 0, loc.clone(), 1, -1)); //Sleigh SleighEnts = new ArrayList(); @@ -77,65 +78,71 @@ public class Sleigh for (SleighPart part : PresentSlots) SleighEnts.add(part); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 0, -3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -1, -3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -2, -3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 1, -3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 2, -3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 0, -3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -1, -3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -2, -3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 1, -3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 2, -3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -2, -2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), -1, -2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 0, -2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 1, -2)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 2, -2)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -2, -2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), -1, -2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 0, -2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 1, -2)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 2, -2)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -2, -1)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), -1, -1)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 0, -1)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 1, -1)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 2, -1)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -2, -1)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), -1, -1)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 0, -1)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 1, -1)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 2, -1)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -2, 0)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -1, 0)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 0, 0)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 1, 0)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 2, 0)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -2, 0)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -1, 0)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 0, 0)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 1, 0)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 2, 0)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -2, 1)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), -1, 1)); - SleighEnts.add(new SleighPart(0, 159, 15, loc.clone(), 0, 1)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 1, 1)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 2, 1)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -2, 1)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), -1, 1)); + SleighEnts.add(new SleighPart(this, 0, 159, 15, loc.clone(), 0, 1)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 1, 1)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 2, 1)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), -2, 2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), -1, 2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 0, 2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 1, 2)); - SleighEnts.add(new SleighPart(0, 44, 7, loc.clone(), 2, 2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), -2, 2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), -1, 2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 0, 2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 1, 2)); + SleighEnts.add(new SleighPart(this, 0, 44, 7, loc.clone(), 2, 2)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -2, 3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), -1, 3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 0, 3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 1, 3)); - SleighEnts.add(new SleighPart(0, 159, 14, loc.clone(), 2, 3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -2, 3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), -1, 3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 0, 3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 1, 3)); + SleighEnts.add(new SleighPart(this, 0, 159, 14, loc.clone(), 2, 3)); //Santa - SleighPart santa = new SleighPart(3, 0, 0, loc.clone(), 0, 1); - santa.AddSanta(); + SleighPart santa = new SleighPart(this, 3, 0, 0, loc.clone(), 0, 1); + Santa = santa.AddSanta(); SleighEnts.add(santa); - SleighHorses.add(new SleighHorse(loc.clone(), -1.5, 8)); - SleighHorses.add(new SleighHorse(loc.clone(), 1.5, 8)); + SleighHorses.add(new SleighHorse(loc.clone(), "Dasher", -1.5, 8)); + SleighHorses.add(new SleighHorse(loc.clone(), "Dancer", 1.5, 8)); + + SleighHorses.add(new SleighHorse(loc.clone(), "Prancer", -1.5, 11)); + SleighHorses.add(new SleighHorse(loc.clone(), "Vixen", 1.5, 11)); + + SleighHorses.add(new SleighHorse(loc.clone(), "Comet", -1.5, 14)); + SleighHorses.add(new SleighHorse(loc.clone(), "Cupid", 1.5, 14)); - SleighHorses.add(new SleighHorse(loc.clone(), -1.5, 11)); - SleighHorses.add(new SleighHorse(loc.clone(), 1.5, 11)); + SleighHorses.add(new SleighHorse(loc.clone(), "Donner", -1.5, 17)); + SleighHorses.add(new SleighHorse(loc.clone(), "Blitzen", 1.5, 17)); for (SleighHorse horse : SleighHorses) horse.spawnHorse(); - for (SleighHorse horse : SleighHorses) - UtilEnt.Leash(horse.Ent, santa.GetTop(), false, false); +// for (SleighHorse horse : SleighHorses) +// UtilEnt.Leash(horse.Ent, santa.GetTop(), true, false); } public Location GetLocation() @@ -157,6 +164,8 @@ public class Sleigh Move(CentralEntity, Target, 1); + Santa.setTicksLived(1); + //Move Sleigh for (SleighPart part : SleighEnts) { @@ -184,24 +193,6 @@ public class Sleigh { for (Player player : Host.GetPlayers(true)) { - if (!Recharge.Instance.usable(player, "Sleigh Bump")) - continue; - - for (SleighPart part : SleighEnts) - if (UtilMath.offset(player, part.Ent) < 1) - { - UtilAction.velocity(player, UtilAlg.getTrajectory2d(CentralEntity, player), 0.4, true, 0.2, 0, 0, true); - Recharge.Instance.useForce(player, "Sleigh Bump", 400); - } - - - for (SleighHorse part : SleighHorses) - if (UtilMath.offset(player, part.Ent) < 1) - { - UtilAction.velocity(player, UtilAlg.getTrajectory2d(CentralEntity, player), 0.4, true, 0.2, 0, 0, true); - Recharge.Instance.useForce(player, "Sleigh Bump", 400); - } - if (player.getLocation().getZ() < CentralEntity.getLocation().getZ() - 24) { player.damage(1); @@ -211,6 +202,64 @@ public class Sleigh Recharge.Instance.useForce(player, "Sleigh Bump", 400); } } + + for (SleighPart part : SleighEnts) + { + for (Entity ent : UtilEnt.getInRadius(part.Ent.getLocation(), 1).keySet()) + { + boolean matches = false; + for (SleighPart cur : SleighEnts) + { + if (ent instanceof LivingEntity && cur.HasEntity((LivingEntity) ent)) + { + matches = true; + break; + } + } + + if (matches) + continue; + + if (ent instanceof Player) + { + if (!Recharge.Instance.usable((Player) ent, "Sleigh Bump")) + continue; + + Recharge.Instance.useForce((Player) ent, "Sleigh Bump", 400); + } + + UtilAction.velocity(ent, UtilAlg.getTrajectory2d(CentralEntity, ent), 0.4, true, 0.2, 0, 0, true); + } + } + + for (SleighHorse part : SleighHorses) + { + for (Entity ent : UtilEnt.getInRadius(part.Ent.getLocation(), 1).keySet()) + { + boolean matches = false; + for (SleighPart cur : SleighEnts) + { + if (ent instanceof LivingEntity && cur.HasEntity((LivingEntity) ent)) + { + matches = true; + break; + } + } + + if (matches) + continue; + + if (ent instanceof Player) + { + if (!Recharge.Instance.usable((Player) ent, "Sleigh Bump")) + continue; + + Recharge.Instance.useForce((Player) ent, "Sleigh Bump", 400); + } + + UtilAction.velocity(ent, UtilAlg.getTrajectory2d(CentralEntity, ent), 0.4, true, 0.2, 0, 0, true); + } + } } public boolean HasPresent(Location loc) @@ -222,6 +271,7 @@ public class Sleigh { PresentsCollected.add(loc); loc.getBlock().setType(Material.AIR); + loc.getBlock().getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).setType(Material.IRON_BLOCK); loc.getBlock().getRelative(BlockFace.DOWN).setType(Material.GLASS); UtilFirework.launchFirework(loc.clone().add(0.5, 0.5, 0.5), FireworkEffect.builder().flicker(false).withColor(Color.YELLOW).with(Type.BALL).trail(true).build(), new Vector(0,1,0), 0); @@ -267,4 +317,9 @@ public class Sleigh { return SleighHorses; } + + public Entity getSanta() + { + return Santa; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighHorse.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighHorse.java index 10a772184..0f0e5ed2f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighHorse.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighHorse.java @@ -2,6 +2,19 @@ package nautilus.game.arcade.game.games.christmas; import java.util.HashSet; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Horse.Color; +import org.bukkit.entity.Horse.Style; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import mineplex.core.common.util.C; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilPlayer; import net.minecraft.server.v1_8_R3.DataWatcher; @@ -14,19 +27,6 @@ import net.minecraft.server.v1_8_R3.PacketPlayOutEntityTeleport; import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving; import net.minecraft.server.v1_8_R3.Vector3f; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; -import org.bukkit.entity.Horse; -import org.bukkit.entity.Player; -import org.bukkit.entity.Horse.Color; -import org.bukkit.entity.Horse.Style; -import org.bukkit.entity.LivingEntity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - public class SleighHorse { private Location _lastFacing; @@ -40,9 +40,11 @@ public class SleighHorse public int horseId; public double OffsetX; public double OffsetZ; + public String Name; - public SleighHorse(Location loc, double x, double z) + public SleighHorse(Location loc, String name, double x, double z) { + Name = name; OffsetX = x; OffsetZ = z; _lastFacing = loc.add(x, 0.5, z); @@ -182,6 +184,10 @@ public class SleighHorse Ent = _lastFacing.getWorld().spawn(_lastFacing.subtract(0, 0.5, 0), Horse.class); UtilEnt.Vegetate(Ent); UtilEnt.ghost(Ent, true, false); + Ent.setRemoveWhenFarAway(false); + + Ent.setCustomName(C.cWhiteB + Name); + Ent.setCustomNameVisible(true); Ent.setStyle(Style.BLACK_DOTS); Ent.setColor(Color.BROWN); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighPart.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighPart.java index 2c0406f27..877d36049 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighPart.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/SleighPart.java @@ -1,9 +1,5 @@ package nautilus.game.arcade.game.games.christmas; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilMath; - import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.Material; @@ -16,6 +12,10 @@ import org.bukkit.entity.Skeleton; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.LeatherArmorMeta; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilMath; + public class SleighPart { public Chicken Ent; @@ -23,38 +23,32 @@ public class SleighPart public double OffsetX; public double OffsetZ; - public SleighPart(int rise, int id, int data, Location loc, double x, double z) + public int Rise; + public int Id; + public int Data; + public Location Location; + + public SleighPart(Sleigh sleigh, int rise, int id, int data, Location loc, double x, double z) { //Base Ent = loc.getWorld().spawn(loc.add(x, 0, z), Chicken.class); Ent.setBaby(); Ent.setAgeLock(true); + Ent.setRemoveWhenFarAway(false); + UtilEnt.Vegetate(Ent, true); - UtilEnt.ghost(Ent, true, true); - + UtilEnt.ghost(Ent, true, false); + sleigh.Host.Manager.GetCondition().Factory().Invisible("Sleigh", Ent, null, Double.MAX_VALUE, 3, false, false, true); + //Height - Chicken top = Ent; - for (int i=0 ; i _heightComparator = new Comparator() + { + @Override + public int compare(Block o1, Block o2) + { + if (o1.getLocation().getBlockY() == o2.getLocation().getBlockY()) + return 0; + + return o1.getLocation().getBlockY() > o2.getLocation().getBlockY() ? 1 : -1; + } + }; + public IceMaze(Christmas host, ArrayList mazeCorners, ArrayList mazeExits, Location[] presents) { Host = host; @@ -71,6 +84,8 @@ public class IceMaze if (_blocks.isEmpty()) return; + Collections.sort(_blocks, _heightComparator); + for (int i=0 ; i<20 ; i++) { if (_blocks.isEmpty()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java index cae20e196..b97da2215 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java @@ -1,17 +1,15 @@ package nautilus.game.arcade.game.games.christmas.content; import java.util.ArrayList; +import java.util.List; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature; -import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.IronGolem; import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.IronGolem; import org.bukkit.entity.Player; -import org.bukkit.entity.Slime; import org.bukkit.entity.Snowball; import org.bukkit.entity.Snowman; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; @@ -147,7 +145,17 @@ public class SnowmanBoss else { if ((minion.Target == null || !minion.Target.isValid() || !Host.IsAlive(minion.Target)) && !Host.GetPlayers(true).isEmpty()) - minion.Target = UtilAlg.Random(Host.GetPlayers(true)); + { + List valid = new ArrayList(); + for (Player player : Host.GetPlayers(true)) + if (UtilMath.offset(player, minion.Ent) <= 25 && player.getLocation().getBlockY() >= minion.Ent.getLocation().getBlockY()) + valid.add(player); + + minion.Target = UtilAlg.Random(valid); + } + + if (minion.Target == null) + continue; //Move UtilEnt.CreatureMoveFast(minion.Ent, minion.Target.getLocation(), 1.6f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java index 5aeecaa3b..140bcb805 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java @@ -6,17 +6,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; -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.UtilMath; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.common.util.UtilWorld; -import mineplex.core.recharge.Recharge; -import nautilus.game.arcade.game.games.christmas.Christmas; - import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; @@ -28,6 +17,16 @@ import org.bukkit.entity.Snowman; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.util.Vector; +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.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.game.games.christmas.Christmas; +import nautilus.game.arcade.game.games.christmas.content.SnowmanWaypoint.CardinalDirection; + public class SnowmanMaze { private Christmas Host; @@ -163,48 +162,90 @@ public class SnowmanMaze if (south != null) nextBlock.add(south); if (east != null) nextBlock.add(east); if (west != null) nextBlock.add(west); - - //Random Direction - if (!nextBlock.isEmpty()) + + if(nextBlock.isEmpty()) { - data.getValue().Target = UtilAlg.Random(nextBlock).getLocation().add(0.5, 0, 0.5); - UtilEnt.CreatureMove(data.getKey(), data.getValue().Target, 1.4f); + entIterator.remove(); + data.getKey().remove(); + continue; + } + + if(nextBlock.size() > 1 && data.getValue().Direction != CardinalDirection.NULL) // they can do a uturn if they're stuck + { + if(data.getValue().Direction == CardinalDirection.NORTH) + { + nextBlock.remove(south); + } + else if(data.getValue().Direction == CardinalDirection.SOUTH) + { + nextBlock.remove(north); + } + else if(data.getValue().Direction == CardinalDirection.WEST) + { + nextBlock.remove(east); + } + else if(data.getValue().Direction == CardinalDirection.EAST) + { + nextBlock.remove(west); + } + } + + if (nextBlock.isEmpty()) + { + entIterator.remove(); + data.getKey().remove(); + continue; + } + + //Random Direction + Location nextLoc = UtilAlg.Random(nextBlock).getLocation(); + data.getValue().Target = nextLoc.clone().add(0.5, 0, 0.5); + if(north != null && nextLoc.equals(north.getLocation())) + { + data.getValue().Direction = CardinalDirection.NORTH; + } + else if(south != null && nextLoc.equals(south.getLocation())) + { + data.getValue().Direction = CardinalDirection.SOUTH; + } + else if(east != null && nextLoc.equals(east.getLocation())) + { + data.getValue().Direction = CardinalDirection.EAST; + } + else if(west != null && nextLoc.equals(west.getLocation())) + { + data.getValue().Direction = CardinalDirection.WEST; } } - - //Timeout Move - if (UtilMath.offset(data.getKey().getLocation(), data.getValue().Last) > 0.1) - data.getValue().Time = System.currentTimeMillis(); - - if (UtilTime.elapsed(data.getValue().Time, 2000)) - UtilEnt.CreatureMove(data.getKey(), data.getValue().Target, 1.4f); + + UtilEnt.CreatureMoveFast(data.getKey(), data.getValue().Target, 1.4f); } } - + private Block getTarget(Block start, Block cur, BlockFace face) { if (cur == null) cur = start; - + while (_waypoints.contains(cur.getRelative(face))) { cur = cur.getRelative(face); - + //Stop at intersection int count = 0; - - if (face != BlockFace.NORTH && _waypoints.contains(cur.getRelative(BlockFace.NORTH))) count++; - if (face != BlockFace.SOUTH && _waypoints.contains(cur.getRelative(BlockFace.SOUTH))) count++; - if (face != BlockFace.EAST && _waypoints.contains(cur.getRelative(BlockFace.EAST))) count++; - if (face != BlockFace.WEST && _waypoints.contains(cur.getRelative(BlockFace.WEST))) count++; - + + if (face != BlockFace.NORTH && _waypoints.contains(cur.getRelative(BlockFace.NORTH)) && !_waypoints.contains(cur.getRelative(BlockFace.NORTH))) count++; + if (face != BlockFace.SOUTH && _waypoints.contains(cur.getRelative(BlockFace.SOUTH)) && !_waypoints.contains(cur.getRelative(BlockFace.SOUTH))) count++; + if (face != BlockFace.EAST && _waypoints.contains(cur.getRelative(BlockFace.EAST)) && !_waypoints.contains(cur.getRelative(BlockFace.EAST))) count++; + if (face != BlockFace.WEST && _waypoints.contains(cur.getRelative(BlockFace.WEST)) && !_waypoints.contains(cur.getRelative(BlockFace.WEST))) count++; + if (count > 1) break; } - + if (cur.equals(start)) return null; - + return cur; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanWaypoint.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanWaypoint.java index 78e197277..22c0deabf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanWaypoint.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanWaypoint.java @@ -6,6 +6,7 @@ public class SnowmanWaypoint { public Location Last; public Location Target; + public CardinalDirection Direction = CardinalDirection.NULL; public long Time; public SnowmanWaypoint(Location last) @@ -14,4 +15,9 @@ public class SnowmanWaypoint Target = null; Time = System.currentTimeMillis(); } + + public static enum CardinalDirection + { + NORTH, SOUTH, EAST, WEST, NULL // such order much not care + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/kits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/kits/KitPlayer.java index 9af09d62b..3c3efcee3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/kits/KitPlayer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/kits/KitPlayer.java @@ -1,12 +1,15 @@ package nautilus.game.arcade.game.games.christmas.kits; +import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; +import mineplex.core.itemstack.ItemBuilder; import mineplex.core.itemstack.ItemStackFactory; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.Kit; @@ -21,15 +24,23 @@ public class KitPlayer extends Kit new String[] { - "Help Santa retreive the lost presents!" + "Help Santa retrieve the lost presents!" }, new Perk[] { }, - EntityType.ZOMBIE, + EntityType.SKELETON, new ItemStack(Material.IRON_SWORD)); - + } + + @Override + public void SpawnCustom(LivingEntity ent) + { + ent.getEquipment().setHelmet(new ItemBuilder(Material.LEATHER_HELMET).setColor(Color.RED).setUnbreakable(true).build()); + ent.getEquipment().setChestplate(new ItemBuilder(Material.LEATHER_CHESTPLATE).setColor(Color.RED).build()); + ent.getEquipment().setLeggings(new ItemBuilder(Material.LEATHER_LEGGINGS).setColor(Color.RED).build()); + ent.getEquipment().setBoots(new ItemBuilder(Material.LEATHER_BOOTS).setColor(Color.BLACK).build()); } @Override @@ -43,7 +54,7 @@ public class KitPlayer extends Kit item = ItemStackFactory.Instance.CreateStack(Material.BOW, (byte)0, 1, C.cGreen + C.Bold + "Toy Bow"); item.addEnchantment(Enchantment.ARROW_INFINITE, 1); player.getInventory().setItem(1, item); - player.getInventory().setItem(28, ItemStackFactory.Instance.CreateStack(Material.ARROW)); + player.getInventory().setItem(9, ItemStackFactory.Instance.CreateStack(Material.ARROW)); //Axe item = ItemStackFactory.Instance.CreateStack(Material.STONE_PICKAXE, (byte)0, 1, C.cGreen + C.Bold + "Coal Digger"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part.java index 7a96132c4..ea8e171cc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part.java @@ -1,35 +1,42 @@ package nautilus.game.arcade.game.games.christmas.parts; -import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature; +import org.bukkit.entity.Ageable; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Creature; +import org.bukkit.entity.Entity; +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.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + import mineplex.core.common.util.C; +import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAlg; 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.UtilTextTop; +import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.game.games.christmas.Christmas; import nautilus.game.arcade.game.games.christmas.ChristmasAudio; import net.minecraft.server.v1_8_R3.EntityCreature; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.SkullType; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature; -import org.bukkit.entity.Ageable; -import org.bukkit.entity.Creature; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; - public abstract class Part implements Listener { public Christmas Host; @@ -42,6 +49,7 @@ public abstract class Part implements Listener protected double _objectiveHealth = 1; protected HashMap _creatures = new HashMap(); + protected NautHashMap _spawnedPresents = new NautHashMap(); public Part(Christmas host, Location sleigh, Location[] presents) { @@ -53,38 +61,63 @@ public abstract class Part implements Listener loc.getBlock().setType(Material.AIR); } + @SuppressWarnings("deprecation") public void Prepare() { Activate(); for (Location loc : _presents) - { - Block present = loc.getBlock(); - present.setTypeIdAndData(Material.SKULL.getId(), (byte)1, true); - - Skull skull = (Skull) present.getState(); - skull.setSkullType(SkullType.PLAYER); + { + Location standLoc = loc.clone().add(0, -1.45, 0); + standLoc.setYaw(UtilMath.r(100)); - //Present Type - double r = Math.random(); - if (r > 0.75) skull.setOwner("CruXXx"); - else if (r > 0.5) skull.setOwner("CruXXx"); - else if (r > 0.25) skull.setOwner("CruXXx"); - else skull.setOwner("CruXXx"); + Host.CreatureAllowOverride = true; + ArmorStand stand = loc.getWorld().spawn(standLoc, ArmorStand.class); + Host.CreatureAllowOverride = false; - //Angle - BlockFace face = BlockFace.UP; - while (face == BlockFace.UP || face == BlockFace.DOWN || face == BlockFace.SELF) - face = BlockFace.values()[UtilMath.r(BlockFace.values().length)]; - skull.setRotation(face); - - skull.update(); + stand.setVisible(false); + stand.setGravity(false); + + ItemStack stack = ItemStackFactory.Instance.CreateStack(Material.SKULL_ITEM, (byte) 3); + SkullMeta meta = (SkullMeta) stack.getItemMeta(); + meta.setOwner("CruXXx"); + stack.setItemMeta(meta); + + stand.setHelmet(stack); +// +// present.setTypeIdAndData(Material.SKULL.getId(), (byte)1, true); +// +// Skull skull = (Skull) present.getState(); +// skull.setSkullType(SkullType.PLAYER); +// +// //Present Type +// double r = Math.random(); +// if (r > 0.75) skull.setOwner("CruXXx"); +// else if (r > 0.5) skull.setOwner("CruXXx"); +// else if (r > 0.25) skull.setOwner("CruXXx"); +// else skull.setOwner("CruXXx"); +// +// //Angle +// BlockFace face = BlockFace.UP; +// while (face == BlockFace.UP || face == BlockFace.DOWN || face == BlockFace.SELF) +// face = BlockFace.values()[UtilMath.r(BlockFace.values().length)]; +// skull.setRotation(face); +// +// skull.update(); + + _spawnedPresents.put(stand, loc); //Beacon - present.getRelative(BlockFace.DOWN).setType(Material.BEACON); for (int x=-1 ; x<=1 ; x++) for (int z=-1 ; z<=1 ; z++) - present.getRelative(x, -2, z).setType(Material.IRON_BLOCK); + { + loc.getBlock().getRelative(x, -2, z).setType(Material.IRON_BLOCK); + loc.getBlock().getRelative(x, -3, z).setType(Material.IRON_BLOCK); + } + + loc.getBlock().getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).setType(Material.BEACON); + loc.getBlock().getRelative(BlockFace.DOWN).setType(Material.STAINED_GLASS); + loc.getBlock().getRelative(BlockFace.DOWN).setData(UtilMath.randomElement(new Byte[]{14, 5, 13})); } } @@ -157,35 +190,38 @@ public abstract class Part implements Listener return true; } - @EventHandler - public void PresentCollect(PlayerInteractEvent event) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = false) + public void PresentCollect(PlayerInteractAtEntityEvent event) { - if (event.getClickedBlock() == null) + Location present = _spawnedPresents.get(event.getRightClicked()); + if (present == null) return; - + boolean contains = false; for (Location loc : _presents) - if (loc.getBlock().equals(event.getClickedBlock())) + if (loc.getBlock().equals(present.getBlock())) contains = true; if (!contains) return; - event.setCancelled(true); - if (!Host.IsLive()) return; if (!Host.IsAlive(event.getPlayer())) return; - if (Host.GetSleigh().HasPresent(event.getClickedBlock().getLocation())) + if (Host.GetSleigh().HasPresent(present.getBlock().getLocation())) return; - if (UtilMath.offset(event.getPlayer().getLocation(), event.getClickedBlock().getLocation().add(0.5, 0.5, 0.5)) > 2) + if (UtilMath.offset(event.getPlayer().getLocation(), present.clone().add(0.5, 0.5, 0.5)) > 2) return; - Host.GetSleigh().AddPresent(event.getClickedBlock().getLocation()); + _spawnedPresents.remove(event.getRightClicked()); + + event.getRightClicked().remove(); + + Host.GetSleigh().AddPresent(present.getBlock().getLocation()); Host.SantaSay("Well done " + event.getPlayer().getName() + "! You collected a present!", null); } @@ -276,4 +312,21 @@ public abstract class Part implements Listener _creatures.clear(); } + @EventHandler + public void onDamagePresent(EntityDamageEvent event) + { + event.setCancelled(_spawnedPresents.containsKey(event.getEntity())); + } + + @EventHandler + public void PresentParticles(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + for (Entity ent : _spawnedPresents.keySet()) + { + UtilParticle.PlayParticle(ParticleType.HAPPY_VILLAGER, ent.getLocation().clone().add(0, 1.5, 0), .3F, .3F, .3F, 0F, 1, ViewDist.LONG, UtilServer.getPlayers()); + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part1.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part1.java index c37047bce..6839ff135 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part1.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part1.java @@ -1,41 +1,33 @@ package nautilus.game.arcade.game.games.christmas.parts; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilParticle.ViewDist; -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.GameState; -import nautilus.game.arcade.game.games.christmas.Christmas; -import nautilus.game.arcade.game.games.christmas.ChristmasAudio; - 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.entity.Entity; -import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.inventory.ItemStack; +import mineplex.core.common.util.UtilAlg; +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.UtilTime; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.game.games.christmas.Christmas; +import nautilus.game.arcade.game.games.christmas.ChristmasAudio; + public class Part1 extends Part { private ArrayList _skeletons; @@ -145,7 +137,7 @@ public class Part1 extends Part _presents = System.currentTimeMillis(); - Host.SantaSay("Theres some of the presents up ahead!", ChristmasAudio.P1_B); + Host.SantaSay("There are some of the presents up ahead!", ChristmasAudio.P1_B); SetObjectivePresents(); } @@ -189,7 +181,7 @@ public class Part1 extends Part } Host.SantaSay("Clear the path! Watch out for the undead!", ChristmasAudio.P1_D); - SetObjectiveText("Clear a path for Santas Sleigh!", 1); + SetObjectiveText("Clear a path for Santa's Sleigh!", 1); } private void UpdateClear() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part4.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part4.java index 7286d1512..26b282b57 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part4.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part4.java @@ -3,10 +3,22 @@ package nautilus.game.arcade.game.games.christmas.parts; import java.util.ArrayList; import java.util.Iterator; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Giant; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + import mineplex.core.common.util.C; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; import mineplex.core.hologram.Hologram; import mineplex.core.hologram.HologramManager; import mineplex.core.updater.UpdateType; @@ -17,24 +29,6 @@ import nautilus.game.arcade.game.games.christmas.ChristmasAudio; import nautilus.game.arcade.game.games.christmas.content.CaveGiant; import nautilus.game.arcade.game.games.christmas.content.Snake; -import org.bukkit.ChatColor; -import org.bukkit.Effect; -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.entity.FallingBlock; -import org.bukkit.entity.Giant; -import org.bukkit.entity.Spider; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; - public class Part4 extends Part { private ArrayList _roofIce; @@ -51,6 +45,13 @@ public class Part4 extends Part private boolean _b = false; private HologramManager _holoManager; + private String[] _evilElfNames = new String[] + { "Bing", "Bling", "Blitz", "Larry", "Buddy", "Buster", "Cedar", "Dash", "Eggnog", "Elfie", "Elm", "Elvis", + "Evergreen", "Figgy", "Flake", "Frank", "Frost", "Gabriel", "George", "Henry", "Hermey", "Ice", "Jangle", + "Jingle", "Jinx", "Kringle", "Kris", "Louie", "Max", "Mistletoe", "Nat", "Nick", "Noel", "Pax", "Peppermin", + "Pine", "Ralphie", "Rudy", "Snow", "Snowball", "Star", "Tinsel", "Tiny", "Topper", "Trinket", "Wayne", + "Wink", "Yule", "Zippy" }; + public Part4(HologramManager holoManager, Christmas host, Location sleigh, Location[] presents, ArrayList roofIce, ArrayList mobs, ArrayList snakeHead, ArrayList snakeTrail, ArrayList gate, ArrayList checkpoints, Location giant) { @@ -85,7 +86,7 @@ public class Part4 extends Part @EventHandler public void GateUpdate(UpdateEvent event) { - if (event.getType() != UpdateType.SEC) + if (event.getType() != UpdateType.FAST) return; if (_gate.isEmpty()) @@ -187,6 +188,8 @@ public class Part4 extends Part ent.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); ent.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); ent.setVillager(true); + + ent.setCustomName("Evil Elf " + UtilMath.randomElement(_evilElfNames)); ent.setHealth(9); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part5.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part5.java index 741b7f3ac..2dceaca60 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part5.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/parts/Part5.java @@ -2,41 +2,37 @@ package nautilus.game.arcade.game.games.christmas.parts; import java.util.ArrayList; -import mineplex.core.common.util.UtilAction; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTime; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.damage.CustomDamageEvent; -import nautilus.game.arcade.game.games.christmas.Christmas; -import nautilus.game.arcade.game.games.christmas.ChristmasAudio; -import nautilus.game.arcade.game.games.christmas.content.*; -import net.minecraft.server.v1_8_R3.EntityCreature; - import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.EntityEffect; 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.craftbukkit.v1_8_R3.entity.CraftCreature; import org.bukkit.entity.Player; import org.bukkit.entity.Snowman; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import mineplex.core.common.util.UtilAction; +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 mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.game.games.christmas.Christmas; +import nautilus.game.arcade.game.games.christmas.ChristmasAudio; +import nautilus.game.arcade.game.games.christmas.content.BossFloor; +import nautilus.game.arcade.game.games.christmas.content.BossMobs; +import nautilus.game.arcade.game.games.christmas.content.BossSnowmanPattern; +import nautilus.game.arcade.game.games.christmas.content.PumpkinKing; + public class Part5 extends Part { private ArrayList _spawn; @@ -385,6 +381,9 @@ public class Part5 extends Part @EventHandler public void Damage(CustomDamageEvent event) { + if (event.isCancelled()) + return; + if (_boss == null) return; From 0c383f8bf4858c4e3a32658f8d2b54e171b761eb Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 18:58:03 -0500 Subject: [PATCH 186/223] Remove bad message --- .../Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java | 1 - 1 file changed, 1 deletion(-) 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 cd1a4d1fd..86b7852ec 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.ChatColor; -//Mysticate@184.154.0.242:7990/scm/min/mineplex.git import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; From 0e9e8c155f2f680cbded4a75eba11f57ee723626 Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 19:11:06 -0500 Subject: [PATCH 187/223] Quick fix that I don't think i caused. --- .../Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 86b7852ec..6b1411ecd 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -248,7 +248,7 @@ public class ServerGameMenu extends ShopPageBase setItem(42, _minigameCycle.get(_minigameIndex)); setItem(44, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 3) - .addLore(C.Reset + C.Bold + C.cYellow + "Player Servers " + C.cGray + "Player Hosted Games").addLore(new String[] + .setTitle(C.Reset + C.Bold + C.cYellow + "Player Servers " + C.cGray + "Player Hosted Games").addLore(new String[] { C.Reset + "", C.Reset + "Join your friends in their own ", From a827f95eb448564d925f861bb3d386db9ecf02c6 Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 19:24:24 -0500 Subject: [PATCH 188/223] Fixed scoreboard. VIVA LA FIESTA --- .../game/arcade/game/games/christmas/Christmas.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java index ebe29c61b..7def0ed30 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java @@ -610,7 +610,7 @@ public class Christmas extends SoloGame Scoreboard.Reset(); String line = ""; - for (int i = 0 ; i < 10 ; i++) + for (int i = 0 ; i < 20 ; i++) line += ((i % 2 == 0 ? C.cRed : C.cDGreen) + "█"); Scoreboard.WriteBlank(); @@ -619,12 +619,14 @@ public class Christmas extends SoloGame Scoreboard.WriteBlank(); Scoreboard.Write(C.cWhiteB + "May your winter"); - Scoreboard.Write(C.cWhiteB + "be filled with " + C.cYellowB + "joy" + C.cWhiteB + " and " + C.cYellowB + "cheer" + C.cWhiteB + "."); + Scoreboard.Write(C.cWhiteB + "be filled with"); + Scoreboard.Write(C.cYellowB + "joy" + C.cWhiteB + " and " + C.cYellowB + "cheer" + C.cWhiteB + "."); Scoreboard.WriteBlank(); - Scoreboard.Write(C.cWhite + "Happy Holidays!"); - Scoreboard.Write(C.cWhiteB + "- Your friends at " + C.cGoldB + "MINEPLEX"); + Scoreboard.Write(C.cAquaB + "Happy Holidays!"); + Scoreboard.Write(C.cWhiteB + "- Your friends at"); + Scoreboard.Write(C.cGoldB + "MINEPLEX"); Scoreboard.WriteBlank(); Scoreboard.Write(line); From 0dd7db27cd6196b22acdc2ed751efce63ecbfaf7 Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 19:49:41 -0500 Subject: [PATCH 189/223] FIXED FORAMTTING --- .../nautilus/game/arcade/game/games/christmas/Christmas.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java index 7def0ed30..d3644f231 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java @@ -620,11 +620,14 @@ public class Christmas extends SoloGame Scoreboard.Write(C.cWhiteB + "May your winter"); Scoreboard.Write(C.cWhiteB + "be filled with"); - Scoreboard.Write(C.cYellowB + "joy" + C.cWhiteB + " and " + C.cYellowB + "cheer" + C.cWhiteB + "."); + Scoreboard.Write(C.cYellowB + "joy" + C.cWhiteB + " and " + C.cYellowB + "cheer."); Scoreboard.WriteBlank(); Scoreboard.Write(C.cAquaB + "Happy Holidays!"); + + Scoreboard.WriteBlank(); + Scoreboard.Write(C.cWhiteB + "- Your friends at"); Scoreboard.Write(C.cGoldB + "MINEPLEX"); From b5bdf7ced4341d29116c6efdd91a7bc85b65fd91 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 14 Dec 2015 15:42:32 +1300 Subject: [PATCH 190/223] Remove custom name on players on join and arcade spectator --- .../src/mineplex/core/CustomTagFix.java | 22 ++++++++++++++----- .../nautilus/game/arcade/ArcadeManager.java | 3 +++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java b/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java index 790df2c43..d757499b7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java @@ -35,6 +35,8 @@ import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.EntityType; 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.PlayerQuitEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.event.player.PlayerVelocityEvent; @@ -81,6 +83,15 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook _loggedIn.remove(event.getPlayer()); } + @EventHandler(priority = EventPriority.LOW) + public void playerJoin(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + + player.setCustomName(""); + player.setCustomNameVisible(false); + } + @EventHandler public void ncpExempt(final PlayerToggleFlightEvent event) { @@ -140,7 +151,8 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook { Entry> entry = iterator.next(); - for (Iterator> innerIterator = entry.getValue().entrySet().iterator(); innerIterator.hasNext();) + for (Iterator> innerIterator = entry.getValue().entrySet().iterator(); innerIterator + .hasNext();) { final Entry entry2 = innerIterator.next(); @@ -247,7 +259,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook _entityNameMap.get(owner.getName()).put(spawnPacket.a, entityName); _entityMap.get(owner.getName()).put(spawnPacket.a, new Integer[] { - newId + newId }); sendProtocolPackets(owner, spawnPacket.a, newId, entityName, verifier, true, -1); @@ -349,7 +361,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook { newId = new Integer[] { - UtilEnt.getNewEntityId() + UtilEnt.getNewEntityId() }; _entityMap.get(owner.getName()).put(metaPacket.a, newId); @@ -469,8 +481,8 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook _entityRiding.get(owner.getName()).remove(attachPacket.b); - sendProtocolPackets(owner, vehicleId, ids[ids.length - 1], - _entityNameMap.get(owner.getName()).get(vehicleId), verifier, true, ids.length > 1 ? ids[0] : -1); + sendProtocolPackets(owner, vehicleId, ids[ids.length - 1], _entityNameMap.get(owner.getName()).get(vehicleId), + verifier, true, ids.length > 1 ? ids[0] : -1); } else { 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 fbf22d621..016289a6f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -921,6 +921,9 @@ public class ArcadeManager extends MiniPlugin implements IRelation ((CraftEntity) player).getHandle().getDataWatcher().watch(0, Byte.valueOf((byte) 0)); + player.setCustomName(""); + player.setCustomNameVisible(false); + player.setSprinting(false); player.setSneaking(false); From a04eaddc427553f97bb159e35970e76c3e4664c0 Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 22:25:18 -0500 Subject: [PATCH 191/223] Fixed bump --- .../arcade/game/games/christmas/Sleigh.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java index a41031b6c..26ef62540 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Sleigh.java @@ -207,17 +207,7 @@ public class Sleigh { for (Entity ent : UtilEnt.getInRadius(part.Ent.getLocation(), 1).keySet()) { - boolean matches = false; - for (SleighPart cur : SleighEnts) - { - if (ent instanceof LivingEntity && cur.HasEntity((LivingEntity) ent)) - { - matches = true; - break; - } - } - - if (matches) + if (isPart(ent)) continue; if (ent instanceof Player) @@ -236,17 +226,7 @@ public class Sleigh { for (Entity ent : UtilEnt.getInRadius(part.Ent.getLocation(), 1).keySet()) { - boolean matches = false; - for (SleighPart cur : SleighEnts) - { - if (ent instanceof LivingEntity && cur.HasEntity((LivingEntity) ent)) - { - matches = true; - break; - } - } - - if (matches) + if (isPart(ent)) continue; if (ent instanceof Player) @@ -322,4 +302,30 @@ public class Sleigh { return Santa; } + + public boolean isPart(Entity ent) + { + if (ent == null) + return false; + + if (ent == CentralEntity) + return true; + + if (ent == Santa) + return true; + + for (SleighPart part : SleighEnts) + if (part.Block == ent || part.Ent == ent || (ent instanceof LivingEntity && part.HasEntity((LivingEntity) ent))) + return true; + + for (SleighHorse horse : SleighHorses) + if (horse.Ent == ent || (ent instanceof LivingEntity && horse.HasEntity((LivingEntity) ent))) + return true; + + for (SleighPart part : PresentSlots) + if (part.Block == ent || part.Ent == ent || (ent instanceof LivingEntity && part.HasEntity((LivingEntity) ent))) + return true; + + return false; + } } From 42244ae79876e2075ddeeccb057c26116e7a922f Mon Sep 17 00:00:00 2001 From: Mysticate Date: Sun, 13 Dec 2015 22:43:11 -0500 Subject: [PATCH 192/223] Snowman AI fix --- .../arcade/game/games/christmas/content/SnowmanMaze.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java index 140bcb805..a9d5d3767 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java @@ -234,10 +234,10 @@ public class SnowmanMaze //Stop at intersection int count = 0; - if (face != BlockFace.NORTH && _waypoints.contains(cur.getRelative(BlockFace.NORTH)) && !_waypoints.contains(cur.getRelative(BlockFace.NORTH))) count++; - if (face != BlockFace.SOUTH && _waypoints.contains(cur.getRelative(BlockFace.SOUTH)) && !_waypoints.contains(cur.getRelative(BlockFace.SOUTH))) count++; - if (face != BlockFace.EAST && _waypoints.contains(cur.getRelative(BlockFace.EAST)) && !_waypoints.contains(cur.getRelative(BlockFace.EAST))) count++; - if (face != BlockFace.WEST && _waypoints.contains(cur.getRelative(BlockFace.WEST)) && !_waypoints.contains(cur.getRelative(BlockFace.WEST))) count++; + if (face != BlockFace.NORTH && _waypoints.contains(cur.getRelative(BlockFace.NORTH))) count++; + if (face != BlockFace.SOUTH && _waypoints.contains(cur.getRelative(BlockFace.SOUTH))) count++; + if (face != BlockFace.EAST && _waypoints.contains(cur.getRelative(BlockFace.EAST))) count++; + if (face != BlockFace.WEST && _waypoints.contains(cur.getRelative(BlockFace.WEST))) count++; if (count > 1) break; From dcf3c1ea8840475263b53f4a8391f67500685868 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Sun, 13 Dec 2015 23:14:17 -0500 Subject: [PATCH 193/223] Deleted and added new Cache since renaming was jacked up. --- Plugins/BuildFiles/common.xml | 10 +++++----- .../.classpath | 0 .../.project | 0 .../src/mineplex/cache/player/PlayerCache.java | 0 .../src/mineplex/cache/player/PlayerInfo.java | 0 .../Mineplex.PlayerCache/Mineplex.PlayerCache.iml | 12 ------------ 6 files changed, 5 insertions(+), 17 deletions(-) rename Plugins/{Mineplex.PlayerCache => Mineplex.Cache}/.classpath (100%) rename Plugins/{Mineplex.PlayerCache => Mineplex.Cache}/.project (100%) rename Plugins/{Mineplex.PlayerCache => Mineplex.Cache}/src/mineplex/cache/player/PlayerCache.java (100%) rename Plugins/{Mineplex.PlayerCache => Mineplex.Cache}/src/mineplex/cache/player/PlayerInfo.java (100%) delete mode 100644 Plugins/Mineplex.PlayerCache/Mineplex.PlayerCache.iml diff --git a/Plugins/BuildFiles/common.xml b/Plugins/BuildFiles/common.xml index 4200a7c8a..7cbbd04a4 100644 --- a/Plugins/BuildFiles/common.xml +++ b/Plugins/BuildFiles/common.xml @@ -86,7 +86,7 @@ - + @@ -158,7 +158,7 @@ - + @@ -210,7 +210,7 @@ - + @@ -249,7 +249,7 @@ - + @@ -329,7 +329,7 @@ - + diff --git a/Plugins/Mineplex.PlayerCache/.classpath b/Plugins/Mineplex.Cache/.classpath similarity index 100% rename from Plugins/Mineplex.PlayerCache/.classpath rename to Plugins/Mineplex.Cache/.classpath diff --git a/Plugins/Mineplex.PlayerCache/.project b/Plugins/Mineplex.Cache/.project similarity index 100% rename from Plugins/Mineplex.PlayerCache/.project rename to Plugins/Mineplex.Cache/.project diff --git a/Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerCache.java b/Plugins/Mineplex.Cache/src/mineplex/cache/player/PlayerCache.java similarity index 100% rename from Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerCache.java rename to Plugins/Mineplex.Cache/src/mineplex/cache/player/PlayerCache.java diff --git a/Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerInfo.java b/Plugins/Mineplex.Cache/src/mineplex/cache/player/PlayerInfo.java similarity index 100% rename from Plugins/Mineplex.PlayerCache/src/mineplex/cache/player/PlayerInfo.java rename to Plugins/Mineplex.Cache/src/mineplex/cache/player/PlayerInfo.java diff --git a/Plugins/Mineplex.PlayerCache/Mineplex.PlayerCache.iml b/Plugins/Mineplex.PlayerCache/Mineplex.PlayerCache.iml deleted file mode 100644 index 54892e832..000000000 --- a/Plugins/Mineplex.PlayerCache/Mineplex.PlayerCache.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file From c34ac3ec523a993bb9f6bcc801ad0c4ff2005fbc Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 15:21:43 +1100 Subject: [PATCH 194/223] xmas --- .../nautilus/game/arcade/game/games/christmas/Christmas.java | 2 +- .../game/arcade/game/games/christmas/content/SnowmanBoss.java | 4 ++-- .../game/arcade/game/games/christmas/content/SnowmanMaze.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java index d3644f231..226fbcb51 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java @@ -475,7 +475,7 @@ public class Christmas extends SoloGame } else { - SetCustomWinMessage(player, "You earned " + C.cYellow + "Winter Chest x2"); + SetCustomWinMessage(player, "You earned " + C.cYellow + "2x Winter Holiday Treasure"); Manager.GetTaskManager().completedTask(new Callback() { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java index b97da2215..82b334134 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanBoss.java @@ -49,8 +49,8 @@ public class SnowmanBoss _minions.add(new SnowmanMinion(_spawn.getWorld().spawn(_spawn, Snowman.class))); _heart = _spawn.getWorld().spawn(_spawn, IronGolem.class); - _heart.setMaxHealth(1000); - _heart.setHealth(1000); + _heart.setMaxHealth(1400); + _heart.setHealth(1400); UtilEnt.Vegetate(_heart); Host.CreatureAllowOverride = false; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java index a9d5d3767..e65212177 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/SnowmanMaze.java @@ -254,7 +254,7 @@ public class SnowmanMaze //Spawn if (!Host.GetSleigh().HasPresent(_present)) { - while (_ents.size() < 36) + while (_ents.size() < 44) { Location loc = UtilAlg.Random(_spawns); From 94169a5b8a16b364d2386a597866ceed6c68d4fd Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 15:29:34 +1100 Subject: [PATCH 195/223] it made me push it :( --- Plugins/Mineplex.PlayerCache/.project | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Plugins/Mineplex.PlayerCache/.project diff --git a/Plugins/Mineplex.PlayerCache/.project b/Plugins/Mineplex.PlayerCache/.project new file mode 100644 index 000000000..5321c2157 --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/.project @@ -0,0 +1,17 @@ + + + Mineplex.Cache + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + From fe3431ba0436834ced9353389f23ece576af3714 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Sun, 13 Dec 2015 23:31:21 -0500 Subject: [PATCH 196/223] Cosmetic Menu Update --- .../mineplex/core/common/CurrencyType.java | 8 +- .../mineplex/core/cosmetic/ui/page/Menu.java | 280 +++++++++++------- .../core/shop/page/ConfirmationPage.java | 2 +- .../mineplex/core/treasure/TreasureType.java | 8 +- 4 files changed, 190 insertions(+), 108 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/CurrencyType.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/CurrencyType.java index 6a007fefa..e54f9f28f 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/CurrencyType.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/CurrencyType.java @@ -4,10 +4,10 @@ import org.bukkit.Material; public enum CurrencyType { - Tokens(" Tokens", Material.EMERALD), - Coins(" Coins", Material.DOUBLE_PLANT), - Gems(" Gems", Material.EMERALD), - Gold(" Gold", Material.GOLD_NUGGET); + Tokens("Tokens", Material.EMERALD), + Coins("Treasure Shards", Material.PRISMARINE_SHARD), + Gems("Gems", Material.EMERALD), + Gold("Gold", Material.GOLD_NUGGET); private String _prefix; private Material _displayMaterial; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index e29d110ca..b191a0d93 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -1,5 +1,8 @@ package mineplex.core.cosmetic.ui.page; +import java.util.EnumMap; +import java.util.List; + import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Creature; @@ -11,6 +14,9 @@ import mineplex.core.account.CoreClientManager; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.LineFormat; +import mineplex.core.common.util.UtilText; +import mineplex.core.common.util.UtilUI; import mineplex.core.cosmetic.CosmeticManager; import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.cosmetic.ui.button.OpenArrowTrails; @@ -29,6 +35,7 @@ import mineplex.core.donation.Donor; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.mount.Mount; +import mineplex.core.pet.Pet; import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.page.ConfirmationPage; @@ -53,114 +60,189 @@ public class Menu extends ShopPageBase // " " // }, 1, false)); - addButton(1, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this)); - addButton(3, new ShopItem(Material.ARROW, "Arrow Trails", 1, false), new OpenArrowTrails(this)); - addButton(5, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", 1, false), new OpenDoubleJump(this)); - addButton(7, new ShopItem(Material.SKULL_ITEM, "Death Animations", 1, false), new OpenDeathAnimations(this)); - - addButton(19, new ShopItem(Material.MELON_BLOCK, "Gadgets", 1, false), new OpenGadgets(this)); - addButton(21, new ShopItem(Material.LEATHER, "Morphs", 1, false), new OpenMorphs(this)); - addButton(23, new ShopItem(Material.IRON_BARDING, "Mounts", 1, false), new OpenMounts(this)); - addButton(25, new ShopItem(Material.BONE, "Pets", 1, false), new OpenPets(this)); - - addButton(37, new ShopItem(Material.GOLD_HELMET, "Hats", 1, false), new OpenHats(this)); - addButton(39, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", 1, false), new OpenCostumes(this)); - addButton(41, new ShopItem(Material.GREEN_RECORD, "Music", 1, false), new OpenMusic(this)); - addButton(43, new ShopItem(Material.NAME_TAG, "Taunts", new String[]{C.Bold + "", C.cDGreen + C.Italics + "Coming soon!"}, 1, false), new IButton() + int[] slots = UtilUI.getIndicesFor(12, 1); + int particleSlot = slots[0]; + int arrowSlot = slots[1]; + int jumpSlot = slots[2]; + int deathSlot = slots[3]; + int gadgetSlot = slots[4]; + int morphSlot = slots[5]; + int mountSlot = slots[6]; + int petSlot = slots[7]; + int hatSlot = slots[8]; + int costumeSlot = slots[9]; + int musicSlot = slots[10]; + int tauntSlot = slots[11]; + + EnumMap ownedCount = new EnumMap(GadgetType.class); + EnumMap maxCount = new EnumMap(GadgetType.class); + EnumMap enabled = new EnumMap(GadgetType.class); + + for(GadgetType type : GadgetType.values()) + { + ownedCount.put(type, 0); + maxCount.put(type, 0); + + List gadgets = getPlugin().getGadgetManager().getGadgets(type); + if (gadgets != null) + { + for (Gadget gadget : gadgets) + { + if (gadget.ownsGadget(getPlayer())) + { + ownedCount.put(type, ownedCount.get(type) + 1); + } + + maxCount.put(type, maxCount.get(type) + 1); + } + } + + final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), type); + if(gadget != null) enabled.put(type, gadget); + +// addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), C.mItem + gadget.GetName(), new String[0], 1, false, false), +// new IButton() +// { +// public void onClick(Player player, ClickType clickType) { +// playAcceptSound(player); +// gadget.Disable(player); +// refresh(); +// }; +// }); + } + + int mountOwned = 0; + int mountMax = 0; + Mount mountActive = getPlugin().getMountManager().getActive(getPlayer()); + for (Mount mount : getPlugin().getMountManager().getMounts()) + { + if (mount.HasMount(getPlayer())) + { + mountOwned++; + } + + mountMax++; + } + + int petOwned = 0; + int petMax = 0; + for (Pet pet : getPlugin().getPetManager().GetFactory().GetPets()) + { + if (getPlugin().getPetManager().Get(getPlayer()).GetPets().containsKey(pet.GetPetType())) + { + petOwned++; + } + + petMax++; + } + Creature petActive = getPlugin().getPetManager().GetPet(getPlayer()); + + GadgetType type = GadgetType.Particle; + String[] lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(particleSlot, new ShopItem(Material.NETHER_STAR, "Particle Effects", lore, 1, false), new OpenParticles(this)); + if (enabled.containsKey(type)) addGlow(particleSlot); + + type = GadgetType.ArrowTrail; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(arrowSlot, new ShopItem(Material.ARROW, "Arrow Trails", lore, 1, false), new OpenArrowTrails(this)); + if (enabled.containsKey(type)) addGlow(arrowSlot); + + type = GadgetType.DoubleJump; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(jumpSlot, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", lore, 1, false), new OpenDoubleJump(this)); + if (enabled.containsKey(type)) addGlow(jumpSlot); + + type = GadgetType.Death; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(deathSlot, new ShopItem(Material.SKULL_ITEM, "Death Animations", lore, 1, false), new OpenDeathAnimations(this)); + if (enabled.containsKey(type)) addGlow(deathSlot); + + type = GadgetType.Item; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(gadgetSlot, new ShopItem(Material.MELON_BLOCK, "Gadgets", lore, 1, false), new OpenGadgets(this)); + if (enabled.containsKey(type)) addGlow(gadgetSlot); + + type = GadgetType.Morph; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(morphSlot, new ShopItem(Material.LEATHER, "Morphs", lore, 1, false), new OpenMorphs(this)); + if (enabled.containsKey(type)) addGlow(morphSlot); + + lore = getLore(mountOwned, mountMax, mountActive == null ? null : mountActive.GetName()); + addButton(mountSlot, new ShopItem(Material.IRON_BARDING, "Mounts", lore, 1, false), new OpenMounts(this)); + if (mountActive != null) addGlow(mountSlot); + + lore = getLore(petOwned, petMax, petActive == null ? null : petActive.getCustomName()); + addButton(petSlot, new ShopItem(Material.BONE, "Pets", lore, 1, false), new OpenPets(this)); + if (petActive != null) addGlow(petSlot); + + type = GadgetType.Hat; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(hatSlot, new ShopItem(Material.GOLD_HELMET, "Hats", lore, 1, false), new OpenHats(this)); + if (enabled.containsKey(type)) addGlow(hatSlot); + + type = GadgetType.Costume; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(costumeSlot, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", lore, 1, false), new OpenCostumes(this)); + if (enabled.containsKey(type)) addGlow(costumeSlot); + + type = GadgetType.MusicDisc; + lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); + addButton(musicSlot, new ShopItem(Material.GREEN_RECORD, "Music", lore, 1, false), new OpenMusic(this)); + if (enabled.containsKey(type)) addGlow(musicSlot); + + addButton(tauntSlot, new ShopItem(Material.NAME_TAG, "Taunts", new String[]{C.Bold + "", C.cDGreen + C.Italics + "Coming soon!"}, 1, false), new IButton() { @Override public void onClick(Player player, ClickType clickType) { - player.sendMessage(F.main("Shop", "Comming soon!")); + player.sendMessage(F.main("Shop", "Coming soon!")); } }); - - for(GadgetType type : GadgetType.values()) + +// if (getPlugin().getPetManager().hasActivePet(getPlayer().getName())) +// { +// Creature activePet = getPlugin().getPetManager().getActivePet(getPlayer().getName()); +// String petName = activePet.getType() == EntityType.WITHER ? "Widder" : activePet.getCustomName(); +// addButton(25 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), C.mItem + petName, new String[0], 1, false, false), +// new IButton() +// { +// public void onClick(Player player, ClickType clickType) +// { +// playAcceptSound(player); +// getPlugin().getPetManager().RemovePet(player, true); +// refresh(); +// } +// }); +// } + } + + private String[] getLore(int ownedCount, int maxCount, Gadget enabled) + { + return getLore(ownedCount, maxCount, enabled == null ? null : enabled.GetName()); + } + + private String[] getLore(int ownedCount, int maxCount, String enabled) + { + if (enabled != null) { - final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), type); - if(gadget == null) continue; - - int slot = 10; - switch (type) - { - case Particle: - slot = 1; - break; - case ArrowTrail: - slot = 3; - break; - case DoubleJump: - slot = 5; - break; - case Death: - slot = 7; - break; - case Item: - slot = 19; - break; - case Morph: - slot = 21; - break; - case Hat: - slot = 37; - break; - case Costume: - slot = 39; - break; - case MusicDisc: - slot = 41; - break; - case Taunt: - slot = 43; - break; - default: - slot = 1; - break; - } - slot += 9; - - addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), C.mItem + gadget.GetName(), new String[0], 1, false, false), - new IButton() - { - public void onClick(Player player, ClickType clickType) { - playAcceptSound(player); - gadget.Disable(player); - refresh(); - }; - }); + return UtilText.splitLinesToArray(new String[] { + C.blankLine, + C.cWhite + "You own " + C.cYellow + ownedCount + "/" + maxCount, + C.blankLine, + C.cWhite + "Active: " + C.cGreen + enabled, + C.cWhite + "Right Click to Disable", + C.blankLine, + C.cWhite + "Left Click to View Category" + }, LineFormat.LORE); } - - if (getPlugin().getMountManager().getActive(getPlayer()) != null) + else { - final Mount mount = getPlugin().getMountManager().getActive(getPlayer()); - - addButton(23 + 9, - new ShopItem(mount.GetDisplayMaterial(), mount.GetDisplayData(), C.mItem + mount.GetName(), new String[0], 1, false, false), - new IButton() - { - public void onClick(Player player, ClickType clickType) - { - playAcceptSound(player); - mount.Disable(player); - refresh(); - } - }); - } - - if (getPlugin().getPetManager().hasActivePet(getPlayer().getName())) - { - Creature activePet = getPlugin().getPetManager().getActivePet(getPlayer().getName()); - String petName = activePet.getType() == EntityType.WITHER ? "Widder" : activePet.getCustomName(); - addButton(25 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), C.mItem + petName, new String[0], 1, false, false), - new IButton() - { - public void onClick(Player player, ClickType clickType) - { - playAcceptSound(player); - getPlugin().getPetManager().RemovePet(player, true); - refresh(); - } - }); + return UtilText.splitLinesToArray(new String[] { + C.blankLine, + C.cWhite + "You own " + C.cYellow + ownedCount + "/" + maxCount, + C.blankLine, + C.cWhite + "Left Click to View Category" + }, LineFormat.LORE); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java b/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java index b253a4ea7..c52c84e2b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java @@ -79,7 +79,7 @@ public class ConfirmationPage Date: Mon, 14 Dec 2015 15:33:09 +1100 Subject: [PATCH 197/223] xmas a little harder --- .../nautilus/game/arcade/game/games/christmas/Christmas.java | 2 +- .../game/arcade/game/games/christmas/content/CaveGiant.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java index 226fbcb51..8d129fc69 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/Christmas.java @@ -488,7 +488,7 @@ public class Christmas extends SoloGame } else { - UtilPlayer.message(player, F.main("Inventory", "An error occured while giving you " + C.cRed + "Winter Chest x2" + C.cGray + ".")); + UtilPlayer.message(player, F.main("Inventory", "An error occured while giving you " + C.cRed + "2x Winter Holiday Treasure" + C.cGray + ".")); } } }, player, "CC Reward 2015"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/CaveGiant.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/CaveGiant.java index 153e41aa2..65c5b40d1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/CaveGiant.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/christmas/content/CaveGiant.java @@ -32,8 +32,8 @@ public class CaveGiant Host.Host.CreatureAllowOverride = false; UtilEnt.Vegetate(_ent); - _ent.setMaxHealth(200); - _ent.setHealth(200); + _ent.setMaxHealth(300); + _ent.setHealth(300); _tpLoc = _ent.getLocation(); From bccade55bc5c597cece36a4054ff1fdb72f3e3af Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 15:43:45 +1100 Subject: [PATCH 198/223] reduced coal fumes size --- .../gadget/gadgets/particle/ParticleCoalFumes.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java index 364d388d2..587d8d56d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java @@ -28,19 +28,12 @@ public class ParticleCoalFumes extends ParticleGadget @EventHandler public void onUpdate(UpdateEvent event) { - if(event.getType() != UpdateType.TICK) return; - -// int dur = 200; -// int tick = Math.abs(event.getTick()%dur); - - -// double d = tick/(double)dur; -// float xz = (float) Math.sin(d*Math.PI); - float xz = 2; + if(event.getType() != UpdateType.TICK) + return; for(Player p : GetActive()) { - UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, p.getLocation(), xz, 0, xz, 0, 5, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, p.getLocation(), 0.8f, 0, 0.8f, 0, 6, ViewDist.NORMAL); } } From e8b0e5dd8ed0a255c1a60f64da7dcc7a27c069e2 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Sun, 13 Dec 2015 23:51:47 -0500 Subject: [PATCH 199/223] Fix IntellIJ Files --- .../artifacts/Nautilus_Core_Craftbukkit_jar.xml | 9 --------- Plugins/.idea/compiler.xml | 2 +- Plugins/.idea/modules.xml | 2 +- .../Mineplex.Bungee.Mineplexer.iml | 2 +- Plugins/Mineplex.Cache/Mineplex.Cache.iml | 12 ++++++++++++ Plugins/Mineplex.Core/Mineplex.Core.iml | 2 +- 6 files changed, 16 insertions(+), 13 deletions(-) delete mode 100644 Plugins/.idea/artifacts/Nautilus_Core_Craftbukkit_jar.xml create mode 100644 Plugins/Mineplex.Cache/Mineplex.Cache.iml diff --git a/Plugins/.idea/artifacts/Nautilus_Core_Craftbukkit_jar.xml b/Plugins/.idea/artifacts/Nautilus_Core_Craftbukkit_jar.xml deleted file mode 100644 index b855273ea..000000000 --- a/Plugins/.idea/artifacts/Nautilus_Core_Craftbukkit_jar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - $PROJECT_DIR$/bin - - - - - - \ No newline at end of file diff --git a/Plugins/.idea/compiler.xml b/Plugins/.idea/compiler.xml index df8666836..ec08cea77 100644 --- a/Plugins/.idea/compiler.xml +++ b/Plugins/.idea/compiler.xml @@ -23,7 +23,7 @@ - + diff --git a/Plugins/.idea/modules.xml b/Plugins/.idea/modules.xml index a734c3f2e..c3f549fab 100644 --- a/Plugins/.idea/modules.xml +++ b/Plugins/.idea/modules.xml @@ -5,6 +5,7 @@ + @@ -14,7 +15,6 @@ - diff --git a/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml b/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml index 872b77ead..a1a0bd8bf 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml +++ b/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml @@ -13,6 +13,6 @@ - + \ No newline at end of file diff --git a/Plugins/Mineplex.Cache/Mineplex.Cache.iml b/Plugins/Mineplex.Cache/Mineplex.Cache.iml new file mode 100644 index 000000000..54892e832 --- /dev/null +++ b/Plugins/Mineplex.Cache/Mineplex.Cache.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugins/Mineplex.Core/Mineplex.Core.iml b/Plugins/Mineplex.Core/Mineplex.Core.iml index 06f039df9..c6de528e3 100644 --- a/Plugins/Mineplex.Core/Mineplex.Core.iml +++ b/Plugins/Mineplex.Core/Mineplex.Core.iml @@ -20,6 +20,6 @@ - + \ No newline at end of file From 55fffdad59346768d936db22c68eded32e81000c Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 16:03:51 +1100 Subject: [PATCH 200/223] fixed some colors --- .../src/mineplex/core/cosmetic/ui/page/GadgetPage.java | 4 ++-- .../mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java | 2 +- .../mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index de8ac1f19..ffc32a7b4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -86,7 +86,7 @@ public class GadgetPage extends ShopPageBase if (gadget.getSet() != null) { itemLore.add(C.cBlack); - itemLore.add(C.cGray + gadget.getSet().getName() + " Set;"); + itemLore.add(C.cWhite + gadget.getSet().getName() + " Set;"); //Elements for (Gadget cur : gadget.getSet().getGadgets()) @@ -95,7 +95,7 @@ public class GadgetPage extends ShopPageBase itemLore.add(C.cBlack); //Bonus - itemLore.add(C.cGray + gadget.getSet().getName() + " Set Bonus;"); + itemLore.add(C.cWhite + gadget.getSet().getName() + " Set Bonus;"); for (String bonus : gadget.getSet().getBonus()) itemLore.add(" " + (gadget.getSet().isActive(getPlayer()) ? C.cGreen : C.cGray) + bonus); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java index 7ff4e8986..bc1656359 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitRaveSuit.java @@ -33,7 +33,7 @@ public class OutfitRaveSuit extends OutfitGadget int cost, ArmorSlot slot, Material mat, byte data) { super(manager, name, - UtilText.splitLineToArray(C.cWhite + "There's nothing more suitable for celebration than this high tech flashing outfit!", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "There's nothing more suitable for celebration than this high tech flashing outfit!", LineFormat.LORE), cost, slot, mat, data); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java index 16cb9a226..9d29e4e43 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/outfit/OutfitSpaceSuit.java @@ -23,7 +23,7 @@ public class OutfitSpaceSuit extends OutfitGadget int cost, ArmorSlot slot, Material mat, byte data) { super(manager, name, - UtilText.splitLineToArray(C.cWhite + "Designed specifically for combat in deep space for a sport known as \'Gravity\'", LineFormat.LORE), + UtilText.splitLineToArray(C.cGray + "Designed specifically for combat in deep space for a sport known as \'Gravity\'", LineFormat.LORE), cost, slot, mat, data); } From 7f9e5c4ec9e976f5ca21d964b9500173bc29a354 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 16:06:49 +1100 Subject: [PATCH 201/223] more coal --- .../core/gadget/gadgets/particle/ParticleCoalFumes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java index 587d8d56d..2ccb3701e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/particle/ParticleCoalFumes.java @@ -33,7 +33,7 @@ public class ParticleCoalFumes extends ParticleGadget for(Player p : GetActive()) { - UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, p.getLocation(), 0.8f, 0, 0.8f, 0, 6, ViewDist.NORMAL); + UtilParticle.PlayParticleToAll(ParticleType.LARGE_SMOKE, p.getLocation(), 0.8f, 0, 0.8f, 0, 12, ViewDist.NORMAL); } } From 048a9a81b8aeb4e09bca43b8886197ab771115e3 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 16:20:39 +1100 Subject: [PATCH 202/223] gadget ammo should no logner be purchasable --- .../core/cosmetic/ui/page/GadgetPage.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index ffc32a7b4..24dddffa1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -294,14 +294,14 @@ public class GadgetPage extends ShopPageBase public void activateGadget(Player player, Gadget gadget) { - if (gadget instanceof ItemGadget) - { - if (getPlugin().getInventoryManager().Get(player).getItemCount(gadget.GetName()) <= 0) - { - purchaseGadget(player, gadget); - return; - } - } +// if (gadget instanceof ItemGadget) +// { +// if (getPlugin().getInventoryManager().Get(player).getItemCount(gadget.GetName()) <= 0) +// { +// purchaseGadget(player, gadget); +// return; +// } +// } playAcceptSound(player); gadget.Enable(player); @@ -311,10 +311,10 @@ public class GadgetPage extends ShopPageBase public void handleRightClick(Player player, Gadget gadget) { - if (gadget instanceof ItemGadget) - { - purchaseGadget(player, gadget); - } +// if (gadget instanceof ItemGadget) +// { +// purchaseGadget(player, gadget); +// } } public void deactivateGadget(Player player, Gadget gadget) From cdbcae7e3e70f253fa824988e92ca370f148003e Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Mon, 14 Dec 2015 00:28:28 -0500 Subject: [PATCH 203/223] Cosmetic Menu Update --- .../artifacts/Mineplex_Game_Clans_jar.xml | 2 +- Plugins/.idea/artifacts/Mineplex_Hub_jar.xml | 2 +- .../artifacts/Nautilus_Game_Arcade_jar.xml | 2 +- .../cosmetic/ui/button/OpenArrowTrails.java | 14 +-- .../core/cosmetic/ui/button/OpenCostumes.java | 15 ++-- .../ui/button/OpenDeathAnimations.java | 15 ++-- .../cosmetic/ui/button/OpenDoubleJump.java | 14 +-- .../core/cosmetic/ui/button/OpenGadgets.java | 14 +-- .../core/cosmetic/ui/button/OpenHats.java | 16 ++-- .../core/cosmetic/ui/button/OpenMorphs.java | 19 ++-- .../core/cosmetic/ui/button/OpenMounts.java | 27 ++++-- .../core/cosmetic/ui/button/OpenMusic.java | 17 ++-- .../cosmetic/ui/button/OpenPageButton.java | 48 ++++++++++ .../cosmetic/ui/button/OpenParticles.java | 15 ++-- .../core/cosmetic/ui/button/OpenPets.java | 19 ++-- .../mineplex/core/cosmetic/ui/page/Menu.java | 88 ++++++------------- .../core/treasure/gui/TreasurePage.java | 9 +- 17 files changed, 184 insertions(+), 152 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPageButton.java diff --git a/Plugins/.idea/artifacts/Mineplex_Game_Clans_jar.xml b/Plugins/.idea/artifacts/Mineplex_Game_Clans_jar.xml index d44ba58ec..cc62eda71 100644 --- a/Plugins/.idea/artifacts/Mineplex_Game_Clans_jar.xml +++ b/Plugins/.idea/artifacts/Mineplex_Game_Clans_jar.xml @@ -20,7 +20,7 @@ - + \ No newline at end of file diff --git a/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml b/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml index 55d803b0b..8ac831c95 100644 --- a/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml +++ b/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml @@ -20,8 +20,8 @@ - + \ No newline at end of file diff --git a/Plugins/.idea/artifacts/Nautilus_Game_Arcade_jar.xml b/Plugins/.idea/artifacts/Nautilus_Game_Arcade_jar.xml index 619cdf3df..79c3170ce 100644 --- a/Plugins/.idea/artifacts/Nautilus_Game_Arcade_jar.xml +++ b/Plugins/.idea/artifacts/Nautilus_Game_Arcade_jar.xml @@ -19,7 +19,7 @@ - + \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java index 2664fb9c7..e280de6c2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenArrowTrails.java @@ -5,19 +5,19 @@ import org.bukkit.event.inventory.ClickType; import mineplex.core.cosmetic.ui.page.ArrowTrailPage; import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.gadget.types.Gadget; import mineplex.core.shop.item.IButton; -public class OpenArrowTrails implements IButton +public class OpenArrowTrails extends OpenPageButton { - private Menu _page; - - public OpenArrowTrails(Menu page) + public OpenArrowTrails(Menu menu, Gadget active) { - _page = page; + super(menu, active); } - public void onClick(Player player, ClickType clickType) + @Override + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new ArrowTrailPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Arrow Trails", player)); + getMenu().getShop().openPageForPlayer(player, new ArrowTrailPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Arrow Trails", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenCostumes.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenCostumes.java index 347a007be..01f528d6e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenCostumes.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenCostumes.java @@ -1,23 +1,20 @@ package mineplex.core.cosmetic.ui.button; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; import mineplex.core.cosmetic.ui.page.Menu; -import mineplex.core.shop.item.IButton; +import mineplex.core.gadget.types.Gadget; -public class OpenCostumes implements IButton +public class OpenCostumes extends OpenPageButton { - private Menu _menu; - - public OpenCostumes(Menu menu) + public OpenCostumes(Menu menu, Gadget active) { - _menu = menu; + super(menu, active); } @Override - public void onClick(Player player, ClickType clickType) + protected void leftClick(Player player) { - _menu.openCostumes(player); + getMenu().openCostumes(player); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java index fad54be30..f16d51e65 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDeathAnimations.java @@ -5,19 +5,20 @@ import org.bukkit.event.inventory.ClickType; import mineplex.core.cosmetic.ui.page.DeathEffectPage; import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.gadget.types.Gadget; import mineplex.core.shop.item.IButton; -public class OpenDeathAnimations implements IButton +public class OpenDeathAnimations extends OpenPageButton { - private Menu _page; - - public OpenDeathAnimations(Menu page) + + public OpenDeathAnimations(Menu menu, Gadget active) { - _page = page; + super(menu, active); } - public void onClick(Player player, ClickType clickType) + @Override + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new DeathEffectPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Death Animations", player)); + getMenu().getShop().openPageForPlayer(player, new DeathEffectPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Death Animations", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java index b433181c8..4506defc4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenDoubleJump.java @@ -5,19 +5,19 @@ import org.bukkit.event.inventory.ClickType; import mineplex.core.cosmetic.ui.page.DoubleJumpPage; import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.gadget.types.Gadget; import mineplex.core.shop.item.IButton; -public class OpenDoubleJump implements IButton +public class OpenDoubleJump extends OpenPageButton { - private Menu _page; - - public OpenDoubleJump(Menu page) + public OpenDoubleJump(Menu menu, Gadget active) { - _page = page; + super(menu, active); } - public void onClick(Player player, ClickType clickType) + @Override + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new DoubleJumpPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Double Jump Effects", player)); + getMenu().getShop().openPageForPlayer(player, new DoubleJumpPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Double Jump Effects", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenGadgets.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenGadgets.java index 79a62a52f..a981afc88 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenGadgets.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenGadgets.java @@ -2,23 +2,23 @@ package mineplex.core.cosmetic.ui.button; import mineplex.core.cosmetic.ui.page.GadgetPage; import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.gadget.types.Gadget; import mineplex.core.shop.item.IButton; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; -public class OpenGadgets implements IButton +public class OpenGadgets extends OpenPageButton { - private Menu _page; - - public OpenGadgets(Menu page) + + public OpenGadgets(Menu menu, Gadget active) { - _page = page; + super(menu, active); } @Override - public void onClick(Player player, ClickType clickType) + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new GadgetPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Gadgets", player)); + getMenu().getShop().openPageForPlayer(player, new GadgetPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Gadgets", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java index 48cd8a98c..126382e58 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenHats.java @@ -1,23 +1,21 @@ package mineplex.core.cosmetic.ui.button; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; import mineplex.core.cosmetic.ui.page.HatPage; import mineplex.core.cosmetic.ui.page.Menu; -import mineplex.core.shop.item.IButton; +import mineplex.core.gadget.types.Gadget; -public class OpenHats implements IButton +public class OpenHats extends OpenPageButton { - private Menu _page; - - public OpenHats(Menu page) + public OpenHats(Menu menu, Gadget active) { - _page = page; + super(menu, active); } - public void onClick(Player player, ClickType clickType) + @Override + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new HatPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Hats", player)); + getMenu().getShop().openPageForPlayer(player, new HatPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Hats", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMorphs.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMorphs.java index 8666c1bfb..34d6ac932 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMorphs.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMorphs.java @@ -2,22 +2,21 @@ package mineplex.core.cosmetic.ui.button; import mineplex.core.cosmetic.ui.page.Menu; import mineplex.core.cosmetic.ui.page.MorphPage; -import mineplex.core.shop.item.IButton; +import mineplex.core.gadget.types.Gadget; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -public class OpenMorphs implements IButton +public class OpenMorphs extends OpenPageButton { - private Menu _page; - - public OpenMorphs(Menu page) + + public OpenMorphs(Menu menu, Gadget active) { - _page = page; + super(menu, active); } - - public void onClick(Player player, ClickType clickType) + + @Override + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new MorphPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Morphs", player)); + getMenu().getShop().openPageForPlayer(player, new MorphPage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Morphs", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMounts.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMounts.java index d71c566a8..17dea9154 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMounts.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMounts.java @@ -2,6 +2,8 @@ package mineplex.core.cosmetic.ui.button; import mineplex.core.cosmetic.ui.page.Menu; import mineplex.core.cosmetic.ui.page.MountPage; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.mount.Mount; import mineplex.core.shop.item.IButton; import org.bukkit.entity.Player; @@ -9,15 +11,28 @@ import org.bukkit.event.inventory.ClickType; public class OpenMounts implements IButton { - private Menu _page; - - public OpenMounts(Menu page) + private Menu _menu; + private Mount _active; + + public OpenMounts(Menu menu, Mount active) { - _page = page; + _menu = menu; + _active = active; } - + + @Override public void onClick(Player player, ClickType clickType) { - _page.getShop().openPageForPlayer(player, new MountPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Mounts", player)); + if (clickType.isLeftClick()) + _menu.getShop().openPageForPlayer(player, new MountPage(_menu.getPlugin(), _menu.getShop(), _menu.getClientManager(), _menu.getDonationManager(), "Mounts", player)); + else + { + if (_active != null) + { + _menu.playAcceptSound(player); + _active.Disable(player); + _menu.refresh(); + } + } } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMusic.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMusic.java index 72d1c2d18..b158901cc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMusic.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenMusic.java @@ -4,22 +4,19 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.gadget.types.Gadget; import mineplex.core.shop.item.IButton; -/** - * Created by shaun on 14-09-15. - */ -public class OpenMusic implements IButton +public class OpenMusic extends OpenPageButton { - private Menu _menu; - - public OpenMusic(Menu menu) + public OpenMusic(Menu menu, Gadget active) { - _menu = menu; + super(menu, active); } - public void onClick(Player player, ClickType clickType) + @Override + protected void leftClick(Player player) { - _menu.openMusic(player); + getMenu().openMusic(player); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPageButton.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPageButton.java new file mode 100644 index 000000000..7e0a4159a --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPageButton.java @@ -0,0 +1,48 @@ +package mineplex.core.cosmetic.ui.button; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.shop.item.IButton; + +public abstract class OpenPageButton implements IButton +{ + private Menu _menu; + private Gadget _active; + + public OpenPageButton(Menu menu, Gadget active) + { + _active = active; + _menu = menu; + } + + @Override + public void onClick(Player player, ClickType clickType) + { + if (clickType.isLeftClick()) + leftClick(player); + else + { + if (_active != null) + { + _menu.playAcceptSound(player); + _active.Disable(player); + _menu.refresh(); + } + } + } + + protected Menu getMenu() + { + return _menu; + } + + protected Gadget getActive() + { + return _active; + } + + protected abstract void leftClick(Player player); +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenParticles.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenParticles.java index 37e9cf1e1..b464e0b22 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenParticles.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenParticles.java @@ -2,22 +2,23 @@ package mineplex.core.cosmetic.ui.button; import mineplex.core.cosmetic.ui.page.Menu; import mineplex.core.cosmetic.ui.page.ParticlePage; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.Gadget; import mineplex.core.shop.item.IButton; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; -public class OpenParticles implements IButton +public class OpenParticles extends OpenPageButton { - private Menu _page; - - public OpenParticles(Menu page) + public OpenParticles(Menu menu, Gadget active) { - _page = page; + super(menu, active); } - public void onClick(Player player, ClickType clickType) + @Override + protected void leftClick(Player player) { - _page.getShop().openPageForPlayer(player, new ParticlePage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Particles", player)); + getMenu().getShop().openPageForPlayer(player, new ParticlePage(getMenu().getPlugin(), getMenu().getShop(), getMenu().getClientManager(), getMenu().getDonationManager(), "Particles", player)); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPets.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPets.java index fdaaa0e19..78c7790e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPets.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/button/OpenPets.java @@ -1,7 +1,9 @@ package mineplex.core.cosmetic.ui.button; import mineplex.core.cosmetic.ui.page.Menu; +import mineplex.core.cosmetic.ui.page.MountPage; import mineplex.core.cosmetic.ui.page.PetPage; +import mineplex.core.pet.Pet; import mineplex.core.shop.item.IButton; import org.bukkit.entity.Player; @@ -9,16 +11,23 @@ import org.bukkit.event.inventory.ClickType; public class OpenPets implements IButton { - private Menu _page; - - public OpenPets(Menu page) + private Menu _menu; + + public OpenPets(Menu menu) { - _page = page; + _menu = menu; } @Override public void onClick(Player player, ClickType clickType) { - _page.getShop().openPageForPlayer(player, new PetPage(_page.getPlugin(), _page.getShop(), _page.getClientManager(), _page.getDonationManager(), "Pets", player)); + if (clickType.isLeftClick()) + _menu.getShop().openPageForPlayer(player, new PetPage(_menu.getPlugin(), _menu.getShop(), _menu.getClientManager(), _menu.getDonationManager(), "Pets", player)); + else + { + _menu.playAcceptSound(player); + _menu.getPlugin().getPetManager().RemovePet(player, true); + _menu.refresh(); + } } } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index b191a0d93..cfbfd261b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -1,5 +1,6 @@ package mineplex.core.cosmetic.ui.page; +import java.util.ArrayList; import java.util.EnumMap; import java.util.List; @@ -41,6 +42,7 @@ import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.page.ConfirmationPage; import mineplex.core.shop.page.ShopPageBase; import mineplex.core.treasure.TreasureKey; +import mineplex.core.treasure.TreasureType; public class Menu extends ShopPageBase { @@ -54,13 +56,19 @@ public class Menu extends ShopPageBase @Override protected void buildPage() { -// Donor donor = getDonationManager().Get(getPlayer()); + // Treasure Shards + int treasureShards = getDonationManager().Get(getPlayer()).getCoins(); -// addItem(2, new ShopItem(CurrencyType.Gems.GetDisplayMaterial(), donor.GetGems() + " Gems", new String[] { -// " " -// }, 1, false)); + List shardLore = new ArrayList(); + shardLore.add(" "); + shardLore.add(C.cGray + "This seems like it might come in"); + shardLore.add(C.cGray + "handy. Maybe I can collect more!"); - int[] slots = UtilUI.getIndicesFor(12, 1); + ShopItem shards = new ShopItem(Material.PRISMARINE_SHARD, C.cAqua + C.Bold + treasureShards + " Treasure Shards", shardLore.toArray(new String[0]), 0, false); + addItem(4, shards); + + // Cosmetic Items + int[] slots = UtilUI.getIndicesFor(12, 2); int particleSlot = slots[0]; int arrowSlot = slots[1]; int jumpSlot = slots[2]; @@ -99,16 +107,6 @@ public class Menu extends ShopPageBase final Gadget gadget = getPlugin().getGadgetManager().getActive(getPlayer(), type); if(gadget != null) enabled.put(type, gadget); - -// addButton(slot, new ShopItem(gadget.GetDisplayMaterial(), gadget.GetDisplayData(), C.mItem + gadget.GetName(), new String[0], 1, false, false), -// new IButton() -// { -// public void onClick(Player player, ClickType clickType) { -// playAcceptSound(player); -// gadget.Disable(player); -// refresh(); -// }; -// }); } int mountOwned = 0; @@ -139,36 +137,36 @@ public class Menu extends ShopPageBase GadgetType type = GadgetType.Particle; String[] lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(particleSlot, new ShopItem(Material.NETHER_STAR, "Particle Effects", lore, 1, false), new OpenParticles(this)); + addButton(particleSlot, new ShopItem(Material.NETHER_STAR, "Particle Effects", lore, 1, false), new OpenParticles(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(particleSlot); type = GadgetType.ArrowTrail; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(arrowSlot, new ShopItem(Material.ARROW, "Arrow Trails", lore, 1, false), new OpenArrowTrails(this)); + addButton(arrowSlot, new ShopItem(Material.ARROW, "Arrow Trails", lore, 1, false), new OpenArrowTrails(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(arrowSlot); type = GadgetType.DoubleJump; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(jumpSlot, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", lore, 1, false), new OpenDoubleJump(this)); + addButton(jumpSlot, new ShopItem(Material.GOLD_BOOTS, "Double Jump Effects", lore, 1, false), new OpenDoubleJump(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(jumpSlot); type = GadgetType.Death; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(deathSlot, new ShopItem(Material.SKULL_ITEM, "Death Animations", lore, 1, false), new OpenDeathAnimations(this)); + addButton(deathSlot, new ShopItem(Material.SKULL_ITEM, "Death Animations", lore, 1, false), new OpenDeathAnimations(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(deathSlot); type = GadgetType.Item; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(gadgetSlot, new ShopItem(Material.MELON_BLOCK, "Gadgets", lore, 1, false), new OpenGadgets(this)); + addButton(gadgetSlot, new ShopItem(Material.MELON_BLOCK, "Gadgets", lore, 1, false), new OpenGadgets(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(gadgetSlot); type = GadgetType.Morph; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(morphSlot, new ShopItem(Material.LEATHER, "Morphs", lore, 1, false), new OpenMorphs(this)); + addButton(morphSlot, new ShopItem(Material.LEATHER, "Morphs", lore, 1, false), new OpenMorphs(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(morphSlot); lore = getLore(mountOwned, mountMax, mountActive == null ? null : mountActive.GetName()); - addButton(mountSlot, new ShopItem(Material.IRON_BARDING, "Mounts", lore, 1, false), new OpenMounts(this)); + addButton(mountSlot, new ShopItem(Material.IRON_BARDING, "Mounts", lore, 1, false), new OpenMounts(this, mountActive)); if (mountActive != null) addGlow(mountSlot); lore = getLore(petOwned, petMax, petActive == null ? null : petActive.getCustomName()); @@ -177,17 +175,17 @@ public class Menu extends ShopPageBase type = GadgetType.Hat; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(hatSlot, new ShopItem(Material.GOLD_HELMET, "Hats", lore, 1, false), new OpenHats(this)); + addButton(hatSlot, new ShopItem(Material.GOLD_HELMET, "Hats", lore, 1, false), new OpenHats(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(hatSlot); type = GadgetType.Costume; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(costumeSlot, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", lore, 1, false), new OpenCostumes(this)); + addButton(costumeSlot, new ShopItem(Material.DIAMOND_CHESTPLATE, "Costumes", lore, 1, false), new OpenCostumes(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(costumeSlot); type = GadgetType.MusicDisc; lore = getLore(ownedCount.get(type), maxCount.get(type), enabled.get(type)); - addButton(musicSlot, new ShopItem(Material.GREEN_RECORD, "Music", lore, 1, false), new OpenMusic(this)); + addButton(musicSlot, new ShopItem(Material.GREEN_RECORD, "Music", lore, 1, false), new OpenMusic(this, enabled.get(type))); if (enabled.containsKey(type)) addGlow(musicSlot); addButton(tauntSlot, new ShopItem(Material.NAME_TAG, "Taunts", new String[]{C.Bold + "", C.cDGreen + C.Italics + "Coming soon!"}, 1, false), new IButton() @@ -198,22 +196,6 @@ public class Menu extends ShopPageBase player.sendMessage(F.main("Shop", "Coming soon!")); } }); - -// if (getPlugin().getPetManager().hasActivePet(getPlayer().getName())) -// { -// Creature activePet = getPlugin().getPetManager().getActivePet(getPlayer().getName()); -// String petName = activePet.getType() == EntityType.WITHER ? "Widder" : activePet.getCustomName(); -// addButton(25 + 9, new ShopItem(Material.MONSTER_EGG, (byte) getPlugin().getPetManager().getActivePet(getPlayer().getName()).getType().getTypeId(), C.mItem + petName, new String[0], 1, false, false), -// new IButton() -// { -// public void onClick(Player player, ClickType clickType) -// { -// playAcceptSound(player); -// getPlugin().getPetManager().RemovePet(player, true); -// refresh(); -// } -// }); -// } } private String[] getLore(int ownedCount, int maxCount, Gadget enabled) @@ -227,21 +209,21 @@ public class Menu extends ShopPageBase { return UtilText.splitLinesToArray(new String[] { C.blankLine, - C.cWhite + "You own " + C.cYellow + ownedCount + "/" + maxCount, + C.cWhite + "You own " + ownedCount + "/" + maxCount, C.blankLine, - C.cWhite + "Active: " + C.cGreen + enabled, - C.cWhite + "Right Click to Disable", + C.cWhite + "Active: " + C.cYellow + enabled, + C.cGreen + "Right-Click to Disable", C.blankLine, - C.cWhite + "Left Click to View Category" + C.cGreen + "Left-Click to View Category" }, LineFormat.LORE); } else { return UtilText.splitLinesToArray(new String[] { C.blankLine, - C.cWhite + "You own " + C.cYellow + ownedCount + "/" + maxCount, + C.cWhite + "You own " + ownedCount + "/" + maxCount, C.blankLine, - C.cWhite + "Left Click to View Category" + C.cGreen + "Left-Click to View Category" }, LineFormat.LORE); } } @@ -255,16 +237,4 @@ public class Menu extends ShopPageBase { getShop().openPageForPlayer(player, new MusicPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Music", player)); } - - public void attemptPurchaseKey(Player player) - { - getShop().openPageForPlayer(player, new ConfirmationPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), new Runnable() - { - public void run() - { - getPlugin().getInventoryManager().addItemToInventory(getPlayer(), "Treasure Key", 1); - refresh(); - } - }, this, new TreasureKey(), CurrencyType.Coins, getPlayer())); - } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java index 889765b9b..9da74c1e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/gui/TreasurePage.java @@ -47,11 +47,8 @@ public class TreasurePage extends ShopPageBase List shardLore = new ArrayList(); shardLore.add(" "); - shardLore.add(F.value("Treasure Shards", "" + treasureShards)); - shardLore.add(" "); - shardLore.add(C.cGray + "Useless by itself, Treasure Shards"); - shardLore.add(C.cGray + "can be combined to forge new"); - shardLore.add(C.cGray + "and undiscovered treasures."); + shardLore.add(C.cGray + "This seems like it might come in"); + shardLore.add(C.cGray + "handy. Maybe I can collect more!"); List basicLore = new ArrayList(); basicLore.add(" "); @@ -130,7 +127,7 @@ public class TreasurePage extends ShopPageBase christmasLore.add(ChatColor.RESET + "or Purchase at: " + C.cYellow + "www.mineplex.com/shop"); } - ShopItem shards = new ShopItem(Material.PRISMARINE_SHARD, C.cAqua + C.Bold + "Treasure Shards", shardLore.toArray(new String[0]), 0, false); + ShopItem shards = new ShopItem(Material.PRISMARINE_SHARD, C.cAqua + C.Bold + treasureShards + " Treasure Shards", shardLore.toArray(new String[0]), 0, false); ShopItem basic = new ShopItem(Material.CHEST, C.cGreen + C.Bold + "Old Chest", basicLore.toArray(new String[0]), 0, false, false); ShopItem heroic = new ShopItem(Material.TRAPPED_CHEST, C.cGold + C.Bold + "Ancient Chest", heroicLore.toArray(new String[0]), 0, false, false); ShopItem legendary = new ShopItem(Material.ENDER_CHEST, C.cRed + C.Bold + "Mythical Chest", legendaryLore.toArray(new String[0]), 0, false, false); From c508b5ea965e45f7c1641767492f730f3183568b Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 18:13:19 +1100 Subject: [PATCH 204/223] chest visuals --- .../src/mineplex/core/treasure/Treasure.java | 6 ++++++ .../mineplex/core/treasure/TreasureStyle.java | 2 +- .../animation/BlockChangeAnimation.java | 20 +++++++++++++++---- .../animation/ChestSpawnAnimation.java | 8 ++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/Treasure.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/Treasure.java index e4645cad3..a9eecb3f7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/Treasure.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/Treasure.java @@ -14,6 +14,7 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; 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; @@ -174,6 +175,11 @@ public class Treasure UtilParticle.PlayParticle(type, block.getLocation().add(0.5 + xDif, 0.5 + yDif, 0.5 + zDif), red, 0.2F, 0.2F, 1F, 0, ViewDist.NORMAL, UtilServer.getPlayers()); } + else if (_treasureType == TreasureType.CHRISTMAS) + { + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, block.getLocation().add(0.5f, 0.5f, 0.5f), 0.1f, 0.1F, 0.1F, 0.2F, 5, + ViewDist.NORMAL, UtilServer.getPlayers()); + } else { UtilParticle.PlayParticle(type, block.getLocation().add(0.5, 0.5, 0.5), 0.5F, 0.5F, 0.5F, 0.2F, 0, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java index 38828ee6b..f69e4b130 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureStyle.java @@ -30,7 +30,7 @@ public enum TreasureStyle CHRISTMAS( ParticleType.SNOW_SHOVEL, ParticleType.SNOWBALL_POOF, - ParticleType.FIREWORKS_SPARK, + ParticleType.SNOW_SHOVEL, Sound.FIZZ, Sound.CHICKEN_EGG_POP ); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/BlockChangeAnimation.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/BlockChangeAnimation.java index aef2e303f..2d6e42d38 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/BlockChangeAnimation.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/BlockChangeAnimation.java @@ -54,18 +54,30 @@ public class BlockChangeAnimation extends Animation if (getTreasure().getTreasureType() == TreasureType.OLD) continue; - Material newMaterial = getTreasure().getTreasureType() == TreasureType.ANCIENT ? Material.NETHER_BRICK : Material.QUARTZ_BLOCK; + Material mat; + if (getTreasure().getTreasureType() == TreasureType.ANCIENT) mat = Material.NETHER_BRICK; + else if (getTreasure().getTreasureType() == TreasureType.MYTHICAL) mat = Material.QUARTZ_BLOCK; + else if (getTreasure().getTreasureType() == TreasureType.CHRISTMAS) mat = Material.ICE; + else + continue; + _blockInfoList.add(new BlockInfo(b)); - b.setType(newMaterial); + b.setType(mat); } else if (b.getType() == Material.SMOOTH_STAIRS || b.getType() == Material.COBBLESTONE_STAIRS) { if (getTreasure().getTreasureType() == TreasureType.OLD) continue; - Material newMaterial = getTreasure().getTreasureType() == TreasureType.ANCIENT ? Material.NETHER_BRICK_STAIRS : Material.QUARTZ_STAIRS; + Material mat; + if (getTreasure().getTreasureType() == TreasureType.ANCIENT) mat = Material.NETHER_BRICK_STAIRS; + else if (getTreasure().getTreasureType() == TreasureType.MYTHICAL) mat = Material.QUARTZ_STAIRS; + else if (getTreasure().getTreasureType() == TreasureType.CHRISTMAS) mat = Material.PACKED_ICE; + else + continue; + _blockInfoList.add(new BlockInfo(b)); - b.setType(newMaterial); + b.setType(mat); } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/ChestSpawnAnimation.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/ChestSpawnAnimation.java index 54fc12cee..65c51b163 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/ChestSpawnAnimation.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/animation/ChestSpawnAnimation.java @@ -16,6 +16,7 @@ import net.minecraft.server.v1_8_R3.MathHelper; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.treasure.BlockInfo; @@ -115,6 +116,13 @@ public class ChestSpawnAnimation extends Animation ViewDist.NORMAL, UtilServer.getPlayers()); } } + else if (getTreasure().getTreasureType() == TreasureType.CHRISTMAS) + { + float spread = 1f - (getTicks() / (float)ANIMATION_DURATION); + + UtilParticle.PlayParticle(ParticleType.SNOW_SHOVEL, _centerLocation.clone().add(0, 5, 0), spread, 0.1f, spread, 0, 30, + ViewDist.NORMAL, UtilServer.getPlayers()); + } //Spawn Chest if (getTicks() >= ANIMATION_DURATION) From fac255db12934925ee6aa0a939c9a0aa2ddd4fa7 Mon Sep 17 00:00:00 2001 From: Cheese Date: Mon, 14 Dec 2015 18:24:05 +1100 Subject: [PATCH 205/223] art --- Art/BlackFriday.png | Bin 0 -> 174285 bytes Art/ChristmasChaos.png | Bin 0 -> 448594 bytes Art/ClansBanner.png | Bin 0 -> 1041082 bytes Art/TitanLogo.png | Bin 0 -> 384335 bytes Art/WinterTreasure.png | Bin 0 -> 1500317 bytes Art/WinterTreasureTrim.png | Bin 0 -> 1415618 bytes Art/y5O7WYh.png | Bin 0 -> 39246 bytes Art/zKzkfLE.png | Bin 0 -> 95417 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Art/BlackFriday.png create mode 100644 Art/ChristmasChaos.png create mode 100644 Art/ClansBanner.png create mode 100644 Art/TitanLogo.png create mode 100644 Art/WinterTreasure.png create mode 100644 Art/WinterTreasureTrim.png create mode 100644 Art/y5O7WYh.png create mode 100644 Art/zKzkfLE.png diff --git a/Art/BlackFriday.png b/Art/BlackFriday.png new file mode 100644 index 0000000000000000000000000000000000000000..d63feef857fa8f14b489a70dff163eb2162a027d GIT binary patch literal 174285 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%0DAih9=4kEMj>pRkT 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�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 literal 0 HcmV?d00001 diff --git a/Art/ChristmasChaos.png b/Art/ChristmasChaos.png new file mode 100644 index 0000000000000000000000000000000000000000..92bf27cd34787e0889ea0d1faadf5c0e587fbbcf GIT binary patch literal 448594 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 kBdLYnHMI|!%oOBQ-f108tFDwuGmxdMgZ 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%0A{J7 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 CyocBOduD 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 z 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 BFNFXA literal 0 HcmV?d00001 diff --git a/Art/ClansBanner.png b/Art/ClansBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..2de832c70ddeec3d5826c5890e918aeb50607aa4 GIT binary patch literal 1041082 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�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