diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBarrage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBarrage.java index 0e55f9e15..7471b9dfc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBarrage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBarrage.java @@ -30,237 +30,259 @@ import nautilus.game.arcade.kit.Perk; public class PerkBarrage extends Perk { - private WeakHashMap _charge = new WeakHashMap(); - private WeakHashMap _chargeLast = new WeakHashMap(); + private WeakHashMap _charge = new WeakHashMap(); + private WeakHashMap _chargeLast = new WeakHashMap(); - private HashSet _firing = new HashSet(); - private HashSet _arrows = new HashSet(); + private HashSet _firing = new HashSet(); + private HashSet _arrows = new HashSet(); - private int _max; - private long _tick; - private boolean _remove; - private boolean _noDelay; - - public PerkBarrage(int max, long tick, boolean remove, boolean noDelay) - { - super("Barrage", new String[] - { - C.cYellow + "Charge" + C.cGray + " your Bow to use " + C.cGreen + "Barrage" - }); - - _max = max; - _tick = tick; - _remove = remove; - _noDelay = noDelay; - } + private int _max; + private long _tick; + private boolean _remove; + private boolean _noDelay; + private boolean _useExp; - @EventHandler - public void BarrageDrawBow(PlayerInteractEvent event) - { - Player player = event.getPlayer(); + public PerkBarrage(int max, long tick, boolean remove, boolean noDelay) + { + this(max, tick, remove, noDelay, false); + } - if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) - return; + public PerkBarrage(int max, long tick, boolean remove, boolean noDelay, boolean useExpAndBar) + { + super("Barrage", new String[] + { + C.cYellow + "Charge" + C.cGray + " your Bow to use " + C.cGreen + "Barrage" + }); + _useExp = useExpAndBar; + _max = max; + _tick = tick; + _remove = remove; + _noDelay = noDelay; + } - if (player.getItemInHand() == null || player.getItemInHand().getType() != Material.BOW) - return; + @EventHandler + public void BarrageDrawBow(PlayerInteractEvent event) + { + Player player = event.getPlayer(); - if (!Kit.HasKit(player)) - return; + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) + return; - if (!player.getInventory().contains(Material.ARROW)) - return; + if (player.getItemInHand() == null || player.getItemInHand().getType() != Material.BOW) + return; - if (event.getClickedBlock() != null) - if (UtilBlock.usable(event.getClickedBlock())) - return; + if (!Kit.HasKit(player)) + return; - //Start Charge - _charge.put(player, 0); - _chargeLast.put(player, System.currentTimeMillis()); - _firing.remove(player); - } + if (!player.getInventory().contains(Material.ARROW)) + return; - @EventHandler - public void BarrageCharge(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; + if (event.getClickedBlock() != null) + if (UtilBlock.usable(event.getClickedBlock())) + return; - for (Player cur : UtilServer.getPlayers()) - { - //Not Charging - if (!_charge.containsKey(cur)) - continue; + // Start Charge + _charge.put(player, 0); + _chargeLast.put(player, System.currentTimeMillis()); + _firing.remove(player); + } - if (_firing.contains(cur)) - continue; + @EventHandler + public void BarrageCharge(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; - //Max Charge - if (_charge.get(cur) >= _max) - continue; + for (Player cur : UtilServer.getPlayers()) + { + // Not Charging + if (!_charge.containsKey(cur)) + continue; - //Charge Interval - if (_charge.get(cur) == 0) - { - if (!UtilTime.elapsed(_chargeLast.get(cur), 1000)) - continue; - } - else - { - if (!UtilTime.elapsed(_chargeLast.get(cur), _tick)) - continue; - } + if (_firing.contains(cur)) + continue; - //No Longer Holding Bow - if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW) - { - _charge.remove(cur); - _chargeLast.remove(cur); - continue; - } + // Max Charge + if (_charge.get(cur) >= _max) + continue; - //Increase Charge - _charge.put(cur, _charge.get(cur) + 1); - _chargeLast.put(cur, System.currentTimeMillis()); + // Charge Interval + if (_charge.get(cur) == 0) + { + if (!UtilTime.elapsed(_chargeLast.get(cur), 1000)) + continue; + } + else + { + if (!UtilTime.elapsed(_chargeLast.get(cur), _tick)) + continue; + } - //Effect - cur.playSound(cur.getLocation(), Sound.CLICK, 1f, 1f + (0.1f * _charge.get(cur))); - } - } + // No Longer Holding Bow + if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW) + { + if (_useExp) + { + cur.setLevel(_charge.get(cur)); + } + _charge.remove(cur); + _chargeLast.remove(cur); + continue; + } - @EventHandler(priority = EventPriority.HIGH) - public void BarrageFireBow(EntityShootBowEvent event) - { - if (event.isCancelled()) - return; - - if (!Manager.GetGame().IsLive()) - return; - - if (!(event.getEntity() instanceof Player)) - return; + // Increase Charge + _charge.put(cur, _charge.get(cur) + 1); - if (!(event.getProjectile() instanceof Arrow)) - return; + if (_useExp) + { + cur.setLevel(_charge.get(cur)); + } + _chargeLast.put(cur, System.currentTimeMillis()); - Player player = (Player)event.getEntity(); + // Effect + cur.playSound(cur.getLocation(), Sound.CLICK, 1f, 1f + (0.1f * _charge.get(cur))); + } + } - if (!_charge.containsKey(player)) - return; + @EventHandler(priority = EventPriority.HIGH) + public void BarrageFireBow(EntityShootBowEvent event) + { + if (event.isCancelled()) + return; - //Start Barrage - _firing.add(player); - _chargeLast.put(player, System.currentTimeMillis()); - } + if (!Manager.GetGame().IsLive()) + return; - @EventHandler - public void BarrageArrows(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; + if (!(event.getEntity() instanceof Player)) + return; - HashSet remove = new HashSet(); + if (!(event.getProjectile() instanceof Arrow)) + return; - for (Player cur : _firing) - { - if (!_charge.containsKey(cur) || !_chargeLast.containsKey(cur)) - { - remove.add(cur); - continue; - } + Player player = (Player) event.getEntity(); - if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW) - { - remove.add(cur); - continue; - } + if (!_charge.containsKey(player)) + return; - int arrows = _charge.get(cur); - if (arrows <= 0) - { - remove.add(cur); - continue; - } + // Start Barrage + _firing.add(player); + _chargeLast.put(player, System.currentTimeMillis()); + } - _charge.put(cur, arrows-1); + @EventHandler + public void BarrageArrows(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; - //Fire Arrow - Vector random = new Vector((Math.random()-0.5)/10, (Math.random()-0.5)/10, (Math.random()-0.5)/10); - Projectile arrow = cur.launchProjectile(Arrow.class); - arrow.setVelocity(cur.getLocation().getDirection().add(random).multiply(3)); - _arrows.add(arrow); - cur.getWorld().playSound(cur.getLocation(), Sound.SHOOT_ARROW, 1f, 1f); - } + HashSet remove = new HashSet(); - for (Player cur : remove) - { - _charge.remove(cur); - _chargeLast.remove(cur); - _firing.remove(cur); - } - } - - @EventHandler(priority = EventPriority.HIGH) - public void BarrageDamageTime(CustomDamageEvent event) - { - if (!_noDelay) - return; - - if (event.GetProjectile() == null) - return; + for (Player cur : _firing) + { + if (!_charge.containsKey(cur) || !_chargeLast.containsKey(cur)) + { + remove.add(cur); + continue; + } - if (event.GetDamagerPlayer(true) == null) - return; + if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW) + { + remove.add(cur); + continue; + } - if (!(event.GetProjectile() instanceof Arrow)) - return; + int arrows = _charge.get(cur); + if (arrows <= 0) + { + remove.add(cur); + continue; + } - Player damager = event.GetDamagerPlayer(true); + _charge.put(cur, arrows - 1); + if (_useExp) + { + cur.setLevel(_charge.get(cur)); + } - if (!Kit.HasKit(damager)) - return; + // Fire Arrow + Vector random = new Vector((Math.random() - 0.5) / 10, (Math.random() - 0.5) / 10, (Math.random() - 0.5) / 10); + Projectile arrow = cur.launchProjectile(Arrow.class); + arrow.setVelocity(cur.getLocation().getDirection().add(random).multiply(3)); + _arrows.add(arrow); + cur.getWorld().playSound(cur.getLocation(), Sound.SHOOT_ARROW, 1f, 1f); + } - event.SetCancelled("Barrage Cancel"); - - event.GetProjectile().remove(); - - //Damage Event - Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, - DamageCause.THORNS, event.GetDamage(), true, true, false, - damager.getName(), GetName()); - } + for (Player cur : remove) + { + if (_useExp) + { + cur.setLevel(0); + } + _charge.remove(cur); + _chargeLast.remove(cur); + _firing.remove(cur); + } + } - @EventHandler - public void BarrageProjectileHit(ProjectileHitEvent event) - { - if (_remove) - if (_arrows.remove(event.getEntity())) - event.getEntity().remove(); - } + @EventHandler(priority = EventPriority.HIGH) + public void BarrageDamageTime(CustomDamageEvent event) + { + if (!_noDelay) + return; - @EventHandler - public void BarrageClean(UpdateEvent event) - { - if (event.getType() != UpdateType.SEC) - return; + if (event.GetProjectile() == null) + return; - for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) - { - Projectile arrow = arrowIterator.next(); + if (event.GetDamagerPlayer(true) == null) + return; - if (arrow.isDead() || !arrow.isValid()) - arrowIterator.remove(); - } - } + if (!(event.GetProjectile() instanceof Arrow)) + return; - @EventHandler - public void Quit(PlayerQuitEvent event) - { - Player player = event.getPlayer(); + Player damager = event.GetDamagerPlayer(true); - _charge.remove(player); - _chargeLast.remove(player); - _firing.remove(player); - } + if (!Kit.HasKit(damager)) + return; + + event.SetCancelled("Barrage Cancel"); + + event.GetProjectile().remove(); + + // Damage Event + Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, DamageCause.THORNS, event.GetDamage(), true, + true, false, damager.getName(), GetName()); + } + + @EventHandler + public void BarrageProjectileHit(ProjectileHitEvent event) + { + if (_remove) + if (_arrows.remove(event.getEntity())) + event.getEntity().remove(); + } + + @EventHandler + public void BarrageClean(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) + { + Projectile arrow = arrowIterator.next(); + + if (arrow.isDead() || !arrow.isValid()) + arrowIterator.remove(); + } + } + + @EventHandler + public void Quit(PlayerQuitEvent event) + { + Player player = event.getPlayer(); + + _charge.remove(player); + _chargeLast.remove(player); + _firing.remove(player); + } }