From 54a605de5bad3365dcc685f375a8c3093d2b800a Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 7 Jan 2018 17:42:32 +0000 Subject: [PATCH] Finish up new generators --- .../mineplex/core/common/util/UtilPlayer.java | 3 +- .../arcade/game/games/skywars/Skywars.java | 201 ++++-------------- .../game/games/skywars/SoloSkywars.java | 46 ++-- .../skywars/module/ZombieGuardianModule.java | 7 + .../game/modules/EXPForKillsModule.java | 69 ++++++ .../arcade/game/modules/MapCrumbleModule.java | 6 + .../game/modules/ThrowableTNTModule.java | 100 +++++++++ .../game/modules/generator/Generator.java | 109 ++++++++++ .../modules/generator/GeneratorModule.java | 84 +++++++- .../game/modules/generator/GeneratorType.java | 59 ++++- 10 files changed, 489 insertions(+), 195 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/EXPForKillsModule.java create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/ThrowableTNTModule.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java index afb3dc39f..2a4b0cad5 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java @@ -14,7 +14,6 @@ import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -482,7 +481,7 @@ public class UtilPlayer public static List getNearby(Location loc, double maxDist, boolean onlySurvival) { maxDist *= maxDist; - LinkedList nearbyMap = new LinkedList(); + LinkedList nearbyMap = new LinkedList<>(); for (Player cur : loc.getWorld().getPlayers()) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/Skywars.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/Skywars.java index 91961dc09..4b54e59c2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/Skywars.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/Skywars.java @@ -4,11 +4,13 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.concurrent.TimeUnit; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Color; 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.block.BlockState; @@ -20,50 +22,32 @@ import org.bukkit.entity.Egg; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Snowball; -import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockSpreadEvent; import org.bukkit.event.block.LeavesDecayEvent; -import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.entity.ItemDespawnEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.MapUtil; import mineplex.core.common.util.NautHashMap; -import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilPlayer; import mineplex.core.explosion.ExplosionEvent; import mineplex.core.loot.ChestLoot; import mineplex.core.loot.RandomItem; import mineplex.core.recharge.Recharge; import mineplex.core.titles.tracks.standard.LuckyTrack; import mineplex.core.titles.tracks.standard.UnluckyTrack; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.minecraft.game.core.combat.CombatComponent; -import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; @@ -80,9 +64,14 @@ import nautilus.game.arcade.game.games.skywars.kits.KitIce; import nautilus.game.arcade.game.games.skywars.kits.KitMetal; import nautilus.game.arcade.game.games.skywars.modes.kits.KitElementalist; import nautilus.game.arcade.game.games.skywars.module.ZombieGuardianModule; +import nautilus.game.arcade.game.modules.EXPForKillsModule; import nautilus.game.arcade.game.modules.EnderPearlModule; import nautilus.game.arcade.game.modules.MapCrumbleModule; +import nautilus.game.arcade.game.modules.ThrowableTNTModule; import nautilus.game.arcade.game.modules.compass.CompassModule; +import nautilus.game.arcade.game.modules.generator.Generator; +import nautilus.game.arcade.game.modules.generator.GeneratorModule; +import nautilus.game.arcade.game.modules.generator.GeneratorType; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.ore.OreHider; @@ -162,10 +151,6 @@ public abstract class Skywars extends Game HideTeamSheep = true; - new CompassModule() - .setGiveCompassToAlive(true) - .register(this); - GameTimeout = 1500000L; DeathDropItems = true; @@ -205,9 +190,16 @@ public abstract class Skywars extends Game }; + new CompassModule() + .setGiveCompassToAlive(true) + .register(this); + new EnderPearlModule() .register(this); + new EXPForKillsModule() + .register(this); + setAlreadyAnnounced(false); setupBookEnchantments(); setupPlayerLoot(); @@ -218,7 +210,6 @@ public abstract class Skywars extends Game @Override public void ParseData() { - parseCreateZombieSpawns(); parseCreateMiddleChests(); parseCreateConnectorChests(); parseCreatePlayerChests(); @@ -232,6 +223,22 @@ public abstract class Skywars extends Game .addSpawns(WorldData.GetDataLocs("RED")) .register(this); + ThrowableTNTModule tntModule = new ThrowableTNTModule() + .setThrowAndDrop(true) + .setThrowStrength(1.4); + tntModule.register(this); + + ItemStack tntItem = tntModule.getTntItem().clone(); + tntItem.setAmount(2); + + new GeneratorModule() + .addGenerator(new Generator + ( + new GeneratorType(tntItem, TimeUnit.SECONDS.toMillis(30), "Throwable TNT", ChatColor.RED, Color.RED, true), + WorldData.GetDataLocs("LIME").get(0) + )) + .register(this); + for (Location oreLoc : WorldData.GetCustomLocs("56")) { oreLoc.getBlock().setType(Material.STONE); @@ -243,11 +250,11 @@ public abstract class Skywars extends Game MapUtil.QuickChangeBlockAt(loc, Material.AIR); } - // TNT - for (Location loc : WorldData.GetDataLocs("LIME")) - { - _tntGen = new TNTGenerator(this, loc); - } +// // TNT +// for (Location loc : WorldData.GetDataLocs("LIME")) +// { +// _tntGen = new TNTGenerator(this, loc); +// } // // Register Blocks // for (int y = WorldData.MinY; y < WorldData.MaxY; y++) @@ -520,66 +527,6 @@ public abstract class Skywars extends Game } } - @EventHandler - public void onPlayerPickupItem(PlayerPickupItemEvent e) - { - ItemStack is = e.getItem().getItemStack(); - Player player = e.getPlayer(); - if (is.getType() == Material.TNT) - { - e.setCancelled(true); - _tntGen.pickup(player, e.getItem()); - } - } - - @EventHandler - public void onPlayerInteractTNT(PlayerInteractEvent e) - { - if (!IsLive()) - { - return; - } - - Player player = e.getPlayer(); - - if (!IsAlive(player)) - { - return; - } - - if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) - { - return; - } - e.setCancelled(true); - - UtilInv.remove(player, Material.TNT, (byte) 0, 1); - UtilInv.Update(player); - - TNTPrimed tnt = (TNTPrimed) player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); - - tnt.setFuseTicks(60); - if (UtilEvent.isAction(e, UtilEvent.ActionType.L)) - { - UtilAction.velocity(tnt, player.getLocation().getDirection(), 1.75D, false, 0.0D, 0.1D, 10.0D, false); - player.playSound(player.getLocation(), Sound.GHAST_FIREBALL, 3.0F, 1.0F); - } - - _tntMap.put(tnt, player); - } - - @EventHandler - public void onUpdateTNTCannon(UpdateEvent e) - { - if (!IsLive()) - return; - - if (e.getType() == UpdateType.FAST) - { - _tntGen.update(); - } - } - @EventHandler public void onBlockBurn(BlockBurnEvent event) { @@ -608,23 +555,14 @@ public abstract class Skywars extends Game public void onBlockPlaceAdd(BlockPlaceEvent event) { Material material = event.getBlock().getType(); - _worldBlocks.add(event.getBlock()); if (material == Material.CHEST || material == Material.PISTON_BASE || material == Material.PISTON_STICKY_BASE || material == Material.HOPPER) { + event.getPlayer().sendMessage(F.main("Game", "You cannot place this block.")); event.setCancelled(true); } } - @EventHandler - public void onBlockPhysics(BlockPhysicsEvent event) - { - if (IsLive() && event.getBlock().getWorld().equals(WorldData.World)) - { - _worldBlocks.add(event.getBlock()); - } - } - @EventHandler(priority = EventPriority.MONITOR) public void onBlockBreakBonusDrops(BlockBreakEvent event) { @@ -1103,80 +1041,15 @@ public abstract class Skywars extends Game public void onExplosion(ExplosionEvent event) { _oreHider.Explosion(event); - event.GetBlocks().removeIf(block -> block.getType() == Material.CHEST || block.getType() == Material.ANVIL); } - @EventHandler - public void onEntityChangeBlock(EntityChangeBlockEvent event) - { - if (event.getBlock().getType() == Material.ANVIL) - { - event.setCancelled(true); - } - } - @EventHandler public void onBlockBreakOreReveal(BlockBreakEvent event) { _oreHider.BlockBreak(event); } - @EventHandler - public void onExplosionPrime(ExplosionPrimeEvent event) - { - Player player = _tntMap.get(event.getEntity()); - if (player != null) - { - for (Player other : UtilPlayer.getNearby(event.getEntity().getLocation(), 14)) - { - Manager.GetCondition().Factory().Explosion("Throwing TNT", other, player, 50, 0.1, false, false); - } - } - } - - @EventHandler - public void onCombatDeathEventLevels(CombatDeathEvent event) - { - Game game = Manager.GetGame(); - if (game == null) - return; - - if (!(event.GetEvent().getEntity() instanceof Player)) - return; - - Player killed = (Player) event.GetEvent().getEntity(); - - if (event.GetLog().GetKiller() != null) - { - Player killer = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); - - if (killer != null && !killer.equals(killed)) - { - // Kill - killer.giveExpLevels(2); - - killer.playSound(killer.getLocation(), Sound.LEVEL_UP, 1f, 1f); - } - } - - for (CombatComponent log : event.GetLog().GetAttackers()) - { - if (event.GetLog().GetKiller() != null && log.equals(event.GetLog().GetKiller())) - continue; - - Player assist = UtilPlayer.searchExact(log.GetName()); - - // Assist - if (assist != null) - { - assist.giveExpLevels(1); - assist.playSound(assist.getLocation(), Sound.ORB_PICKUP, 1f, 1f); - } - - } - } - @Override public double GetKillsGems(Player killer, Player killed, boolean assist) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/SoloSkywars.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/SoloSkywars.java index be448adde..5326b7f78 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/SoloSkywars.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/SoloSkywars.java @@ -118,29 +118,29 @@ public class SoloSkywars extends Skywars } } - if (IsLive()) - { - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Time"); - Scoreboard.write(UtilTime.convertString(System.currentTimeMillis() - GetStateTime(), 0, TimeUnit.FIT)); - - Scoreboard.writeNewLine(); - Scoreboard.write((this.getTnTGen().active() ? C.cGreen : C.cRed) + C.Bold + "TNT Spawn"); - Scoreboard.write(this.getTnTGen().getScoreboardInfo()); - - Scoreboard.writeNewLine(); - - if (UtilTime.elapsed(GetStateTime(), this.getCrumbleTime())) - { - Scoreboard.write(C.cRed + C.Bold + "Map Crumble"); - Scoreboard.write("Active"); - } - else - { - Scoreboard.write(C.cGreen + C.Bold + "Map Crumble"); - Scoreboard.write(UtilTime.convertString(this.getCrumbleTime() - (System.currentTimeMillis() - GetStateTime()), 0, TimeUnit.FIT)); - } - } +// if (IsLive()) +// { +// Scoreboard.writeNewLine(); +// Scoreboard.write(C.cYellow + C.Bold + "Time"); +// Scoreboard.write(UtilTime.convertString(System.currentTimeMillis() - GetStateTime(), 0, TimeUnit.FIT)); +// +// Scoreboard.writeNewLine(); +// Scoreboard.write((this.getTnTGen().active() ? C.cGreen : C.cRed) + C.Bold + "TNT Spawn"); +// Scoreboard.write(this.getTnTGen().getScoreboardInfo()); +// +// Scoreboard.writeNewLine(); +// +// if (UtilTime.elapsed(GetStateTime(), this.getCrumbleTime())) +// { +// Scoreboard.write(C.cRed + C.Bold + "Map Crumble"); +// Scoreboard.write("Active"); +// } +// else +// { +// Scoreboard.write(C.cGreen + C.Bold + "Map Crumble"); +// Scoreboard.write(UtilTime.convertString(this.getCrumbleTime() - (System.currentTimeMillis() - GetStateTime()), 0, TimeUnit.FIT)); +// } +// } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/module/ZombieGuardianModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/module/ZombieGuardianModule.java index adefa0479..bc158b208 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/module/ZombieGuardianModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/skywars/module/ZombieGuardianModule.java @@ -46,6 +46,13 @@ public class ZombieGuardianModule extends Module _zombies = new HashMap<>(); } + @Override + public void cleanup() + { + _zombies.clear(); + _spawns.clear(); + } + public ZombieGuardianModule addSpawns(List spawns) { _spawns.addAll(spawns); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/EXPForKillsModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/EXPForKillsModule.java new file mode 100644 index 000000000..7374e6b03 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/EXPForKillsModule.java @@ -0,0 +1,69 @@ +package nautilus.game.arcade.game.modules; + +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +import mineplex.core.common.util.UtilPlayer; +import mineplex.minecraft.game.core.combat.CombatComponent; +import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; + +/** + * A legacy module that awards players enchanting levels when they kill or assist on killing another player. + */ +public class EXPForKillsModule extends Module +{ + + private final int _levelsForKill, _levelsForAssist; + + public EXPForKillsModule() + { + this(2, 1); + } + + public EXPForKillsModule(int levelsForKill, int levelsForAssist) + { + _levelsForKill = levelsForKill; + _levelsForAssist = levelsForAssist; + } + + @EventHandler + public void onCombatDeathEventLevels(CombatDeathEvent event) + { + if (!(event.GetEvent().getEntity() instanceof Player)) + { + return; + } + + Player killed = (Player) event.GetEvent().getEntity(); + + if (event.GetLog().GetKiller() != null) + { + Player killer = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + + if (killer != null && !killer.equals(killed)) + { + // Kill + killer.giveExpLevels(_levelsForKill); + killer.playSound(killer.getLocation(), Sound.LEVEL_UP, 1f, 1f); + } + } + + for (CombatComponent log : event.GetLog().GetAttackers()) + { + if (event.GetLog().GetKiller() != null && log.equals(event.GetLog().GetKiller())) + { + continue; + } + + Player assist = UtilPlayer.searchExact(log.GetName()); + + // Assist + if (assist != null) + { + assist.giveExpLevels(_levelsForAssist); + assist.playSound(assist.getLocation(), Sound.ORB_PICKUP, 1f, 1f); + } + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/MapCrumbleModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/MapCrumbleModule.java index 73824b29c..54ade2594 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/MapCrumbleModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/MapCrumbleModule.java @@ -74,6 +74,12 @@ public class MapCrumbleModule extends Module }, 1, 2); } + @Override + public void cleanup() + { + _worldBlocks.clear(); + } + public MapCrumbleModule setEnabled(boolean enabled) { _enabled = enabled; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/ThrowableTNTModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/ThrowableTNTModule.java new file mode 100644 index 000000000..1402c0f61 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/ThrowableTNTModule.java @@ -0,0 +1,100 @@ +package nautilus.game.arcade.game.modules; + +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.itemstack.ItemBuilder; + +public class ThrowableTNTModule extends Module +{ + + private ItemStack _tntItem; + private int _fuseTicks = 60; + private boolean _throwAndDrop; + private double _throwStrength = 1.3; + + @Override + protected void setup() + { + ItemBuilder builder = new ItemBuilder(Material.TNT); + + if (_throwAndDrop) + { + builder.setTitle(C.cYellowB + "Left Click - Throw" + C.cWhite + " / " + C.cYellowB + " Right Click - Drop"); + } + else + { + builder.setTitle(C.cYellowB + "Throwable TNT"); + } + + _tntItem = builder.build(); + } + + public ThrowableTNTModule setFuseTicks(int fuseTicks) + { + _fuseTicks = fuseTicks; + return this; + } + + public ThrowableTNTModule setThrowAndDrop(boolean throwAndDrop) + { + _throwAndDrop = throwAndDrop; + return this; + } + + public ThrowableTNTModule setThrowStrength(double throwStrength) + { + _throwStrength = throwStrength; + return this; + } + + public ItemStack getTntItem() + { + return _tntItem; + } + + @EventHandler + public void playerThrowTNT(PlayerInteractEvent event) + { + if (event.getAction() == Action.PHYSICAL || !getGame().IsLive()) + { + return; + } + + Player player = event.getPlayer(); + ItemStack itemStack = player.getItemInHand(); + + if (UtilPlayer.isSpectator(player) || itemStack == null || itemStack.getType() != Material.TNT) + { + return; + } + + player.setItemInHand(UtilInv.decrement(itemStack)); + event.setCancelled(true); + + Location location = player.getEyeLocation(); + location.add(location.getDirection()); + + TNTPrimed tntPrimed = location.getWorld().spawn(location, TNTPrimed.class); + tntPrimed.setFuseTicks(_fuseTicks); + + if (!_throwAndDrop || UtilEvent.isAction(event, ActionType.L)) + { + UtilAction.velocity(tntPrimed, location.getDirection(), _throwStrength, false, 0, 0.3, 1, false); + player.playEffect(location, Effect.GHAST_SHOOT, 0); + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/Generator.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/Generator.java index 276ca14c3..1e11b552b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/Generator.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/Generator.java @@ -1,5 +1,114 @@ package nautilus.game.arcade.game.modules.generator; +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; + public class Generator { + + private static final int COLLECT_RADIUS = 2; + private static final float ROTATION_DELTA_YAW = 10; + + private final GeneratorType _type; + private final Location _location; + private final Block _block; + + private ArmorStand _holder; + private long _lastCollect; + private boolean _colourTick = true; + + public Generator(GeneratorType type, Location location) + { + _type = type; + _location = location.clone().subtract(0, 0.5, 0); + _block = location.getBlock().getRelative(BlockFace.DOWN); + } + + public void checkCollect() + { + if (_holder == null) + { + return; + } + + List nearby = UtilPlayer.getNearby(_location, COLLECT_RADIUS); + + if (nearby.isEmpty()) + { + return; + } + + Player player = nearby.get(0); + _type.collect(this, player); + _holder.remove(); + _holder = null; + _lastCollect = System.currentTimeMillis(); + } + + public void checkSpawn() + { + if (_holder != null || !UtilTime.elapsed(_lastCollect, _type.getSpawnRate())) + { + return; + } + + _holder = _type.spawnHolder(this); + } + + public void animateHolder() + { + if (_holder == null) + { + return; + } + + Location location = _holder.getLocation(); + + ((CraftEntity) _holder).getHandle().setPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw() + ROTATION_DELTA_YAW, location.getPitch()); + } + + public void updateName() + { + if (_holder == null) + { + return; + } + + if (!_holder.isCustomNameVisible()) + { + _holder.setCustomNameVisible(true); + } + + if (_type.isFlashName()) + { + _colourTick = !_colourTick; + } + + _holder.setCustomName((_colourTick ? _type.getColour() + C.Bold : C.cWhiteB) + _type.getName()); + } + + public ArmorStand getHolder() + { + return _holder; + } + + public Location getLocation() + { + return _location; + } + + public Block getBlock() + { + return _block; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorModule.java index ab4b7c342..47d16aab0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorModule.java @@ -1,12 +1,92 @@ package nautilus.game.arcade.game.modules.generator; -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; +import java.util.HashSet; +import java.util.Set; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerArmorStandManipulateEvent; + +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.modules.Module; public class GeneratorModule extends Module { + private final Set _generators; + public GeneratorModule() + { + _generators = new HashSet<>(); + } + + @Override + public void cleanup() + { + _generators.clear(); + } + + public GeneratorModule addGenerator(Generator generator) + { + _generators.add(generator); + return this; + } + + @EventHandler + public void update(UpdateEvent event) + { + if (!getGame().IsLive()) + { + return; + } + + if (event.getType() == UpdateType.FAST) + { + getGame().CreatureAllowOverride = true; + + for (Generator generator : _generators) + { + generator.checkSpawn(); + generator.checkCollect(); + generator.updateName(); + } + + getGame().CreatureAllowOverride = false; + } + else if (event.getType() == UpdateType.TICK) + { + for (Generator generator : _generators) + { + generator.animateHolder(); + } + } + } + + @EventHandler + public void armourStandManipulate(PlayerArmorStandManipulateEvent event) + { + for (Generator generator: _generators) + { + if (generator.getHolder().equals(event.getRightClicked())) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler + public void armourStandDamage(CustomDamageEvent event) + { + for (Generator generator: _generators) + { + if (generator.getHolder().equals(event.GetDamageeEntity())) + { + event.SetCancelled("Generator Holder"); + return; + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorType.java index 2f34e8fc1..09d38ae48 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/modules/generator/GeneratorType.java @@ -5,22 +5,30 @@ import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import mineplex.core.common.util.MapUtil; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilFirework; public class GeneratorType { private final ItemStack _itemStack; + private final long _spawnRate; + private final String _name; private final ChatColor _colour; private final boolean _flashName; private final FireworkEffect _effect; - public GeneratorType(ItemStack itemStack, ChatColor chatColour, Color bukkitColour, boolean flashName) + public GeneratorType(ItemStack itemStack, long spawnRate, String name, ChatColor chatColour, Color bukkitColour, boolean flashName) { _itemStack = itemStack; + _spawnRate = spawnRate; + _name = name; _colour = chatColour; _flashName = flashName; _effect = FireworkEffect.builder() @@ -29,10 +37,34 @@ public class GeneratorType .build(); } - final void collect(Generator generator) + final void collect(Generator generator, Player player) { - Location location = - UtilFirework.playFirework(ge, _effect); + playEffect(generator); + MapUtil.QuickChangeBlockAt(generator.getBlock().getLocation(), Material.IRON_BLOCK); + collect(player); + } + + final ArmorStand spawnHolder(Generator generator) + { + Location location = generator.getLocation(); + ArmorStand holder = location.getWorld().spawn(location, ArmorStand.class); + + holder.setGravity(false); + holder.setVisible(false); + holder.setHelmet(_itemStack); + holder.setRemoveWhenFarAway(false); + UtilEnt.setTickWhenFarAway(holder, true); + + playEffect(generator); + MapUtil.QuickChangeBlockAt(generator.getBlock().getLocation(), Material.GOLD_BLOCK); + + return holder; + } + + private void playEffect(Generator generator) + { + Location location = generator.getLocation(); + UtilFirework.playFirework(location, _effect); } public void collect(Player player) @@ -40,4 +72,23 @@ public class GeneratorType player.getInventory().addItem(_itemStack); } + public String getName() + { + return _name; + } + + public long getSpawnRate() + { + return _spawnRate; + } + + public ChatColor getColour() + { + return _colour; + } + + public boolean isFlashName() + { + return _flashName; + } }