From 3bb11bba084baa2654b1470f76415c35e46bdd1a Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Sat, 21 Nov 2015 11:30:53 -0500 Subject: [PATCH 01/31] - Fixed Stats [caused by bad communication between chiss and I] --- .../mineplex/core/achievement/Achievement.java | 16 ++++++++-------- .../core/achievement/AchievementCategory.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 329f3bd35..6f36f0dd3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -277,7 +277,7 @@ public enum Achievement //Champions CHAMPIONS_WINS("Champion", 600, - new String[]{"Champions Domination.Wins", "Champions TDM.Wins", "Champions Capture the Flag.Wins"}, + new String[]{"Champions Domination.Wins", "Champions TDM.Wins", "Champions CTF.Wins"}, new String[]{"Win 80 games of Dominate, TDM, or CTF"}, new int[]{80}, AchievementCategory.CHAMPIONS), @@ -295,43 +295,43 @@ public enum Achievement AchievementCategory.CHAMPIONS), CHAMPIONS_ASSASSINATION("Assassination", 1000, - new String[]{"Champions Domination.Assassination", "Champions TDM.Assassination", "Champions Capture the Flag.Assassination"}, + new String[]{"Champions Domination.Assassination", "Champions TDM.Assassination", "Champions CTF.Assassination"}, new String[]{"Kill 40 players with Backstab without", "taking any damage from them"}, new int[]{40}, AchievementCategory.CHAMPIONS), CHAMPIONS_MASS_ELECTROCUTION("Mass Electrocution", 1200, - new String[]{"Champions Domination.MassElectrocution", "Champions TDM.MassElectrocution", "Champions Capture the Flag.MassElectrocution"}, + new String[]{"Champions Domination.MassElectrocution", "Champions TDM.MassElectrocution", "Champions CTF.MassElectrocution"}, new String[]{"Hit 4 enemies with a Lightning Orb"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_THE_LONGEST_SHOT("The Longest Shot", 1200, - new String[]{"Champions Domination.TheLongestShot", "Champions TDM.TheLongestShot", "Champions Capture the Flag.TheLongestShot"}, + new String[]{"Champions Domination.TheLongestShot", "Champions TDM.TheLongestShot", "Champions CTF.TheLongestShot"}, new String[]{"Kill someone using Longshot who", "is over 64 Blocks away from you"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_EARTHQUAKE("Earthquake", 1200, - new String[]{"Champions Domination.Earthquake", "Champions TDM.Earthquake", "Champions Capture the Flag.Earthquake"}, + new String[]{"Champions Domination.Earthquake", "Champions TDM.Earthquake", "Champions CTF.Earthquake"}, new String[]{"Launch 5 enemies using Seismic Slam"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_CAPTURES("Sticky Fingers", 2500, - new String[]{"Champions Capture the Flag.Captures"}, + new String[]{"Champions CTF.Captures"}, new String[]{"Capture the Enemy Flag 20 times"}, new int[]{20}, AchievementCategory.CHAMPIONS), CHAMPIONS_CLUTCH("Clutch", 600, - new String[]{"Champions Capture the Flag.Clutch"}, + new String[]{"Champions CTF.Clutch"}, new String[]{"Kill the Enemy Flag Carrier in Sudden Death"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_SPECIAL_WIN("Champion of Champions", 3000, - new String[]{"Champions Capture the Flag.SpecialWin"}, + new String[]{"Champions CTF.SpecialWin"}, new String[]{"Win the game with 5 more captures than the other team"}, new int[]{1}, AchievementCategory.CHAMPIONS), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 8eb4305a2..2bf9be288 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -78,7 +78,7 @@ public enum AchievementCategory new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, Material.BOOK_AND_QUILL, 0, GameCategory.CLASSICS, "Extra Tools Kit"), - CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions Capture the Flag"}, + CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions CTF"}, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, new StatDisplay("Flags Captured", "Captures") }, Material.BEACON, 0, GameCategory.CHAMPIONS, "Extra Class Skills"), From 8ceb6ccfca6869518509b9cdf68054a0d70eec69 Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 25 Nov 2015 17:41:00 +1100 Subject: [PATCH 02/31] minestrike update! --- .../game/games/minestrike/MineStrike.java | 39 +++++++++++++- .../game/games/minestrike/ShopManager.java | 5 +- .../items/equipment/armor/Armor.java | 2 +- .../items/grenades/FireGrenadeBase.java | 13 +++++ .../minestrike/items/grenades/Smoke.java | 52 ++++++++++++++++--- 5 files changed, 99 insertions(+), 12 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java index 439990900..b1f6b1e6f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java @@ -211,6 +211,7 @@ public class MineStrike extends TeamGame private HashSet _defusalDropped = new HashSet(); private HashMap _incendiary = new HashMap(); + private HashMap _smokeBlocks = new HashMap(); private Bomb _bomb = null; private Item _bombItem = null; @@ -612,6 +613,17 @@ public class MineStrike extends TeamGame { _incendiary.put(loc, endTime); } + + @SuppressWarnings("deprecation") + public void registerSmokeBlock(Block block, long endTime) + { + if (block.getType() == Material.AIR || block.getType() == Material.PORTAL || block.getType() == Material.FIRE) + { + block.setTypeIdAndData(90, (byte)UtilMath.r(2), false); + + _smokeBlocks.put(block, endTime); + } + } public Gun getGunInHand(Player player, ItemStack overrideStack) { @@ -728,7 +740,7 @@ public class MineStrike extends TeamGame if (grenade == null) return; - if (!UtilTime.elapsed(GetStateTime(), 15000)) + if (!UtilTime.elapsed(GetStateTime(), 10000)) { UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot throw Grenades yet.")); return; @@ -2160,6 +2172,11 @@ public class MineStrike extends TeamGame //Incendiary _incendiary.clear(); Manager.GetBlockRestore().RestoreAll(); + + //Smoke + for (Block block : _smokeBlocks.keySet()) + block.setType(Material.AIR); + _smokeBlocks.clear(); //Restock Ammo for (Gun gun : _gunsEquipped.keySet()) @@ -2411,6 +2428,26 @@ public class MineStrike extends TeamGame loc.getWorld().playSound(loc, Sound.PIG_DEATH, 1f, 1f); } } + + @EventHandler + public void smokeUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + Iterator smokeIterator = _smokeBlocks.keySet().iterator(); + + while (smokeIterator.hasNext()) + { + Block block = smokeIterator.next(); + + if (System.currentTimeMillis() > _smokeBlocks.get(block)) + { + block.setTypeIdAndData(0, (byte)0, false); + smokeIterator.remove(); + } + } + } @EventHandler public void bombBurnUpdate(UpdateEvent event) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java index d276c503a..a7aab38ff 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java @@ -236,14 +236,15 @@ public class ShopManager Host.registerGrenade(grenade, player); } + //Use 250 instead of 255, to show that its kevlar/helmet else if (item instanceof Helmet) { - ((Helmet)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(255, 75, 75) : Color.fromRGB(125, 200, 255)); + ((Helmet)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(250, 75, 75) : Color.fromRGB(125, 200, 250)); } else if (item instanceof Kevlar) { - ((Kevlar)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(255, 75, 75) : Color.fromRGB(125, 200, 255)); + ((Kevlar)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(250, 75, 75) : Color.fromRGB(125, 200, 250)); } else if (item instanceof DefusalKit) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java index 275062ce9..02a40771a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java @@ -54,7 +54,7 @@ public class Armor extends StrikeItem try { LeatherArmorMeta meta = (LeatherArmorMeta)stack.getItemMeta(); - return (meta.getColor().getBlue() == 100 || meta.getColor().getRed() == 100); + return (meta.getColor().getBlue() == 250 || meta.getColor().getRed() == 250); } catch (Exception e) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java index 70627c3fe..020e63723 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java @@ -74,6 +74,19 @@ public abstract class FireGrenadeBase extends Grenade if (!UtilBlock.solid(block.getRelative(BlockFace.DOWN))) continue; + //Smoke + boolean nearSmoke = false; + for (Block other : UtilBlock.getSurrounding(block, false)) + { + if (other.getType() == Material.PORTAL) + { + nearSmoke = true; + break; + } + } + if (nearSmoke) + continue; + UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(game.Manager.getPlugin(), new Runnable() { public void run() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java index 995f8c70e..62b2b08f1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java @@ -1,5 +1,9 @@ package nautilus.game.arcade.game.games.minestrike.items.grenades; +import java.util.HashMap; + +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -12,11 +16,15 @@ import org.bukkit.ChatColor; 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; public class Smoke extends Grenade { + private boolean _createdBlocks = false; + public Smoke() { super("Smoke", new String[] @@ -27,27 +35,55 @@ public class Smoke extends Grenade } @Override - public boolean updateCustom(MineStrike game, Entity ent) + public boolean updateCustom(final MineStrike game, Entity ent) { - if (ent.getTicksLived() > 60) + if (ent.getTicksLived() > 40 && UtilEnt.isGrounded(ent)) { // UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, ent.getLocation(), 0.3f, 0.3f, 0.3f, 0, 1, // ViewDist.MAX, UtilServer.getPlayers()); - UtilParticle.PlayParticle(ParticleType.CLOUD, ent.getLocation(), 1.5f, 1.5f, 1.5f, 0, 100, - ViewDist.MAX, UtilServer.getPlayers()); - - - ent.getWorld().playSound(ent.getLocation(), Sound.FIZZ, 0.1f, 0.1f); - + //Remove Fire for (Location loc : game.Manager.GetBlockRestore().RestoreBlockAround(Material.FIRE, ent.getLocation(), 5)) { loc.getWorld().playSound(loc, Sound.FIZZ, 1f, 1f); } + //Smoke Blocks + if (!_createdBlocks) + { + final HashMap blocks = UtilBlock.getInRadius(ent.getLocation().add(0, 1, 0), 4d); + final int round = game.getRound(); + for (final Block block : blocks.keySet()) + { + if (block.getType() != Material.AIR) + continue; + + UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(game.Manager.getPlugin(), new Runnable() + { + public void run() + { + if (round == game.getRound() && !game.isFreezeTime()) + { + //18 seconds + long duration = (long) (15000 + blocks.get(block) * 3000); + + game.registerSmokeBlock(block, System.currentTimeMillis() + duration); + } + } + }, 10 - (int)(10d * blocks.get(block))); + } + + _createdBlocks = true; + } + + ent.getWorld().playSound(ent.getLocation(), Sound.FIZZ, 0.1f, 0.1f); + + + return false; } + //18 seconds return ent.getTicksLived() > 360; } From 360f3db2ed3fa07348a550be166ee59959ebcc0d Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 25 Nov 2015 17:48:32 +1100 Subject: [PATCH 03/31] fixed grenade vertical rebound bug --- .../games/minestrike/items/grenades/Grenade.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java index b33d48b03..47b1f818c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java @@ -177,6 +177,11 @@ public abstract class Grenade extends StrikeItem if (UtilEnt.isGrounded(ent) || ent.getVelocity().length() < 0.1 || ent.getTicksLived() < 4) return; + if (Math.abs(_vel.getX()) < 0.1 && Math.abs(_vel.getX()) < 0.1) + { + return; + } + /* * What we must do here, is record the velocity every tick. * Then when it collides, we get the velocity from a few ticks before and apply it, reversing the direction of collision. @@ -184,8 +189,8 @@ public abstract class Grenade extends StrikeItem */ //X Rebound - if ((_vel.getX() > 0.05 && ent.getLocation().getX() - _lastLoc.getX() <= 0) || - (_vel.getX() < 0.05 && ent.getLocation().getX() - _lastLoc.getX() >= 0)) + if ((_vel.getX() > 0.1 && ent.getLocation().getX() - _lastLoc.getX() <= 0) || + (_vel.getX() < 0.1 && ent.getLocation().getX() - _lastLoc.getX() >= 0)) { _vel = _velHistory.get(0); _vel.setX(-_vel.getX()); @@ -197,8 +202,8 @@ public abstract class Grenade extends StrikeItem } //Z Rebound - else if ((_vel.getZ() > 0.05 && ent.getLocation().getZ() - _lastLoc.getZ() <= 0) || - (_vel.getZ() < 0.05 && ent.getLocation().getZ() - _lastLoc.getZ() >= 0)) + else if ((_vel.getZ() > 0.1 && ent.getLocation().getZ() - _lastLoc.getZ() <= 0) || + (_vel.getZ() < 0.1 && ent.getLocation().getZ() - _lastLoc.getZ() >= 0)) { _vel = _velHistory.get(0); _vel.setZ(-_vel.getZ()); From f668ae608254d2c53a5a8f8f054f66b7feeb1f37 Mon Sep 17 00:00:00 2001 From: Cheese Date: Wed, 25 Nov 2015 17:49:18 +1100 Subject: [PATCH 04/31] ms smoke --- Art/MS SMoke.psd | Bin 0 -> 185768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Art/MS SMoke.psd diff --git a/Art/MS SMoke.psd b/Art/MS SMoke.psd new file mode 100644 index 0000000000000000000000000000000000000000..cfddd9d8cf8690e182329c212db7e32502132523 GIT binary patch literal 185768 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೻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�{6XBG0BQ7 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

+o_=)FKk248D4hty!&DRnB<3}~IK&(dD^E94k2I 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 Date: Thu, 26 Nov 2015 12:56:26 +1100 Subject: [PATCH 05/31] -Fixed smoke being removed when bomb was planted in it -Fixed being unable to defuse bomb in smoke -Fixed older smokes removing newer intersecting smokes -Grenades will still detonate after being burned -Bizon now gives $600 per kill -Added replacement smoke on gun fire -Added shell ejecting particles on gun fire -Removed gun bobbing when firing -Changed ammo display location --- .../game/games/minestrike/MineStrike.java | 54 +++++++++++++------ .../game/games/minestrike/data/Bomb.java | 16 ++++-- .../minestrike/items/grenades/FlashBang.java | 5 +- .../minestrike/items/grenades/Grenade.java | 14 +++-- .../items/grenades/HighExplosive.java | 3 +- .../minestrike/items/grenades/Smoke.java | 7 +-- .../game/games/minestrike/items/guns/Gun.java | 46 ++++++++++++---- .../games/minestrike/items/guns/Shotgun.java | 2 +- 8 files changed, 108 insertions(+), 39 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java index b1f6b1e6f..12f7bcdc2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java @@ -1429,6 +1429,9 @@ public class MineStrike extends TeamGame if (event.GetLog().GetLastDamager().GetReason().contains("AWP")) amount = 100; + else if (event.GetLog().GetLastDamager().GetReason().contains("PP-Bizon")) + amount = 600; + else if (event.GetLog().GetLastDamager().GetReason().contains("Nova")) amount = 900; @@ -1501,14 +1504,6 @@ public class MineStrike extends TeamGame UtilParticle.PlayParticle(ParticleType.CRIT, grenadeItem.getLocation(), 0, 0, 0, 0, 1, ViewDist.NORMAL, UtilServer.getPlayers()); - //Expired - if (!grenadeItem.isValid() || grenadeItem.getTicksLived() > 400) - { - grenadeItem.remove(); - grenadeIterator.remove(); - continue; - } - //Completed Grenade grenade = _grenadesThrown.get(grenadeItem); if (grenade.update(this, grenadeItem)) @@ -1680,11 +1675,15 @@ public class MineStrike extends TeamGame { for (Player player : GetTeam(ChatColor.AQUA).GetPlayers(true)) { - Block block = player.getTargetBlock((HashSet) null, 5); + HashSet ignoreBlocks = new HashSet(); + ignoreBlocks.add(Material.AIR); + ignoreBlocks.add(Material.PORTAL); + + Block block = player.getTargetBlock(ignoreBlocks, 5); if (block == null || !_bomb.isBlock(block)) continue; - + if (UtilMath.offset(player.getLocation(), block.getLocation().add(0.5, 0, 0.5)) > 3) continue; @@ -1725,15 +1724,19 @@ public class MineStrike extends TeamGame if (_bombDefuser == null) return; - Block block = _bombDefuser.getTargetBlock((HashSet) null, 5); - + HashSet ignoreBlocks = new HashSet(); + ignoreBlocks.add(Material.AIR); + ignoreBlocks.add(Material.PORTAL); + + Block block = _bombDefuser.getTargetBlock(ignoreBlocks, 5); + if (!IsAlive(_bombDefuser) || block == null || !_bomb.isBlock(block) || !_bombDefuser.isOnline() || UtilMath.offset(_bombDefuser.getLocation(), block.getLocation().add(0.5, 0, 0.5)) > 3) { _bombDefuser.setExp(0f); - _bombDefuser = null; + _bombDefuser = null; return; } - + //Kit or Not? float defuseRate = 0.005f; if (UtilGear.isMat(_bombDefuser.getInventory().getItem(8), Material.SHEARS)) @@ -2429,6 +2432,21 @@ public class MineStrike extends TeamGame } } + @EventHandler + public void gunUpdate(UpdateEvent event) + { + if (!IsLive()) + return; + + if (event.getType() != UpdateType.TICK) + return; + + for (Gun gun : _gunsEquipped.keySet()) + { + gun.displayAmmo(_gunsEquipped.get(gun)); + } + } + @EventHandler public void smokeUpdate(UpdateEvent event) { @@ -2443,9 +2461,15 @@ public class MineStrike extends TeamGame if (System.currentTimeMillis() > _smokeBlocks.get(block)) { - block.setTypeIdAndData(0, (byte)0, false); + if (block.getType() == Material.PORTAL) + block.setTypeIdAndData(0, (byte)0, false); + smokeIterator.remove(); } + else if (block.getType() == Material.AIR) + { + block.setTypeIdAndData(90, (byte)UtilMath.r(2), false); + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java index 65dee38f0..a22be532f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java @@ -34,10 +34,18 @@ public class Bomb Block = planter.getLocation().getBlock(); - Type = Block.getType(); - Data = Block.getData(); + if (Block.getType() != Material.PORTAL) + { + Type = Block.getType(); + Data = Block.getData(); + } + else + { + Type = Material.AIR; + Data = 0; + } - Block.setType(Material.DAYLIGHT_DETECTOR); + Block.setTypeIdAndData(Material.DAYLIGHT_DETECTOR.getId(), (byte)0, false); StartTime = System.currentTimeMillis(); } @@ -45,7 +53,7 @@ public class Bomb public boolean update() { if (Block.getType() != Material.DAYLIGHT_DETECTOR) - Block.setType(Material.DAYLIGHT_DETECTOR); + Block.setTypeIdAndData(Material.DAYLIGHT_DETECTOR.getId(), (byte)0, false); double scale = (double)(System.currentTimeMillis() - StartTime)/(double)BombTime; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java index 638edf7f6..21c4d3dab 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java @@ -7,6 +7,7 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.games.minestrike.MineStrike; import nautilus.game.arcade.game.games.minestrike.Radio; @@ -34,7 +35,7 @@ public class FlashBang extends Grenade @Override public boolean updateCustom(MineStrike game, Entity ent) { - if (ent.getTicksLived() > 40) + if (UtilTime.elapsed(_throwTime, 2000)) { FireworkEffect effect = FireworkEffect.builder().flicker(true).withColor(Color.WHITE).with(Type.BALL_LARGE).trail(false).build(); UtilFirework.playFirework(ent.getLocation().add(0, 0.5, 0), effect); @@ -46,7 +47,7 @@ public class FlashBang extends Grenade continue; //Line of Sight - Location loc = player.getEyeLocation(); + Location loc = player.getEyeLocation(); boolean sight = true; while (UtilMath.offset(loc, ent.getLocation()) > 0.5) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java index 47b1f818c..f8110807b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java @@ -19,6 +19,7 @@ import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; import nautilus.game.arcade.game.games.minestrike.MineStrike; import nautilus.game.arcade.game.games.minestrike.items.StrikeItem; import nautilus.game.arcade.game.games.minestrike.items.StrikeItemType; @@ -75,6 +76,8 @@ public abstract class Grenade extends StrikeItem protected int _limit; + protected long _throwTime = 0; + public Grenade(String name, String[] desc, int cost, int gemCost, Material skin, int limit) { super(StrikeItemType.GRENADE, name, desc, cost, gemCost, skin); @@ -154,14 +157,19 @@ public abstract class Grenade extends StrikeItem //Sound playSound(game, player); + + _throwTime = System.currentTimeMillis(); } public boolean update(MineStrike game, Entity ent) { - //Invalid - if (!ent.isValid()) + if (UtilTime.elapsed(_throwTime, 20000)) return true; + //Invalid (Burned) + if (!ent.isValid()) + return updateCustom(game, ent); + //Rebound Off Blocks rebound(ent); @@ -174,7 +182,7 @@ public abstract class Grenade extends StrikeItem public void rebound(Entity ent) { - if (UtilEnt.isGrounded(ent) || ent.getVelocity().length() < 0.1 || ent.getTicksLived() < 4) + if (UtilEnt.isGrounded(ent) || ent.getVelocity().length() < 0.1 || !UtilTime.elapsed(_throwTime, 200)) return; if (Math.abs(_vel.getX()) < 0.1 && Math.abs(_vel.getX()) < 0.1) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java index bff72ca57..02c7b7300 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java @@ -6,6 +6,7 @@ import java.util.List; 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.common.util.UtilPlayer; @@ -35,7 +36,7 @@ public class HighExplosive extends Grenade @Override public boolean updateCustom(MineStrike game, Entity ent) { - if (ent.getTicksLived() > 40) + if (UtilTime.elapsed(_throwTime, 2000)) { UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, ent.getLocation(), 0, 0, 0, 0, 1, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java index 62b2b08f1..792e9df85 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java @@ -6,6 +6,7 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilEnt; 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 nautilus.game.arcade.game.GameTeam; @@ -37,7 +38,7 @@ public class Smoke extends Grenade @Override public boolean updateCustom(final MineStrike game, Entity ent) { - if (ent.getTicksLived() > 40 && UtilEnt.isGrounded(ent)) + if (UtilTime.elapsed(_throwTime, 2000) && (UtilEnt.isGrounded(ent) || !ent.isValid())) { // UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, ent.getLocation(), 0.3f, 0.3f, 0.3f, 0, 1, // ViewDist.MAX, UtilServer.getPlayers()); @@ -55,7 +56,7 @@ public class Smoke extends Grenade final int round = game.getRound(); for (final Block block : blocks.keySet()) { - if (block.getType() != Material.AIR) + if (block.getType() != Material.AIR && block.getType() != Material.PORTAL && block.getType() != Material.FIRE) continue; UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(game.Manager.getPlugin(), new Runnable() @@ -84,7 +85,7 @@ public class Smoke extends Grenade } //18 seconds - return ent.getTicksLived() > 360; + return UtilTime.elapsed(_throwTime, 18000); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java index 408033016..d8f9bf7a2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java @@ -47,6 +47,8 @@ public class Gun extends StrikeItem protected long _lastMoveTime; protected boolean _reloading = false; + + protected boolean _reloadTick = false; public Gun(GunStats gunStats) { @@ -124,17 +126,25 @@ public class Gun extends StrikeItem //Use Ammo _loadedAmmo--; - updateWeaponName(player); + //updateWeaponName(player); //Effect soundFire(player.getLocation()); - //Visual + //Smoke Location loc = player.getEyeLocation().add(player.getLocation().getDirection().multiply(1.2)); loc.add(UtilAlg.getRight(player.getLocation().getDirection()).multiply(0.5)); - loc.add(UtilAlg.getDown(player.getLocation().getDirection()).multiply(0.3)); - UtilParticle.PlayParticle(ParticleType.EXPLODE, loc, 0, 0, 0, 0, 1, + loc.add(UtilAlg.getDown(player.getLocation().getDirection()).multiply(0.4)); + UtilParticle.PlayParticle(Math.random() > 0.5 ? ParticleType.ANGRY_VILLAGER : ParticleType.HEART, loc, 0, 0, 0, 0, 1, ViewDist.LONG, UtilServer.getPlayers()); + + //Shell + loc = player.getEyeLocation().add(player.getLocation().getDirection().multiply(0.6)); + loc.add(UtilAlg.getRight(player.getLocation().getDirection()).multiply(0.7)); + loc.add(UtilAlg.getDown(player.getLocation().getDirection()).multiply(0.5)); + UtilParticle.PlayParticle(ParticleType.SPLASH, loc, 0, 0, 0, 0, 1, + ViewDist.LONG, UtilServer.getPlayers()); + game.registerBullet(fireBullet(player, game)); @@ -265,7 +275,7 @@ public class Gun extends StrikeItem } //Recharge - Recharge.Instance.use(player, getName() + " Reload", getReloadTime(), false, true, true); + Recharge.Instance.use(player, getName() + " Reload", getReloadTime(), false, true); //Sound soundReload(player.getLocation()); @@ -284,17 +294,33 @@ public class Gun extends StrikeItem { updateWeaponName(null); } + + public void displayAmmo(Player player) + { + if (!UtilGear.isMat(player.getItemInHand(), getStack().getType())) + return; + + //Weapon Bob during reload + if (_reloading) + updateWeaponName(player); + + if (!Recharge.Instance.usable(player, getName() + " Reload")) + return; + + UtilTextBottom.display(C.cGreen + _loadedAmmo + ChatColor.RESET + " / " + C.cYellow + _reserveAmmo, player); + } public void updateWeaponName(Player player) { ItemMeta meta = getStack().getItemMeta(); - meta.setDisplayName(ChatColor.RESET + (getOwnerName() == null ? "" : getOwnerName() + "'s ") + C.Bold + getName() + ChatColor.RESET + " " + C.cGreen + _loadedAmmo + ChatColor.RESET + " / " + C.cYellow + _reserveAmmo); + meta.setDisplayName(ChatColor.RESET + (getOwnerName() == null ? "" : getOwnerName() + "'s ") + C.Bold + getName() + (_reloadTick ? ChatColor.RED : ChatColor.WHITE)); getStack().setItemMeta(meta); - getStack().setAmount(Math.max(1, _loadedAmmo)); - if (player != null) + { player.getInventory().setItem(_slot, getStack()); + _reloadTick = !_reloadTick; + } } public double getDropOff() @@ -349,7 +375,7 @@ public class Gun extends StrikeItem _reserveAmmo = Math.max(0, ammo - _gunStats.getClipSize()); //Update - updateWeaponName(player); + //updateWeaponName(player); //Sound player.getWorld().playSound(player.getEyeLocation(), Sound.PISTON_EXTEND, 1f, 1.6f); @@ -417,7 +443,7 @@ public class Gun extends StrikeItem _loadedAmmo = _gunStats.getClipSize(); _reserveAmmo = _gunStats.getClipReserve() * _gunStats.getClipSize(); - updateWeaponName(player); + //updateWeaponName(player); } public double getDamage() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java index 579843cc3..78f565db2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java @@ -43,7 +43,7 @@ public class Shotgun extends Gun //Use Ammo _loadedAmmo--; - updateWeaponName(player); + //updateWeaponName(false); //Effect soundFire(player.getLocation()); From 55f5f958690744a3b83dec73d8947d565083caf2 Mon Sep 17 00:00:00 2001 From: Cheese Date: Thu, 26 Nov 2015 13:05:27 +1100 Subject: [PATCH 06/31] added no ammo display --- .../game/arcade/game/games/minestrike/items/guns/Gun.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java index d8f9bf7a2..04016f60a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java @@ -307,7 +307,10 @@ public class Gun extends StrikeItem if (!Recharge.Instance.usable(player, getName() + " Reload")) return; - UtilTextBottom.display(C.cGreen + _loadedAmmo + ChatColor.RESET + " / " + C.cYellow + _reserveAmmo, player); + if (_loadedAmmo > 0 || _reserveAmmo > 0) + UtilTextBottom.display(C.cGreen + _loadedAmmo + ChatColor.RESET + " / " + C.cYellow + _reserveAmmo, player); + else + UtilTextBottom.display(C.cRed + "No Ammo", player); } public void updateWeaponName(Player player) From 3e8a53562eb15f93986ab3f639913444c953f52a Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 26 Nov 2015 15:49:28 +1300 Subject: [PATCH 07/31] Add new hologram interaction thingy so holograms can catch interactions that they would normally block --- .../src/mineplex/core/hologram/Hologram.java | 67 ++++--- .../core/hologram/HologramInteraction.java | 9 + .../core/hologram/HologramManager.java | 176 +++++++++++------- .../core/treasure/TreasureLocation.java | 17 +- .../Mineplex.Hub/src/mineplex/hub/Hub.java | 2 +- .../src/nautilus/game/arcade/Arcade.java | 2 +- 6 files changed, 172 insertions(+), 101 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java index 6be18e222..e772427cc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java @@ -2,11 +2,8 @@ package mineplex.core.hologram; 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 org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -34,7 +31,7 @@ public class Hologram /** * 1.7 packets uses both EntityIDs while 1.8 uses only the first. */ - private ArrayList> _entityIds = new ArrayList>(); + private ArrayList _entityIds = new ArrayList(); private Entity _followEntity; private HologramManager _hologramManager; private String[] _hologramText = new String[0]; @@ -53,6 +50,7 @@ public class Hologram private int _viewDistance = 70; protected Vector relativeToEntity; private boolean _hideBoundingBox; + private HologramInteraction _interaction; public Hologram(HologramManager hologramManager, Location location, String... text) { @@ -61,6 +59,18 @@ public class Hologram setText(text); } + public Hologram setInteraction(HologramInteraction interact) + { + _interaction = interact; + + return this; + } + + public HologramInteraction getInteraction() + { + return _interaction; + } + /** * Adds the player to the Hologram to be effected by Whitelist or Blacklist */ @@ -151,6 +161,7 @@ public class Hologram nearbyPlayers.add(player); } } + return nearbyPlayers; } @@ -229,9 +240,7 @@ public class Hologram for (int i = 0; i < _entityIds.size(); i++) { - Entry entry = _entityIds.get(i); - - entityIds1_8[i] = entry.getKey(); + entityIds1_8[i] = _entityIds.get(i); } _destroy1_8 = new PacketPlayOutEntityDestroy(entityIds1_8); @@ -247,7 +256,7 @@ public class Hologram for (int i = _entityIds.size(); i < _hologramText.length; i++) { - _entityIds.add(new HashMap.SimpleEntry(UtilEnt.getNewEntityId(), UtilEnt.getNewEntityId())); + _entityIds.add(UtilEnt.getNewEntityId()); } } else @@ -261,9 +270,7 @@ public class Hologram } for (int textRow = 0; textRow < _hologramText.length; textRow++) { - Entry entityIds = this._entityIds.get(textRow); - - Packet[] packets1_8 = makeSpawnPackets1_8(textRow, entityIds.getKey(), _hologramText[textRow]); + Packet[] packets1_8 = makeSpawnPackets1_8(textRow, _entityIds.get(textRow), _hologramText[textRow]); for (int i = 0; i < packets1_8.length; i++) { @@ -326,8 +333,7 @@ public class Hologram public Hologram setFollowEntity(Entity entityToFollow) { _followEntity = entityToFollow; - relativeToEntity = entityToFollow == null ? null : this._location.clone().subtract(entityToFollow.getLocation()) - .toVector(); + relativeToEntity = entityToFollow == null ? null : _location.clone().subtract(entityToFollow.getLocation()).toVector(); return this; } @@ -340,7 +346,7 @@ public class Hologram */ public Hologram setHologramTarget(HologramTarget newTarget) { - this._target = newTarget; + _target = newTarget; return this; } @@ -405,11 +411,11 @@ public class Hologram if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) { _lastMovement.subtract(new Vector(x / 32D, y / 32D, z / 32D)); - for (Entry entityId : this._entityIds) + for (Integer entityId : _entityIds) { PacketPlayOutEntity.PacketPlayOutRelEntityMove relMove = new PacketPlayOutEntity.PacketPlayOutRelEntityMove(); - relMove.a = entityId.getKey(); + relMove.a = entityId; relMove.b = (byte) x; relMove.c = (byte) y; relMove.d = (byte) z; @@ -425,13 +431,12 @@ public class Hologram _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); - for (Entry entityId : this._entityIds) + for (Integer entityId : _entityIds) { PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); - teleportPacket.a = entityId.getKey(); + teleportPacket.a = entityId; teleportPacket.b = x; - teleportPacket.c = (int) Math - .floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); + teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); teleportPacket.d = z; packets1_8[i] = teleportPacket; @@ -458,6 +463,11 @@ public class Hologram return this; } + public boolean isEntityId(int entityId) + { + return _entityIds.contains(entityId); + } + /** * Set the hologram text */ @@ -491,28 +501,28 @@ public class Hologram { // Add entity id and send spawn packets // You add a entity id because the new hologram needs - Entry entry = new HashMap.SimpleEntry(UtilEnt.getNewEntityId(), UtilEnt.getNewEntityId()); - _entityIds.add(entry); + int entityId = UtilEnt.getNewEntityId(); + _entityIds.add(entityId); - packets1_8.addAll(Arrays.asList(makeSpawnPackets1_8(i, entry.getKey(), newText[i]))); + packets1_8.addAll(Arrays.asList(makeSpawnPackets1_8(i, entityId, newText[i]))); } // If less lines than previously else if (i >= newText.length) { // Remove entity id and send destroy packets - Entry entry = _entityIds.remove(newText.length); + Integer entityId = _entityIds.remove(newText.length); destroy1_8 = Arrays.copyOf(destroy1_8, destroy1_8.length + 1); - destroy1_8[destroy1_8.length - 1] = entry.getKey(); + destroy1_8[destroy1_8.length - 1] = entityId; } else if (!newText[i].equals(_hologramText[i])) { // Send update metadata packets - Entry entry = _entityIds.get(i); + Integer entityId = _entityIds.get(i); PacketPlayOutEntityMetadata metadata1_8 = new PacketPlayOutEntityMetadata(); - metadata1_8.a = entry.getKey(); + metadata1_8.a = entityId; DataWatcher watcher1_8 = new DataWatcher(null); @@ -552,7 +562,7 @@ public class Hologram */ public Hologram setViewDistance(int newDistance) { - this._viewDistance = newDistance; + _viewDistance = newDistance; return setLocation(getLocation()); } @@ -593,6 +603,7 @@ public class Hologram _playersTracking.clear(); _lastMovement = null; } + return this; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java new file mode 100644 index 000000000..b6bc659e3 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java @@ -0,0 +1,9 @@ +package mineplex.core.hologram; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +public interface HologramInteraction +{ + public void onClick(Player player, ClickType clickType); +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java index 8be93fc9a..df8a9352b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java @@ -5,90 +5,106 @@ import java.util.Iterator; import java.util.List; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.packethandler.IPacketHandler; +import mineplex.core.packethandler.PacketHandler; +import mineplex.core.packethandler.PacketInfo; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import net.minecraft.server.v1_8_R3.Packet; +import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; +import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity.EnumEntityUseAction; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.Vector; -public class HologramManager implements Listener +public class HologramManager implements Listener, IPacketHandler { - private ArrayList _activeHolograms = new ArrayList(); + private ArrayList _activeHolograms = new ArrayList(); - public HologramManager(JavaPlugin arcadeManager) - { - Bukkit.getPluginManager().registerEvents(this, arcadeManager); - } + public HologramManager(JavaPlugin arcadeManager, PacketHandler packetHandler) + { + Bukkit.getPluginManager().registerEvents(this, arcadeManager); + packetHandler.addPacketHandler(this, true, PacketPlayInUseEntity.class); + } - void addHologram(Hologram hologram) - { - _activeHolograms.add(hologram); - } + void addHologram(Hologram hologram) + { + _activeHolograms.add(hologram); + } - void removeHologram(Hologram hologram) - { - _activeHolograms.remove(hologram); - } + void removeHologram(Hologram hologram) + { + _activeHolograms.remove(hologram); + } - @EventHandler(priority = EventPriority.LOWEST) - public void onTick(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK || _activeHolograms.isEmpty()) - return; - List worlds = Bukkit.getWorlds(); - Iterator itel = _activeHolograms.iterator(); - while (itel.hasNext()) - { - Hologram hologram = itel.next(); - if (!worlds.contains(hologram.getLocation().getWorld())) - { - itel.remove(); - hologram.stop(); - } - else - { - if (hologram.getEntityFollowing() != null) - { - Entity following = hologram.getEntityFollowing(); - if (hologram.isRemoveOnEntityDeath() && !following.isValid()) - { - itel.remove(); - hologram.stop(); - continue; - } - if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) - { - // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky. - Vector vec = hologram.relativeToEntity.clone(); - hologram.setLocation(following.getLocation().add(hologram.relativeToEntity)); - hologram.relativeToEntity = vec; - continue; // No need to do the rest of the code as setLocation does it. - } - } - ArrayList canSee = hologram.getNearbyPlayers(); - Iterator itel2 = hologram.getPlayersTracking().iterator(); - while (itel2.hasNext()) - { - Player player = itel2.next(); - if (!canSee.contains(player)) - { - itel2.remove(); - if (player.getWorld() == hologram.getLocation().getWorld()) - { - UtilPlayer.sendPacket(player, hologram.getDestroyPacket()); - } - } - } - for (Player player : canSee) + @EventHandler(priority = EventPriority.LOWEST) + public void onTick(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK || _activeHolograms.isEmpty()) + return; + + List worlds = Bukkit.getWorlds(); + + Iterator itel = _activeHolograms.iterator(); + + while (itel.hasNext()) + { + Hologram hologram = itel.next(); + + if (!worlds.contains(hologram.getLocation().getWorld())) + { + itel.remove(); + hologram.stop(); + } + else + { + if (hologram.getEntityFollowing() != null) + { + Entity following = hologram.getEntityFollowing(); + + if (hologram.isRemoveOnEntityDeath() && !following.isValid()) + { + itel.remove(); + hologram.stop(); + continue; + } + if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) + { + // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky. + Vector vec = hologram.relativeToEntity.clone(); + hologram.setLocation(following.getLocation().add(hologram.relativeToEntity)); + hologram.relativeToEntity = vec; + + continue; // No need to do the rest of the code as setLocation does it. + } + } + + ArrayList canSee = hologram.getNearbyPlayers(); + + Iterator itel2 = hologram.getPlayersTracking().iterator(); + + while (itel2.hasNext()) + { + Player player = itel2.next(); + + if (!canSee.contains(player)) + { + itel2.remove(); + if (player.getWorld() == hologram.getLocation().getWorld()) + { + UtilPlayer.sendPacket(player, hologram.getDestroyPacket()); + } + } + } + + for (Player player : canSee) { if (!hologram.getPlayersTracking().contains(player)) { @@ -96,8 +112,28 @@ public class HologramManager implements Listener UtilPlayer.sendPacket(player, hologram.getSpawnPackets()); } - } - } - } - } + } + } + } + } + + @Override + public void handle(PacketInfo packetInfo) + { + PacketPlayInUseEntity packetPlayIn = (PacketPlayInUseEntity) packetInfo.getPacket(); + + for (Hologram hologram : _activeHolograms) + { + if (!hologram.isEntityId(packetPlayIn.a)) + continue; + + if (hologram.getInteraction() != null) + { + hologram.getInteraction().onClick(packetInfo.getPlayer(), + packetPlayIn.action == EnumEntityUseAction.ATTACK ? ClickType.LEFT : ClickType.RIGHT); + } + + break; + } + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java index c5f591843..43447a030 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java @@ -12,6 +12,7 @@ import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.event.GadgetBlockEvent; import mineplex.core.hologram.Hologram; +import mineplex.core.hologram.HologramInteraction; import mineplex.core.hologram.HologramManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.reward.Reward; @@ -32,6 +33,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -63,7 +65,20 @@ public class TreasureLocation implements Listener _hologramManager = hologramManager; _statusManager = statusManager; _currentTreasure = null; - _hologram = new Hologram(_hologramManager, chestBlock.getLocation().add(0.5, 2.5, 0.5), C.cGreen + C.Bold + "Open Treasure"); + _hologram = new Hologram(_hologramManager, chestBlock.getLocation().add(0.5, 2.5, 0.5), C.cGreen + C.Bold + + "Open Treasure"); + _hologram.setInteraction(new HologramInteraction() + { + + @Override + public void onClick(Player player, ClickType clickType) + { + if (clickType == ClickType.LEFT) + return; + + openShop(player); + } + }); setHoloChestVisible(true); _shop = new TreasureShop(treasureManager, _inventoryManager, clientManager, donationManager, this); } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 73a06ad64..9a0d8f1dc 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -133,7 +133,7 @@ public class Hub extends JavaPlugin implements IRelation SkillConditionManager conditionManager = new SkillConditionManager(this); PersonalServerManager personalServerManager = new PersonalServerManager(this, clientManager); - HubManager hubManager = new HubManager(this, blockRestore, clientManager, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager, webServerAddress), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this), npcManager, personalServerManager, packetHandler, punish, serverStatusManager, giveawayManager); + HubManager hubManager = new HubManager(this, blockRestore, clientManager, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager, webServerAddress), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this, packetHandler), npcManager, personalServerManager, packetHandler, punish, serverStatusManager, giveawayManager); QueueManager queueManager = new QueueManager(this, clientManager, donationManager, new EloManager(this, clientManager), partyManager); 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 28aa540dc..fb19678e3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -136,7 +136,7 @@ public class Arcade extends JavaPlugin BlockRestore blockRestore = new BlockRestore(this); ProjectileManager projectileManager = new ProjectileManager(this); - HologramManager hologramManager = new HologramManager(this); + HologramManager hologramManager = new HologramManager(this, packetHandler); //Inventory InventoryManager inventoryManager = new InventoryManager(this, _clientManager); From 1a5dbc073d58202cbc22a1f048ec929e3518ce40 Mon Sep 17 00:00:00 2001 From: Cheese Date: Thu, 26 Nov 2015 14:47:01 +1100 Subject: [PATCH 08/31] recursive block find method --- .../mineplex/core/common/util/UtilBlock.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) 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 c4152acb0..9bbec70f8 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 @@ -624,4 +624,29 @@ public class UtilBlock return block.getTypeId(); } } + + public HashSet findConnectedBlocks(Block block, HashSet blocks, HashSet searched, int limit) + { + //This is incase you recursively check an entire MC world + if (blocks.size() >= limit) + return blocks; + + //Mark current node as searched + searched.add(block); + + //Search the node + for (Block neighbour : UtilBlock.getSurrounding(block, false)) + { + if (neighbour.getType() == Material.AIR) + continue; + + blocks.add(neighbour); + + //If neighbour hasn't been searched, recursively search it! + if (!searched.contains(neighbour)) + findConnectedBlocks(neighbour, blocks, searched, limit); + } + + return blocks; + } } From 059a9a32cd81cb7379d547e2b2e572bf6c13eec9 Mon Sep 17 00:00:00 2001 From: Cheese Date: Thu, 26 Nov 2015 14:51:45 +1100 Subject: [PATCH 09/31] fixed method --- .../src/mineplex/core/common/util/UtilBlock.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 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 9bbec70f8..c9b57d914 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 @@ -625,14 +625,17 @@ public class UtilBlock } } - public HashSet findConnectedBlocks(Block block, HashSet blocks, HashSet searched, int limit) + public HashSet findConnectedBlocks(Block block, HashSet blocks, int limit) { + if (blocks == null) + blocks = new HashSet(); + //This is incase you recursively check an entire MC world if (blocks.size() >= limit) return blocks; //Mark current node as searched - searched.add(block); + blocks.add(block); //Search the node for (Block neighbour : UtilBlock.getSurrounding(block, false)) @@ -640,11 +643,9 @@ public class UtilBlock if (neighbour.getType() == Material.AIR) continue; - blocks.add(neighbour); - //If neighbour hasn't been searched, recursively search it! - if (!searched.contains(neighbour)) - findConnectedBlocks(neighbour, blocks, searched, limit); + if (!blocks.contains(neighbour)) + findConnectedBlocks(neighbour, blocks, limit); } return blocks; From 193c5fe487f0e5f79657c711e13a883c3a3a0a8e Mon Sep 17 00:00:00 2001 From: Cheese Date: Thu, 26 Nov 2015 15:26:57 +1100 Subject: [PATCH 10/31] fixed static --- .../src/mineplex/core/common/util/UtilBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java index c9b57d914..0c3baa122 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 @@ -625,7 +625,7 @@ public class UtilBlock } } - public HashSet findConnectedBlocks(Block block, HashSet blocks, int limit) + public static HashSet findConnectedBlocks(Block block, HashSet blocks, int limit) { if (blocks == null) blocks = new HashSet(); From 98d988584d393ca2a1c8fc0a49cc98a9e7c13e18 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 13:35:25 +1100 Subject: [PATCH 11/31] titan cosmetics --- .../mineplex/core/common/util/UtilAlg.java | 6 + .../disguise/disguises/DisguiseGuardian.java | 23 ++++ .../core/gadget/gadgets/MorphTitan.java | 49 +++++++- .../src/mineplex/core/mount/Mount.java | 1 + .../mineplex/core/mount/types/MountTitan.java | 117 ++++++++++++++++-- .../core/mount/types/MountTitanData.java | 117 ++++++++++++++++++ .../src/mineplex/core/pet/PetFactory.java | 1 + .../src/mineplex/core/pet/PetManager.java | 8 ++ .../src/mineplex/mapparser/MapParser.java | 1 + 9 files changed, 310 insertions(+), 13 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java index c3d16a857..71916c921 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java @@ -9,6 +9,7 @@ import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.util.EulerAngle; import org.bukkit.util.Vector; public class UtilAlg @@ -439,4 +440,9 @@ public class UtilAlg return value; } + + public static EulerAngle vectorToEuler(Vector vector) + { + return new EulerAngle(Math.toRadians(GetPitch(vector)), Math.toRadians(GetYaw(vector)), 0); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java new file mode 100644 index 000000000..808c60efc --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java @@ -0,0 +1,23 @@ +package mineplex.core.disguise.disguises; + +import org.bukkit.entity.*; + +public class DisguiseGuardian extends DisguiseCreature +{ + public DisguiseGuardian(org.bukkit.entity.Entity entity) + { + super(EntityType.GUARDIAN, entity); + } + + public void setElder(boolean elder) + { + //data stuff + } + + public boolean isElder() + { + //return DataWatcher.getByte(13); + + return false; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java index 26d1bd925..9d19f5eca 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java @@ -1,35 +1,76 @@ package mineplex.core.gadget.gadgets; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.disguise.disguises.DisguiseGuardian; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.recharge.Recharge; public class MorphTitan extends MorphGadget { public MorphTitan(GadgetManager manager) { - super(manager, "Titanic Morph", new String[] + super(manager, "Elder Guardian Morph", new String[] { - C.cWhite + "Coming Soon...", + C.cWhite + "From deep withinsdngsg", " ", C.cRed + "Unlocked with Titan Rank", }, -1, - Material.INK_SACK, (byte)8); + Material.PRISMARINE_SHARD, (byte)0); } @Override public void EnableCustom(Player player) { - + this.ApplyArmor(player); + + DisguiseGuardian disguise = new DisguiseGuardian(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 Snort(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!IsActive(player)) + return; + + if (!UtilEvent.isAction(event, ActionType.L)) + return; + if (!Recharge.Instance.use(player, GetName(), 2000, false, false)) + return; + + player.getWorld().playSound(player.getLocation(), Sound.ZOMBIE_UNFECT, 1f, 0.25f); + } + + @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/mount/Mount.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java index 3e346cc57..f9731fe6c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java @@ -54,6 +54,7 @@ public abstract class Mount extends SalesPackageBase implements Listener Manager.setActive(player, this); EnableCustom(player); } + public abstract void EnableCustom(Player player); public abstract void Disable(Player player); 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 e4ea28811..186a5a3b4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -1,27 +1,126 @@ package mineplex.core.mount.types; +import java.util.HashMap; + import org.bukkit.Material; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Slime; 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.EntityTargetEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +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.UtilPlayer; import mineplex.core.mount.HorseMount; +import mineplex.core.mount.Mount; import mineplex.core.mount.MountManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; -public class MountTitan extends HorseMount +public class MountTitan extends Mount { - public MountTitan(MountManager manager) + public MountTitan(MountManager manager) { - super(manager, "Titanic Mount", new String[] + super(manager, "Molten Snake", Material.REDSTONE_BLOCK, (byte)0, new String[] { - C.cWhite + "Coming Soon...", + C.cWhite + "From the distant ether realm,", + C.cWhite + "this prized dragon is said to", + C.cWhite + "obey only true Heroes!", " ", C.cRed + "Unlocked with Titan Rank", - }, - Material.INK_SACK, - (byte)8, - -1, - Color.BLACK, Style.BLACK_DOTS, Variant.UNDEAD_HORSE, 0.8, null); + }, -1); + } + + @Override + public void EnableCustom(Player player) + { + player.leaveVehicle(); + player.eject(); + + //Remove other mounts + Manager.DeregisterAll(player); + + //Inform + UtilPlayer.message(player, F.main("Mount", "You spawned " + F.elem(GetName()) + ".")); + + //Store + _active.put(player, new MountTitanData(player, GetName())); + } + + @Override + public void Disable(Player player) + { + MountTitanData data = _active.remove(player); + if (data != null) + { + data.clean(); + + //Inform + UtilPlayer.message(player, F.main("Mount", "You despawned " + F.elem(GetName()) + ".")); + + Manager.removeActive(player); + } + } + + @EventHandler + public void update(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (MountTitanData data : _active.values()) + { + data.update(); + } + } + + @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())) + { + UtilPlayer.message(event.getPlayer(), F.main("Mount", "This is not your Mount!")); + return; + } + + event.getPlayer().leaveVehicle(); + event.getPlayer().eject(); + + GetActive().get(event.getPlayer()).mount(event.getPlayer(), event.getRightClicked()); + } + + @EventHandler + public void target(EntityTargetEvent event) + { + if (!(event.getEntity() instanceof Player)) + return; + + if (!GetActive().containsKey(event.getTarget())) + return; + + if (!GetActive().get(event.getTarget()).ownsMount((Player)event.getEntity())) + event.setCancelled(true); + } + + @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/mount/types/MountTitanData.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java new file mode 100644 index 000000000..7f73ac764 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java @@ -0,0 +1,117 @@ + + +package mineplex.core.mount.types; + +import java.util.ArrayList; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.MagmaCube; +import org.bukkit.entity.Player; +import org.bukkit.entity.Slime; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +public class MountTitanData +{ + private String _owner; + + private Slime _head; + + private ArrayList _nodes; + + public MountTitanData(Player player, String name) + { + _owner = player.getName(); + + //Nodes + _nodes = new ArrayList(); + + for (int i=0 ; i<30 ; i++) + { + ArmorStand node = player.getWorld().spawn(player.getLocation(), ArmorStand.class); + + node.setVisible(false); + node.setGravity(false); + + node.setHelmet(new ItemStack(Material.REDSTONE_BLOCK)); + + _nodes.add(node); + } + + //Head + _head = player.getWorld().spawn(player.getLocation(), MagmaCube.class); + _head.setSize(2); + + _head.setCustomName(player.getName() + "'s " + name); + } + + public void mount(Player player, Entity entity) + { + if (_head.equals(entity) || _nodes.contains(entity)) + _head.setPassenger(player); + } + + public void update() + { + //Head + if (_head.getPassenger() != null) + _head.setVelocity(_head.getPassenger().getLocation().getDirection().add(new Vector(0,0.2,0))); + + Location infront = _head.getLocation().add(0, -1.5, 0); + + //Move + for (int i=0 ; i<30 ; i++) + { + ArmorStand node = _nodes.get(i); + + //Move + if (i == 0) + node.teleport(infront); + else if (UtilMath.offset(node.getLocation(), infront) > 0.5) + node.teleport(infront.add(UtilAlg.getTrajectory(infront, node.getLocation()).multiply(0.5))); + + infront = node.getLocation(); + + //Rotation + node.setHeadPose(UtilAlg.vectorToEuler(UtilAlg.getTrajectory(infront, node.getLocation()))); + } + + + //Shuffle In + if (_head.getPassenger() == null) + { + for (int i=_nodes.size()-1 ; i>=0 ; i--) + { + ArmorStand node = _nodes.get(i); + + if (i>0) + infront = _nodes.get(i-1).getLocation(); + else + infront = _head.getLocation().add(0, -1.5, 0); + + node.teleport(infront); + } + } + } + + + + public void clean() + { + _head.remove(); + + for (ArmorStand stand : _nodes) + stand.remove(); + } + + public boolean ownsMount(Player player) + { + return _owner.equals(player.getName()); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java index 84a1a2664..6aa8d232b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java @@ -42,6 +42,7 @@ public class PetFactory _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.GUARDIAN, new Pet("Guardian", EntityType.GUARDIAN, -1)); } private void CreatePetExtras() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index 9d631ff8d..65e182620 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -38,8 +38,10 @@ 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; @@ -159,6 +161,12 @@ public class PetManager extends MiniClientPlugin if (!Get(p).GetPets().containsKey(EntityType.WITHER)) Get(p).GetPets().put(EntityType.WITHER, "Widder"); } + + if (rank.has(Rank.TITAN)) + { + if (!Get(p).GetPets().containsKey(EntityType.GUARDIAN)) + Get(p).GetPets().put(EntityType.GUARDIAN, "Guardian"); + } } public void AddPetOwner(Player player, EntityType entityType, Location location) diff --git a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java index a33e9f6d7..88522f513 100644 --- a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java +++ b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java @@ -160,6 +160,7 @@ public class MapParser extends JavaPlugin implements Listener player.addAttachment(plugin, "worldedit.*", hasPermission); player.addAttachment(plugin, "voxelsniper.sniper", hasPermission); player.addAttachment(plugin, "voxelsniper.brush.*", hasPermission); + player.addAttachment(plugin, "coloredsigns.format", hasPermission); } _permissionMap.put(player, hasPermission); From 0a4416381bf1a0b84b151ac411bcfb62083949e8 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 27 Nov 2015 15:55:02 +1300 Subject: [PATCH 12/31] Fix guardian --- .../disguise/disguises/DisguiseGuardian.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java index 808c60efc..9f527874b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java @@ -8,16 +8,24 @@ public class DisguiseGuardian extends DisguiseCreature { super(EntityType.GUARDIAN, entity); } - + public void setElder(boolean elder) { - //data stuff + DataWatcher.watch(16, Integer.valueOf(DataWatcher.getInt(16) | 4)); } - + public boolean isElder() { - //return DataWatcher.getByte(13); - - return false; + return (this.DataWatcher.getInt(16) & 4) != 0; + } + + protected String getHurtSound() + { + if (isElder()) + { + return "mob.guardian.elder.hit"; + } + + return "mob.guardian.hit"; } } From 3c9824320167f5e39a1aa6366f804e89a4eb8f4f Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 27 Nov 2015 15:56:56 +1300 Subject: [PATCH 13/31] Some more guardian stuff --- .../mineplex/core/disguise/disguises/DisguiseGuardian.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java index 9f527874b..6a5f016f0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java @@ -7,6 +7,13 @@ public class DisguiseGuardian extends DisguiseCreature public DisguiseGuardian(org.bukkit.entity.Entity entity) { super(EntityType.GUARDIAN, entity); + DataWatcher.a(16, 0); + DataWatcher.a(17, 0); + } + + public void setTarget(int target) + { + DataWatcher.watch(17, 0); } public void setElder(boolean elder) From 05e7183b65b1cb889196501aa5f5667260828868 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 15:55:00 +1100 Subject: [PATCH 14/31] titan stuff update --- .../disguise/disguises/DisguiseGuardian.java | 2 +- .../core/gadget/gadgets/MorphTitan.java | 75 ++++++++++++++++++- .../src/mineplex/core/pet/PetFactory.java | 2 +- .../src/mineplex/core/pet/PetManager.java | 20 ++++- 4 files changed, 92 insertions(+), 7 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java index 6a5f016f0..bd2ced0fd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java @@ -13,7 +13,7 @@ public class DisguiseGuardian extends DisguiseCreature public void setTarget(int target) { - DataWatcher.watch(17, 0); + DataWatcher.watch(17, target); } public void setElder(boolean elder) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java index 9d19f5eca..9e550d110 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java @@ -3,18 +3,28 @@ package mineplex.core.gadget.gadgets; import org.bukkit.Material; import org.bukkit.Sound; 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; +import org.bukkit.util.Vector; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseGuardian; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.MorphGadget; import mineplex.core.recharge.Recharge; +import mineplex.core.recharge.RechargedEvent; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; public class MorphTitan extends MorphGadget { @@ -38,6 +48,7 @@ public class MorphTitan extends MorphGadget DisguiseGuardian disguise = new DisguiseGuardian(player); disguise.setName(player.getName(), Manager.getClientManager().Get(player).GetRank()); disguise.setCustomNameVisible(true); + disguise.setElder(true); Manager.getDisguiseManager().disguise(disguise); } @@ -46,10 +57,13 @@ public class MorphTitan extends MorphGadget { this.RemoveArmor(player); Manager.getDisguiseManager().undisguise(player); + + player.setAllowFlight(false); + player.setFlying(false); } @EventHandler - public void Snort(PlayerInteractEvent event) + public void lazer(PlayerInteractEvent event) { Player player = event.getPlayer(); @@ -59,10 +73,65 @@ public class MorphTitan extends MorphGadget if (!UtilEvent.isAction(event, ActionType.L)) return; - if (!Recharge.Instance.use(player, GetName(), 2000, false, false)) + if (!Recharge.Instance.use(player, "Guarians Laser", 4000, true, false)) return; - player.getWorld().playSound(player.getLocation(), Sound.ZOMBIE_UNFECT, 1f, 0.25f); + DisguiseBase base = Manager.getDisguiseManager().getDisguise(player); + if (base == null || !(base instanceof DisguiseGuardian)) + return; + + DisguiseGuardian disguise = (DisguiseGuardian)base; + + for (Player other : UtilServer.getPlayers()) + if (!player.equals(other)) + { + System.out.println("set target to " + other.getEntityId()); + disguise.setTarget(other.getEntityId()); + break; + } + + Manager.getDisguiseManager().updateDisguise(disguise); + + //Fake Head + UtilEnt.setFakeHead(player, true); + Recharge.Instance.useForce(player, GetName() + " FakeHead", 2000); + } + + @EventHandler + public void lazerEnd(RechargedEvent event) + { + if (event.GetAbility().equals(GetName() + " FakeHead")) + { + UtilEnt.setFakeHead(event.GetPlayer(), false); + + DisguiseBase base = Manager.getDisguiseManager().getDisguise(event.GetPlayer()); + if (base == null || !(base instanceof DisguiseGuardian)) + return; + + DisguiseGuardian disguise = (DisguiseGuardian)base; + disguise.setTarget(0); + + Manager.getDisguiseManager().updateDisguise(disguise); + } + } + + @EventHandler + public void flight(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (Player player : GetActive()) + { + if (UtilPlayer.isSpectator(player)) + continue; + + player.setAllowFlight(true); + player.setFlying(true); + + if (UtilEnt.isGrounded(player)) + UtilAction.velocity(player, new Vector(0,1,0)); + } } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java index 6aa8d232b..56cab2079 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java @@ -42,7 +42,7 @@ public class PetFactory _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.GUARDIAN, new Pet("Guardian", EntityType.GUARDIAN, -1)); + _pets.put(EntityType.SKELETON, new Pet("Guardian", EntityType.SKELETON, -1)); } private void CreatePetExtras() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index 65e182620..5b1c801ed 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -17,6 +17,7 @@ import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilEnt; 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; @@ -164,8 +165,8 @@ public class PetManager extends MiniClientPlugin if (rank.has(Rank.TITAN)) { - if (!Get(p).GetPets().containsKey(EntityType.GUARDIAN)) - Get(p).GetPets().put(EntityType.GUARDIAN, "Guardian"); + if (!Get(p).GetPets().containsKey(EntityType.SKELETON)) + Get(p).GetPets().put(EntityType.SKELETON, "Guardian"); } } @@ -183,6 +184,7 @@ public class PetManager extends MiniClientPlugin Creature pet; + //Wither Spawn if (entityType == EntityType.WITHER) { _creatureModule.SetForce(true); @@ -204,6 +206,7 @@ public class PetManager extends MiniClientPlugin _creatureModule.SetForce(false); } + //Default Spawn else { pet = (Creature)_creatureModule.SpawnEntity(location, entityType); @@ -228,6 +231,19 @@ public class PetManager extends MiniClientPlugin ((Villager) pet).setBaby(); ((Villager) pet).setAgeLock(true); } + else if (pet instanceof Skeleton) + { + pet.getEquipment().setHelmet(new ItemStack(Material.PUMPKIN)); + + DisguiseGuardian disguise = new DisguiseGuardian(pet); + + if (Get(player).GetPets().get(entityType) != null && Get(player).GetPets().get(entityType).length() > 0) + { + disguise.setName(Get(player).GetPets().get(entityType)); + } + + _disguiseManager.disguise(disguise); + } _activePetOwners.put(player.getName(), pet); _failedAttempts.put(player.getName(), 0); From 2b047cdde8990f4526b88c610c48525bb3d4400a Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 16:46:48 +1100 Subject: [PATCH 15/31] more titan stuff --- .../mineplex/core/gadget/gadgets/ItemTNT.java | 2 +- .../core/gadget/gadgets/MorphTitan.java | 89 +++++++++++++++++-- .../src/mineplex/core/pet/PetManager.java | 8 ++ 3 files changed, 89 insertions(+), 10 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java index 91ac32a93..863e9d79b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java @@ -61,7 +61,7 @@ public class ItemTNT extends ItemGadget if (!_tnt.remove(event.getEntity())) return; - HashMap players = UtilPlayer.getInRadius(event.getLocation(), 10); + HashMap players = UtilPlayer.getInRadius(event.getLocation(), 8); for (Player player : players.keySet()) { if (Manager.collideEvent(this, player)) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java index 9e550d110..a28618db5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java @@ -1,7 +1,14 @@ package mineplex.core.gadget.gadgets; +import java.util.HashMap; +import java.util.HashSet; + +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; @@ -11,9 +18,14 @@ 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; import mineplex.core.common.util.UtilEvent; +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.UtilEvent.ActionType; @@ -28,6 +40,8 @@ import mineplex.core.updater.event.UpdateEvent; public class MorphTitan extends MorphGadget { + private HashMap _targets = new HashMap(); + public MorphTitan(GadgetManager manager) { super(manager, "Elder Guardian Morph", new String[] @@ -60,6 +74,10 @@ public class MorphTitan extends MorphGadget player.setAllowFlight(false); player.setFlying(false); + + Entity ent = _targets.remove(player); + if (ent != null) + ent.remove(); } @EventHandler @@ -73,7 +91,7 @@ public class MorphTitan extends MorphGadget if (!UtilEvent.isAction(event, ActionType.L)) return; - if (!Recharge.Instance.use(player, "Guarians Laser", 4000, true, false)) + if (!Recharge.Instance.use(player, "Guardians Laser", 4000, true, false)) return; DisguiseBase base = Manager.getDisguiseManager().getDisguise(player); @@ -82,13 +100,20 @@ public class MorphTitan extends MorphGadget DisguiseGuardian disguise = (DisguiseGuardian)base; - for (Player other : UtilServer.getPlayers()) - if (!player.equals(other)) - { - System.out.println("set target to " + other.getEntityId()); - disguise.setTarget(other.getEntityId()); - break; - } + HashSet ignore = new HashSet(); + ignore.add(Material.AIR); + + Location loc = player.getTargetBlock(ignore, 64).getLocation().add(0.5, 0.5, 0.5); + + ArmorStand stand = loc.getWorld().spawn(loc, ArmorStand.class); + + stand.setVisible(false); + stand.setGhost(true); + stand.setGravity(false); + + _targets.put(player, stand); + + disguise.setTarget(stand.getEntityId()); Manager.getDisguiseManager().updateDisguise(disguise); @@ -104,6 +129,30 @@ public class MorphTitan extends MorphGadget { UtilEnt.setFakeHead(event.GetPlayer(), false); + //Explode + ArmorStand stand = _targets.remove(event.GetPlayer()); + if (stand != null) + { + UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, stand.getLocation(), 3f, 3f, 3f, 0, 32, ViewDist.MAX, UtilServer.getPlayers()); + + HashMap players = UtilEnt.getInRadius(stand.getLocation(), 12); + for (Entity ent : players.keySet()) + { + if (ent instanceof Player) + if (Manager.collideEvent(this, (Player)ent)) + continue; + + double mult = players.get(ent); + + //Knockback + UtilAction.velocity(ent, UtilAlg.getTrajectory(stand.getLocation(), ent.getLocation()), 4 * mult, false, 0, 1 + 3 * mult, 10, true); + } + + //Sound + stand.getWorld().playSound(stand.getLocation(), Sound.ZOMBIE_REMEDY, 6f, 0.75f); + } + + //Disguise DisguiseBase base = Manager.getDisguiseManager().getDisguise(event.GetPlayer()); if (base == null || !(base instanceof DisguiseGuardian)) return; @@ -111,10 +160,32 @@ public class MorphTitan extends MorphGadget DisguiseGuardian disguise = (DisguiseGuardian)base; disguise.setTarget(0); - Manager.getDisguiseManager().updateDisguise(disguise); + Manager.getDisguiseManager().updateDisguise(disguise); } } + @EventHandler + public void selfParticles(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (Player player : _targets.keySet()) + { + Vector dir = UtilAlg.getTrajectory( player.getLocation().add(0, 1.5, 0), _targets.get(player).getLocation()); + dir.multiply(8); + + UtilParticle.PlayParticle(ParticleType.MAGIC_CRIT, + player.getLocation().add(0, 1.5, 0), + (float)dir.getX(), + (float)dir.getY(), + (float)dir.getZ(), + 1, 0, ViewDist.LONG, UtilServer.getPlayers()); + + player.playSound(player.getLocation(), Sound.FIREWORK_TWINKLE2, 2f, 2f); + } + } + @EventHandler public void flight(UpdateEvent event) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index 5b1c801ed..5ddf55c63 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -14,6 +14,8 @@ import mineplex.core.account.event.ClientWebResponseEvent; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.common.Rank; 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.UtilServer; import mineplex.core.disguise.DisguiseManager; @@ -359,6 +361,12 @@ public class PetManager extends MiniClientPlugin xDiff = Math.abs(petSpot.getBlockX() - ownerSpot.getBlockX()); yDiff = Math.abs(petSpot.getBlockY() - ownerSpot.getBlockY()); zDiff = Math.abs(petSpot.getBlockZ() - ownerSpot.getBlockZ()); + + //Guardian + if (pet instanceof Skeleton && Math.random() > 0.66 && UtilEnt.isGrounded(pet)) + { + UtilAction.velocity(pet, UtilAlg.getTrajectory(pet, owner), Math.random() * 0.3 + 0.3, false, 0, 0.3, 1, true); + } if ((xDiff + yDiff + zDiff) > 4) { From 77be81c216a820dc6b3fd10617e5263be1033466 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 16:50:22 +1100 Subject: [PATCH 16/31] pet changes --- Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index 5ddf55c63..d111bc6a7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -235,7 +235,8 @@ public class PetManager extends MiniClientPlugin } else if (pet instanceof Skeleton) { - pet.getEquipment().setHelmet(new ItemStack(Material.PUMPKIN)); + pet.getEquipment().setHelmet(new ItemStack(Material.PUMPKIN)); //stop burning + UtilEnt.silence(pet, true); DisguiseGuardian disguise = new DisguiseGuardian(pet); From 4085c998cd5e562792dc1738587c2237e30a4e36 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 18:44:33 +1100 Subject: [PATCH 17/31] MUSIC 4 LIFE --- .../src/mineplex/game/clans/spawn/Spawn.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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 7e05a5fe9..aae254487 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 @@ -4,6 +4,7 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Effect; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; @@ -61,6 +62,12 @@ public class Spawn extends MiniPlugin private WeightSet _spawns; private WeightSet _shops; private ClansManager _clansManager; + + private long _songEastLast = 0; + private long _songWestLast = 0; + + private long _songEastLength = 345000; //Blocks + private long _songWestLength = 185000; //Chirp public Spawn(JavaPlugin plugin, ClansManager clansManager) { @@ -450,4 +457,21 @@ public class Spawn extends MiniPlugin UtilPlayer.message(player, F.main("Clans", message)); } } + + @EventHandler + public void playDatMusicALLDAYLONG(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + if (UtilTime.elapsed(_songEastLast, _songEastLength)) + { + getEastSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2258); //Blocks + } + + if (UtilTime.elapsed(_songWestLast, _songWestLength)) + { + getEastSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2259); //Chirp + } + } } From e25df8739d2f3fadc4cb6729c6a414dd09c60465 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 18:46:15 +1100 Subject: [PATCH 18/31] EAST 2 WEST --- .../src/mineplex/game/clans/spawn/Spawn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 aae254487..e01211d51 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 @@ -471,7 +471,7 @@ public class Spawn extends MiniPlugin if (UtilTime.elapsed(_songWestLast, _songWestLength)) { - getEastSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2259); //Chirp + getWestSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2259); //Chirp } } } From f55b6761a89912161e90c4fb207f46318230bfff Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 19:14:35 +1100 Subject: [PATCH 19/31] disabled titan gadgets! --- .../src/mineplex/core/gadget/gadgets/MorphTitan.java | 8 ++++---- .../src/mineplex/core/mount/types/MountTitan.java | 8 ++++---- .../Mineplex.Core/src/mineplex/core/pet/PetManager.java | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java index a28618db5..eb50cc32e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java @@ -208,9 +208,9 @@ public class MorphTitan extends MorphGadget @EventHandler public void titanOwner(PlayerJoinEvent event) { - if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) - { - Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); - } +// 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/mount/types/MountTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java index 186a5a3b4..4c95237c6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -118,9 +118,9 @@ public class MountTitan extends Mount @EventHandler public void titanOwner(PlayerJoinEvent event) { - if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) - { - Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); - } +// 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/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index d111bc6a7..572919566 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -167,8 +167,8 @@ public class PetManager extends MiniClientPlugin if (rank.has(Rank.TITAN)) { - if (!Get(p).GetPets().containsKey(EntityType.SKELETON)) - Get(p).GetPets().put(EntityType.SKELETON, "Guardian"); +// if (!Get(p).GetPets().containsKey(EntityType.SKELETON)) +// Get(p).GetPets().put(EntityType.SKELETON, "Guardian"); } } From 0b0710458ff164e17cce8fa68bb4c69903490e96 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Fri, 27 Nov 2015 03:22:17 -0500 Subject: [PATCH 20/31] Hub updates/try to fix chiss stuff --- .../src/mineplex/game/clans/Clans.java | 2 +- .../hub/server/ui/clans/ClansServerPage.java | 35 +++++++++++-------- .../hub/server/ui/clans/ClansServerShop.java | 2 +- .../game/games/minestrike/MineStrike.java | 6 +--- .../minestrike/items/grenades/Smoke.java | 12 +++---- 5 files changed, 27 insertions(+), 30 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 072549742..5f6fd52d2 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -119,7 +119,7 @@ public class Clans extends JavaPlugin new CustomTagFix(this, packetHandler); GearManager customGear = new GearManager(this, packetHandler, _clientManager, _donationManager); - HologramManager hologram = new HologramManager(this); + HologramManager hologram = new HologramManager(this, packetHandler); _clansManager = new ClansManager(this, serverStatusManager.getCurrentServerName(), packetHandler, _clientManager, _donationManager, preferenceManager, blockRestore, teleport, chat, customGear, hologram, webServerAddress); new Recipes(this); new Farming(this); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java index fee39d92e..87a5a8f35 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java @@ -32,7 +32,7 @@ public class ClansServerPage extends ShopPageBase public ClansServerShop(ServerManager plugin, CoreClientManager clientManager, DonationManager donationManager) { - super(plugin, clientManager, donationManager, "Clans"); + super(plugin, clientManager, donationManager, "Clans Alpha"); _repository = new ClanRepository(plugin.getPlugin(), plugin.getStatusManager().getCurrentServerName()); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java index 166baf04d..1024a5338 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java @@ -2174,16 +2174,12 @@ public class MineStrike extends TeamGame //Incendiary _incendiary.clear(); -<<<<<<< HEAD Manager.GetBlockRestore().restoreAll(); -======= - Manager.GetBlockRestore().RestoreAll(); - + //Smoke for (Block block : _smokeBlocks.keySet()) block.setType(Material.AIR); _smokeBlocks.clear(); ->>>>>>> master //Restock Ammo for (Gun gun : _gunsEquipped.keySet()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java index a96942805..dbbd4dddb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java @@ -42,19 +42,15 @@ public class Smoke extends Grenade { // UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, ent.getLocation(), 0.3f, 0.3f, 0.3f, 0, 1, // ViewDist.MAX, UtilServer.getPlayers()); - -<<<<<<< HEAD + UtilParticle.PlayParticle(ParticleType.CLOUD, ent.getLocation(), 1.5f, 1.5f, 1.5f, 0, 100, ViewDist.MAX, UtilServer.getPlayers()); - + ent.getWorld().playSound(ent.getLocation(), Sound.FIZZ, 0.1f, 0.1f); - - for (Location loc : game.Manager.GetBlockRestore().restoreBlockAround(Material.FIRE, ent.getLocation(), 5)) -======= + //Remove Fire - for (Location loc : game.Manager.GetBlockRestore().RestoreBlockAround(Material.FIRE, ent.getLocation(), 5)) ->>>>>>> master + for (Location loc : game.Manager.GetBlockRestore().restoreBlockAround(Material.FIRE, ent.getLocation(), 5)) { loc.getWorld().playSound(loc, Sound.FIZZ, 1f, 1f); } From 5d40a57df8d5109c1a7aaa72fed8ad3070cba493 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 19:29:17 +1100 Subject: [PATCH 21/31] sound fix --- .../src/mineplex/game/clans/spawn/Spawn.java | 4 ++++ 1 file changed, 4 insertions(+) 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 e01211d51..c861e7a05 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 @@ -467,11 +467,15 @@ public class Spawn extends MiniPlugin if (UtilTime.elapsed(_songEastLast, _songEastLength)) { getEastSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2258); //Blocks + + _songEastLast = System.currentTimeMillis(); } if (UtilTime.elapsed(_songWestLast, _songWestLength)) { getWestSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2259); //Chirp + + _songWestLast = System.currentTimeMillis(); } } } From 936e61de57ea7dd9dd7cb7a6bc2db4eee2874a6f Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 19:42:04 +1100 Subject: [PATCH 22/31] gui changes :) --- .../hub/server/ui/clans/ClansServerPage.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java index 87a5a8f35..d2dc329a4 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java @@ -95,21 +95,22 @@ public class ClansServerPage extends ShopPageBase Date: Fri, 27 Nov 2015 20:01:48 +1100 Subject: [PATCH 23/31] fxied song again T_T --- .../src/mineplex/game/clans/spawn/Spawn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c861e7a05..5ec752a23 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 @@ -473,7 +473,7 @@ public class Spawn extends MiniPlugin if (UtilTime.elapsed(_songWestLast, _songWestLength)) { - getWestSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2259); //Chirp + getWestSpawn().getWorld().playEffect(getWestSpawn(), Effect.RECORD_PLAY, 2259); //Chirp _songWestLast = System.currentTimeMillis(); } From 6428d282758eeb69ed389e1e8e2469e807721402 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 20:31:19 +1100 Subject: [PATCH 24/31] travel hub bed fix --- .../src/mineplex/game/clans/spawn/travel/TravelPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java index dc2c3e24a..3ebc58d1d 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java @@ -97,7 +97,7 @@ public class TravelPage extends ShopPageBase } else { - if (UtilBlock.isValidBed(clan.getHome()) && clan.getHome().clone().add(0, 0.6, 0).getBlock().getType().equals(Material.AIR) && clan.getHome().clone().add(0, 2, 0).getBlock().getType().equals(Material.AIR)) + if (UtilBlock.isValidBed(clan.getHome()) && clan.getHome().clone().add(0, 1, 0).getBlock().getType().equals(Material.AIR) && clan.getHome().clone().add(0, 2, 0).getBlock().getType().equals(Material.AIR)) { meta.setDisplayName(C.cGreenB + "Clan Home"); meta.setLore(Arrays.asList(" ", C.cWhite + "Teleport to your Clan Home.")); From 9ce444067959c7ecf1f6cb5cc950b478547cdcb1 Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 20:36:00 +1100 Subject: [PATCH 25/31] extra cmds --- .../mineplex/game/clans/clans/gui/page/ClanMainPage.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java index a0de02304..e9738de3f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java @@ -176,10 +176,13 @@ public class ClanMainPage extends ClanPageBase byte commandsData = USE_RESOURCE_ICONS ? ClanIcon.COMMANDS.getData() : 0; ArrayList commandsLore = new ArrayList(); commandsLore.add(" "); + commandsLore.add(ChatColor.RESET + C.cYellow + "/c help " + C.cWhite + "Lists Clans Commands"); commandsLore.add(ChatColor.RESET + C.cYellow + "/c ally " + C.cWhite + "Request Ally"); commandsLore.add(ChatColor.RESET + C.cYellow + "/c neutral " + C.cWhite + "Revoke Ally"); - commandsLore.add(ChatColor.RESET + C.cYellow + "/c sethome " + C.cWhite + "Set Home"); - + commandsLore.add(ChatColor.RESET + C.cYellow + "/c sethome " + C.cWhite + "Set Home Bed"); + commandsLore.add(ChatColor.RESET + C.cYellow + "/c home " + C.cWhite + "Teleport to Home Bed"); + commandsLore.add(ChatColor.RESET + C.cYellow + "/map " + C.cWhite + "Give yourself a World Map"); + ShopItem commandsItem = new ShopItem(commandsMaterial, commandsData, commandsName, commandsLore.toArray(new String[0]), 1, false, false); setItem(8, commandsItem); } From dda0e827e1a92c49f324951304974a62afb4961f Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 20:46:33 +1100 Subject: [PATCH 26/31] FGIXEXFSD --- .../src/mineplex/hub/server/ui/clans/ClansServerPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java index d2dc329a4..74e6b3151 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java @@ -109,7 +109,7 @@ public class ClansServerPage extends ShopPageBase Date: Fri, 27 Nov 2015 20:59:23 +1100 Subject: [PATCH 27/31] fixed chome teleport height --- .../src/mineplex/game/clans/clans/commands/ClansCommand.java | 2 +- .../src/mineplex/game/clans/spawn/travel/TravelPage.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 05347d3f1..d77d750ab 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 @@ -763,7 +763,7 @@ public class ClansCommand extends CommandBase // Teleport", 300000, true, false, false, false)) return; // Do - Plugin.getTeleport().TP(caller, clan.getHome().add(0, 0.6, 0)); + Plugin.getTeleport().TP(caller, clan.getHome().add(0, 1, 0)); // Inform UtilPlayer.message(caller, F.main("Clans", "You teleported to your Clan Home " + UtilWorld.locToStrClean(caller.getLocation()) + ".")); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java index 3ebc58d1d..d6babf2a1 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java @@ -119,7 +119,7 @@ public class TravelPage extends ShopPageBase if (item.getItemMeta().getDisplayName().startsWith(C.cGreen)) { player.closeInventory(); - player.teleport(clan.getHome().clone().add(0, 0.6, 0)); + player.teleport(clan.getHome().clone().add(0, 1, 0)); } } }); From ec0e2d2d641d61b3dfc9c8139139680c5a1d037b Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 21:09:25 +1100 Subject: [PATCH 28/31] fixed colors --- .../src/mineplex/hub/server/ui/clans/ClansServerPage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java index 74e6b3151..137fa6322 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java @@ -95,8 +95,8 @@ public class ClansServerPage extends ShopPageBase Date: Fri, 27 Nov 2015 05:53:57 -0500 Subject: [PATCH 29/31] Fixes for release --- .../core/account/CoreClientManager.java | 13 ++++++------ .../serverConfig/ServerConfiguration.java | 4 +--- .../src/mineplex/core/teleport/Teleport.java | 15 +++++++++++++- .../teleport/command/TeleportCommand.java | 9 ++++++++- .../src/mineplex/game/clans/Clans.java | 4 ++-- .../game/clans/clans/ClansManager.java | 15 +++++++------- .../clans/commands/ClansLoginManager.java | 20 +++++++++---------- .../clans/clans/regions/ClansRegions.java | 2 +- .../scoreboard/ClansScoreboardManager.java | 2 +- .../game/clans/shop/ClansShopItem.java | 2 +- .../Mineplex.Hub/src/mineplex/hub/Hub.java | 2 +- .../src/nautilus/game/arcade/Arcade.java | 2 +- 12 files changed, 54 insertions(+), 36 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index a95e46cf2..3c01d37a3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -373,13 +373,12 @@ public class CoreClientManager extends MiniPlugin // Reserved Slot Check if (Bukkit.getOnlinePlayers().size() >= Bukkit.getServer().getMaxPlayers()) { - // TODO: REMOVE THIS RESTRICTION FROM CLANS-BRANCH, USED TO PREVENT ULTRA FROM JOINING CLANS -// if (client.GetRank().Has(event.getPlayer(), Rank.ULTRA, false)) -// { -// event.allow(); -// event.setResult(PlayerLoginEvent.Result.ALLOWED); -// return; -// } + if (client.GetRank().has(event.getPlayer(), Rank.ULTRA, false)) + { + event.allow(); + event.setResult(PlayerLoginEvent.Result.ALLOWED); + return; + } event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "This server is full and no longer accepts players."); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java b/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java index d5bd71dec..f57097c2d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java @@ -37,7 +37,6 @@ public class ServerConfiguration extends MiniPlugin if (_serverGroup == null) return; - /* try { _playerListMaxPlayers = PlayerList.class.getDeclaredField("maxPlayers"); @@ -50,9 +49,8 @@ public class ServerConfiguration extends MiniPlugin } _plugin.getServer().setWhitelist(_serverGroup.getWhitelist()); - */ ((CraftServer)_plugin.getServer()).getServer().setPVP(_serverGroup.getPvp()); - //((CraftServer)_plugin.getServer()).getServer().setTexturePack(_serverGroup.getResourcePack()); +// ((CraftServer)_plugin.getServer()).getServer().setResourcePack(_serverGroup.getResourcePack()); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java index 09aabb2ac..db766014d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java @@ -4,6 +4,7 @@ import java.util.LinkedList; import java.util.UUID; import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; import mineplex.core.teleport.command.LocateCommand; import mineplex.core.teleport.command.TeleportCommand; import mineplex.core.teleport.event.MineplexTeleportEvent; @@ -40,12 +41,14 @@ public class Teleport extends MiniPlugin private NautHashMap> _tpHistory = new NautHashMap>(); private NautHashMap _failedRedisLocates = new NautHashMap(); private String _serverName; + private CoreClientManager _clientManager; - public Teleport(JavaPlugin plugin) + public Teleport(JavaPlugin plugin, CoreClientManager clientManager) { super("Teleport", plugin); _serverName = getPlugin().getConfig().getString("serverstatus.name"); + _clientManager = clientManager; RedisLocateHandler locateHandler = new RedisLocateHandler(this); @@ -295,4 +298,14 @@ public class Teleport extends MiniPlugin { return _tpHistory.get(player.getName()); } + + public String getServerName() + { + return _serverName; + } + + public CoreClientManager getClientManager() + { + return _clientManager; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java index f9a1ac6e2..600f3fe6b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java @@ -6,13 +6,14 @@ import mineplex.core.command.MultiCommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.status.ServerStatusManager; import mineplex.core.teleport.Teleport; public class TeleportCommand extends MultiCommandBase { public TeleportCommand(Teleport plugin) { - super(plugin, Rank.ADMIN, "tp", "teleport"); + super(plugin, Rank.MODERATOR, "tp", "teleport"); AddCommand(new AllCommand(plugin)); AddCommand(new BackCommand(plugin)); @@ -22,6 +23,12 @@ public class TeleportCommand extends MultiCommandBase @Override protected void Help(Player caller, String[] args) { + if (Plugin.getServerName().contains("Clans") && !Plugin.getClientManager().hasRank(caller, Rank.ADMIN) && !caller.isOp()) + { + caller.sendMessage(F.main("Clans", "You cannot use /tp in clans!")); + return; + } + //Caller to Player if (args.length == 1 && CommandCenter.GetClientManager().Get(caller).GetRank().has(caller, Rank.MODERATOR, true)) Plugin.playerToPlayer(caller, caller.getName(), args[0]); 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 5f6fd52d2..2ade3e90f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -48,7 +48,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer; public class Clans extends JavaPlugin { - public static final String VERSION = "0.13"; + public static final String VERSION = "0.14"; private String WEB_CONFIG = "webServer"; // Modules @@ -91,7 +91,7 @@ public class Clans extends JavaPlugin new Spawn(this, serverStatusManager.getCurrentServerName()); Give.Initialize(this); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this, _clientManager); Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName()); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion()); 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 f30d1dd02..6557a4c28 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 @@ -65,6 +65,7 @@ import mineplex.game.clans.clans.commands.ClanManagementCommand; import mineplex.game.clans.clans.commands.ClansAllyChatCommand; import mineplex.game.clans.clans.commands.ClansChatCommand; import mineplex.game.clans.clans.commands.ClansCommand; +import mineplex.game.clans.clans.commands.ClansLoginManager; import mineplex.game.clans.clans.commands.KillCommand; import mineplex.game.clans.clans.commands.MapCommand; import mineplex.game.clans.clans.commands.RegionsCommand; @@ -244,7 +245,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati _explosion = new Explosion(plugin, blockRestore); - // new ClansLoginManager(getPlugin(), clientManager, _serverName); + new ClansLoginManager(getPlugin(), clientManager, _serverName); _clanShop = new ClanShop(this, clientManager, donationManager); @@ -950,16 +951,16 @@ public class ClansManager extends MiniClientPluginimplements IRelati public void onJoin(PlayerLoginEvent event) { Rank rank = _clientManager.Get(event.getPlayer()).GetRank(); - if (!event.getPlayer().isWhitelisted() || !rank.has(Rank.EVENT)) + if (!event.getPlayer().isWhitelisted() && !rank.has(Rank.LEGEND)) { - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans is currently in Legend+ only Alpha!"); // event.setKickMessage("This server is whitelisted!"); - event.setKickMessage("Clans is currently in staff only Pre-Alpha!"); + event.setKickMessage("Clans is currently in Legend+ only Alpha!"); } - else if (UtilServer.getPlayers().length >= UtilServer.getServer().getMaxPlayers() && !rank.has(Rank.ADMIN) && !event.getPlayer().isWhitelisted()) + else if (UtilServer.getPlayers().length >= UtilServer.getServer().getMaxPlayers() && !rank.has(Rank.ADMIN) && !event.getPlayer().isWhitelisted() && !event.getPlayer().isOp()) { - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); - event.setKickMessage("Clans Pre-Alpha is full! Try again soon"); + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans Alpha is full! Try again soon"); + event.setKickMessage("Clans Alpha is full! Try again soon"); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java index 3b90d62d4..1267209fb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java @@ -39,12 +39,13 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor @EventHandler public void onPlayerJoin(PlayerLoginEvent event) { - if (_queue.contains(event.getPlayer().getName())) + if (_queue.contains(event.getPlayer().getName()) && !event.getPlayer().isOp()) { -// event.setKickMessage("This is not your Clans home server"); -// event.setResult(PlayerLoginEvent.Result.KICK_OTHER); - _queue.remove(event.getPlayer().getName()); + event.setKickMessage("This is not your Clans home server"); + event.setResult(PlayerLoginEvent.Result.KICK_OTHER); } + + _queue.remove(event.getPlayer().getName()); } private void kickPlayer(final String playerName, final String homeServer) @@ -54,11 +55,11 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor @Override public void run() { -// Player player = UtilPlayer.searchExact(playerName); -// if (player != null && player.isOnline()) -// { -// player.kickPlayer("This is not your home server. To play clans, connect to " + homeServer); -// } + Player player = UtilPlayer.searchExact(playerName); + if (player != null && player.isOnline() && !player.isOp()) + { + player.kickPlayer("This is not your home server. To play clans, connect to " + homeServer); + } } }, 20); } @@ -74,7 +75,6 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor if (serverName != null) { - System.out.println("Player " + playerName + " is from server: " + serverName); if (!serverName.equals(_serverName)) { _queue.add(playerName); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java index 2ea500277..537f21e7c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java @@ -40,7 +40,7 @@ public class ClansRegions extends MiniPlugin { public final static String DEFAULT_WORLD_NAME = "world"; public final static int SPAWN_RADIUS = 3; // Radius of spawn claim area (measured in chunks) - public final static int SHOP_RADIUS = 4; // Radius of shop claim area (measured in chunks) + public final static int SHOP_RADIUS = 7; // Radius of shop claim area (measured in chunks) public final static int FIELDS_RADIUS = 7; // Radius of fields claim area (measured in chunks) public final static int BORDERLANDS_RADIUS = 50; // Radius of borderlands claim area (measured in chunks) public static final int BORDER_RADIUS = 768; 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 4737f9abf..42f3c6d6c 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 @@ -45,7 +45,7 @@ public class ClansScoreboardManager extends ScoreboardManager ScoreboardData data = getData("default", true); - data.write(C.cGreen + "Clans Pre-Alpha " + Clans.VERSION); + data.write(C.cGreen + "Clans Alpha " + Clans.VERSION); data.writeEmpty(); data.writeElement(new ScoreboardElementClan(_clansManager)); data.writeElement(new ScoreboardElementPlayer(_clansManager)); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java index d3be0444e..a51346651 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java @@ -75,7 +75,7 @@ public enum ClansShopItem NETHER_BRICK(50, 10, Material.NETHER_BRICK, 1), QUARTZ_BLOCK(75, 15, Material.QUARTZ_BLOCK, 1), CLAY(30, 6, Material.CLAY, 1), - GOLD_TOKEN(5000, 5000, Material.GOLD_RECORD, 1, (byte) 0, "Gold Token"); + GOLD_TOKEN(50000, 50000, Material.GOLD_RECORD, 1, (byte) 0, "Gold Token"); private int _buyPrice; private int _sellPrice; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index d6d98788a..f52155acb 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -166,7 +166,7 @@ public class Hub extends JavaPlugin implements IRelation conditionManager.setDamageManager(damage); Fire fire = new Fire(this, conditionManager, damage); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this, clientManager); Energy energy = new Energy(this); energy.setEnabled(false); 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 fb19678e3..7a710683b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -112,7 +112,7 @@ public class Arcade extends JavaPlugin Creature creature = new Creature(this); ServerStatusManager serverStatusManager = new ServerStatusManager(this, _clientManager, new LagMeter(this, _clientManager)); LeaderboardManager leaderboardManager = new LeaderboardManager(this, _clientManager); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this, _clientManager); Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName()); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion()); PacketHandler packetHandler = new PacketHandler(this); From b996dc20cacbd3fe71d50414c72e7d82d2d3d6c7 Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Fri, 27 Nov 2015 06:26:32 -0500 Subject: [PATCH 30/31] Enable tutorial, fix stuck command --- .../game/clans/clans/stuck/commands/StuckCommand.java | 5 +++-- .../game/clans/tutorials/types/TutorialGettingStarted.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java index 22ad80ada..f43064682 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java @@ -33,9 +33,10 @@ public class StuckCommand extends CommandBase return; } - if(ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null && !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Borderlands")) + if(ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null && !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Borderlands") && + !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Shops") && !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Spawn")) { - UtilPlayer.message(caller, F.main("Clans", "You must be in the Wilderness/Borderlands to use this command.")); + UtilPlayer.message(caller, F.main("Clans", "You must be in the Wilderness/Borderlands/Shops/Spawn to use this command.")); return; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java index 427a6f635..fb17f9fe5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java @@ -42,13 +42,13 @@ public class TutorialGettingStarted extends Tutorial _doScoreboard = true; _ghostMode = true; - _startOnJoin = false; + _startOnJoin = true; _goldReward = 5000; _uniqueId = "GettingStartedTutorial"; _friendlyName = "Getting Started"; } - + @Override public void onFinished(final Player player) { From 53da9c97d0c9579567531f51b1f8f9287bbc377d Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 27 Nov 2015 22:27:20 +1100 Subject: [PATCH 31/31] item frame cancel! --- .../src/mineplex/game/clans/spawn/Spawn.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) 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 5ec752a23..dfca12bb5 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 @@ -23,6 +23,7 @@ import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.EntityTargetEvent; @@ -159,6 +160,30 @@ public class Spawn extends MiniPlugin } } + @EventHandler + public void onItemFrameDamage(CustomDamageEvent event) + { + if (event.GetDamageeEntity() instanceof ItemFrame) + { + if (isInSpawn(event.GetDamageeEntity().getLocation())) + { + event.SetCancelled("Item Frame Cancel"); + } + } + } + + @EventHandler + public void onItemFrameDamage(EntityDamageEvent event) + { + if (event.getEntity() instanceof ItemFrame) + { + if (isInSpawn(event.getEntity().getLocation())) + { + event.setCancelled(true); + } + } + } + @EventHandler public void Update(UpdateEvent event) {