diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java index 68f377459..e2825bfde 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/ui/page/AchievementMainPage.java @@ -102,7 +102,7 @@ public class AchievementMainPage extends ShopPageBase lore, int max) { int achievementCount = 0; - for (int i = 0; i < Achievement.values().length && achievementCount < max; i++) + for (int i = 0; i < Achievement.values().length; i++) { Achievement achievement = Achievement.values()[i]; if (achievement.getCategory() == category) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index bf853ef6e..cd838343e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -899,7 +899,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation { _specList.remove(event.getPlayer()); if (_game.GetTeam(event.getPlayer()) != null) - _game.GetTeam(event.getPlayer()).SetPlayerState(event.getPlayer(), PlayerState.IN); + _game.SetPlayerState(event.getPlayer(), PlayerState.IN); } if (isSpectator(event.getPlayer())) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 1f0b18f71..d16299e05 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -1161,6 +1161,25 @@ public abstract class Game extends ListenerComponent implements Lifetimed return GetKit(player).GetName().equals(kit.GetName()); } + public void disqualify(Player player) + { + RemoveTeamPreference(player); + GetPlayerKits().remove(player); + GetPlayerGems().remove(player); + + //Remove Team + GameTeam team = GetTeam(player); + if (team != null) + { + if (InProgress()) + SetPlayerState(player, PlayerState.OUT); + else + team.RemovePlayer(player); + } + + Manager.addSpectator(player, false); + } + public boolean SetPlayerState(Player player, PlayerState state) { GameTeam team = GetTeam(player); @@ -1227,6 +1246,11 @@ public abstract class Game extends ListenerComponent implements Lifetimed return false; } + public boolean shouldHeal(Player player) + { + return true; + } + public ArrayList GetPlayers(boolean aliveOnly) { ArrayList players = new ArrayList(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java index d027e68ac..2a6636c1b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java @@ -5,10 +5,15 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; -import mineplex.core.common.Pair; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -42,11 +47,13 @@ import org.bukkit.scheduler.BukkitRunnable; import com.google.common.collect.Lists; +import mineplex.core.common.Pair; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -60,12 +67,12 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileUser; import mineplex.core.recharge.Recharge; -import mineplex.core.teleport.event.MineplexTeleportEvent; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.condition.Condition.ConditionType; import mineplex.minecraft.game.core.condition.events.ConditionApplyEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; + import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GamePrepareCountdownCommence; @@ -197,9 +204,9 @@ public class BawkBawkBattles extends TeamGame implements IThrown private BawkBawkBattlesSettings _settings = new BawkBawkBattlesSettings(); private ChallengeList _list = new ChallengeList(); - private Map _lives = new HashMap<>(); - private List _winners = new ArrayList(); - private GameTeam _playerTeam, _chickenTeam; + private Map _lives = new HashMap<>(); + private LinkedList _winners = new LinkedList<>(); + private GameTeam _playerTeam; private DeathEffect _deathEffect = new DeathEffect(this); private ChickenAttack _chickenAttack; private Location _chickenAttackCenter; @@ -207,25 +214,27 @@ public class BawkBawkBattles extends TeamGame implements IThrown private List _lastChallengeBlocks; private long _delay; + public final Set _beingAttacked = new HashSet<>(); + private List _countdown = Arrays.asList( - C.cRed + C.Bold + "3", - C.cYellow + C.Bold + "2", - C.cGreen + C.Bold + "1", - C.cWhite + C.Bold + "GO!"); + C.cRed + C.Bold + "3", + C.cYellow + C.Bold + "2", + C.cGreen + C.Bold + "1", + C.cWhite + C.Bold + "GO!"); @SuppressWarnings("unchecked") public BawkBawkBattles(ArcadeManager manager) { super(manager, - GameType.BawkBawkBattles, - new Kit[] { new KitBawksFood(manager) }, - new String[] { - "Follow Bawk Bawk's instructions in chat.", - "Complete a task first or be the last one to stay alive.", - "If you fail a challenge, you lose one life.", - "If you run out of lives, chickens will attack you.", - "Last player with lives wins.", - }); + GameType.BawkBawkBattles, + new Kit[]{new KitBawksFood(manager)}, + new String[]{ + "Follow Bawk Bawk's instructions in chat.", + "Complete a task first or be the last one to stay alive.", + "If you fail a challenge, you lose one life.", + "If you run out of lives, chickens will attack you.", + "Last player with lives wins.", + }); DamagePvP = false; DamagePvE = false; @@ -243,57 +252,54 @@ public class BawkBawkBattles extends TeamGame implements IThrown DeathMessages = false; FixSpawnFacing = false; - TeleportsDisqualify = false; - GiveClock = false; - Manager.GetCreature().SetDisableCustomDrops(true); populateChallenges(); registerStatTrackers( - new BouncingShadowTracker(this), - new DragonKingTracker(this), - new EliteArcherTracker(this), - new MilkManTracker(this), - new PinataMasterTracker(this), - new PixelNinjaTracker(this), - new SpeedyBuildersTracker(this), - new SurfUpTracker(this), - new TagMasterTracker(this), - new VeteranTracker(this)); + new BouncingShadowTracker(this), + new DragonKingTracker(this), + new EliteArcherTracker(this), + new MilkManTracker(this), + new PinataMasterTracker(this), + new PixelNinjaTracker(this), + new SpeedyBuildersTracker(this), + new SurfUpTracker(this), + new TagMasterTracker(this), + new VeteranTracker(this)); } public void populateChallenges() { _list.add( - new ChallengeAnvilDance(this), - new ChallengeArrowRampage(this), - new ChallengeBlockLobbers(this), - new ChallengeBouncingBlock(this), - new ChallengeBuildRace(this), - new ChallengeColorChange(this), - new ChallengeChickenShooting(this), - new ChallengeDeadlyTnt(this), - new ChallengeDiamondHunt(this), - new ChallengeEggSmash(this), - new ChallengeFallingBlocks(this), - new ChallengeFastFood(this), - new ChallengeWaterHorror(this), - new ChallengeKangarooJump(this), - new ChallengeKingOfTheLadder(this), - new ChallengeLavaRun(this), - new ChallengeMilkACow(this), - new ChallengeOreRun(this), - new ChallengeMinecartDance(this), - new ChallengeMiniOneInTheQuiver(this), - new ChallengePickASide(this), - new ChallengePunchThePig(this), - new ChallengeRedLightGreenLight(this), - new ChallengeReverseTag(this), - new ChallengeRushPush(this), - new ChallengeSmashOff(this), - new ChallengeTreasureDigger(this), - new ChallengeWaveCrush(this)); + new ChallengeAnvilDance(this), + new ChallengeArrowRampage(this), + new ChallengeBlockLobbers(this), + new ChallengeBouncingBlock(this), + new ChallengeBuildRace(this), + new ChallengeColorChange(this), + new ChallengeChickenShooting(this), + new ChallengeDeadlyTnt(this), + new ChallengeDiamondHunt(this), + new ChallengeEggSmash(this), + new ChallengeFallingBlocks(this), + new ChallengeFastFood(this), + new ChallengeWaterHorror(this), + new ChallengeKangarooJump(this), + new ChallengeKingOfTheLadder(this), + new ChallengeLavaRun(this), + new ChallengeMilkACow(this), + new ChallengeOreRun(this), + new ChallengeMinecartDance(this), + new ChallengeMiniOneInTheQuiver(this), + new ChallengePickASide(this), + new ChallengePunchThePig(this), + new ChallengeRedLightGreenLight(this), + new ChallengeReverseTag(this), + new ChallengeRushPush(this), + new ChallengeSmashOff(this), + new ChallengeTreasureDigger(this), + new ChallengeWaveCrush(this)); /* * Removed: @@ -313,40 +319,17 @@ public class BawkBawkBattles extends TeamGame implements IThrown _chickenAttackCenter = WorldData.GetDataLocs("WHITE").get(0); } - /* - * Team creation - */ - @EventHandler(priority = EventPriority.HIGHEST) public void createTeams(GameStateChangeEvent event) { if (event.GetState() == GameState.Recruit) { - createPlayerTeam(); - } - else if (event.GetState() == GameState.Live) - { - createChickenTeam(); + GetTeamList().clear(); + _playerTeam = new GameTeam(this, "Players", ChatColor.YELLOW, new ArrayList<>()); + AddTeam(_playerTeam); } } - private void createPlayerTeam() - { - _playerTeam = new GameTeam(this, "Players", ChatColor.YELLOW, new ArrayList<>()); - AddTeam(_playerTeam); - } - - private void createChickenTeam() - { - _chickenTeam = new GameTeam(this, "Chickens", ChatColor.GRAY, _playerTeam.GetSpawns()); - _chickenTeam.SetVisible(false); - AddTeam(_chickenTeam); - } - - /* - * Preparing for start - */ - @EventHandler(priority = EventPriority.HIGH) public void prepare(GameStateChangeEvent event) { @@ -370,7 +353,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown { for (Player player : GetPlayers(true)) { - _lives.put(player, MAX_LIVES); + _lives.put(player.getUniqueId(), MAX_LIVES); } } @@ -439,7 +422,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown _challenge.getData().setSpawns(selected); _playerTeam.SetSpawns(selected); - SpectatorSpawn = _challenge.getCenter().add(0, SPECTATOR_SPAWN_HEIGHT, 0); + SpectatorSpawn = _challenge.getCenter().add(0.5, SPECTATOR_SPAWN_HEIGHT, 0.5); return selected; } @@ -450,13 +433,14 @@ public class BawkBawkBattles extends TeamGame implements IThrown resetPlayers(); addEffectsToPlayers(); teleportSpectatorsToSpawn(); + clearInventories(); } private void resetPlayers() { - for (Player player : GetPlayers(false)) + for (Player player : GetPlayers(true)) { - if (_lives.get(player) > 0) + if (_lives.containsKey(player.getUniqueId()) && _lives.get(player.getUniqueId()) > 0) { Manager.Clear(player); Scoreboard.setPlayerTeam(player, _playerTeam); @@ -468,7 +452,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown { for (Player player : GetPlayers(false)) { - if (!IsAlive(player)) + if (!IsAlive(player) && !_beingAttacked.contains(player.getUniqueId())) { player.teleport(GetSpectatorLocation()); } @@ -543,7 +527,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown if (!IsAlive(player)) return; - if (!getPlayersAlive().contains(player)) + if (!IsAlive(player)) return; if (!PrepareFreeze) @@ -663,6 +647,14 @@ public class BawkBawkBattles extends TeamGame implements IThrown } } + private void clearInventories() + { + for (Player player : GetPlayers(true)) + { + UtilInv.Clear(player); + } + } + private void addEffectsToPlayers() { for (Player player : GetPlayers(true)) @@ -885,36 +877,33 @@ public class BawkBawkBattles extends TeamGame implements IThrown if (getPlayersWithRemainingLives() <= 1) { - if (getPlayersAlive().size() > 0) + if (GetPlayers(true).size() > 0) { - Player additional = getPlayersAlive().get(0); - _winners.add(0, additional); + Player additional = GetPlayers(true).get(0); + _winners.addFirst(additional); } - if (_winners.size() > 2) - { - Collections.swap(_winners, SEMIFINAL_INDEX, FINAL_INDEX); - } + List actualWinners = _winners.subList(0, Math.min(_winners.size(), 3)); - if (_winners.size() >= 1) + if (actualWinners.size() >= 1) { - AddGems(_winners.get(FIRST_WINNER_INDEX), FIRST_PLACE_GEM_REWARD, "First Place", false, false); + AddGems(actualWinners.get(FIRST_WINNER_INDEX), FIRST_PLACE_GEM_REWARD, "First Place", false, false); - if (_winners.size() >= 2) + if (actualWinners.size() >= 2) { - AddGems(_winners.get(SECOND_WINNER_INDEX), SECOND_PLACE_GEM_REWARD, "Second Place", false, false); + AddGems(actualWinners.get(SECOND_WINNER_INDEX), SECOND_PLACE_GEM_REWARD, "Second Place", false, false); - if (_winners.size() >= 3) + if (actualWinners.size() >= 3) { - AddGems(_winners.get(THIRD_WINNER_INDEX), THIRD_PLACE_GEM_REWARD, "Third Place", false, false); + AddGems(actualWinners.get(THIRD_WINNER_INDEX), THIRD_PLACE_GEM_REWARD, "Third Place", false, false); } } } - for (Player player : super.GetPlayers(false)) + for (Player player : GetPlayers(false)) AddGems(player, PARTICIPATION_GEMS, "Participation", false, false); - AnnounceEnd(_winners); + AnnounceEnd(actualWinners); SetState(GameState.End); } } @@ -937,19 +926,16 @@ public class BawkBawkBattles extends TeamGame implements IThrown private boolean canStartCrumbling() { int lost = _challenge.getData().getLostPlayers().size(); - int current = getPlayersAlive().size(); + int current = GetPlayers(true).size(); return !_settings.isCrumbling() && lost > current / CRUMBLE_DIVIDER; } private void announceCrumbling() { - for (Player player : UtilServer.getPlayers()) + for (Player player : GetPlayers(true)) { - if (!_chickenTeam.HasPlayer(player)) - { - UtilPlayer.message(player, F.main("Game", "The map has started to crumble.")); - } + UtilPlayer.message(player, F.main("Game", "The map has started to crumble.")); } } @@ -1006,13 +992,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown if (event.getType() != UpdateType.SEC) return; - if (_chickenTeam == null) - return; - - if (_chickenTeam.GetSize() == 0) - return; - - for (Player player : _chickenTeam.GetPlayers(true)) + _beingAttacked.stream().map(Bukkit::getPlayer).filter(Objects::nonNull).forEach(player -> { Chicken chicken = UtilMath.randomElement(_chickenAttack.getChickens()); Material feetType = chicken.getLocation().getBlock().getType(); @@ -1022,18 +1002,18 @@ public class BawkBawkBattles extends TeamGame implements IThrown UtilEnt.CreatureLook(chicken, player); player.playSound(chicken.getLocation(), Sound.BAT_TAKEOFF, CHICKEN_ATTACK_SOUND_VOLUME, CHICKEN_ATTACK_SOUND_PITCH); UtilAction.velocity( - chicken, - UtilAlg.getTrajectory2d(chicken, player), - UtilAlg.calculateVelocity(chicken.getLocation().toVector(), player.getLocation().toVector(), CHICKEN_VELOCITY_HEIGHT).length() + CHICKEN_VELOCITY_ADD, - false, - 0, - CHICKEN_VELOCITY_HEIGHT, - CHICKEN_VELOCITY_HEIGHT + 1, - false); + chicken, + UtilAlg.getTrajectory2d(chicken, player), + UtilAlg.calculateVelocity(chicken.getLocation().toVector(), player.getLocation().toVector(), CHICKEN_VELOCITY_HEIGHT).length() + CHICKEN_VELOCITY_ADD, + false, + 0, + CHICKEN_VELOCITY_HEIGHT, + CHICKEN_VELOCITY_HEIGHT + 1, + false); Manager.GetProjectile().AddThrow(chicken, null, this, -1, true, false, false, true, CHICKEN_ATTACK_HITBOX_GROW); } - } + }); } @EventHandler @@ -1068,12 +1048,39 @@ public class BawkBawkBattles extends TeamGame implements IThrown Player player = event.getEntity(); - if (!_chickenTeam.HasPlayer(player)) + if (IsAlive(player)) return; _chickenAttack.kill(player, true); } + @Override + public void disqualify(Player player) + { + RemoveTeamPreference(player); + GetPlayerKits().remove(player); + GetPlayerGems().remove(player); + + //Remove Team + GameTeam team = GetTeam(player); + if (team != null) + { + if (InProgress()) + { + getPlayerTeam().SetPlayerState(player, GameTeam.PlayerState.OUT); + + int alive = getPlayersWithRemainingLives(); + + if (alive > Challenge.CHICKEN_ATTACK_CRITERIA) + getChickenAttack().start(player); + else + getChickenAttack().kill(player, true); + } + else + team.RemovePlayer(player); + } + } + @EventHandler public void blockChickenAttackMemberDamage(EntityDamageEvent event) { @@ -1107,8 +1114,14 @@ public class BawkBawkBattles extends TeamGame implements IThrown for (Player player : GetPlayers(true)) { - for (Player other : _chickenTeam.GetPlayers(false)) + for (Player other : GetPlayers(false)) { + if (IsAlive(other)) + continue; + + if (_beingAttacked.contains(other.getUniqueId())) + continue; + if (player.equals(other)) continue; @@ -1139,7 +1152,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown Player player = event.getPlayer(); - if (_challenge.getData().isDone(player) && !_chickenTeam.HasPlayer(player.getName(), false)) + if (_challenge.getData().isDone(player) && IsAlive(player)) { if (event.getTo().getY() <= 0) { @@ -1199,7 +1212,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown { Player player = event.getPlayer(); - _lives.remove(player); + _lives.remove(player.getUniqueId()); _winners.remove(player); } @@ -1219,19 +1232,16 @@ public class BawkBawkBattles extends TeamGame implements IThrown // } // } + @Override + public boolean shouldHeal(Player player) + { + return !_beingAttacked.contains(player.getUniqueId()); + } + /* * Miscellaneous */ - @EventHandler - public void blockTeleport(MineplexTeleportEvent event) - { - if (!IsLive()) - return; - - event.setCancelled(true); - } - @EventHandler public void blockDeathEffectHeadModification(PlayerArmorStandManipulateEvent event) { @@ -1349,6 +1359,9 @@ public class BawkBawkBattles extends TeamGame implements IThrown if (event.getType() != UpdateType.FAST) return; + if (!IsLive()) + return; + Scoreboard.reset(); if (getPlayersWithRemainingLives() >= GENERIC_SCOREBOARD_PLAYER_COUNT) @@ -1430,7 +1443,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown { Scoreboard.writeNewLine(); - Scoreboard.writeGroup(super.GetPlayers(true), player -> + Scoreboard.writeGroup(GetPlayers(true), player -> { int lives = lives(player); String state = definePlayerState(player); @@ -1477,74 +1490,6 @@ public class BawkBawkBattles extends TeamGame implements IThrown return ""; } - // @EventHandler - // public void debugCommands(PlayerCommandPreprocessEvent event) - // { - // Player player = event.getPlayer(); - // String message = event.getMessage(); - // - // if (Manager.GetClients().hasRank(player, Rank.SNR_MODERATOR)) - // { - // if (message.startsWith("/restrict")) - // { - // String[] pieces = message.split(" "); - // - // if (pieces.length > 1) - // { - // String challenge = F.combine(pieces, 1, null, false).trim(); - // - // if (_list.restrict(challenge)) - // { - // UtilPlayer.message(player, F.main("Game", "Restricted to " + F.elem(challenge) + " challenge.")); - // } - // else - // { - // UtilPlayer.message(player, F.main("Game", "Could not find any challenge by that name.")); - // } - // } - // else - // { - // UtilPlayer.message(player, F.main("Game", "All challenge restrictions were cleared.")); - // _list.unrestrict(); - // } - // - // event.setCancelled(true); - // } - // else if (message.startsWith("/skip")) - // { - // if (IsLive()) - // { - // endCurrentChallenge(); - // - // Announce(C.cAqua + C.Bold + player.getName() + " skipped this challenge."); - // } - // else - // { - // UtilPlayer.message(player, F.main("Game", "You cannot skip a challenge if the game is not started.")); - // } - // - // event.setCancelled(true); - // } - // else if (message.startsWith("/lose")) - // { - // if (IsLive() && _challenge != null && IsAlive(player)) - // { - // setLives(player, 0); - // _challenge.getData().addLostPlayer(player); - // _deathEffect.playDeath(player, player.getLocation()); - // GetScoreboard().ResetScore(player.getName()); - // _chickenAttack.start(player); - // } - // else - // { - // UtilPlayer.message(player, F.main("Game", "You cannot lose at this time.")); - // } - // - // event.setCancelled(true); - // } - // } - // } - /* * Helper methods */ @@ -1562,10 +1507,12 @@ public class BawkBawkBattles extends TeamGame implements IThrown public int lives(Player player) { - if (!_lives.containsKey(player)) + if (!_lives.containsKey(player.getUniqueId())) + { return 0; + } - return _lives.get(player); + return _lives.get(player.getUniqueId()); } /* @@ -1574,7 +1521,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown public void setLives(Player player, int amount) { - _lives.put(player, amount); + _lives.put(player.getUniqueId(), amount); } /* @@ -1586,11 +1533,6 @@ public class BawkBawkBattles extends TeamGame implements IThrown return _playerTeam; } - public GameTeam getChickenTeam() - { - return _chickenTeam; - } - public Challenge getCurrentChallenge() { return _challenge; @@ -1602,14 +1544,17 @@ public class BawkBawkBattles extends TeamGame implements IThrown } @Override - public List getWinners() + public LinkedList getWinners() { return _winners; } - public Map getLives() + @Override + public List getLosers() { - return _lives; + List players = new ArrayList<>(UtilServer.getPlayersCollection()); + players.removeAll(getWinners()); + return players; } public BawkBawkBattlesSettings getSettings() @@ -1636,40 +1581,6 @@ public class BawkBawkBattles extends TeamGame implements IThrown * Player related getter methods */ - /** - * Returns the list of players contained on the player's team. - * - * @param aliveOnly Whether or not to select all players. - */ - @Override - public ArrayList GetPlayers(boolean aliveOnly) - { - if (_playerTeam != null) - return _playerTeam.GetPlayers(aliveOnly); - else - return super.GetPlayers(aliveOnly); - } - - /** - * Returns the list of players that are alive. - *
- * Players are considered to be alive after they are teleported to challenge spawn locations. - */ - public ArrayList getPlayersAlive() - { - ArrayList list = new ArrayList(); - - for (Player player : GetPlayers(true)) - { - if (!UtilPlayer.isSpectator(player)) - { - list.add(player); - } - } - - return list; - } - /** * Returns the amount of players with more than one life. */ @@ -1677,7 +1588,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown { int amount = 0; - for (Player player : _lives.keySet()) + for (Player player : GetPlayers(true)) { if (lives(player) > 0) { @@ -1709,7 +1620,7 @@ public class BawkBawkBattles extends TeamGame implements IThrown { Player player = (Player) target; - if (_chickenTeam.HasPlayer(player) && IsAlive(player)) + if (_beingAttacked.contains(player.getUniqueId())) { player.playSound(player.getLocation(), Sound.CHICKEN_HURT, CHICKEN_HIT_PLAYER_SOUND_VOLUME, CHICKEN_HIT_PLAYER_SOUND_PITCH); player.damage(CHICKEN_HIT_PLAYER_DAMAGE); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/Challenge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/Challenge.java index c6fdc6a31..50f25aa42 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/Challenge.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/Challenge.java @@ -4,6 +4,13 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import net.minecraft.server.v1_8_R3.BlockPosition; +import net.minecraft.server.v1_8_R3.Blocks; +import net.minecraft.server.v1_8_R3.ChunkSection; +import net.minecraft.server.v1_8_R3.EnumSkyBlock; +import net.minecraft.server.v1_8_R3.IBlockData; +import net.minecraft.server.v1_8_R3.WorldServer; + import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Effect; @@ -12,8 +19,10 @@ import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; @@ -34,6 +43,7 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -49,6 +59,8 @@ import mineplex.core.projectile.ProjectileUser; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.condition.Condition.ConditionType; + +import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.games.mineware.BawkBawkBattles; import nautilus.game.arcade.game.games.mineware.events.ChallengeEndEvent; import nautilus.game.arcade.game.games.mineware.events.ChallengeStartEvent; @@ -61,7 +73,7 @@ import nautilus.game.arcade.world.WorldData; * All challenges should trigger any functionality inside * {@link #createSpawns()}, {@link #createMap()}, {@link #onStart()} and {@link #onEnd()}. *

- * + * * Additionally, {@link #onTimerFinish()} and {@link #onCollide(LivingEntity, Block, ProjectileUser)} can be overrided. */ public abstract class Challenge implements Listener @@ -79,8 +91,8 @@ public abstract class Challenge implements Listener private static final int BORDER_MAX_Z = 100; private static final int COMPLETE_COUNT_DIVIDER = 2; - private static final int WINNER_ADD_CRITERIA = 3; // players - private static final int CHICKEN_ATTACK_CRITERIA = 2; // players + public static final int WINNER_ADD_CRITERIA = 3; // players + public static final int CHICKEN_ATTACK_CRITERIA = 2; // players private static final int CHALLENGE_CLOAK_DURATION = 7777; private static final int COMPLETION_GEMS = 3; @@ -146,7 +158,7 @@ public abstract class Challenge implements Listener /** * The list of spawn locations where players will be teleported. - * + * * @return ArrayList */ public abstract ArrayList createSpawns(); @@ -174,7 +186,7 @@ public abstract class Challenge implements Listener { if (firstRun) { - ArrayList players = Host.GetPlayers(false); + ArrayList players = Host.GetPlayers(true); for (int i = 0; i < players.size(); i++) { @@ -192,7 +204,7 @@ public abstract class Challenge implements Listener } else { - Host.getPlayerTeam().SpawnTeleport(false); + Host.getPlayerTeam().SpawnTeleport(true); } } @@ -305,7 +317,7 @@ public abstract class Challenge implements Listener @EventHandler(priority = EventPriority.MONITOR) public void death(PlayerDeathEvent event) { - if (!Host.IsLive() || Host.getChickenTeam().HasPlayer(event.getEntity())) + if (!Host.IsLive() || !Host.IsAlive(event.getEntity())) return; Player player = event.getEntity(); @@ -319,17 +331,21 @@ public abstract class Challenge implements Listener private void handleDeath(Player player) { - int alive = Host.getPlayersWithRemainingLives(); int lives = loseLife(player); - if (lives <= 0 && alive <= WINNER_ADD_CRITERIA) + if (lives <= 0) { - Host.getWinners().add(player); - } + Host.getPlayerTeam().SetPlayerState(player, GameTeam.PlayerState.OUT); - if (lives <= 0 && alive > CHICKEN_ATTACK_CRITERIA) - { - Host.getChickenAttack().start(player); + int alive = Host.getPlayersWithRemainingLives(); + if (Host.lives(player) <= 0) + { + Host.getWinners().addFirst(player); + if (alive > Challenge.CHICKEN_ATTACK_CRITERIA) + Host.getChickenAttack().start(player); + else + Host.getChickenAttack().kill(player, true); + } } else { @@ -355,6 +371,8 @@ public abstract class Challenge implements Listener UtilPlayer.message(player, F.main("Game", C.cRed + "You failed to complete the task.")); Host.showLivesLeft(player); Host.Manager.addSpectator(player, true); + if (UtilItem.matchesMaterial(player.getInventory().getItem(8), Material.WATCH)) + player.getInventory().setItem(8, null); Host.Manager.GetCondition().Factory().Cloak("Challenge Death", player, player, CHALLENGE_CLOAK_DURATION, true, true); } @@ -400,7 +418,7 @@ public abstract class Challenge implements Listener for (Player player : players) { - if (!Host.getChickenTeam().HasPlayer(player) && Host.lives(player) > 0) + if (!Host.IsAlive(player) && Host.lives(player) > 0) { UtilTextBottom.display(C.Bold + "Next challenge will begin shortly.", player); } @@ -523,30 +541,14 @@ public abstract class Challenge implements Listener setCompleted(player, false); } - protected void setLost(Player player, boolean cloak) + protected void setLost(Player player) { if (Data.isDone(player)) return; Data.addLostPlayer(player); - loseLife(player); - if (cloak) - { - cloak(player, false); - } - - UtilPlayer.message(player, F.main("Game", C.cRed + "You failed to complete the task.")); - Host.showLivesLeft(player); - player.playSound(player.getLocation(), Sound.NOTE_BASS, LOST_SOUND_VOLUME, LOST_SOUND_PITCH); - - UtilPlayer.clearPotionEffects(player); - UtilInv.Clear(player); - } - - protected void setLost(Player player) - { - setLost(player, false); + handleDeath(player); } private void cloak(Player player, boolean completed) @@ -578,6 +580,39 @@ public abstract class Challenge implements Listener UtilBlock.setQuick(block.getWorld(), block.getX(), block.getY(), block.getZ(), type.getId(), data); } + public void setBlockReallyQuicklyAndDangerously(Block block, Material type, byte data) + { + World world = block.getWorld(); + int x = block.getLocation().getBlockX(); + int y = block.getLocation().getBlockY(); + int z = block.getLocation().getBlockZ(); + int i = x & 15; + int j = y; + int k = z & 15; + int cx = block.getX() >> 4; + int cz = block.getZ() >> 4; + if (!world.isChunkLoaded(cx, cz)) + { + world.loadChunk(cx, cz, true); + } + + WorldServer nmsWorld = ((CraftWorld) world).getHandle(); + + net.minecraft.server.v1_8_R3.Chunk chunk = nmsWorld.getChunkAt(x >> 4, z >> 4); + BlockPosition pos = new BlockPosition(x, y, z); + IBlockData ibd = net.minecraft.server.v1_8_R3.Block.getById(type.getId()).fromLegacyData(data); + ChunkSection chunksection = chunk.getSections()[y >> 4]; + if (chunksection == null) + { + if (block != Blocks.AIR) + { + chunksection = chunk.getSections()[y >> 4] = new ChunkSection(y >> 4 << 4, !nmsWorld.worldProvider.o()); + } + } + chunksection.setType(i, j & 15, k, ibd); + nmsWorld.notify(pos); + } + public void setBlock(Block block, Material type) { setBlock(block, type, (byte) 0); @@ -819,7 +854,7 @@ public abstract class Challenge implements Listener public ArrayList getPlayersAlive() { - return Host.getPlayersAlive(); + return Host.GetPlayers(true); } public ArrayList getPlayersIn(boolean ignoreCompleted) @@ -864,7 +899,7 @@ public abstract class Challenge implements Listener public int getArenaSize(int minBlocks) { int size = (int) (minBlocks + Math.ceil(Host.getPlayersWithRemainingLives() / ARENA_SIZE_DIVIDER)); - return size > ARENA_SIZE_LIMIT ? ARENA_SIZE_LIMIT : size; + return Math.min(size, ARENA_SIZE_LIMIT); } public BawkBawkBattles getHost() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/TeamChallenge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/TeamChallenge.java index 7c7ca7665..d8b33577c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/TeamChallenge.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/TeamChallenge.java @@ -140,7 +140,7 @@ public abstract class TeamChallenge extends Challenge */ protected void autoSelectTeams() { - ArrayList players = Host.GetPlayers(false); + ArrayList players = Host.GetPlayers(true); Collections.shuffle(players); int size = 0; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBouncingBlock.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBouncingBlock.java index dbe302bbc..0b463033a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBouncingBlock.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBouncingBlock.java @@ -74,7 +74,7 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker "Bouncing Block", "Jump and punch floating wool blocks.", "Avoid landing on red wool.", - "First to " + SCORE_GOAL + " wins!"); + "Get to " + SCORE_GOAL + " to win!"); Settings.setUseMapHeight(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java index b2829b1b3..64fd9ed59 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java @@ -57,7 +57,7 @@ public class ChallengeBuildRace extends Challenge implements LogicTracker ChallengeType.FirstComplete, "Build Race", "Your inventory is filled with blocks.", - "Place them all in the ground!"); + "Place them all on the ground!"); Settings.setUseMapHeight(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeColorChange.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeColorChange.java index 67f62bdcf..31509c80b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeColorChange.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeColorChange.java @@ -13,6 +13,8 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTextBottom; @@ -32,8 +34,9 @@ public class ChallengeColorChange extends Challenge private static final int MAP_HEIGHT = 1; private static final long TIME_DELAY = 5000; - private static final int TIME_DELAY_DECREMENT_RATE = 100; - private static final int RESET_DELAY = 4000; + private static final int RESET_DELAY = 3750; + private static final int TIME_DELAY_DECREMENT_RATE = 600; + private static final int TIME_DELAY_MIN = 1500; private static final int PLATFORM_MULTIPLIER = 2; private static final int PLATFORM_SHIFT = 2; @@ -96,6 +99,12 @@ public class ChallengeColorChange extends Challenge _stageDelay = System.currentTimeMillis() + _modifiedTimeDelay; _currentColor = UtilMath.randomElement(_colors); + for (Player player : Host.GetPlayers(false)) + { + PotionEffect nightVision = new PotionEffect(PotionEffectType.NIGHT_VISION, 100000, 1, true, false); + player.addPotionEffect(nightVision); + } + fillItem(new ItemStack(Material.STAINED_CLAY, 1, (short) _currentColor)); } @@ -105,6 +114,11 @@ public class ChallengeColorChange extends Challenge _isFalling = false; _lastSound = 0; _lastGeneratedPlatforms.clear(); + + for (Player player : Host.GetPlayers(false)) + { + player.removePotionEffect(PotionEffectType.NIGHT_VISION); + } } @EventHandler @@ -124,22 +138,26 @@ public class ChallengeColorChange extends Challenge if (_isFalling) { + removeAllPlatforms(); playFallSound(); _isFalling = false; - _modifiedTimeDelay -= TIME_DELAY_DECREMENT_RATE; - _stageDelay = System.currentTimeMillis() + _modifiedTimeDelay; _currentColor = UtilMath.randomElement(_colors); createMap(); addCurrentColorToInventory(); + + _modifiedTimeDelay -= TIME_DELAY_DECREMENT_RATE; + _modifiedTimeDelay = Math.max(_modifiedTimeDelay, TIME_DELAY_MIN); + _stageDelay = System.currentTimeMillis() + _modifiedTimeDelay; } else { _isFalling = true; - _stageDelay = System.currentTimeMillis() + RESET_DELAY; removeDifferentColorPlatforms(); + + _stageDelay = System.currentTimeMillis() + RESET_DELAY; } } else if (!_isFalling) @@ -210,7 +228,7 @@ public class ChallengeColorChange extends Challenge for (int z = 0; z <= 1; z++) { Block block = getCenter().getBlock().getRelative(platformX + x, 0, platformZ + z); - setBlock(block, Material.STAINED_CLAY, color); + setBlockReallyQuicklyAndDangerously(block, Material.STAINED_CLAY, color); addBlock(block); } } @@ -242,7 +260,28 @@ public class ChallengeColorChange extends Challenge if (block.getData() != _currentColor) { - resetBlock(block); + setBlockReallyQuicklyAndDangerously(block, Material.AIR, (byte) 0); + } + } + } + + } + } + + @SuppressWarnings("deprecation") + private void removeAllPlatforms() + { + for (Entry platform : _lastGeneratedPlatforms) + { + for (int x = 0; x <= 1; x++) + { + for (int z = 0; z <= 1; z++) + { + Block block = getCenter().getBlock().getRelative(platform.getKey() + x, 0, platform.getValue() + z); + + if (block.getType() != Material.AIR) + { + setBlockReallyQuicklyAndDangerously(block, Material.AIR, (byte) 0); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeEggSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeEggSmash.java index bf137e70a..603dcfe76 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeEggSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeEggSmash.java @@ -121,7 +121,6 @@ public class ChallengeEggSmash extends Challenge implements NumberTracker remove(EntityType.FALLING_BLOCK); } - @SuppressWarnings("deprecation") @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeFastFood.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeFastFood.java index 221ca144d..9f42ac4e1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeFastFood.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeFastFood.java @@ -74,7 +74,7 @@ public class ChallengeFastFood extends Challenge ChallengeType.FirstComplete, "Fast Food", "Your inventory is full of food.", - "Punch to throw it in the ground."); + "Punch to throw it on the ground."); Settings.setUseMapHeight(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeLavaRun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeLavaRun.java index 49037ba6f..10adc6e26 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeLavaRun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeLavaRun.java @@ -14,6 +14,8 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import mineplex.core.common.util.UtilMath; import mineplex.core.disguise.disguises.DisguiseMagmaCube; @@ -103,6 +105,11 @@ public class ChallengeLavaRun extends Challenge _disappearingBlocks = DISSAPEARING_BLOCKS; createLava(); disguisePlayers(); + for (Player player : Host.GetPlayers(false)) + { + PotionEffect nightVision = new PotionEffect(PotionEffectType.NIGHT_VISION, 100000, 1, true, false); + player.addPotionEffect(nightVision); + } } @Override @@ -123,6 +130,11 @@ public class ChallengeLavaRun extends Challenge Host.Manager.GetDisguise().undisguise(player); } } + + for (Player player : Host.GetPlayers(false)) + { + player.removePotionEffect(PotionEffectType.NIGHT_VISION); + } } @EventHandler @@ -139,7 +151,7 @@ public class ChallengeLavaRun extends Challenge if (_shouldMoveObsidian) { - resetBlock(_obsidian); + setBlockReallyQuicklyAndDangerously(_obsidian, Material.AIR, (byte) 0); generatePlatform(); _obsidian = createObsidianBlock(); blockBreakEffect(_obsidian, false); @@ -209,7 +221,7 @@ public class ChallengeLavaRun extends Challenge for (int z = -getArenaSize(); z <= getArenaSize(); z++) { Block block = getCenter().getBlock().getRelative(x, MAP_HEIGHT, z); - setBlock(block, Material.GLASS); + setBlockReallyQuicklyAndDangerously(block, Material.GLASS, (byte) 0); _platform.add(block); addBlock(block); } @@ -227,7 +239,7 @@ public class ChallengeLavaRun extends Challenge for (int y = 0; y < MAP_HEIGHT; y++) { Block block = getCenter().getBlock().getRelative(x, y, z); - setBlock(block, Material.STATIONARY_LAVA); + setBlockReallyQuicklyAndDangerously(block, Material.STATIONARY_LAVA, (byte) 0); addBlock(block); } } @@ -237,7 +249,7 @@ public class ChallengeLavaRun extends Challenge private Block createObsidianBlock() { Block block = getCenter().add(UtilMath.r(_arenaStartSize), MAP_HEIGHT, UtilMath.r(_arenaStartSize)).getBlock(); - setBlock(block, Material.OBSIDIAN); + setBlockReallyQuicklyAndDangerously(block, Material.OBSIDIAN, (byte) 0); return block; } @@ -283,14 +295,7 @@ public class ChallengeLavaRun extends Challenge distance.put(part, part.getLocation().add(DISTANCE_XZ_ADD, 0, DISTANCE_XZ_ADD).distance(_obsidian.getLocation())); } - Collections.sort(_platform, new Comparator() - { - @Override - public int compare(Block o1, Block o2) - { - return distance.get(o2).compareTo(distance.get(o1)); - } - }); + _platform.sort((o1, o2) -> distance.get(o2).compareTo(distance.get(o1))); for (int i = 0; i < Math.min(_disappearingBlocks, _platform.size()); i++) { @@ -299,7 +304,7 @@ public class ChallengeLavaRun extends Challenge if (!block.equals(_obsidian)) // We do not want to remove the obsidian block. { _platform.remove(0); - resetBlock(block); + setBlockReallyQuicklyAndDangerously(block, Material.AIR, (byte) 0); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeWaterHorror.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeWaterHorror.java index e6d5609bd..6647a83bc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeWaterHorror.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeWaterHorror.java @@ -386,10 +386,17 @@ public class ChallengeWaterHorror extends Challenge TNTPrimed explosive = dropsite.getWorld().spawn(dropsite, TNTPrimed.class); explosive.setFuseTicks(TNT_EXPLODE_AFTER * TICK_MULTIPLIER); + double str = UtilAlg.calculateVelocity(dropsite.toVector(), target.toVector(), TNT_VELOCITY_HEIGHT).length() + TNT_VELOCITY_POWER_MIN; + + if (((dropsite.getX() - target.getX()) * (dropsite.getX() - target.getX()) + (dropsite.getY() - target.getY()) * (dropsite.getY() - target.getY())) < 16) + { + str = 0; + } + UtilAction.velocity( explosive, UtilAlg.getTrajectory2d(dropsite, target), - UtilAlg.calculateVelocity(dropsite.toVector(), target.toVector(), TNT_VELOCITY_HEIGHT).length() + TNT_VELOCITY_POWER_MIN, + str, true, 0, TNT_VELOCITY_HEIGHT, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/effect/ChickenAttack.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/effect/ChickenAttack.java index 7599ab638..91cf2d583 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/effect/ChickenAttack.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/effect/ChickenAttack.java @@ -70,8 +70,7 @@ public class ChickenAttack public void start(Player player) { - _host.getPlayerTeam().RemovePlayer(player); - _host.getChickenTeam().AddPlayer(player, true); + _host._beingAttacked.add(player.getUniqueId()); UtilInv.Clear(player); _host.Manager.Clear(player); @@ -96,7 +95,7 @@ public class ChickenAttack @Override public void run() { - if (_host.IsLive() && _host.getChickenTeam().HasPlayer(player) && _host.IsAlive(player)) + if (_host.IsLive() && _host._beingAttacked.contains(player.getUniqueId())) { UtilPlayer.message(player, F.main("Game", "You have been moved to spectators.")); kill(player, false); @@ -112,6 +111,7 @@ public class ChickenAttack public void kill(Player player, boolean inform) { _host.Manager.Clear(player); + _host._beingAttacked.remove(player.getUniqueId()); if (inform) { @@ -123,7 +123,6 @@ public class ChickenAttack @Override public void run() { - _host.SetPlayerState(player, PlayerState.OUT); DisguiseChicken disguise = new DisguiseChicken(player); disguise.setBaby(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java index 44746a8db..b7a2119d0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java @@ -857,7 +857,7 @@ public class GameFlagManager implements Listener if (team != null) { if (game.InProgress()) - team.SetPlayerState(event.getPlayer(), PlayerState.OUT); + game.SetPlayerState(event.getPlayer(), PlayerState.OUT); else team.RemovePlayer(event.getPlayer()); } @@ -896,7 +896,7 @@ public class GameFlagManager implements Listener //Not Playing for (Player player : UtilServer.getPlayers()) { - if (game == null || game.GetState() == GameState.Recruit || !game.IsAlive(player)) + if (game == null || game.GetState() == GameState.Recruit || (!game.IsAlive(player) && game.shouldHeal(player))) { player.setMaxHealth(20); player.setHealth(20); @@ -1033,21 +1033,9 @@ public class GameFlagManager implements Listener return; //Remove Kit - game.RemoveTeamPreference(event.getPlayer()); - game.GetPlayerKits().remove(event.getPlayer()); - game.GetPlayerGems().remove(event.getPlayer()); - - //Remove Team - GameTeam team = game.GetTeam(event.getPlayer()); - if (team != null) - { - if (game.InProgress()) - team.SetPlayerState(event.getPlayer(), PlayerState.OUT); - else - team.RemovePlayer(event.getPlayer()); - } - - Manager.addSpectator(event.getPlayer(), false); + game.disqualify(event.getPlayer()); + + event.setCancelled(true); } @EventHandler