diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/Evolution.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/Evolution.java index f5d2a636f..3338381e6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/Evolution.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/Evolution.java @@ -5,15 +5,19 @@ import java.util.Collections; import mineplex.core.common.util.C; import mineplex.core.common.util.NautHashMap; -import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilPlayer; 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.game.SoloGame; +import nautilus.game.arcade.game.games.evolution.events.EvolutionBeginEvent; +import nautilus.game.arcade.game.games.evolution.events.EvolutionEndEvent; +import nautilus.game.arcade.game.games.evolution.events.EvolutionPostEvolveEvent; +import nautilus.game.arcade.game.games.evolution.evolve.EvolveManager; import nautilus.game.arcade.game.games.evolution.kits.KitAgility; import nautilus.game.arcade.game.games.evolution.kits.KitHealth; import nautilus.game.arcade.game.games.evolution.kits.KitRecharge; @@ -29,8 +33,6 @@ import nautilus.game.arcade.game.games.evolution.mobs.KitSpider; import nautilus.game.arcade.game.games.evolution.mobs.KitWolf; import nautilus.game.arcade.kit.Kit; -import org.bukkit.Color; -import org.bukkit.FireworkEffect.Type; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -39,6 +41,8 @@ import org.bukkit.scoreboard.Objective; public class Evolution extends SoloGame { + private EvolveManager _evolve; + private ArrayList _boosterKits = new ArrayList(); private ArrayList _mobKits = new ArrayList(); @@ -57,7 +61,7 @@ public class Evolution extends SoloGame "Each evolution has unique skills.", "First to get through 10 evolutions wins!" }); - + //Custom kit stuff to make other things easier _boosterKits.add(new KitHealth(manager)); _boosterKits.add(new KitAgility(manager)); @@ -112,6 +116,11 @@ public class Evolution extends SoloGame _evoObj.setDisplaySlot(DisplaySlot.BELOW_NAME); } + public EvolveManager getEvolve() + { + return _evolve; + } + //Double Kit @EventHandler(priority = EventPriority.MONITOR) public void storeTokens(GameStateChangeEvent event) @@ -128,7 +137,35 @@ public class Evolution extends SoloGame _evoObj.getScore(GetTeam(player).GetColor() + player.getName()).setScore(0); } } + + @EventHandler(priority = EventPriority.MONITOR) + public void endNoEvolve(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + if (WorldData.GetCustomLocs("RED").size() <= 0) + { + Announce(C.cWhite + C.Bold + GetName() + " ended, map not set up properly!"); + SetState(GameState.Dead); + return; + } + + _evolve = new EvolveManager(this, WorldData.GetCustomLocs("RED").get(0)); + } + @EventHandler + public void tickEvolve(UpdateEvent event) + { + if (!IsLive()) + return; + + if (event.getType() != UpdateType.FASTER) + return; + + _evolve.tick(); + } + @Override public boolean HasKit(Player player, Kit kit) { @@ -144,6 +181,38 @@ public class Evolution extends SoloGame return false; } + @EventHandler(priority = EventPriority.MONITOR) + public void onEvolveDamage(CustomDamageEvent event) + { + if (!IsLive()) + return; + + if (!(event.GetDamageeEntity() instanceof Player)) + return; + + if (_evolve.isEvolving(event.GetDamageePlayer())) + event.SetCancelled("Player is evolving!"); + } + + @EventHandler + public void startEvolve(EvolutionBeginEvent event) + { + Manager.GetCondition().Factory().Cloak("Evolution", event.getPlayer(), null, Double.MAX_VALUE, false, false); + } + + @EventHandler + public void stopEvolve(EvolutionEndEvent event) + { + upgradeKit(event.getPlayer(), true); + } + + @EventHandler + public void endEvolve(EvolutionPostEvolveEvent event) + { + Manager.GetCondition().Clean(event.getPlayer()); + event.getPlayer().teleport(GetTeam(event.getPlayer()).GetSpawn()); + } + @EventHandler public void onKill(CombatDeathEvent event) { @@ -174,36 +243,21 @@ public class Evolution extends SoloGame End(); return; } - - if (upgradeKit(killer, true)) - return; - - killer.teleport(GetTeam(killer).GetSpawn()); - UtilFirework.playFirework(killer.getEyeLocation(), Type.BALL, Color.GREEN, false, false); } //Boolean ending - public boolean upgradeKit(Player player, boolean give) + public void upgradeKit(Player player, boolean give) { if (!IsAlive(player)) - return false; + return; - try - { - EvoKit newKit = _mobKits.get(getScore(player)); - - SetKit(player, newKit, false); + EvoKit newKit = _mobKits.get(getScore(player)); - if (give) - { - newKit.upgradeGive(player); - } - return false; - } - catch (IndexOutOfBoundsException ex) + SetKit(player, newKit, false); + + if (give) { - End(); - return true; + newKit.upgradeGive(player); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/events/EvolutionPostEvolveEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/events/EvolutionPostEvolveEvent.java new file mode 100644 index 000000000..8a38ddc24 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/events/EvolutionPostEvolveEvent.java @@ -0,0 +1,26 @@ +package nautilus.game.arcade.game.games.evolution.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; + +public class EvolutionPostEvolveEvent extends PlayerEvent +{ + private static HandlerList _handlers = new HandlerList(); + + public EvolutionPostEvolveEvent(Player who) + { + super(who); + } + + public static HandlerList getHandlerList() + { + return _handlers; + } + + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveData.java index 9251860d3..f75b4bb03 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveData.java @@ -1,11 +1,15 @@ package nautilus.game.arcade.game.games.evolution.evolve; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; +import nautilus.game.arcade.game.games.evolution.events.EvolutionBeginEvent; +import nautilus.game.arcade.game.games.evolution.events.EvolutionEndEvent; +import nautilus.game.arcade.game.games.evolution.events.EvolutionPostEvolveEvent; import net.minecraft.server.v1_7_R4.EntityBlaze; import net.minecraft.server.v1_7_R4.EntityChicken; import net.minecraft.server.v1_7_R4.EntityCreeper; @@ -22,11 +26,13 @@ import net.minecraft.server.v1_7_R4.PacketPlayOutEntityDestroy; import net.minecraft.server.v1_7_R4.PacketPlayOutSpawnEntityLiving; import net.minecraft.server.v1_7_R4.World; +import org.bukkit.Bukkit; +import org.bukkit.Color; import org.bukkit.Location; +import org.bukkit.FireworkEffect.Type; import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; public class EvolveData { @@ -34,6 +40,8 @@ public class EvolveData private final EvolveManager _manager; + private boolean _active = true; + private final Player _player; private final EntityType _from; @@ -54,17 +62,37 @@ public class EvolveData _from = from; _to = to; + + Bukkit.getServer().getPluginManager().callEvent(new EvolutionBeginEvent(_player)); } //Boolean completed public boolean tick() { teleport(); + + if (!_active) + { + if (!UtilTime.elapsed(_curtime, 4000)) + return false; + + Bukkit.getServer().getPluginManager().callEvent(new EvolutionPostEvolveEvent(_player)); + return true; + } _stage++; if (_stage > 12) - return true; + { + _active = false; + + Bukkit.getServer().getPluginManager().callEvent(new EvolutionEndEvent(_player)); + + _curtime = System.currentTimeMillis(); + + UtilFirework.playFirework(_manager.getLocation().clone().add(0.0, 1.5, 0.0), Type.BALL, Color.GREEN, false, false); + return false; + } if (!UtilTime.elapsed(_curtime, 1000 * (6 - (_stage / 2)))) return false; @@ -93,18 +121,13 @@ public class EvolveData private void teleport() { - Location newLoc = UtilAlg.getTrajectory(_player.getLocation(), newLoc).normalize().toLocation(_player.getWorld()); - - double lead = i * ((2d * Math.PI)/game.GetTeamList().size()); - double sizeMod = 4; - double oX = -Math.sin(lead) * sizeMod; - double oZ = Math.cos(lead) * sizeMod; - - //Location - Location entLoc = spawn.clone().add(oX, 0, oZ); + _player.setFlying(true); + _player.setHealth(20.0); - _player.teleport(_manager.getLocation()); + Location newLoc = UtilAlg.getTrajectory(_player.getLocation(), _manager.getLocation()).normalize().toLocation(_player.getWorld()); + newLoc.add(Math.cos((Math.PI / 14) * _player.getTicksLived()) * 4.0, .1, Math.sin((Math.PI / 14) * _player.getTicksLived()) * 4.0); + _player.teleport(_manager.getLocation()); } private EntityInsentient spawn(EntityType type) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveManager.java index 85cb47c08..de841782a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/evolution/evolve/EvolveManager.java @@ -1,15 +1,24 @@ package nautilus.game.arcade.game.games.evolution.evolve; +import java.util.Iterator; +import java.util.Map.Entry; + +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilPlayer; import nautilus.game.arcade.game.games.evolution.Evolution; import org.bukkit.Location; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; public class EvolveManager { - private Evolution _host; + private final Evolution _host; private final Location _evolveLoc; + private NautHashMap _data = new NautHashMap(); + public EvolveManager(Evolution evolution, Location evolveLoc) { _host = evolution; @@ -21,4 +30,45 @@ public class EvolveManager return _evolveLoc; } + public boolean isEvolving(Player player) + { + return _data.containsKey(player.getName()); + } + + public void addEvolve(Player player, EntityType from, EntityType to) + { + if (!_data.containsKey(player.getName())) + return; + + _data.put(player.getName(), new EvolveData(this, player, from, to)); + } + + public void tick() + { + Iterator> iterator = _data.entrySet().iterator(); + while (iterator.hasNext()) + { + Entry entry = iterator.next(); + + Player player = UtilPlayer.searchExact(entry.getKey()); + + if (player == null || !player.isOnline()) + { + iterator.remove(); + continue; + } + + if (!_host.IsAlive(player)) + { + iterator.remove(); + continue; + } + + if (entry.getValue().tick()) + { + iterator.remove(); + continue; + } + } + } }