Modify Barrage perk to support setting levels to indicate arrows

This commit is contained in:
libraryaddict 2014-11-29 16:38:54 +13:00
parent 6439fc93c2
commit e3b0843b2c
1 changed files with 214 additions and 192 deletions

View File

@ -30,237 +30,259 @@ import nautilus.game.arcade.kit.Perk;
public class PerkBarrage extends Perk public class PerkBarrage extends Perk
{ {
private WeakHashMap<Player, Integer> _charge = new WeakHashMap<Player, Integer>(); private WeakHashMap<Player, Integer> _charge = new WeakHashMap<Player, Integer>();
private WeakHashMap<Player, Long> _chargeLast = new WeakHashMap<Player, Long>(); private WeakHashMap<Player, Long> _chargeLast = new WeakHashMap<Player, Long>();
private HashSet<Player> _firing = new HashSet<Player>(); private HashSet<Player> _firing = new HashSet<Player>();
private HashSet<Projectile> _arrows = new HashSet<Projectile>(); private HashSet<Projectile> _arrows = new HashSet<Projectile>();
private int _max; private int _max;
private long _tick; private long _tick;
private boolean _remove; private boolean _remove;
private boolean _noDelay; private boolean _noDelay;
private boolean _useExp;
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;
}
@EventHandler public PerkBarrage(int max, long tick, boolean remove, boolean noDelay)
public void BarrageDrawBow(PlayerInteractEvent event) {
{ this(max, tick, remove, noDelay, false);
Player player = event.getPlayer(); }
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) public PerkBarrage(int max, long tick, boolean remove, boolean noDelay, boolean useExpAndBar)
return; {
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) @EventHandler
return; public void BarrageDrawBow(PlayerInteractEvent event)
{
Player player = event.getPlayer();
if (!Kit.HasKit(player)) if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK)
return; return;
if (!player.getInventory().contains(Material.ARROW)) if (player.getItemInHand() == null || player.getItemInHand().getType() != Material.BOW)
return; return;
if (event.getClickedBlock() != null) if (!Kit.HasKit(player))
if (UtilBlock.usable(event.getClickedBlock())) return;
return;
//Start Charge if (!player.getInventory().contains(Material.ARROW))
_charge.put(player, 0); return;
_chargeLast.put(player, System.currentTimeMillis());
_firing.remove(player);
}
@EventHandler if (event.getClickedBlock() != null)
public void BarrageCharge(UpdateEvent event) if (UtilBlock.usable(event.getClickedBlock()))
{ return;
if (event.getType() != UpdateType.TICK)
return;
for (Player cur : UtilServer.getPlayers()) // Start Charge
{ _charge.put(player, 0);
//Not Charging _chargeLast.put(player, System.currentTimeMillis());
if (!_charge.containsKey(cur)) _firing.remove(player);
continue; }
if (_firing.contains(cur)) @EventHandler
continue; public void BarrageCharge(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
//Max Charge for (Player cur : UtilServer.getPlayers())
if (_charge.get(cur) >= _max) {
continue; // Not Charging
if (!_charge.containsKey(cur))
continue;
//Charge Interval if (_firing.contains(cur))
if (_charge.get(cur) == 0) continue;
{
if (!UtilTime.elapsed(_chargeLast.get(cur), 1000))
continue;
}
else
{
if (!UtilTime.elapsed(_chargeLast.get(cur), _tick))
continue;
}
//No Longer Holding Bow // Max Charge
if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW) if (_charge.get(cur) >= _max)
{ continue;
_charge.remove(cur);
_chargeLast.remove(cur);
continue;
}
//Increase Charge // Charge Interval
_charge.put(cur, _charge.get(cur) + 1); if (_charge.get(cur) == 0)
_chargeLast.put(cur, System.currentTimeMillis()); {
if (!UtilTime.elapsed(_chargeLast.get(cur), 1000))
continue;
}
else
{
if (!UtilTime.elapsed(_chargeLast.get(cur), _tick))
continue;
}
//Effect // No Longer Holding Bow
cur.playSound(cur.getLocation(), Sound.CLICK, 1f, 1f + (0.1f * _charge.get(cur))); 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) // Increase Charge
public void BarrageFireBow(EntityShootBowEvent event) _charge.put(cur, _charge.get(cur) + 1);
{
if (event.isCancelled())
return;
if (!Manager.GetGame().IsLive())
return;
if (!(event.getEntity() instanceof Player))
return;
if (!(event.getProjectile() instanceof Arrow)) if (_useExp)
return; {
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)) @EventHandler(priority = EventPriority.HIGH)
return; public void BarrageFireBow(EntityShootBowEvent event)
{
if (event.isCancelled())
return;
//Start Barrage if (!Manager.GetGame().IsLive())
_firing.add(player); return;
_chargeLast.put(player, System.currentTimeMillis());
}
@EventHandler if (!(event.getEntity() instanceof Player))
public void BarrageArrows(UpdateEvent event) return;
{
if (event.getType() != UpdateType.TICK)
return;
HashSet<Player> remove = new HashSet<Player>(); if (!(event.getProjectile() instanceof Arrow))
return;
for (Player cur : _firing) Player player = (Player) event.getEntity();
{
if (!_charge.containsKey(cur) || !_chargeLast.containsKey(cur))
{
remove.add(cur);
continue;
}
if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW) if (!_charge.containsKey(player))
{ return;
remove.add(cur);
continue;
}
int arrows = _charge.get(cur); // Start Barrage
if (arrows <= 0) _firing.add(player);
{ _chargeLast.put(player, System.currentTimeMillis());
remove.add(cur); }
continue;
}
_charge.put(cur, arrows-1); @EventHandler
public void BarrageArrows(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
//Fire Arrow HashSet<Player> remove = new HashSet<Player>();
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);
}
for (Player cur : remove) for (Player cur : _firing)
{ {
_charge.remove(cur); if (!_charge.containsKey(cur) || !_chargeLast.containsKey(cur))
_chargeLast.remove(cur); {
_firing.remove(cur); remove.add(cur);
} continue;
} }
@EventHandler(priority = EventPriority.HIGH)
public void BarrageDamageTime(CustomDamageEvent event)
{
if (!_noDelay)
return;
if (event.GetProjectile() == null)
return;
if (event.GetDamagerPlayer(true) == null) if (cur.getItemInHand() == null || cur.getItemInHand().getType() != Material.BOW)
return; {
remove.add(cur);
continue;
}
if (!(event.GetProjectile() instanceof Arrow)) int arrows = _charge.get(cur);
return; 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)) // Fire Arrow
return; 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"); for (Player cur : remove)
{
event.GetProjectile().remove(); if (_useExp)
{
//Damage Event cur.setLevel(0);
Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, }
DamageCause.THORNS, event.GetDamage(), true, true, false, _charge.remove(cur);
damager.getName(), GetName()); _chargeLast.remove(cur);
} _firing.remove(cur);
}
}
@EventHandler @EventHandler(priority = EventPriority.HIGH)
public void BarrageProjectileHit(ProjectileHitEvent event) public void BarrageDamageTime(CustomDamageEvent event)
{ {
if (_remove) if (!_noDelay)
if (_arrows.remove(event.getEntity())) return;
event.getEntity().remove();
}
@EventHandler if (event.GetProjectile() == null)
public void BarrageClean(UpdateEvent event) return;
{
if (event.getType() != UpdateType.SEC)
return;
for (Iterator<Projectile> arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) if (event.GetDamagerPlayer(true) == null)
{ return;
Projectile arrow = arrowIterator.next();
if (arrow.isDead() || !arrow.isValid()) if (!(event.GetProjectile() instanceof Arrow))
arrowIterator.remove(); return;
}
}
@EventHandler Player damager = event.GetDamagerPlayer(true);
public void Quit(PlayerQuitEvent event)
{
Player player = event.getPlayer();
_charge.remove(player); if (!Kit.HasKit(damager))
_chargeLast.remove(player); return;
_firing.remove(player);
} 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<Projectile> 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);
}
} }