From d493a61d3d0bfbc7f9082701c4650b5d02d3c678 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 13 May 2017 17:13:47 +0100 Subject: [PATCH] Polish the hub event --- .../common/block/schematic/Schematic.java | 18 ++- .../mineplex/hub/modules/AlienInvasion.java | 132 +++++++++++++++--- 2 files changed, 130 insertions(+), 20 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java index 0ab1c909f..54e4974b8 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/block/schematic/Schematic.java @@ -79,6 +79,11 @@ public class Schematic } public SchematicData paste(Location originLocation, boolean ignoreAir, boolean worldEditOffset) + { + return paste(originLocation, ignoreAir, worldEditOffset, true); + } + + public SchematicData paste(Location originLocation, boolean ignoreAir, boolean worldEditOffset, boolean quickSet) { if(worldEditOffset && hasWorldEditOffset()) { @@ -144,9 +149,16 @@ public class Schematic continue; } } - - UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]); - + + if (quickSet) + { + UtilBlock.setQuick(originLocation.getWorld(), startX + x, startY + y, startZ + z, materialId, _blockData[index]); + } + else + { + originLocation.getWorld().getBlockAt(startX + x, startY + y, startZ + z).setTypeIdAndData(materialId, _blockData[index], false); + } + BlockVector bv = new BlockVector(x,y,z); output.getBlocksRaw().add(bv); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java index 250c9e6fc..dd03e2d54 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/AlienInvasion.java @@ -3,27 +3,29 @@ package mineplex.hub.modules; import mineplex.core.MiniPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; import mineplex.core.achievement.Achievement; +import mineplex.core.blockrestore.BlockRestore; import mineplex.core.command.CommandBase; +import mineplex.core.common.Pair; import mineplex.core.common.Rank; import mineplex.core.common.block.schematic.Schematic; import mineplex.core.common.block.schematic.SchematicData; import mineplex.core.common.block.schematic.UtilSchematic; -import mineplex.core.common.util.MapUtil; -import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.*; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.creature.Creature; import mineplex.core.stats.StatsManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.utils.UtilVariant; -import org.bukkit.Bukkit; -import org.bukkit.DyeColor; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockVector; @@ -49,32 +51,68 @@ public class AlienInvasion extends MiniPlugin }, { -25, 97, -26 + }, + { + -17, 94, -47 + }, + { + 20, 95, -55, + }, + { + 45, 106, -23 + }, + { + 50, 110, 16 + }, + { + -33, 125, 5 + }, + { + 30, 102, 10 } }; + /** + * Bob Ross is not an alien + */ private static final String[] ALIEN_SPEAK = { "Every day is a good day when you paint", + "Beat the devil out of it", + "Happy little clouds", + "Happy little trees", + "I believe", + "I wonder if anyone can see these messages", + "Get involved", + "Ruff" }; private static final ItemStack HELMET = new ItemStack(Material.GLASS); + private final BlockRestore _restore; private final Creature _creature; private final StatsManager _stats; + private final World _world; + private Schematic _schematic; private boolean _active; private int _lastUFOIndex; private Location _beam; private final Set _ufoBlocks; + private final Set _beaconBlocks; private final Set _aliens; public AlienInvasion() { super("Alien Invasion"); + _restore = require(BlockRestore.class); _creature = require(Creature.class); _stats = require(StatsManager.class); + _world = Bukkit.getWorld("world"); + _ufoBlocks = new HashSet<>(200); + _beaconBlocks = new HashSet<>(); _aliens = new HashSet<>(); addCommand(new CommandBase(this, Rank.ADMIN, "alien-animation-start") @@ -109,11 +147,21 @@ public class AlienInvasion extends MiniPlugin _lastUFOIndex = 0; _active = true; + + _world.setTime(18000); + + for (Player player : Bukkit.getOnlinePlayers()) + { + player.playSound(player.getLocation(), Sound.AMBIENCE_CAVE, 1, 0.5F); + } + + UtilTextMiddle.display(C.cGreenB + "Alien Invasion", "Event is starting!", 10, 40, 10); + Bukkit.broadcastMessage(F.main("Alien", "")); } public void sendPlayerToInstance(Player player) { - player.sendMessage("Testing"); + player.sendMessage("Imagine you are being sent to a game server, ooooo spooky"); } public void stopAnimation() @@ -122,7 +170,7 @@ public class AlienInvasion extends MiniPlugin for (Block block : _ufoBlocks) { - MapUtil.QuickChangeBlockAt(block.getLocation(), Material.AIR); + block.setType(Material.AIR); } _ufoBlocks.clear(); @@ -133,6 +181,15 @@ public class AlienInvasion extends MiniPlugin } _aliens.clear(); + + for (Block block : _beaconBlocks) + { + _restore.restore(block); + } + + _beaconBlocks.clear(); + + _world.setTime(6000); } @EventHandler @@ -144,9 +201,13 @@ public class AlienInvasion extends MiniPlugin } int[] cords = UFO_SPAWNS[_lastUFOIndex]; - Location location = new Location(Bukkit.getWorld("world"), cords[0], cords[1], cords[2]); + Location location = new Location(_world, cords[0], cords[1], cords[2]); - SchematicData data = _schematic.paste(location, true); + location.subtract(5, 0, 5); + + UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, location, 5F, 5F, 5F, 1, 50, ViewDist.LONG); + + SchematicData data = _schematic.paste(location, true, false, false); Location beam = data.getDataLocationMap().getIronLocations(DyeColor.LIME).get(0); for (BlockVector vector : data.getBlocks()) @@ -160,7 +221,24 @@ public class AlienInvasion extends MiniPlugin if (_lastUFOIndex == 0) { - _beam = beam; + // Spawn a beacon + Block ground = beam.getBlock(); + + while (ground.getType() == Material.AIR) + { + ground = ground.getRelative(BlockFace.DOWN); + } + + ground = ground.getRelative(BlockFace.UP); + _beam = ground.getLocation(); + + for (Pair> pair : UtilBlock.getBeaconBlocks(ground.getLocation(), (byte) 5)) + { + Block block = pair.getLeft().getBlock(); + + _restore.add(block, pair.getRight().getLeft().getId(), pair.getRight().getRight(), Long.MAX_VALUE); + _beaconBlocks.add(block); + } } _lastUFOIndex++; @@ -169,16 +247,21 @@ public class AlienInvasion extends MiniPlugin @EventHandler public void updateAlienSpawn(UpdateEvent event) { - if (event.getType() != UpdateType.FAST || !_active || _aliens.size() > 20) + if (event.getType() != UpdateType.FAST || !_active || _beam == null || _aliens.size() > 20) { return; } _creature.SetForce(true); - Location random = UtilAlg.getRandomLocation(_beam, 30, 5, 30); + Location random = UtilAlg.getRandomLocation(_beam.clone().add(0, 5, 0), 30, 4, 30); + random.setYaw(UtilMath.r(180)); + Skeleton skeleton = UtilVariant.spawnWitherSkeleton(random); skeleton.getEquipment().setHelmet(HELMET); + skeleton.setCustomNameVisible(true); + skeleton.setCustomName(C.cGreenB + "Alien"); + UtilEnt.vegetate(skeleton); _aliens.add(skeleton); @@ -188,14 +271,14 @@ public class AlienInvasion extends MiniPlugin @EventHandler public void updateSendToInstance(UpdateEvent event) { - if (event.getType() != UpdateType.SEC || !_active) + if (event.getType() != UpdateType.SEC || !_active || _beam == null) { return; } for (Player player : Bukkit.getOnlinePlayers()) { - if (UtilMath.offset2d(player.getLocation(), _beam) > 5) + if (UtilMath.offsetSquared(player.getLocation(), _beam) > 25) { continue; } @@ -229,12 +312,27 @@ public class AlienInvasion extends MiniPlugin Projectile projectile = (Projectile) damager; Player shooter = (Player) projectile.getShooter(); + shooter.playSound(shooter.getLocation(), Sound.NOTE_PLING, 1, 1.8F); _stats.incrementStat(shooter, Achievement.GLOBAL_ALIEN_INVASION.getStats()[0], 1); } } + @EventHandler + public void interactAlien(PlayerInteractAtEntityEvent event) + { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + + if (!_aliens.contains(entity)) + { + return; + } + + sendAlienSpeak(player); + } + private void sendAlienSpeak(Player player) { - player.sendMessage(ALIEN_SPEAK[UtilMath.r(ALIEN_SPEAK.length)]); + player.sendMessage(C.cGreen + C.Scramble + ALIEN_SPEAK[UtilMath.r(ALIEN_SPEAK.length)]); } }