diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java index 68767903c..efdbebb6c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java @@ -19,6 +19,7 @@ import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.games.event.kits.KitPlayer; +import nautilus.game.arcade.game.games.event.staffoscars.StaffOscarsModule; import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.managers.GameHostManager; @@ -125,7 +126,16 @@ public class EventGame extends Game .setGiveCompassToAlive(false) .register(this); } - + + @Override + public void ParseData() + { + if (WorldData.MapName.equals("Staff Oscars")) + { + new StaffOscarsModule().register(this); + } + } + @EventHandler public void registerSigns(GameStateChangeEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/ChairData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/ChairData.java new file mode 100644 index 000000000..4f15c0bdc --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/ChairData.java @@ -0,0 +1,41 @@ +package nautilus.game.arcade.game.games.event.staffoscars; + +import org.bukkit.block.Block; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; + +public class ChairData +{ + + private Player _player; + private Block _block; + private ArmorStand _stand; + + public ChairData(Player player, Block block) + { + _player = player; + _block = block; + _stand = block.getWorld().spawn(block.getLocation().add(0.5, -0.4, 0.5), ArmorStand.class); + + _stand.setGravity(false); + _stand.setSmall(true); + _stand.setVisible(false); + _stand.setPassenger(player); + } + + public Player getPlayer() + { + return _player; + } + + public Block getBlock() + { + return _block; + } + + public ArmorStand getStand() + { + return _stand; + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/RainbowSheep.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/RainbowSheep.java new file mode 100644 index 000000000..bcdddfc13 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/RainbowSheep.java @@ -0,0 +1,105 @@ +package nautilus.game.arcade.game.games.event.staffoscars; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilTime; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import org.bukkit.Color; +import org.bukkit.entity.Player; +import org.bukkit.entity.Sheep; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.Set; + +public class RainbowSheep implements Listener +{ + + private static final Color[] COLOURS = { + Color.RED, Color.ORANGE, Color.YELLOW, Color.LIME, Color.AQUA, Color.BLUE, Color.PURPLE + }; + + private final Set _sheep; + private Player _player; + private boolean _active; + private long _start; + + public RainbowSheep() + { + _sheep = new HashSet<>(); + } + + @EventHandler + public void updateSpawn(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTER || !_active) + { + return; + } + + if (UtilTime.elapsed(_start, 50000)) + { + for (Sheep sheep : _sheep) + { + sheep.remove(); + } + + _sheep.clear(); + _active = false; + return; + } + + Vector direction = _player.getLocation().getDirection(); + Vector left = UtilAlg.getLeft(direction).add(direction.clone().multiply(1.5)); + Vector right = UtilAlg.getRight(direction).add(direction.clone().multiply(1.5)); + + spawnSheep(_player, direction); + spawnSheep(_player, left); + spawnSheep(_player, right); + } + + @EventHandler + public void updateParticles(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + { + return; + } + + for (Sheep sheep : _sheep) + { + UtilParticle.playColoredParticleToAll(COLOURS[UtilMath.r(COLOURS.length)], UtilParticle.ParticleType.RED_DUST, sheep.getLocation().add(0, 0.75, 0), 2, UtilParticle.ViewDist.LONGER); + } + } + + @EventHandler + public void entityDamage(EntityDamageEvent event) + { + if (_sheep.contains(event.getEntity())) + { + event.setCancelled(true); + } + } + + private void spawnSheep(Player player, Vector vector) + { + Sheep sheep = player.getWorld().spawn(player.getEyeLocation(), Sheep.class); + + sheep.setCustomName("jeb_"); + sheep.setVelocity(vector); + + _sheep.add(sheep); + } + + public void setActive(Player player) + { + _player = player; + _active = true; + _start = System.currentTimeMillis(); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/StaffOscarsModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/StaffOscarsModule.java new file mode 100644 index 000000000..2e45e694a --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/staffoscars/StaffOscarsModule.java @@ -0,0 +1,252 @@ +package nautilus.game.arcade.game.games.event.staffoscars; + +import mineplex.core.common.util.*; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.modules.Module; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerArmorStandManipulateEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +public class StaffOscarsModule extends Module +{ + + private static final int MAX_X = 18; + + private List _blocks; + private boolean _open; + private boolean _animate; + private int _x; + private Location _center; + + private Set _chairs; + + private List _fireworks; + + private RainbowSheep _sheep; + + @Override + protected void setup() + { + _chairs = new HashSet<>(); + _blocks = getGame().WorldData.GetCustomLocs(String.valueOf(Material.EMERALD_BLOCK.getId())); + _center = UtilAlg.getAverageLocation(_blocks); + _fireworks = getGame().WorldData.GetDataLocs("YELLOW"); + _sheep = new RainbowSheep(); + UtilServer.RegisterEvents(_sheep); + } + + @Override + public void cleanup() + { + UtilServer.Unregister(_sheep); + } + + @EventHandler + public void prepare(GameStateChangeEvent event) + { + if (event.GetState() != Game.GameState.Prepare) + { + return; + } + + for (Location location : _blocks) + { + MapUtil.QuickChangeBlockAt(location, Material.WOOL, (byte) 14); + } + } + + @EventHandler + public void update(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST || !_animate) + { + return; + } + + for (Location location : _blocks) + { + boolean in = UtilMath.offset2d(location, _center) < _x; + + if (in && _open) + { + MapUtil.QuickChangeBlockAt(location, Material.AIR); + } + else if (!in && !_open) + { + MapUtil.QuickChangeBlockAt(location, Material.WOOL, (byte) 14); + } + } + + if (_open) + { + _x++; + } + else + { + _x--; + } + + if (_open && _x == MAX_X || !_open && _x == -1) + { + _animate = false; + } + } + + @EventHandler + public void curtainCommand(PlayerCommandPreprocessEvent event) + { + String message = event.getMessage(); + + if (message.startsWith("/curtain") && getGame().getArcadeManager().GetGameHostManager().isAdmin(event.getPlayer(), false)) + { + _open = !_open; + _animate = true; + + event.setCancelled(true); + event.getPlayer().sendMessage(F.main("Event", "Curtain open state = " + _open + ".")); + } + } + + @EventHandler + public void chairInteract(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + Block block = event.getClickedBlock(); + + if (block == null) + { + return; + } + + if (UtilBlock.usable(block)) + { + event.setCancelled(true); + } + + if (block.getType() != Material.WOOD_STAIRS) + { + return; + } + + for (ChairData data : _chairs) + { + if (data.getBlock().equals(block)) + { + return; + } + + if (data.getPlayer().equals(player)) + { + handleDismount(player); + break; + } + } + + _chairs.add(new ChairData(player, block)); + } + + @EventHandler + public void playerQuit(PlayerQuitEvent event) + { + handleDismount(event.getPlayer()); + } + + @EventHandler + public void updateDismount(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + { + return; + } + + Iterator iterator = _chairs.iterator(); + + while (iterator.hasNext()) + { + ChairData data = iterator.next(); + + if (data.getPlayer().isInsideVehicle()) + { + continue; + } + + data.getStand().remove(); + iterator.remove(); + } + } + + private void handleDismount(Player player) + { + Iterator iterator = _chairs.iterator(); + + while (iterator.hasNext()) + { + ChairData data = iterator.next(); + + if (!data.getPlayer().equals(player)) + { + continue; + } + + data.getStand().remove(); + iterator.remove(); + } + } + + @EventHandler + public void armourStandEdit(PlayerArmorStandManipulateEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void fireworksCommand(PlayerCommandPreprocessEvent event) + { + String message = event.getMessage(); + + if (message.startsWith("/firework") && getGame().getArcadeManager().GetGameHostManager().isAdmin(event.getPlayer(), false)) + { + event.setCancelled(true); + + FireworkEffect fireworkEffect = FireworkEffect.builder().with(FireworkEffect.Type.BALL_LARGE).withColor(Color.YELLOW).build(); + + for (Location location : _fireworks) + { + for (int i = 0; i < 4; i++) + { + UtilFirework.launchFirework(location, fireworkEffect, null, UtilMath.r(3) + 1); + } + } + } + } + + @EventHandler + public void rainbowSheepCommand(PlayerCommandPreprocessEvent event) + { + String message = event.getMessage(); + + if (!message.startsWith("/deantm") || !getGame().getArcadeManager().GetGameHostManager().isAdmin(event.getPlayer(), false)) + { + return; + } + + event.setCancelled(true); + _sheep.setActive(event.getPlayer()); + } +}