From 54e545e2ff64dbc92874460e7313010507731034 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 30 Apr 2018 19:48:01 +0100 Subject: [PATCH] Turf Wars --- .../game/games/turfforts/TurfForts.java | 750 +++++++++--------- .../arcade/game/games/wither/WitherGame.java | 32 +- .../game/games/wither/kit/KitHumanEditor.java | 7 +- .../game/games/wither/kit/KitHumanMedic.java | 2 +- .../stats/BehindEnemyLinesStatTracker.java | 23 +- 5 files changed, 427 insertions(+), 387 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/turfforts/TurfForts.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/turfforts/TurfForts.java index 912ab25fd..42b81cba5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/turfforts/TurfForts.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/turfforts/TurfForts.java @@ -1,12 +1,13 @@ package nautilus.game.arcade.game.games.turfforts; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Location; @@ -14,10 +15,9 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.Arrow; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.block.Action; @@ -32,26 +32,28 @@ import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.MapUtil; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.events.PlayerKitGiveEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.TeamGame; @@ -70,13 +72,14 @@ import nautilus.game.arcade.stats.TheComebackStatTracker; public class TurfForts extends TeamGame { + public static class ShredBlockEvent extends BlockEvent { - private static final HandlerList handlers = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList(); public static HandlerList getHandlerList() { - return handlers; + return HANDLER_LIST; } @Override @@ -87,7 +90,7 @@ public class TurfForts extends TeamGame private final Arrow _arrow; - public ShredBlockEvent(Block theBlock, Arrow arrow) + ShredBlockEvent(Block theBlock, Arrow arrow) { super(theBlock); @@ -100,7 +103,7 @@ public class TurfForts extends TeamGame } } - private ArrayList _turf; + private List _turf; private Location _red; private Location _redBase; @@ -108,20 +111,18 @@ public class TurfForts extends TeamGame private Location _blue; private Location _blueBase; - private int xRed = 0; - private int zRed = 0; + private int _xRed = 0; + private int _zRed = 0; private long _phaseTime = 0; - private long _buildTime = 20000; - private long _fightTime = 90000; + private long _buildTime = TimeUnit.SECONDS.toMillis(20); + private long _fightTime = TimeUnit.SECONDS.toMillis(90); private boolean _fight = false; private int _lines = 0; - private BlockBreakStatTracker _breakStatTracker; - - private HashMap _enemyTurf = new HashMap(); - - private Set playersThatNeedBlocks = new HashSet(); + private final BlockBreakStatTracker _breakStatTracker; + private final Map _enemyTurf = new HashMap<>(); + private final Set playersThatNeedBlocks = new HashSet<>(); public TurfForts(ArcadeManager manager) { @@ -136,21 +137,22 @@ public class TurfForts extends TeamGame new String[] { - "You have 30 seconds to build your Fort!", - "", - "Each kill advances your turf forwards.", - "Take over all the turf to win!" + "You have " + C.cGreen + "40 Seconds" + C.Reset + " to build your " + C.cAqua + "Fort" + C.Reset + "!", + "Each " + C.cRed + "Kill" + C.Reset + " advances your turf forwards.", + "Take over " + C.cYellow + "All The Turf" + C.Reset + " to win!" }); - this.StrictAntiHack = true; - this.HungerSet = 20; - this.DeathOut = false; - this.BlockPlaceAllow.add(35); - this.BlockBreakAllow.add(35); - this.ItemDrop = false; - this.ItemPickup = false; - this.DamageSelf = false; - this.DeathSpectateSecs = 4; + StrictAntiHack = true; + HungerSet = 20; + DeathOut = false; + BlockPlaceAllow.add(Material.WOOL.getId()); + BlockBreakAllow.add(Material.WOOL.getId()); + ItemDrop = false; + ItemPickup = false; + DamageSelf = false; + DamageFall = false; + DeathSpectateSecs = 4; + GameTimeout = TimeUnit.MINUTES.toMillis(15); _breakStatTracker = new BlockBreakStatTracker(this, false); @@ -158,7 +160,7 @@ public class TurfForts extends TeamGame new BlockShreadStatTracker(this), new BehindEnemyLinesStatTracker(this), new TheComebackStatTracker(this), - new BlockPlaceStatTracker(this, new Material[] {}), + new BlockPlaceStatTracker(this, new Material[]{}), _breakStatTracker ); @@ -191,114 +193,171 @@ public class TurfForts extends TeamGame _blue = WorldData.GetDataLocs("BLUE").get(0); _blueBase = WorldData.GetDataLocs("LIGHT_BLUE").get(0); - if (_red.getBlockX() > _blue.getBlockX()) xRed = 1; - else if (_red.getBlockX() < _blue.getBlockX()) xRed = -1; + if (_red.getBlockX() > _blue.getBlockX()) + { + _xRed = 1; + } + else if (_red.getBlockX() < _blue.getBlockX()) + { + _xRed = -1; + } - if (_red.getBlockZ() > _blue.getBlockZ()) zRed = 1; - else if (_red.getBlockZ() < _blue.getBlockZ()) zRed = -1; + if (_red.getBlockZ() > _blue.getBlockZ()) + { + _zRed = 1; + } + else if (_red.getBlockZ() < _blue.getBlockZ()) + { + _zRed = -1; + } //Color Turf - for (Location loc : _turf) + for (Location location : _turf) { - if (UtilMath.offset(loc, _red) < UtilMath.offset(loc, _blue)) - MapUtil.QuickChangeBlockAt(loc, 159, (byte) 14); + if (UtilMath.offsetSquared(location, _red) < UtilMath.offsetSquared(location, _blue)) + { + MapUtil.QuickChangeBlockAt(location, Material.STAINED_CLAY, (byte) 14); + } else - MapUtil.QuickChangeBlockAt(loc, 159, (byte) 3); + { + MapUtil.QuickChangeBlockAt(location, Material.STAINED_CLAY, (byte) 3); + } } } @EventHandler - public void PlayerKillAward(CombatDeathEvent event) + public void prepare(GameStateChangeEvent event) { - if (!(event.GetEvent().getEntity() instanceof Player)) - return; - - if (event.GetLog().GetKiller() == null) - return; - - Player killed = (Player) event.GetEvent().getEntity(); - - Player killer = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); - if (killer == null) - return; - - if (GetTeam(killer) == null) - return; - - if (GetTeam(killed) == null) - return; - - if (GetTeam(killer).equals(GetTeam(killed))) - return; - - if (GetTeam(killer).GetColor() == ChatColor.RED) + if (event.GetState() != GameState.Prepare) { - TurfMove(true); + return; } - else + + CreatureAllowOverride = true; + spawnKitNPCs(GetTeam(ChatColor.RED), "ORANGE"); + spawnKitNPCs(GetTeam(ChatColor.AQUA), "CYAN"); + CreatureAllowOverride = false; + } + + private void spawnKitNPCs(GameTeam team, String colour) + { + List spawns = WorldData.GetDataLocs(colour); + int i = 0; + + if (spawns.size() < GetKits().length) { - TurfMove(false); + return; + } + + for (Kit kit : GetKits()) + { + Location location = spawns.get(i++); + location.setYaw(UtilAlg.GetYaw(UtilAlg.getTrajectory(location, GetSpectatorLocation()))); + kit.getGameKit().createNPC(location); } } - private void TurfMove(boolean red) + @EventHandler + public void playerDeath(PlayerDeathEvent event) { - for (int line = 0; line < GetLinesPerKill(); line++) + Player killed = event.getEntity(), killer = killed.getKiller(); + _enemyTurf.remove(killed); + + if (killer == null) + { + return; + } + + InfiltrateData data = _enemyTurf.get(killer); + + if (data != null) + { + data.HasKilled = true; + } + + GameTeam killedTeam = GetTeam(killed), killerTeam = GetTeam(killer); + + if (killedTeam.equals(killerTeam)) + { + return; + } + + turfMove(killerTeam.GetColor() == ChatColor.RED); + } + + private void turfMove(boolean red) + { + for (int line = 0; line < getLinesPerKill(); line++) { if (red) { - if (xRed != 0) - for (Location loc : _turf) - if (loc.getBlockX() == _blue.getBlockX()) + if (_xRed != 0) + { + for (Location location : _turf) + { + if (location.getBlockX() == _blue.getBlockX()) { - MapUtil.QuickChangeBlockAt(loc, 159, (byte) 14); + MapUtil.QuickChangeBlockAt(location, Material.STAINED_CLAY, (byte) 14); for (int i = 1; i < 6; i++) - if (loc.getBlock().getRelative(BlockFace.UP, i).getTypeId() == 35) - MapUtil.QuickChangeBlockAt(loc.clone().add(0, i, 0), 0, (byte) 0); + { + if (location.getBlock().getRelative(BlockFace.UP, i).getType() == Material.WOOL) + { + MapUtil.QuickChangeBlockAt(location.clone().add(0, i, 0), 0, (byte) 0); + } + } } + } + } - - if (zRed != 0) - for (Location loc : _turf) - if (loc.getBlockZ() == _blue.getBlockZ()) + if (_zRed != 0) + { + for (Location location : _turf) + { + if (location.getBlockZ() == _blue.getBlockZ()) { - MapUtil.QuickChangeBlockAt(loc, 159, (byte) 14); + MapUtil.QuickChangeBlockAt(location, Material.STAINED_CLAY, (byte) 14); for (int i = 1; i < 6; i++) - if (loc.getBlock().getRelative(BlockFace.UP, i).getTypeId() == 35) - MapUtil.QuickChangeBlockAt(loc.clone().add(0, i, 0), 0, (byte) 0); + { + if (location.getBlock().getRelative(BlockFace.UP, i).getType() == Material.WOOL) + { + MapUtil.QuickChangeBlockAt(location.clone().add(0, i, 0), 0, (byte) 0); + } + } } + } + } - _red.subtract(xRed, 0, zRed); - _blue.subtract(xRed, 0, zRed); + _red.subtract(_xRed, 0, _zRed); + _blue.subtract(_xRed, 0, _zRed); } else { - if (xRed != 0) - for (Location loc : _turf) - if (loc.getBlockX() == _red.getBlockX()) + if (_xRed != 0) + for (Location location : _turf) + if (location.getBlockX() == _red.getBlockX()) { - MapUtil.QuickChangeBlockAt(loc, 159, (byte) 3); + MapUtil.QuickChangeBlockAt(location, Material.STAINED_CLAY, (byte) 3); for (int i = 1; i < 6; i++) - if (loc.getBlock().getRelative(BlockFace.UP, i).getTypeId() == 35) - MapUtil.QuickChangeBlockAt(loc.clone().add(0, i, 0), 0, (byte) 0); + if (location.getBlock().getRelative(BlockFace.UP, i).getType() == Material.WOOL) + MapUtil.QuickChangeBlockAt(location.clone().add(0, i, 0), 0, (byte) 0); } - if (zRed != 0) - for (Location loc : _turf) - if (loc.getBlockZ() == _red.getBlockZ()) + if (_zRed != 0) + for (Location location : _turf) + if (location.getBlockZ() == _red.getBlockZ()) { - MapUtil.QuickChangeBlockAt(loc, 159, (byte) 3); + MapUtil.QuickChangeBlockAt(location, Material.STAINED_CLAY, (byte) 3); for (int i = 1; i < 6; i++) - if (loc.getBlock().getRelative(BlockFace.UP, i).getTypeId() == 35) - MapUtil.QuickChangeBlockAt(loc.clone().add(0, i, 0), 0, (byte) 0); + if (location.getBlock().getRelative(BlockFace.UP, i).getType() == Material.WOOL) + MapUtil.QuickChangeBlockAt(location.clone().add(0, i, 0), 0, (byte) 0); } - _red.add(xRed, 0, zRed); - _blue.add(xRed, 0, zRed); + _red.add(_xRed, 0, _zRed); + _blue.add(_xRed, 0, _zRed); } EndCheck(); @@ -306,7 +365,7 @@ public class TurfForts extends TeamGame } @EventHandler - public void BowCancel(EntityShootBowEvent event) + public void shootBow(EntityShootBowEvent event) { if (!_fight) { @@ -317,20 +376,12 @@ public class TurfForts extends TeamGame } } - @EventHandler - public void BlockBreak(BlockBreakEvent event) + @EventHandler(ignoreCancelled = true) + public void blockBreak(BlockBreakEvent event) { - if (event.isCancelled()) // this statement might save just a small amount of time - return; + Player player = event.getPlayer(); - - if (!IsAlive(event.getPlayer())) - { - event.setCancelled(true); - return; - } - - if (UtilPlayer.isSpectator(event.getPlayer())) + if (UtilPlayer.isSpectator(player)) { event.setCancelled(true); return; @@ -339,50 +390,37 @@ public class TurfForts extends TeamGame Block block = event.getBlock(); GameTeam team = GetTeam(event.getPlayer()); - GameTeam otherTeam = GetOtherTeam(team); + GameTeam otherTeam = getOtherTeam(team); if (block.getType().equals(Material.WOOL) && (block.getData() == 14 && team.GetColor() != ChatColor.RED) || (block.getData() == 3 && team.GetColor() != ChatColor.AQUA)) { - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot break the " + F.elem(otherTeam.GetColor() + otherTeam.GetName()) + " team's blocks!")); + player.sendMessage(F.main("Game", "You cannot break the " + F.elem(otherTeam.GetFormattedName()) + " team's blocks!")); event.setCancelled(true); - return; } } @EventHandler(ignoreCancelled = true) - public void BlockPlace(BlockPlaceEvent event) + public void blockPlace(BlockPlaceEvent event) { - //Remoeved and replaced by ignoreCancelled = true - //if (event.isCancelled()) - // return; - + Player player = event.getPlayer(); GameTeam team = GetTeam(event.getPlayer()); - if (team == null) - { - event.setCancelled(true); - return; - } + Block block = event.getBlock().getRelative(BlockFace.DOWN); - if (!IsAlive(event.getPlayer())) - { - event.setCancelled(true); - return; - } - - if (UtilPlayer.isSpectator(event.getPlayer())) + if (team == null || UtilPlayer.isSpectator(player)) { event.setCancelled(true); return; } //On Own - Block block = event.getBlock().getRelative(BlockFace.DOWN); - while (block.getTypeId() == 0 && block.getY() > 0) + while (block.getType() == Material.AIR && block.getY() > 0) + { block = block.getRelative(BlockFace.DOWN); + } if ((block.getType() != Material.STAINED_CLAY && block.getType() != Material.WOOL) || block.getData() != team.GetColorData()) { - UtilPlayer.message(event.getPlayer(), F.main("Game", "You can only build above " + F.elem(team.GetColor() + team.GetName()) + ".")); + player.sendMessage(F.main("Game", "You can only build above " + F.elem(team.GetFormattedName()) + ".")); event.setCancelled(true); return; } @@ -391,8 +429,10 @@ public class TurfForts extends TeamGame boolean aboveTurf = false; for (int i = 1; i <= 5; i++) { - if (event.getBlock().getRelative(BlockFace.DOWN, i).getTypeId() != 159) + if (event.getBlock().getRelative(BlockFace.DOWN, i).getType() != Material.STAINED_CLAY) + { continue; + } aboveTurf = true; break; @@ -400,51 +440,46 @@ public class TurfForts extends TeamGame if (!aboveTurf) { - UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot build this high above Turf.")); + player.sendMessage(F.main("Game", "You cannot build this high above Turf.")); event.setCancelled(true); - return; } } @EventHandler - public void BlockDamage(ProjectileHitEvent event) + public void blockHit(ProjectileHitEvent event) { - if (event.getEntity().getShooter() == null) - return; + Projectile entity = event.getEntity(); - if (!(event.getEntity() instanceof Arrow)) - return; - - if (!(event.getEntity().getShooter() instanceof Player)) + if (!(entity instanceof Arrow) || entity.getShooter() == null || !(entity.getShooter() instanceof Player)) + { return; + } Player shooter = (Player) event.getEntity().getShooter(); - final GameTeam team = GetTeam(shooter); - if (team == null) - return; + GameTeam team = GetTeam(shooter); - final Arrow arrow = (Arrow) event.getEntity(); + if (team == null) + { + return; + } + + Arrow arrow = (Arrow) event.getEntity(); Manager.runSyncLater(() -> { Block block = UtilEnt.getHitBlock(arrow); + byte data = block.getData(); - if (block.getTypeId() == 35) + if (block.getType() == Material.WOOL) { - if (block.getData() == 14 /* && team.GetColor() != ChatColor.RED */) + if (data == 3 || data == 14) { - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, Material.REDSTONE_BLOCK.getId()); - _breakStatTracker.addStat(shooter); - } - else if (block.getData() == 3 /* && team.GetColor() != ChatColor.AQUA */) - { - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, Material.LAPIS_BLOCK.getId()); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, data == 3 ? Material.LAPIS_BLOCK : Material.REDSTONE_BLOCK); _breakStatTracker.addStat(shooter); + AddGems(shooter, 0.25, "Blocks Broken", true, true); } - Bukkit.getPluginManager().callEvent(new ShredBlockEvent(block, arrow)); - - + UtilServer.CallEvent(new ShredBlockEvent(block, arrow)); block.setType(Material.AIR); } @@ -453,14 +488,8 @@ public class TurfForts extends TeamGame } @EventHandler - public void Damage(CustomDamageEvent event) + public void damage(CustomDamageEvent event) { - if (event.GetCause() == DamageCause.FALL) - { - event.SetCancelled("No Fall"); - return; - } - if (!_fight && (event.GetCause() == DamageCause.PROJECTILE || event.GetCause() == DamageCause.ENTITY_ATTACK)) { event.SetCancelled("Build Time"); @@ -468,54 +497,44 @@ public class TurfForts extends TeamGame } Player damager = event.GetDamagerPlayer(true); - if (damager == null) return; + + if (damager == null) + { + return; + } if (event.GetCause() == DamageCause.PROJECTILE) { - event.AddMod("Turf Forts", "Nullify", -event.GetDamageInitial(), false); - - if (GetKit(damager).GetName().contains("Shredder")) + if (GetKit(damager) instanceof KitShredder) { - event.SetCancelled("Shredder"); - - Manager.GetDamage().NewDamageEvent(event.GetDamageeEntity(), damager, null, - DamageCause.CUSTOM, 9, true, true, false, - damager.getName(), "Barrage"); - - return; + event.AddMod("Shredder", "Barrage", -event.GetDamage() + 9, true); } else { - event.AddMod("Turf Forts", "One Hit Kill", 30, false); + event.AddMod(GetMode(), "One Hit Kill", 500, false); } } else if (event.GetCause() == DamageCause.ENTITY_ATTACK) { - event.AddMod("Turf Forts", "Nullify", -event.GetDamageInitial(), false); + ItemStack itemStack = damager.getItemInHand(); - if (UtilGear.isMat(damager.getItemInHand(), Material.IRON_SWORD)) - { - event.AddMod("Turf Forts", "One Hit Kill", 12, false); - } - else - { - event.AddMod("Turf Forts", "One Hit Kill", 6, false); - } + event.AddMod(GetName(), "Sword", -event.GetDamage() + (itemStack != null && itemStack.getType() == Material.IRON_SWORD ? 12 : 6), false); } } @EventHandler public void ScoreboardTitle(UpdateEvent event) { - if (GetState() != GameState.Live) + if (event.getType() != UpdateType.FASTER || !IsLive()) + { return; + } //2x Initial Build if (_phaseTime == 0) + { _phaseTime = System.currentTimeMillis() + _buildTime; - - if (event.getType() != UpdateType.TICK) - return; + } long time; if (!_fight) @@ -527,10 +546,10 @@ public class TurfForts extends TeamGame _fight = true; _lines++; - Announce(" "); - Announce(C.cWhite + C.Bold + "1 Kill" + C.cWhite + C.Bold + " = " + C.cWhite + C.Bold + GetLinesPerKill() + " Turf Lines"); - Announce(C.cWhite + C.Bold + "90 Seconds of " + C.cYellow + C.Bold + "Combat Time" + C.cWhite + C.Bold + " has begun!"); - Announce(" "); + Announce(" ", true); + Announce(C.cWhiteB + "1 Kill = " + getLinesPerKill() + " Turf Lines", false); + Announce(C.cWhiteB + "90 Seconds of " + C.cYellowB + "Combat Time" + C.cWhiteB + " has begun!", false); + Announce(" ", false); _phaseTime = System.currentTimeMillis(); } @@ -544,9 +563,9 @@ public class TurfForts extends TeamGame { _fight = false; - Announce(" "); - Announce(C.cWhite + C.Bold + "20 Seconds of " + C.cGreen + C.Bold + "Build Time" + C.cWhite + C.Bold + " has begun!"); - Announce(" "); + Announce(" ", true); + Announce(C.cWhiteB + "20 Seconds of " + C.cGreenB + "Build Time" + C.cWhiteB + " has begun!", false); + Announce(" ", false); _phaseTime = System.currentTimeMillis(); @@ -556,7 +575,7 @@ public class TurfForts extends TeamGame { if (UtilPlayer.isSpectator(player)) { - this.playersThatNeedBlocks.add(player.getUniqueId()); + playersThatNeedBlocks.add(player.getUniqueId()); } else { @@ -568,7 +587,7 @@ public class TurfForts extends TeamGame } } - public void addBlocks(GameTeam team, Player player) + private void addBlocks(GameTeam team, Player player) { player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.WOOL, team.GetColorData(), 24)); } @@ -576,35 +595,100 @@ public class TurfForts extends TeamGame @EventHandler(ignoreCancelled = true) public void onQuit(PlayerQuitEvent event) { - this.playersThatNeedBlocks.remove(event.getPlayer().getUniqueId()); + playersThatNeedBlocks.remove(event.getPlayer().getUniqueId()); } @EventHandler(ignoreCancelled = true) public void onSpawn(PlayerKitGiveEvent event) { Player player = event.getPlayer(); - if (this.playersThatNeedBlocks.contains(player.getUniqueId())) + + if (playersThatNeedBlocks.remove(player.getUniqueId())) { - this.playersThatNeedBlocks.remove(player.getUniqueId()); - this.addBlocks(GetTeam(player), player); + addBlocks(GetTeam(player), player); } } + @EventHandler + public void blockGlitchFix(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK || UtilEnt.isGrounded(player) || !IsLive()) + { + return; + } + + Block block = event.getClickedBlock(); + + if (block.getType() == Material.STAINED_CLAY || block.getType() == Material.WOOL) + { + return; + } + + Block ground = player.getLocation().getBlock(); + + while (ground.getType() == Material.AIR && ground.getLocation().getBlockY() >= 0) + { + ground = ground.getRelative(BlockFace.DOWN); + } + + if (ground.isLiquid()) + { + Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 500, false, true, true, GetName(), "Border Damage"); + player.playSound(player.getLocation(), Sound.NOTE_BASS, 2f, 1f); + return; + } + + if (UtilMath.offsetSquared(player.getLocation(), ground.getLocation()) < 16) + { + return; + } + + Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 500, false, true, true, GetName(), "Border Damage"); + player.playSound(player.getLocation(), Sound.NOTE_BASS, 2, 1); + } + + // Keep ladders placed on ice when block updates occur. + @EventHandler + public void ladderDestroyFix(BlockPhysicsEvent event) + { + if (!IsLive()) + { + return; + } + + Block block = event.getBlock(); + + if (block.getType() == Material.LADDER) + { + event.setCancelled(true); + } + } + + @EventHandler + public void itemSpawn(ItemSpawnEvent event) + { + ItemStack itemStack = event.getEntity().getItemStack(); + + if (itemStack.getType() == Material.WOOL) + { + event.setCancelled(true); + } + } @Override @EventHandler public void ScoreboardUpdate(UpdateEvent event) { if (event.getType() != UpdateType.FAST) - return; - - Scoreboard.reset(); - - for (GameTeam team : this.GetTeamList()) { - int lines = 0; - if (team.GetColor() == ChatColor.RED) lines = GetRedLines(); - else lines = GetBlueLines(); + return; + } + + for (GameTeam team : GetTeamList()) + { + int lines = getLines(team); Scoreboard.writeNewLine(); Scoreboard.write(lines + " " + team.GetColor() + team.GetName()); @@ -615,29 +699,29 @@ public class TurfForts extends TeamGame long time = _buildTime - (System.currentTimeMillis() - _phaseTime); Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Build Time"); + Scoreboard.write(C.cYellowB + "Build Time"); Scoreboard.write(UtilTime.MakeStr(Math.max(0, time), 0)); - } - else { long time = _fightTime - (System.currentTimeMillis() - _phaseTime); Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Combat Time"); + Scoreboard.write(C.cYellowB + "Combat Time"); Scoreboard.write(UtilTime.MakeStr(Math.max(0, time), 0)); } Scoreboard.draw(); } - public int GetRedLines() + private int getRedLines() { if (!InProgress()) + { return 0; + } - if (xRed != 0) + if (_xRed != 0) { return Math.abs(_redBase.getBlockX() - _red.getBlockX()); } @@ -645,12 +729,14 @@ public class TurfForts extends TeamGame return Math.abs(_redBase.getBlockZ() - _red.getBlockZ()); } - public int GetBlueLines() + private int getBlueLines() { if (!InProgress()) + { return 0; + } - if (xRed != 0) + if (_xRed != 0) { return Math.abs(_blueBase.getBlockX() - _blue.getBlockX()); } @@ -660,67 +746,50 @@ public class TurfForts extends TeamGame public int getLines(GameTeam team) { - if (team.GetColor() == ChatColor.RED) - return GetRedLines(); - else - return GetBlueLines(); + return team.GetColor() == ChatColor.RED ? getRedLines() : getBlueLines(); } - public int GetLinesPerKill() + private int getLinesPerKill() { return _lines; - //return Math.min(5, 1 + (int)((System.currentTimeMillis() - GetStateTime() - 30000) / 60000)); - } - - @EventHandler - public void PlayerDeath(PlayerDeathEvent event) - { - _enemyTurf.remove(event.getEntity()); } @EventHandler public void Territory(UpdateEvent event) { - if (!IsLive()) + if (event.getType() != UpdateType.FASTEST || !IsLive()) + { return; + } - if (event.getType() != UpdateType.FASTER) - return; - - for (GameTeam team : this.GetTeamList()) + for (GameTeam team : GetTeamList()) { for (Player player : team.GetPlayers(true)) { - if (((CraftPlayer) player).getHandle().spectating) + if (UtilPlayer.isSpectator(player)) + { continue; + } + + Location location = player.getLocation(); //Slow if (_enemyTurf.containsKey(player)) { - int time = (int) ((System.currentTimeMillis() - _enemyTurf.get(player)) / 2500); + InfiltrateData data = getInfiltrateData(player); - if (time > 0) - Manager.GetCondition().Factory().Slow("Infiltrator Slow", player, player, 0.9, time - 1, false, false, false, false); + if (data.SlownessLevel > -1) + { + Manager.GetCondition().Factory().Slow("Infiltrator Slow", player, player, 0.9, data.SlownessLevel, false, false, false, false); + } } Block block = player.getLocation().getBlock().getRelative(BlockFace.DOWN); // Apply velocity even if the player is sneaking near turf edges. - - if (block.isEmpty() && player.isOnGround()) + if (block.isEmpty() && UtilEnt.isGrounded(player)) { - Block[] nearby = { - block.getRelative(BlockFace.NORTH), - block.getRelative(BlockFace.SOUTH), - block.getRelative(BlockFace.WEST), - block.getRelative(BlockFace.EAST), - block.getRelative(BlockFace.NORTH_EAST), - block.getRelative(BlockFace.NORTH_WEST), - block.getRelative(BlockFace.SOUTH_EAST), - block.getRelative(BlockFace.SOUTH_WEST) - }; - - for (Block near : nearby) + for (Block near : UtilBlock.getSurrounding(block, true)) { if (near.getType() == Material.STAINED_CLAY || near.getType() == Material.WOOL) { @@ -730,176 +799,151 @@ public class TurfForts extends TeamGame } } - while (block.getTypeId() != 159 && block.getY() > 0) + while (block.getType() != Material.STAINED_CLAY && block.getY() > 0) + { block = block.getRelative(BlockFace.DOWN); + } - if (block.getTypeId() == 0) + if (block.getType() == Material.AIR) + { continue; + } byte data = block.getData(); //On Enemy Turf if ((team.GetColor() == ChatColor.RED && data == 3) || (team.GetColor() == ChatColor.AQUA && data == 14)) { - //Infiltrate - if (_fight && GetKit(player) != null && GetKit(player).GetName().contains("Infil")) + if (_fight && GetKit(player) != null && GetKit(player) instanceof KitInfiltrator) { - - if (!_enemyTurf.containsKey(player)) - _enemyTurf.put(player, System.currentTimeMillis()); - + _enemyTurf.putIfAbsent(player, new InfiltrateData()); continue; } - if (Recharge.Instance.use(player, "Territory Knockback", 2000, false, false)) - { - UtilAction.velocity(player, UtilAlg.getTrajectory2d(player.getLocation(), team.GetSpawn()), 2, false, 0, 0.8, 1, true); - - player.playSound(player.getLocation(), Sound.NOTE_BASS, 2f, 1f); - UtilPlayer.message(player, F.main("Game", "You cannot walk on the enemies turf!")); - } - - // return; + knockback(player, team); } //On Own Turf else if ((team.GetColor() == ChatColor.RED && data == 14) || (team.GetColor() == ChatColor.AQUA && data == 3)) { _enemyTurf.remove(player); } + else + { + Map averages = new HashMap<>(GetTeamList().size()); + + for (GameTeam other : GetTeamList()) + { + averages.put(UtilAlg.getAverageLocation(other.GetSpawns()), other); + } + + Location nearest = UtilAlg.findClosest(location, averages.keySet()); + + if (!averages.get(nearest).equals(team)) + { + knockback(player, team); + } + } } } } - - /* + @EventHandler - public void ItemRemoval(UpdateEvent event) + public void updateInfiltrate(UpdateEvent event) { - if (!IsLive()) - return; - - if (event.getType() != UpdateType.FAST) - return; - - for (Entity ent : _red.getWorld().getEntities()) + if (event.getType() != UpdateType.SEC) { - if (!(ent instanceof Item)) - continue; + return; + } - if (ent.getTicksLived() > 40) - ent.remove(); + _enemyTurf.forEach((player, data) -> + { + data.Seconds++; + + if (UtilTime.elapsed(data.LastTick, data.HasKilled ? 2500 : 5000)) + { + data.SlownessLevel++; + data.LastTick = System.currentTimeMillis(); + } + }); + } + + private void knockback(Player player, GameTeam team) + { + if (Recharge.Instance.use(player, "Territory Knockback", 2000, false, false)) + { + Location location = player.getLocation(); + UtilAction.velocity(player, UtilAlg.getTrajectory2d(location, team.GetSpawn()), 2, false, 0, 0.8, 1, true); + player.playSound(location, Sound.NOTE_BASS, 2, 1); + player.sendMessage(F.main("Game", "You cannot walk on the enemy's turf!")); } } - */ - - public GameTeam GetOtherTeam(GameTeam team) + private GameTeam getOtherTeam(GameTeam team) { return team.GetColor() == ChatColor.RED ? GetTeam(ChatColor.AQUA) : GetTeam(ChatColor.RED); } - @EventHandler - public void onItem(ItemSpawnEvent e) - { - if (e.getEntityType().equals(EntityType.DROPPED_ITEM)) - { - e.setCancelled(true); - } - } - @Override public void EndCheck() { if (!IsLive()) + { return; + } - if (GetRedLines() == 0 || GetTeam(ChatColor.RED).GetPlayers(true).size() == 0) + if (getRedLines() == 0 || GetTeam(ChatColor.RED).GetPlayers(true).isEmpty()) { AnnounceEnd(GetTeam(ChatColor.AQUA)); } - else if (GetBlueLines() == 0 || GetTeam(ChatColor.AQUA).GetPlayers(true).size() == 0) + else if (getBlueLines() == 0 || GetTeam(ChatColor.AQUA).GetPlayers(true).isEmpty()) { AnnounceEnd(GetTeam(ChatColor.RED)); } else + { return; + } for (GameTeam team : GetTeamList()) { if (WinnerTeam != null && team.equals(WinnerTeam)) { for (Player player : team.GetPlayers(false)) + { AddGems(player, 10, "Winning Team", false, false); + } } for (Player player : team.GetPlayers(false)) + { if (player.isOnline()) + { AddGems(player, 10, "Participation", false, false); + } + } } - endElo(); - - //End SetState(GameState.End); } + @Override + public double GetKillsGems(Player killer, Player killed, boolean assist) + { + return assist ? 1 : 2; + } - public Long getEnemyTurfEntranceTime(Player player) + public InfiltrateData getInfiltrateData(Player player) { return _enemyTurf.get(player); } - // Fixed by TeddyDev. - @EventHandler - public void blockGlitchFix(PlayerInteractEvent event) + public class InfiltrateData { - if (event.getAction() != Action.RIGHT_CLICK_BLOCK) - return; - if (event.getPlayer().isOnGround()) - return; + public int Seconds, SlownessLevel = -1; + public boolean HasKilled; + public long LastTick = System.currentTimeMillis(); - Block block = event.getClickedBlock(); - if (block.getType() == Material.STAINED_CLAY || block.getType() == Material.WOOL) - return; - - Player player = event.getPlayer(); - Block ground = player.getLocation().getBlock(); - while (ground.getType() == Material.AIR && ground.getLocation().getBlockY() >= 0) - { - ground = ground.getRelative(BlockFace.DOWN); - } - - if (ground.isLiquid()) - { - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.VOID, 9001, false, false, false, - "Border", "Border Damage"); - player.playSound(player.getLocation(), Sound.NOTE_BASS, 2f, 1f); - return; - } - - if (player.getLocation().distance(ground.getLocation()) < 4) - return; - - Manager.GetDamage().NewDamageEvent(player, null, null, - DamageCause.VOID, 9001, false, false, false, - "Border", "Border Damage"); - player.playSound(player.getLocation(), Sound.NOTE_BASS, 2f, 1f); - } - - // Keep ladders placed on ice when block updates occur. - @EventHandler - public void ladderDestroyFix(BlockPhysicsEvent event) - { - if (!IsLive()) - return; - - Block block = event.getBlock(); - - if (block.getType() == Material.LADDER) - { - event.setCancelled(true); - } } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java index 6fd1c3ca5..a92e597f7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java @@ -711,6 +711,7 @@ public class WitherGame extends TeamGame implements IBlockRestorer player.setFlying(false); ((CraftPlayer) player).getHandle().spectating = false; ((CraftPlayer) player).getHandle().k = true; + Manager.GetCondition().Factory().Invulnerable("Revival", player, player, 5, false, false); // Items player.getInventory().remove(Material.WATCH); @@ -729,24 +730,18 @@ public class WitherGame extends TeamGame implements IBlockRestorer // Delayed Visibility if (copy != null) { - UtilServer - .getServer() - .getScheduler() - .scheduleSyncDelayedTask(Manager.getPlugin(), - new Runnable() - { - public void run() - { - // Remove Invis - if (IsAlive(player)) - Manager.GetCondition().EndCondition( - player, ConditionType.CLOAK, - null); + Manager.runSyncLater(() -> + { + // Remove Invis + if (IsAlive(player)) + { + Manager.GetCondition().EndCondition(player, ConditionType.CLOAK, null); + } + + // Remove Copy + copy.remove(); + }, 4); - // Remove Copy - copy.remove(); - } - }, 4); } } @@ -791,8 +786,7 @@ public class WitherGame extends TeamGame implements IBlockRestorer copyIterator.remove(); AddGems(thrower, 3, "Revived Ally", true, true); - - Bukkit.getPluginManager().callEvent(new HumanReviveEvent(thrower, copy.GetPlayer())); + UtilServer.CallEvent(new HumanReviveEvent(thrower, copy.GetPlayer())); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanEditor.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanEditor.java index deeca7306..ce7b46297 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanEditor.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanEditor.java @@ -24,11 +24,10 @@ public class KitHumanEditor extends Kit private static final ItemStack[] PLAYER_ITEMS = { - ItemStackFactory.Instance.CreateStack(Material.STONE_AXE), - ItemStackFactory.Instance.CreateStack(Material.STONE_PICKAXE), - ItemStackFactory.Instance.CreateStack(Material.STONE_SPADE), + new ItemStack(Material.STONE_AXE), + new ItemStack(Material.STONE_PICKAXE), + new ItemStack(Material.STONE_SPADE), new ItemBuilder(Material.POTION).setAmount(2).setData((short) 16429).setTitle(C.Reset + "Revival Potion").build(), - ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP), ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP), }; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanMedic.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanMedic.java index dd48c1493..75c85da66 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanMedic.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/kit/KitHumanMedic.java @@ -28,7 +28,7 @@ public class KitHumanMedic extends Kit private static final ItemStack[] PLAYER_ITEMS = { - ItemStackFactory.Instance.CreateStack(Material.STONE_AXE), + new ItemStack(Material.STONE_AXE), new ItemBuilder(Material.POTION).setAmount(2).setData((short) 16429).setTitle(C.Reset + "Revival Potion").build(), ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP), ItemStackFactory.Instance.CreateStack(Material.MUSHROOM_SOUP), diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BehindEnemyLinesStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BehindEnemyLinesStatTracker.java index 2094f425e..f76cfec20 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BehindEnemyLinesStatTracker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/BehindEnemyLinesStatTracker.java @@ -5,11 +5,13 @@ import org.bukkit.event.EventHandler; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import nautilus.game.arcade.game.Game; + import nautilus.game.arcade.game.games.turfforts.TurfForts; +import nautilus.game.arcade.game.games.turfforts.TurfForts.InfiltrateData; public class BehindEnemyLinesStatTracker extends StatTracker { + public BehindEnemyLinesStatTracker(TurfForts game) { super(game); @@ -18,17 +20,18 @@ public class BehindEnemyLinesStatTracker extends StatTracker @EventHandler public void onUpdate(UpdateEvent event) { - if (getGame().GetState() != Game.GameState.Live) - return; - - if (event.getType() == UpdateType.SEC) + if (!getGame().IsLive() || event.getType() != UpdateType.SEC) { - for (Player player : getGame().GetPlayers(true)) - { - Long time = getGame().getEnemyTurfEntranceTime(player); + return; + } - if (time != null && System.currentTimeMillis() - time >= 15000) - addStat(player, "BehindEnemyLines", 1, true, false); + for (Player player : getGame().GetPlayers(true)) + { + InfiltrateData data = getGame().getInfiltrateData(player); + + if (data != null && data.Seconds > 15) + { + addStat(player, "BehindEnemyLines", 1, true, false); } } }