From 690c2acce832cbbcf9ff53a5370ff79b3fac588b Mon Sep 17 00:00:00 2001 From: Cheese Date: Fri, 5 Feb 2016 13:25:57 +1100 Subject: [PATCH] many valentine, such wow --- .../game/core/damage/DamageManager.java | 13 +- .../src/nautilus/game/arcade/GameType.java | 1 + .../game/games/gladiators/Gladiators.java | 2 +- .../arcade/game/games/valentines/ValItem.java | 53 +- .../game/games/valentines/Valentines.java | 608 +++++++++++++++--- .../games/valentines/kit/KitMasterOfLove.java | 3 +- .../tutorial/TutorialPhaseValentines.java | 47 ++ .../tutorial/TutorialValentines.java | 34 + .../arcade/gametutorial/GameTutorial.java | 5 + .../arcade/gametutorial/TutorialText.java | 20 +- 10 files changed, 666 insertions(+), 120 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialPhaseValentines.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialValentines.java diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java index d5c6f0bf4..67b2ba1f3 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java @@ -99,6 +99,10 @@ public class DamageManager extends MiniPlugin LivingEntity damager = UtilEvent.GetDamagerEntity(event, true); Projectile projectile = GetProjectile(event); + /* + * Fishing rods are disabled because of their custom properties + * we want them to behave like default MC. + */ if (projectile instanceof Fish) return; @@ -348,9 +352,8 @@ public class DamageManager extends MiniPlugin } } - // TODO: What is this required for? Players with books in regular games are spammed. Is it meant for debugging? - // TODO: Temporarily commenting out - //DisplayDamage(event); + //Debug + DisplayDamage(event); } private void Damage(CustomDamageEvent event) @@ -669,7 +672,7 @@ public class DamageManager extends MiniPlugin event.setDamage(damage); } - private LivingEntity GetDamageeEntity(EntityDamageEvent event) + public LivingEntity GetDamageeEntity(EntityDamageEvent event) { if (event.getEntity() instanceof LivingEntity) return (LivingEntity)event.getEntity(); @@ -677,7 +680,7 @@ public class DamageManager extends MiniPlugin return null; } - private Projectile GetProjectile(EntityDamageEvent event) + public Projectile GetProjectile(EntityDamageEvent event) { if (!(event instanceof EntityDamageByEntityEvent)) return null; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index a1a14c883..252d24a03 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -63,6 +63,7 @@ import nautilus.game.arcade.game.games.tug.Tug; import nautilus.game.arcade.game.games.turfforts.TurfForts; import nautilus.game.arcade.game.games.typewars.TypeWars; import nautilus.game.arcade.game.games.uhc.UHC; +import nautilus.game.arcade.game.games.valentines.Valentines; import nautilus.game.arcade.game.games.wither.WitherGame; import nautilus.game.arcade.game.games.wizards.Wizards; import nautilus.game.arcade.game.games.zombiesurvival.ZombieSurvival; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java index fbf5edc54..365688c93 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/gladiators/Gladiators.java @@ -110,7 +110,7 @@ public class Gladiators extends SoloGame DamageTeamSelf = true; HungerSet = 20; DontAllowOverfill = true; - EnableTutorials = false; + EnableTutorials = true; BlockBreakAllow.add(Material.SUGAR_CANE_BLOCK.getId()); BlockBreakAllow.add(Material.DEAD_BUSH.getId()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/ValItem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/ValItem.java index 690bc11ff..e23726cba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/ValItem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/ValItem.java @@ -4,23 +4,51 @@ import org.bukkit.Material; public enum ValItem { - FLOWER1("Red Rose", Material.RED_ROSE), - FLOWER2("Dandelion", Material.YELLOW_FLOWER), - FLOWER3("Other Flower", Material.FLOWER_POT), - WINE("Red Wine", Material.POTION), - GRASS("Organic Grass", Material.LONG_GRASS), - DIAMONDS("Diamond Earings", Material.DIAMOND), - EMERALDS("Emerald Necklace", Material.EMERALD), - BOOK("Book of Poetry", Material.BOOK), - WATCH("Fancy Pocket Watch", Material.WATCH); + FLOWER1("Red Rose", + "She will love this bouquet of roses!", + Material.RED_ROSE), + + FLOWER2("Dandelion", + "Oh my, these flowers smell great!", + Material.YELLOW_FLOWER), + + FLOWER3("Other Flower", + "MOO", + Material.REDSTONE), + + WINE("Red Wine", + "This will go great with our dinner!", + Material.POTION), + + GRASS("Organic Grass", + "Only the best for my date!", + Material.LONG_GRASS), + + DIAMONDS("Diamond Earings", + "An expensive, but worthwhile gift!", + Material.DIAMOND), + + EMERALDS("Emerald Necklace", + "Such necklace, many wow!", + Material.EMERALD), + + BOOK("Book of Poetry", + "I will use impress her with poetry!", + Material.BOOK), + + WATCH("Fancy Pocket Watch", + "This sure looks good on me!", + Material.WATCH); private String _title; + private String _endText; private Material _item; - ValItem(String title, Material item) + ValItem(String title, String endText, Material item) { _title = title; _item = item; + _endText = endText; } public String getTitle() @@ -32,4 +60,9 @@ public enum ValItem { return _item; } + + public String getEndText() + { + return _endText; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/Valentines.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/Valentines.java index 7adebd020..1b1631744 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/Valentines.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/Valentines.java @@ -1,28 +1,52 @@ package nautilus.game.arcade.game.games.valentines; +import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import org.bukkit.EntityEffect; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Cow; +import org.bukkit.entity.Fish; +import org.bukkit.entity.Item; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Pig; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; import mineplex.core.common.util.C; 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.UtilEvent; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.noteblock.INoteVerifier; +import mineplex.core.noteblock.NBSReader; +import mineplex.core.noteblock.NotePlayer; +import mineplex.core.noteblock.NoteSong; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; @@ -30,26 +54,45 @@ 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.Game.GameState; +import nautilus.game.arcade.game.games.gladiators.tutorial.TutorialGladiators; import nautilus.game.arcade.game.games.valentines.kit.KitMasterOfLove; +import nautilus.game.arcade.game.games.valentines.tutorial.TutorialValentines; import nautilus.game.arcade.kit.Kit; public class Valentines extends SoloGame { + private String _cowName = "Calvin the Cow"; + + private Cow _cow; + + private NotePlayer _music; + private NoteSong _song; + private int _playersOutPerRound = 1; - private ArrayList _pigSpawns = null; + - private HashSet _blocks = null; + private HashSet _blocks = new HashSet(); + private int _blockMapHeight = 0; private int _round = 0; private long _roundTime = 0; - private long _roundTimeLimit = 30000; + private long _roundTimeLimit = 60000; + + private int _roundState = 0; + //1 = Playing + //2 = Between Rounds + + private boolean _finalRound = false; private ValItem _item = null; - private ArrayList _pigs = new ArrayList(); - private ArrayList _pigsStocked = new ArrayList(); + private ArrayList _pigSpawns = null; + private HashMap _pigs = new HashMap(); + private HashSet _pigsDead = new HashSet(); + private ArrayList _hasItem = new ArrayList(); private ArrayList _completedRound = new ArrayList(); private HashSet _unusedGifts = new HashSet(); @@ -65,14 +108,28 @@ public class Valentines extends SoloGame new String[] { - "Chris the Cow has a Valentines Date,", + "Calvin the Cow has a Valentines Date,", "but he was robbed by the nasty pigs!", "Recover his items, and save the day!", "", "Slowest players are eliminated!" }); - this.DamageTeamSelf = false; + this.DamageTeamSelf = true; + this.HungerSet = 20; + this.HealthSet = 20; + + EnableTutorials = false; + + + try + { + _song = NBSReader.loadSong("../../update/songs/popcorn.nbs"); + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + } } @Override @@ -81,58 +138,213 @@ public class Valentines extends SoloGame _pigSpawns = WorldData.GetDataLocs("YELLOW"); //Scan Map - Block source = _pigSpawns.get(0).getBlock(); - _blocks = UtilBlock.findConnectedBlocks(source, source, new HashSet(), 50000, 50); + for (Block block : UtilBlock.getInBoundingBox(WorldData.GetDataLocs("GRAY").get(0), WorldData.GetDataLocs("GRAY").get(1))) + { + if (block.getType() != Material.AIR) + _blocks.add(block); + + if (UtilBlock.solid(block)) + { + if (block.getY() > _blockMapHeight) + _blockMapHeight = block.getY(); + } + } + + System.out.println("Scanned " + _blocks.size() + " Arena Blocks"); + } + + @EventHandler + public void stateChanges(GameStateChangeEvent event) + { + if (event.GetState() == GameState.Prepare) + { + _playersOutPerRound = Math.max(1, (int)(GetPlayers(true).size()/8d)); + + CreatureAllowOverride = true; + _cow = GetSpectatorLocation().getWorld().spawn(GetSpectatorLocation(), Cow.class); + _cow.setCustomName(C.cGreen + C.Bold + _cowName); + _cow.setCustomNameVisible(true); + + UtilEnt.Vegetate(_cow); + UtilEnt.ghost(_cow, true, false); + CreatureAllowOverride = false; + } + if (event.GetState() == GameState.End || event.GetState() == GameState.Dead) + _music.cancel(); + } + + @Override + public void addTutorials() + { + GetTeamList().get(0).setTutorial(new TutorialValentines(this, Manager)); + } + + @EventHandler + public void tutorialUpdate(UpdateEvent event) + { + TutorialValentines tutorial = (TutorialValentines) GetTeamList().get(0).getTutorial(); + tutorial.update(event); + } + + @EventHandler + public void knockback(CustomDamageEvent event) + { + if (event.GetDamageePlayer() != null) + { + if (event.GetCause() == DamageCause.ENTITY_ATTACK) + event.AddKnockback("Hit Reversal", -1); + } + } + + @EventHandler + public void knockbackRod(EntityDamageEvent event) + { + if (!(event.getEntity() instanceof LivingEntity)) + return; + + Projectile projectile = Manager.GetDamage().GetProjectile(event); + + if (!(projectile instanceof Fish)) + return; + + LivingEntity damagee = Manager.GetDamage().GetDamageeEntity(event); + LivingEntity damager = UtilEvent.GetDamagerEntity(event, true); + + event.setCancelled(true); + + damagee.playEffect(EntityEffect.HURT); + + UtilAction.velocity(damagee, UtilAlg.getTrajectory(damagee, damager), 0.6, false, 0, 0.2, 1, true); } @EventHandler public void grabDamage(CustomDamageEvent event) { - if (event.GetDamagerPlayer(false) == null || !IsAlive(event.GetDamagerPlayer(false))) + if (_finalRound) return; - Iterator pigIter = _pigsStocked.iterator(); + if (event.GetDamagerPlayer(false) == null) + return; - while (pigIter.hasNext()) + if (_finalRound) { - Pig pig = pigIter.next(); - - if (event.GetDamageeEntity().equals(pig) || - (pig.getPassenger() != null && event.GetDamageeEntity().equals(pig.getPassenger()))) - { - grabItem(event.GetDamagerPlayer(false), pig); - pigIter.remove(); - } + event.GetDamageeEntity().eject(); + event.GetDamageeEntity().leaveVehicle(); } - } - - @EventHandler - public void grabDamage(PlayerInteractEntityEvent event) - { - Iterator pigIter = _pigsStocked.iterator(); - while (pigIter.hasNext()) + if (event.GetDamageeEntity() instanceof Pig) { - Pig pig = pigIter.next(); - - if (event.getRightClicked().equals(pig) || - (pig.getPassenger() != null && event.getRightClicked().equals(pig.getPassenger()))) - { - grabItem(event.getPlayer(), pig); - pigIter.remove(); - } + grabItem(event.GetDamagerPlayer(false), (Pig)event.GetDamageeEntity()); } + + if (!event.IsCancelled()) + { + event.SetCancelled("Pig Cancel"); + + event.GetDamageeEntity().playEffect(EntityEffect.HURT); + } } private void grabItem(Player player, Pig pig) { - player.getInventory().addItem(new ItemStack(_item.getMaterial())); + if (!IsAlive(player)) + return; + if (_hasItem.contains(player) || _completedRound.contains(player)) + return; + + if (!_pigs.containsKey(pig)) + return; + + _pigs.remove(pig); + + pig.playEffect(EntityEffect.DEATH); + _pigsDead.add(pig); + + //Remove Item from Pig if (pig.getPassenger() != null) pig.getPassenger().remove(); + + //Give Item to Player + player.getInventory().addItem(new ItemStack(_item.getMaterial())); + + _hasItem.add(player); + + //Effects + player.playSound(player.getLocation(), Sound.ORB_PICKUP, 1f, 1f); + player.getWorld().playSound(pig.getLocation(), Sound.PIG_DEATH, 1f, 1f); + + //Inform + UtilTextMiddle.display(C.cGreen + C.Bold + "Success", "Take " + _item.getTitle() + " back to Calvin!", 0, 80, 20, player); + + if (_pigs.size() > 0) + UtilTextBottom.display(C.Bold + _pigs.size() + " Items Left", UtilServer.getPlayers()); + } + + @EventHandler + public void returnDamage(CustomDamageEvent event) + { + if (event.GetDamagerPlayer(false) == null) + return; + + if (event.GetDamageeEntity() instanceof Cow) + { + returnItem(event.GetDamagerPlayer(false), (Cow)event.GetDamageeEntity()); + + event.SetCancelled("Cow Damage"); + } + } + + @EventHandler + public void returnInteract(PlayerInteractEntityEvent event) + { + if (event.getRightClicked() instanceof Cow) + { + returnItem(event.getPlayer(), (Cow)event.getRightClicked()); + } } - @EventHandler + private void returnItem(Player player, Cow cow) + { + if (!IsAlive(player)) + return; + + if (!_hasItem.remove(player) && player.getVehicle() == null) + return; + + + //Remove Item to Player + if (!_finalRound) + { + player.getInventory().remove(_item.getMaterial()); + } + else + { + _pigs.clear(); + } + + _completedRound.add(player); + + //Effects + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); + player.getWorld().playSound(cow.getLocation(), Sound.COW_IDLE, 2f, 1f); + + UtilParticle.PlayParticle(ParticleType.HEART, _cow.getLocation().add(0, 0.5, 0), 1f, 1f, 1f, 0, 10, ViewDist.NORMAL, UtilServer.getPlayers()); + + //Inform + UtilTextMiddle.display(C.cGreen + C.Bold + _cowName, _item.getEndText(), 0, 80, 20, player); + + if (_pigs.size() > 0) + UtilTextBottom.display(C.Bold + _pigs.size() + " Items Left", UtilServer.getPlayers()); + + } + + public double getRadius() + { + return 24 + (GetPlayers(true).size() * 0.5d); + } + + //@EventHandler public void arenaShrinkUpdate(UpdateEvent event) { if (!IsLive()) @@ -141,8 +353,7 @@ public class Valentines extends SoloGame if (event.getType() != UpdateType.TICK) return; - double radius = 12 + (GetPlayers(true).size() * 0.75d); - + double radius = getRadius(); Block bestBlock = null; double bestDist = 0; @@ -151,7 +362,7 @@ public class Valentines extends SoloGame { double dist = UtilMath.offset2d(GetSpectatorLocation(), block.getLocation().add(0.5, 0.5, 0.5)); - if (dist > radius) + if (dist < radius) continue; if (bestBlock == null || dist > bestDist) @@ -168,61 +379,195 @@ public class Valentines extends SoloGame _blocks.remove(bestBlock); if (bestBlock.getType() != Material.AIR) - { - if (Math.random() > 0.75) - bestBlock.getWorld().spawnFallingBlock(bestBlock.getLocation().add(0.5, 0.5, 0.5), bestBlock.getType(), bestBlock.getData()); - MapUtil.QuickChangeBlockAt(bestBlock.getLocation(), Material.AIR); - } } @EventHandler - public void pigSpawn(GameStateChangeEvent event) + public void pigFall(EntityDamageEvent event) { - if (event.GetState() == GameState.Live) - { - CreatureAllowOverride = true; + if (event.getCause() == DamageCause.FALL) + event.setCancelled(true); + } + + public void pigSpawn() + { + CreatureAllowOverride = true; + + int toSpawn = GetPlayers(true).size()-_playersOutPerRound; + + if (toSpawn == 1) + _finalRound = true; + + for (int i=0 ; i < toSpawn ; i++) + { + Location loc = UtilAlg.Random(_pigSpawns); - for (int i=0 ; i <= GetPlayers(true).size()-_playersOutPerRound ; i++) - { - Location loc = UtilAlg.Random(_pigSpawns); + Pig pig = loc.getWorld().spawn(loc, Pig.class); + _pigs.put(pig, pig.getLocation()); + + UtilEnt.Vegetate(pig); + + //Give Item + if (toSpawn > 1) + { + Item item = pig.getWorld().dropItem(pig.getLocation(), new ItemStack(_item.getMaterial())); - Pig pig = loc.getWorld().spawn(loc, Pig.class); - _pigs.add(pig); + if (pig.getPassenger() != null) + pig.getPassenger().remove(); - UtilEnt.Vegetate(pig); + pig.setPassenger(item); } - - CreatureAllowOverride = false; } + + CreatureAllowOverride = false; } @EventHandler public void pigUpdate(UpdateEvent event) { - for (Pig pig : _pigs) - { - Player bestPlayer = null; - double bestDist = 0; - - for (Player player : GetPlayers(true)) + for (Pig pig : _pigs.keySet()) + { + //Fallen Off Island?! JUMP BACK! + Block block = pig.getLocation().getBlock(); + while (block.getType() == Material.AIR) { - double dist = UtilMath.offset(pig, player); + block = block.getRelative(BlockFace.DOWN); + } + if (block.isLiquid()) + { + UtilAction.velocity(pig, + UtilAlg.getTrajectory(pig.getLocation(), + GetSpectatorLocation().add(Math.random() * 30 - 15, 0, Math.random() * 30 - 15)), + 2 + Math.random(), false, 0, 0.4, 10, true); - if (bestPlayer == null || dist < bestDist) + pig.getWorld().playSound(pig.getLocation(), Sound.PIG_IDLE, 2f, 2f); + + continue; + } + + //Player Rider + if (_finalRound && pig.getPassenger() != null && pig.getPassenger() instanceof Player) + { + Location target = pig.getLocation(); + target.add(pig.getPassenger().getLocation().getDirection().multiply(5)); + + UtilEnt.CreatureMoveFast(pig, target, 2); + + continue; + } + + Vector threat = new Vector(0,0,0); + + //waypoint + Location loc = _pigs.get(pig); + + //find new waypoint + if (UtilMath.offset2d(pig.getLocation(), loc) < 5 || targetAtEdge(loc)) + { + Location newLoc = getNewWaypoint(pig); + + if (newLoc != null) { - bestPlayer = player; - bestDist = dist; + loc.setX(newLoc.getX()); + loc.setZ(newLoc.getZ()); } } - if (bestPlayer == null) - return; + threat.add(UtilAlg.getTrajectory2d(pig.getLocation(), loc).multiply(0.4)); - //RUN! JUMP! MEOW! + //run from players + double closestDist = 0; + HashMap ents = UtilEnt.getInRadius(pig.getLocation(), 12); + if (ents.size() > 0) + { + for (LivingEntity ent : ents.keySet()) + { + if (ent instanceof Player) + { + if (ent.equals(pig)) + continue; + + if (!IsAlive((Player)ent)) + continue; + + double score = ents.get(ent); + + //Add scaled threat! + threat.add(UtilAlg.getTrajectory2d(ent, pig).multiply(score)); + + if (score > closestDist) + closestDist = score; + } + if (ent instanceof Pig) + { + if (ents.get(ent) < 0.3) + { + threat.add(UtilAlg.getTrajectory2d(ent, pig).multiply(ents.get(ent) * 0.3)); + } + } + } + } + + threat.normalize(); + + //MOVE + Location target = pig.getLocation().add(threat.multiply(4)); + + //try to skate around edge + int attempts = 0; + while (targetAtEdge(target) && attempts < 10) + { + attempts++; + + target.add(UtilAlg.getTrajectory(target, GetSpectatorLocation())); + + //too cornered! jump back in + if (UtilMath.offset(pig.getLocation(), target) < 2) + { + UtilEnt.CreatureMoveFast(pig, pig.getLocation().add(UtilAlg.getTrajectory(pig.getLocation(), GetSpectatorLocation())), 2f); + + UtilAction.velocity(pig, + UtilAlg.getTrajectory(pig.getLocation(), + GetSpectatorLocation().add(Math.random() * 30 - 15, 0, Math.random() * 30 - 15)), + 2 + Math.random(), false, 0, 0.4, 10, true); + + pig.getWorld().playSound(pig.getLocation(), Sound.PIG_IDLE, 2f, 2f); + } + } + + UtilEnt.CreatureMoveFast(pig, target, 1.5f + (float)(1f * closestDist)); } } + private Location getNewWaypoint(Pig pig) + { + for (int i=0 ; i<50 ; i++) + { + Location loc = pig.getLocation(); + + loc.add(Math.random() * 50 - 25, 0, Math.random() * 50 - 25); + + if (!targetAtEdge(loc)) + return loc; + } + + return null; + } + + private boolean targetAtEdge(Location target) + { + Block block = target.getWorld().getBlockAt(target.getBlockX(), _blockMapHeight, target.getBlockZ()); + + for (int x=-1 ; x <= 1 ; x++) + for (int z=-1 ; z <= 1 ; z++) + { + if (block.getRelative(x, -1, z).getType() == Material.AIR) + return true; + } + + return false; + } + @EventHandler public void roundUpdate(UpdateEvent event) { @@ -232,18 +577,61 @@ public class Valentines extends SoloGame if (event.getType() != UpdateType.TICK) return; - if (UtilTime.elapsed(_roundTime, _roundTimeLimit) || _pigsStocked.isEmpty()) + if (_roundState == 0) { - //Kill Failed Players - for (Player player : GetPlayers(true)) + nextRound(); + } + + else if (_roundState == 1) + { + if (UtilTime.elapsed(_roundTime, _roundTimeLimit) || (_pigs.isEmpty() && _hasItem.isEmpty())) { - if (!_completedRound.contains(player)) + if (_completedRound.isEmpty()) { - player.damage(9999); + //Announce + AnnounceEnd(new ArrayList()); + + //End + SetState(GameState.End); + + return; } + + //Kill Failed Players + for (Player player : GetPlayers(true)) + { + if (!_completedRound.contains(player)) + { + UtilTextMiddle.display(C.cRed + C.Bold + "Game Over", "You failed to help Calvin", 0, 80, 20, player); + player.damage(9999); + } + } + + _roundState = 2; + _roundTime = System.currentTimeMillis(); + + + //Cull Excess Pigs + Iterator pigIter = _pigs.keySet().iterator(); + while (pigIter.hasNext()) + { + Pig pig = pigIter.next(); + + if (pig.getPassenger() != null) + pig.getPassenger().remove(); + + pig.playEffect(EntityEffect.DEATH); + _pigsDead.add(pig); + pigIter.remove(); + } + + //Stop Music + _music.cancel(); } - - //Prepare Next Round + } + + else if (_roundState == 2 && UtilTime.elapsed(_roundTime, 5000)) + { nextRound(); } } @@ -252,6 +640,12 @@ public class Valentines extends SoloGame { _round++; + _roundState = 1; + _roundTime = System.currentTimeMillis(); + + _completedRound.clear(); + _hasItem.clear(); + //Restock Items (only repeat items if required) if (_unusedGifts.isEmpty()) for (ValItem gift : ValItem.values()) @@ -261,35 +655,44 @@ public class Valentines extends SoloGame _item = UtilAlg.Random(_unusedGifts); _unusedGifts.remove(_item); - //Cull Excess Pigs - while (_pigs.size() > GetPlayers(true).size() - _playersOutPerRound) + //Delete Dead Pigs + for (Pig pig : _pigsDead) + pig.remove(); + _pigsDead.clear(); + + //Clean + for (Pig pig : _pigs.keySet()) { - Pig pig = _pigs.remove(0); - if (pig.getPassenger() != null) pig.getPassenger().remove(); pig.remove(); } + _pigs.clear(); //Restock Pigs - for (Pig pig : _pigs) - { - //Remove Old Armor Stand - if (pig.getPassenger() != null) - pig.getPassenger().remove(); - - //Set Item - ArmorStand stand = pig.getWorld().spawn(pig.getLocation(), ArmorStand.class); - stand.setHelmet(new ItemStack(_item.getMaterial())); - pig.setPassenger(stand); - - //Set Live - _pigsStocked.add(pig); - } + pigSpawn(); //Announce - UtilTextMiddle.display("Round " + _round, _item.getTitle(), 0, 80, 20); + if (_pigs.size() > 1) + UtilTextMiddle.display("Round " + _round, _item.getTitle(), 0, 80, 20); + else + { + UtilTextMiddle.display("Final Round", "Capture the Pig!", 0, 80, 20); + + for (Player player : GetPlayers(true)) + player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.SADDLE, (byte)0, 1, "Pig Saddle")); + } + + //Music! + _music = new NotePlayer(Manager.getPlugin(), _song, new INoteVerifier() + { + @Override + public boolean shouldPlay(Player player) + { + return Manager.getPreferences().Get(player).HubMusic; + } + }, 0.7F, true); } @Override @@ -310,11 +713,18 @@ public class Valentines extends SoloGame Scoreboard.WriteBlank(); Scoreboard.Write(C.cGreen + "Items Left"); - Scoreboard.Write("" + _pigsStocked.size()); + + if (_roundState == 1) + Scoreboard.Write("" + _pigs.size()); + else + Scoreboard.Write("-"); Scoreboard.WriteBlank(); Scoreboard.Write(C.cGreen + "Time Left"); - Scoreboard.Write("" + UtilTime.MakeStr(_roundTimeLimit - (System.currentTimeMillis() - _roundTime), 0)); + if (_roundState == 1) + Scoreboard.Write("" + UtilTime.MakeStr(_roundTimeLimit - (System.currentTimeMillis() - _roundTime), 0)); + else + Scoreboard.Write("-"); Scoreboard.Draw(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/kit/KitMasterOfLove.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/kit/KitMasterOfLove.java index f84af3d89..cc9d89158 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/kit/KitMasterOfLove.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/kit/KitMasterOfLove.java @@ -5,6 +5,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import mineplex.core.itemstack.ItemStackFactory; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; @@ -32,6 +33,6 @@ public class KitMasterOfLove extends Kit @Override public void GiveItems(Player player) { - + player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.FISHING_ROD, (byte)0, 1, "Cupids Pig Catcher")); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialPhaseValentines.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialPhaseValentines.java new file mode 100644 index 000000000..e273444d2 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialPhaseValentines.java @@ -0,0 +1,47 @@ +package nautilus.game.arcade.game.games.valentines.tutorial; + +import org.bukkit.Sound; + +import mineplex.core.common.util.C; +import nautilus.game.arcade.gametutorial.TutorialPhase; +import nautilus.game.arcade.gametutorial.TutorialText; + +public class TutorialPhaseValentines extends TutorialPhase +{ + + public TutorialPhaseValentines() + { + super(new TutorialText[] + { + new TutorialText(C.cRed + "Moolanie", "Calvin! Did you forget Valentines Day again?!", 1, Sound.COW_IDLE), + new TutorialText(C.cGreen + "Calvin", "...of course not!", 2, Sound.COW_IDLE), + new TutorialText(C.cGreen + "Calvin", "I promise this year will be amazing!", 3, Sound.COW_IDLE), + new TutorialText(C.cRed + "Moolanie", "It better be, or we're finished...", 4, Sound.COW_IDLE), + new TutorialText(C.cGreen + "Calvin", "Good thing I prepared for this!", 5, Sound.COW_IDLE), + }); + } + + @Override + public int ID() + { + return 1; + } + + @Override + public void onStart() + { + + } + + @Override + public void onEnd() + { + + } + + @Override + public void onMessageDisplay(TutorialText text) + { + + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialValentines.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialValentines.java new file mode 100644 index 000000000..1f2c66df6 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/valentines/tutorial/TutorialValentines.java @@ -0,0 +1,34 @@ +package nautilus.game.arcade.game.games.valentines.tutorial; + +import java.util.ArrayList; + +import org.bukkit.entity.Cow; +import org.bukkit.entity.Pig; + +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.typewars.tutorial.TutorialPhaseTypeWars; +import nautilus.game.arcade.game.games.valentines.Valentines; +import nautilus.game.arcade.gametutorial.GameTutorial; +import nautilus.game.arcade.gametutorial.TutorialPhase; + +public class TutorialValentines extends GameTutorial +{ + private Valentines Host; + + private Cow _cowBoy; + private Cow _cowGirl; + private ArrayList _pigs = new ArrayList(); + + public TutorialValentines(Valentines valentines, ArcadeManager manager) + { + super(manager, new TutorialPhase[]{new TutorialPhaseValentines()}); + + Host = valentines; + } + + public void update(UpdateEvent event) + { + + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java index 96ac7ad5a..3204c2dbb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/GameTutorial.java @@ -303,6 +303,11 @@ public abstract class GameTutorial return _phases; } + public TutorialPhase getCurrentPhase() + { + return _currentPhase; + } + public long getTutorialStart() { return _started; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java index 2711b10fa..98acc729f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gametutorial/TutorialText.java @@ -7,31 +7,43 @@ public class TutorialText { private String _text; + private String _title; private int _stayTime; private int _id; private Sound _sound; - public TutorialText(String text, int stayTime, int id, Sound sound) + public TutorialText(String title, String text, int stayTime, int id, Sound sound) { _text = text; + _title = title; _id = id; _stayTime = stayTime; _sound = sound; } + public TutorialText(String title, String text, int id, Sound sound) + { + this(title, text, (int) (Math.round(1.5 * text.length()) + 25), id, sound); + } + public TutorialText(String text, int id) { - this(text, (int) (Math.round(1.5 * text.length()) + 25), id, Sound.NOTE_PLING); + this(null, text, (int) (Math.round(1.5 * text.length()) + 25), id, Sound.NOTE_PLING); } public TutorialText(String text, int id, Sound sound) { - this(text, (int) (Math.round(1.5 * text.length()) + 25), id, sound); + this(null, text, (int) (Math.round(1.5 * text.length()) + 25), id, sound); } public TutorialText(String text, int stayTime, int id) { - this(text, stayTime, id, Sound.NOTE_PLING); + this(null, text, stayTime, id, Sound.NOTE_PLING); + } + + public String getTitle() + { + return _title; } public String getText()