From 6f0d21120e015093608e658a4f400d9bd139b950 Mon Sep 17 00:00:00 2001 From: AlexTheCoder Date: Mon, 25 Jul 2016 10:59:03 -0400 Subject: [PATCH] Serious tweaks to gameplay and begin documentation --- Plugins/Mineplex.Game.Clans/plugin.yml | 2 +- .../src/mineplex/game/clans/Clans.java | 8 +- .../game/clans/clans/ClansBetaManager.java | 27 --- .../mineplex/game/clans/clans/ClansGame.java | 18 -- .../game/clans/clans/ClansManager.java | 14 +- .../clans/clans/banners/BannerManager.java | 21 +- .../clans/clans/commands/ClansCommand.java | 6 + .../clans/clans/nether/NetherManager.java | 174 ++++++--------- .../game/clans/clans/nether/NetherPortal.java | 23 +- .../clans/clans/nether/PortalRepository.java | 93 ++++++++ .../clans/nether/command/DeleteCommand.java | 15 +- .../nether/command/ForceTeleportCommand.java | 6 +- .../nether/miniboss/MinibossFireball.java | 4 +- .../miniboss/NetherMinibossManager.java | 67 ++++-- .../nether/miniboss/bosses/GhastMiniboss.java | 23 +- .../scoreboard/ClansScoreboardManager.java | 2 +- .../elements/ScoreboardElementClan.java | 25 ++- .../elements/ScoreboardElementPlayer.java | 28 ++- .../game/clans/clans/siege/SiegeManager.java | 35 +-- .../siege/command/GiveWeaponCommand.java | 26 +++ .../clans/siege/weapon/projectile/Crater.java | 137 +----------- .../game/clans/clans/war/WarManager.java | 207 +++++++++--------- .../war/{WarInvasion.java => WarSiege.java} | 22 +- ...ionEndEvent.java => WarSiegeEndEvent.java} | 20 +- ...tartEvent.java => WarSiegeStartEvent.java} | 20 +- .../clans/worldevent/EventTerrainFinder.java | 131 +++++++---- .../clans/worldevent/WorldEventManager.java | 20 +- .../worldevent/command/StartCommand.java | 4 +- .../game/classcombat/item/ItemUsable.java | 5 +- .../game/core/boss/ironwizard/GolemBoss.java | 2 +- .../abilities/GolemDeadlyTremor.java | 2 +- .../core/boss/skeletonking/SkeletonBoss.java | 3 +- .../boss/skeletonking/SkeletonCreature.java | 1 - 33 files changed, 636 insertions(+), 555 deletions(-) delete mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansBetaManager.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/PortalRepository.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/command/GiveWeaponCommand.java rename Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/{WarInvasion.java => WarSiege.java} (54%) rename Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/{WarInvasionEndEvent.java => WarSiegeEndEvent.java} (52%) rename Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/{WarInvasionStartEvent.java => WarSiegeStartEvent.java} (51%) diff --git a/Plugins/Mineplex.Game.Clans/plugin.yml b/Plugins/Mineplex.Game.Clans/plugin.yml index 7365566e7..3bebeab2e 100644 --- a/Plugins/Mineplex.Game.Clans/plugin.yml +++ b/Plugins/Mineplex.Game.Clans/plugin.yml @@ -1,3 +1,3 @@ name: Clans main: mineplex.game.clans.Clans -version: 0.1 \ No newline at end of file +version: 1.0 \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java index 7612eaf8a..0fd3594cf 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -63,7 +63,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer; public class Clans extends JavaPlugin { - public static final String VERSION = "Beta 1.0"; + public static final String MAP = "Map 1"; private String WEB_CONFIG = "webServer"; // Modules @@ -201,8 +201,8 @@ public class Clans extends JavaPlugin getServer().getPluginManager().callEvent(new ServerShutdownEvent(this)); } - public static String version() + public static String getMap() { - return VERSION; + return MAP; } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansBetaManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansBetaManager.java deleted file mode 100644 index a669ca6f4..000000000 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansBetaManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package mineplex.game.clans.clans; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerJoinEvent; - -import mineplex.core.MiniPlugin; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.task.TaskManager; -import mineplex.game.clans.Clans; - -public class ClansBetaManager extends MiniPlugin -{ - public ClansBetaManager(ClansManager manager, TaskManager taskManager) - { - super("Clans Beta", manager.getPlugin()); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerJoin(final PlayerJoinEvent event) - { - UtilPlayer.message(event.getPlayer(), C.cDAquaB + "Welcome to Mineplex Clans " + Clans.VERSION); - - } - -} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java index 7ec9d898a..8784ee3f3 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java @@ -230,12 +230,6 @@ public class ClansGame extends MiniPlugin return; } - if (_clans.getWarManager().allowFromInvade(event.getBlock().getLocation(), event.getPlayer())) - { - // Allow because of invasion - return; - } - // Disallow event.setCancelled(true); @@ -287,12 +281,6 @@ public class ClansGame extends MiniPlugin Location loc = event.getClickedBlock().getRelative(event.getBlockFace()).getLocation(); if (UtilBlock.usable(event.getClickedBlock())) loc = event.getClickedBlock().getLocation(); - if (_clans.getWarManager().allowFromInvade(loc, event.getPlayer())) - { - // Allow because of invasion - return; - } - // Borderlands if (player.getGameMode() != GameMode.CREATIVE && player.getItemInHand() != null && _clans.getClanBlocks().denyUsePlace(player.getItemInHand().getTypeId()) && _clans.getClanUtility().isBorderlands(event.getClickedBlock().getLocation())) { @@ -564,12 +552,6 @@ public class ClansGame extends MiniPlugin ClanInfo clan = _clans.getClanUtility().getOwner(event.getEntity().getLocation()); if (clan == null) return; - - if (_clans.getWarManager().isBeingInvaded(clan)) - { - // Allow because of invasion - return; - } if (!clan.isProtected()) event.setCancelled(true); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java index 0aee9a4bb..a7c10a0df 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java @@ -325,8 +325,6 @@ public class ClansManager extends MiniClientPluginimplements IRelati new ClanEnergyTracker(plugin, this); // new StuckManager(this); - new ClansBetaManager(this, _taskManager); - new PotatoManager(plugin, this); new Weapon(plugin, energy); @@ -451,8 +449,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati for (Location location : welcomeHolograms) { Hologram hologram = new Hologram(hologramManager, location, - C.cGreenB + "Welcome to Clans Beta", - C.cWhite + "Please be aware there may be bugs", + C.cGreenB + "Welcome to Clans!", C.cWhite + "Type " + C.cYellow + "/clan" + C.cWhite + " to get started!" ); hologram.start(); @@ -663,6 +660,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati public void Join(PlayerJoinEvent event) { event.setJoinMessage(null); + UtilPlayer.message(event.getPlayer(), C.cDAquaB + "Welcome to Mineplex Clans!"); if (_incognitoManager.Get(event.getPlayer()).Status) { @@ -801,7 +799,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati continue; } - UtilPlayer.message(event.getPlayer(), F.main("Clans", "Server is on version: " + F.elem(Clans.version()))); + UtilPlayer.message(event.getPlayer(), F.main("Clans", "Server is running Mineplex Clans version " + _plugin.getDescription().getVersion() + "!")); event.setCancelled(true); } } @@ -1221,8 +1219,8 @@ public class ClansManager extends MiniClientPluginimplements IRelati if (online >= UtilServer.getServer().getMaxPlayers() && !rank.has(Rank.ADMIN) && !event.getPlayer().isWhitelisted() && !event.getPlayer().isOp()) { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans Beta is full! Try again soon"); - event.setKickMessage("Clans Beta is full! Try again soon"); + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "This Clans server is full! Try again soon"); + event.setKickMessage("This Clans server is full! Try again soon"); } else { @@ -1245,7 +1243,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati { if (event.getMessage().toLowerCase().equals("/lobby") || event.getMessage().toLowerCase().equals("/hub") || event.getMessage().toLowerCase().equals("/leave")) { - Portal.getInstance().sendPlayerToServer(event.getPlayer(), "Lobby"); + Portal.getInstance().sendPlayerToServer(event.getPlayer(), "ClansHub"); event.setCancelled(true); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/banners/BannerManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/banners/BannerManager.java index 9877b5c91..c5b168900 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/banners/BannerManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/banners/BannerManager.java @@ -4,14 +4,18 @@ import java.util.HashMap; import mineplex.core.MiniPlugin; import mineplex.core.common.Rank; +import mineplex.core.common.util.F; import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTime.TimeUnit; +import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.banners.command.BannerCommand; +import mineplex.game.clans.core.repository.ClanTerritory; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -91,11 +95,21 @@ public class BannerManager extends MiniPlugin public void placeBanner(Player placing, ClanBanner banner) { + if (!Recharge.Instance.use(placing, "Place Banner", 30000, true, false)) + { + return; + } Block block = placing.getLocation().getBlock(); - BlockPlaceEvent event = new BlockPlaceEvent(block, block.getState(), block, placing.getItemInHand(), placing, false); + BlockPlaceEvent event = new BlockPlaceEvent(block, block.getState(), block, placing.getItemInHand(), placing, true); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { + ClanTerritory claim = ClansManager.getInstance().getClanUtility().getClaim(block.getLocation()); + if (claim != null && !claim.Owner.equals(banner.getClan().getName())) + { + UtilPlayer.message(placing, F.main("Clans", "You cannot place your Clan Banner there.")); + return; + } ClansManager.getInstance().getBlockRestore().restore(block); if (block.getType() == Material.AIR && UtilBlock.fullSolid(block.getRelative(BlockFace.DOWN))) { @@ -106,6 +120,11 @@ public class BannerManager extends MiniPlugin state.update(); _placedBanners.put(block, System.currentTimeMillis()); } + else + { + UtilPlayer.message(placing, F.main("Clans", "You cannot place your Clan Banner there.")); + return; + } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java index 059e55d54..fa710b71f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java @@ -349,6 +349,12 @@ public class ClansCommand extends CommandBase return; } + if (Plugin.getTutorial().inTutorial(caller)) + { + UtilPlayer.message(caller, F.main("Clans", "You cannot invite others while in a tutorial.")); + return; + } + if (args.length < 2) { UtilPlayer.message(caller, F.main("Clans", "You did not input an invitee.")); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherManager.java index dc79d705a..50b4c210b 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherManager.java @@ -1,7 +1,6 @@ package mineplex.game.clans.clans.nether; -import java.io.File; -import java.io.IOException; +import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -40,8 +39,6 @@ import org.bukkit.World; import org.bukkit.WorldBorder; import org.bukkit.WorldCreator; import org.bukkit.block.Block; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -55,6 +52,8 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import com.google.common.collect.Lists; @@ -64,12 +63,11 @@ public class NetherManager extends MiniPlugin private static final String CLAIM_WAND_NAME = C.cRedB + "Portal Claim Wand"; private static final String[] CLAIM_WAND_LORE = new String[] {C.cYellow + "Left Click to select the Portal's first corner", C.cYellow + "Right Click to select the Portal's second corner"}; private static final ItemStack CLAIM_WAND = new ItemBuilder(Material.WOOD_AXE).setTitle(CLAIM_WAND_NAME).setLore(CLAIM_WAND_LORE).build(); + private PortalRepository _repo; private NetherMinibossManager _miniboss; private World _netherWorld; - public List Portals = Lists.newArrayList(); + private List _portals = Lists.newArrayList(); private List _returnPortals = Lists.newArrayList(); - private File _portalCfg; - private YamlConfiguration _portalConfig; public HashMap InNether = new HashMap<>(); public HashMap OverworldOrigins = new HashMap<>(); public HashMap Claiming = new HashMap<>(); @@ -78,21 +76,6 @@ public class NetherManager extends MiniPlugin { super("Nether", manager.getPlugin()); - _portalCfg = new File(UtilServer.getServer().getWorlds().get(0).getWorldFolder().getPath() + File.separator + ".." + File.separator + "portals.yml"); - - try - { - if (!_portalCfg.exists()) - { - _portalCfg.createNewFile(); - } - _portalConfig = YamlConfiguration.loadConfiguration(_portalCfg); - } - catch (Exception e) - { - e.printStackTrace(); - } - begin(); _miniboss = new NetherMinibossManager(this); addCommand(new PortalCommand(this)); @@ -108,59 +91,24 @@ public class NetherManager extends MiniPlugin Bukkit.createWorld(creator); } _netherWorld = Bukkit.getWorld("nether"); - + _netherWorld.setSpawnLocation(43, 135, 113); WorldBorder worldBorder = _netherWorld.getWorldBorder(); worldBorder.setCenter(0, 0); - worldBorder.setSize(200 * 2); + worldBorder.setSize(800 * 2); + _repo = new PortalRepository(getPlugin(), this); loadPortals(); } private void loadPortals() { - try - { - if (!_portalConfig.isInt("PortalCount")) - { - _portalConfig.set("PortalCount", 0); - _portalConfig.save(_portalCfg); - } - - log("Loading " + _portalConfig.getInt("PortalCount") + " Nether Portals!"); - ConfigurationSection portalSection = _portalConfig.getConfigurationSection("Portals"); - for (String portalSectionPath : portalSection.getKeys(false)) - { - ConfigurationSection portal = portalSection.getConfigurationSection(portalSectionPath); - Location firstCorner = UtilWorld.strToLoc(portal.getString("CornerOne")); - Location secondCorner = UtilWorld.strToLoc(portal.getString("CornerTwo")); - boolean returnPortal = portal.getBoolean("ReturnPortal"); - - NetherPortal netherPortal = new NetherPortal(firstCorner, secondCorner, returnPortal); - Portals.add(netherPortal); - if (returnPortal) - { - _returnPortals.add(netherPortal); - } - } - } - catch (Exception e) - { - e.printStackTrace(); - } + _repo.loadPortals(); } @Override public void disable() { closePortals(); - try - { - savePortals(); - } - catch (IOException e) - { - e.printStackTrace(); - } for (Player player : InNether.keySet()) { player.teleport(Spawn.getNorthSpawn()); @@ -188,14 +136,55 @@ public class NetherManager extends MiniPlugin return OverworldOrigins.getOrDefault(player, Spawn.getNorthSpawn()); } + public NetherPortal getPortal(int id) + { + for (NetherPortal portal : _portals) + { + if (portal.getId() == id) + { + return portal; + } + } + + return null; + } + + public void addPortal(NetherPortal portal) + { + _portals.add(portal); + if (portal.isReturnPortal()) + { + _returnPortals.add(portal); + } + _portals.sort(new Comparator() + { + public int compare(NetherPortal o1, NetherPortal o2) + { + if (o1.getId() > o2.getId()) + { + return 1; + } + return -1; + } + }); + } + + public void deletePortal(NetherPortal portal) + { + portal.close(); + _portals.remove(portal); + _returnPortals.remove(portal); + _repo.deletePortal(portal.getId()); + } + public void spawnPortal(long duration) { - if (Portals.isEmpty() || _returnPortals.isEmpty()) + if (_portals.isEmpty() || _returnPortals.isEmpty()) { return; } List available = Lists.newArrayList(); - available.addAll(Portals); + available.addAll(_portals); for (NetherPortal remove : _returnPortals) { available.remove(remove); @@ -228,28 +217,13 @@ public class NetherManager extends MiniPlugin } ClaimData data = Claiming.remove(creator); - NetherPortal portal = new NetherPortal(data.getFirstCorner().getLocation(), data.getSecondCorner().getLocation(), returnPortal); - Portals.add(portal); - if (returnPortal) - { - _returnPortals.add(portal); - } - - try - { - savePortals(); - UtilPlayer.message(creator, F.main(getName(), "Portal successfully created!")); - } - catch (Exception e) - { - UtilPlayer.message(creator, F.main(getName(), "An error occurred while creating that portal! Please report this immediately!")); - return; - } + _repo.addPortal(UtilWorld.locToStr(data.getFirstCorner().getLocation()), UtilWorld.locToStr(data.getSecondCorner().getLocation()), returnPortal); + UtilPlayer.message(creator, F.main(getName(), "Portal successfully created!")); } public void closePortals() { - for (NetherPortal portal : Portals) + for (NetherPortal portal : _portals) { portal.close(); } @@ -258,12 +232,9 @@ public class NetherManager extends MiniPlugin public void showPortalList(Player player) { UtilPlayer.message(player, F.main(getName(), "Portal List:")); - for (int i = 0; i < Portals.size(); i++) - { - int id = i + 1; - NetherPortal portal = Portals.get(i); - - UtilPlayer.message(player, C.cBlue + "- " + F.elem("Portal " + id + ": " + C.cGray + UtilWorld.locToStrClean(portal.getLocation()).replace("(", "").replace(")", ""))); + for (NetherPortal portal : _portals) + { + UtilPlayer.message(player, C.cBlue + "- " + F.elem("Portal " + portal.getId() + ": " + C.cGray + UtilWorld.locToStrClean(portal.getLocation()).replace("(", "").replace(")", ""))); } } @@ -273,22 +244,6 @@ public class NetherManager extends MiniPlugin UtilPlayer.message(player, F.main(getName(), "You have been given a Portal Claim Wand!")); } - public void savePortals() throws IOException - { - _portalConfig.set("PortalCount", Portals.size()); - _portalConfig.set("Portals", null); - _portalConfig.createSection("Portals"); - for (int i = 0; i < Portals.size(); i++) - { - Integer id = i + 1; - _portalConfig.set("Portals." + id.toString() + ".CornerOne", UtilWorld.locToStr(Portals.get(i).getCorners()[0])); - _portalConfig.set("Portals." + id.toString() + ".CornerTwo", UtilWorld.locToStr(Portals.get(i).getCorners()[1])); - _portalConfig.set("Portals." + id.toString() + ".ReturnPortal", Portals.get(i).isReturnPortal()); - } - - _portalConfig.save(_portalCfg); - } - @EventHandler public void breakBlock(BlockBreakEvent event) { @@ -342,6 +297,7 @@ public class NetherManager extends MiniPlugin InNether.remove(event.getPlayer()); event.getPlayer().teleport(getReturnLocation(event.getPlayer())); OverworldOrigins.remove(event.getPlayer()); + event.getPlayer().removePotionEffect(PotionEffectType.NIGHT_VISION); UtilPlayer.message(event.getPlayer(), F.main(getName(), "You have escaped " + F.clansNether("The Nether") + "!")); }, 1); } @@ -368,9 +324,18 @@ public class NetherManager extends MiniPlugin { player.teleport(getReturnLocation(player)); OverworldOrigins.remove(player); + player.removePotionEffect(PotionEffectType.NIGHT_VISION); UtilPlayer.message(player, F.main(getName(), "You have been forced to escape " + F.clansNether("The Nether") + " to survive its demonic poisons!")); } } + else + { + if (!player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) + { + int ticks = (int)((InNether.get(player) - System.currentTimeMillis()) / 1000) * 20; + player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, ticks, 0)); + } + } } UtilServer.getPlayersCollection() @@ -391,12 +356,13 @@ public class NetherManager extends MiniPlugin InNether.remove(event.getPlayer()); event.getPlayer().teleport(getReturnLocation(event.getPlayer())); OverworldOrigins.remove(event.getPlayer()); + event.getPlayer().removePotionEffect(PotionEffectType.NIGHT_VISION); } Claiming.remove(event.getPlayer()); } @EventHandler(priority = EventPriority.LOWEST) - public void onQuit(PlayerDeathEvent event) + public void onDie(PlayerDeathEvent event) { InNether.remove(event.getEntity()); OverworldOrigins.remove(event.getEntity()); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherPortal.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherPortal.java index fa6e8c14b..d1def8de8 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherPortal.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/NetherPortal.java @@ -23,12 +23,15 @@ import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.entity.EntityPortalEnterEvent; import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.potion.PotionEffectType; import com.google.common.collect.Lists; public class NetherPortal implements Listener { private static final int SECONDS_UNTIL_PORTAL = 5; + private int _id; private List _frame = Lists.newArrayList(); private List _portal = Lists.newArrayList(); private Location _loc; @@ -39,8 +42,9 @@ public class NetherPortal implements Listener public boolean Open = false; public long Expire = -1; - public NetherPortal(Location firstCorner, Location secondCorner, boolean returnPortal) + public NetherPortal(int id, Location firstCorner, Location secondCorner, boolean returnPortal) { + _id = id; int maxX = Math.max(firstCorner.getBlockX(), secondCorner.getBlockX()); int minX = Math.min(firstCorner.getBlockX(), secondCorner.getBlockX()); int maxY = Math.max(firstCorner.getBlockY(), secondCorner.getBlockY()); @@ -99,6 +103,11 @@ public class NetherPortal implements Listener return _frame.contains(block) || _portal.contains(block); } + public int getId() + { + return _id; + } + public Location getLocation() { return _loc; @@ -148,7 +157,6 @@ public class NetherPortal implements Listener { Open = false; Expire = -1; - HandlerList.unregisterAll(this); for (Block block : _portal) { block.setType(Material.AIR); @@ -157,6 +165,7 @@ public class NetherPortal implements Listener { block.setType(Material.AIR); } + HandlerList.unregisterAll(this); } @EventHandler(priority = EventPriority.HIGHEST) @@ -204,6 +213,7 @@ public class NetherPortal implements Listener ClansManager.getInstance().getNetherManager().InNether.remove((Player)event.getEntity()); event.getEntity().teleport(ClansManager.getInstance().getNetherManager().getReturnLocation((Player)event.getEntity())); ClansManager.getInstance().getNetherManager().OverworldOrigins.remove((Player)event.getEntity()); + ((Player)event.getEntity()).removePotionEffect(PotionEffectType.NIGHT_VISION); UtilPlayer.message(event.getEntity(), F.main(ClansManager.getInstance().getNetherManager().getName(), "You have escaped " + F.clansNether("The Nether") + "!")); } else @@ -241,4 +251,13 @@ public class NetherPortal implements Listener close(); } } + + @EventHandler + public void onUnload(ChunkUnloadEvent event) + { + if (event.getChunk().getX() == _loc.getChunk().getX() && event.getChunk().getZ() == _loc.getChunk().getZ()) + { + event.setCancelled(true); + } + } } \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/PortalRepository.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/PortalRepository.java new file mode 100644 index 000000000..7a57e144a --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/PortalRepository.java @@ -0,0 +1,93 @@ +package mineplex.game.clans.clans.nether; + +import mineplex.core.common.util.UtilWorld; +import mineplex.core.database.MinecraftRepository; +import mineplex.serverdata.database.DBPool; +import mineplex.serverdata.database.column.ColumnBoolean; +import mineplex.serverdata.database.column.ColumnInt; +import mineplex.serverdata.database.column.ColumnVarChar; + +import org.bukkit.plugin.java.JavaPlugin; + +public class PortalRepository extends MinecraftRepository +{ + private static final String CREATE = "CREATE TABLE IF NOT EXISTS clansNetherPortals (id INT NOT NULL AUTO_INCREMENT," + + "cornerOne VARCHAR(30)," + + "cornerTwo VARCHAR(30)," + + "returnPortal BOOL," + + "PRIMARY KEY (id));"; + + private static final String GET_PORTALS = "SELECT * FROM clansNetherPortals;"; + private static final String INSERT_PORTAL = "INSERT INTO clansNetherPortals (cornerOne, cornerTwo, returnPortal) VALUES (?, ?, ?);"; + private static final String DELETE_PORTAL = "DELETE FROM clansNetherPortals WHERE id=?;"; + + private NetherManager _nether; + + public PortalRepository(JavaPlugin plugin, NetherManager portalManager) + { + super(plugin, DBPool.getAccount()); + + _nether = portalManager; + } + + public void loadPortals() + { + _nether.runAsync(() -> + { + executeQuery(GET_PORTALS, resultSet -> + { + while (resultSet.next()) + { + final int id = resultSet.getInt("id"); + final String cornerOne = resultSet.getString("cornerOne"); + final String cornerTwo = resultSet.getString("cornerTwo"); + final boolean returnPortal = resultSet.getBoolean("returnPortal"); + + _nether.runSync(() -> + { + NetherPortal portal = new NetherPortal(id, UtilWorld.strToLoc(cornerOne), UtilWorld.strToLoc(cornerTwo), returnPortal); + _nether.addPortal(portal); + }); + } + }); + }); + } + + public void addPortal(final String cornerOne, final String cornerTwo, final boolean returnPortal) + { + _nether.runAsync(() -> + { + executeInsert(INSERT_PORTAL, resultSet -> + { + while (resultSet.next()) + { + final int id = resultSet.getInt(1); + _nether.runSync(() -> + { + NetherPortal portal = new NetherPortal(id, UtilWorld.strToLoc(cornerOne), UtilWorld.strToLoc(cornerTwo), returnPortal); + _nether.addPortal(portal); + }); + } + }, new ColumnVarChar("cornerOne", 30, cornerOne), new ColumnVarChar("cornerTwo", 30, cornerTwo), new ColumnBoolean("returnPortal", returnPortal)); + }); + } + + public void deletePortal(final int id) + { + _nether.runAsync(() -> + { + executeUpdate(DELETE_PORTAL, new ColumnInt("id", id)); + }); + } + + @Override + protected void initialize() + { + executeUpdate(CREATE); + } + + @Override + protected void update() + { + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/DeleteCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/DeleteCommand.java index 2b6ac0f41..cb513218c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/DeleteCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/DeleteCommand.java @@ -5,6 +5,7 @@ import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.game.clans.clans.nether.NetherManager; +import mineplex.game.clans.clans.nether.NetherPortal; import org.bukkit.entity.Player; @@ -27,21 +28,13 @@ public class DeleteCommand extends CommandBase id = Integer.parseInt(args[0]); } catch (Exception e) {} - if (id == null || id > Plugin.Portals.size() || id < 1) + if (id == null || Plugin.getPortal(id) == null) { UtilPlayer.message(caller, F.main(Plugin.getName(), "Usage: " + F.elem("/portal " + _aliasUsed + " "))); return; } + NetherPortal portal = Plugin.getPortal(id); UtilPlayer.message(caller, F.main(Plugin.getName(), "Deleting the " + F.clansNether("Nether Portal") + " with ID " + id + "!")); - Plugin.Portals.remove(id - 1); - try - { - Plugin.savePortals(); - } - catch (Exception e) - { - UtilPlayer.message(caller, F.main(Plugin.getName(), "An error occurred while deleting that portal! Please report this immediately!")); - return; - } + Plugin.deletePortal(portal); } } \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/ForceTeleportCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/ForceTeleportCommand.java index 5640d6526..18ce12cc1 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/ForceTeleportCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/command/ForceTeleportCommand.java @@ -4,12 +4,15 @@ import mineplex.core.command.CommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.common.util.UtilTime.TimeUnit; import mineplex.game.clans.clans.ClanTips.TipType; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.nether.NetherManager; import mineplex.game.clans.spawn.Spawn; import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffectType; /** * Command to artificially portal @@ -38,6 +41,7 @@ public class ForceTeleportCommand extends CommandBase Plugin.InNether.remove(caller); caller.teleport(Plugin.getReturnLocation(caller)); Plugin.OverworldOrigins.remove(caller); + caller.removePotionEffect(PotionEffectType.NIGHT_VISION); UtilPlayer.message(caller, F.main(ClansManager.getInstance().getNetherManager().getName(), "You have escaped " + F.clansNether("The Nether") + "!")); } else @@ -49,7 +53,7 @@ public class ForceTeleportCommand extends CommandBase { if (natural) { - Plugin.InNether.put(caller, System.currentTimeMillis()); + Plugin.InNether.put(caller, System.currentTimeMillis() + UtilTime.convert(10, TimeUnit.MINUTES, TimeUnit.MILLISECONDS)); Plugin.OverworldOrigins.put(caller, caller.getLocation()); caller.teleport(Plugin.getNetherWorld().getSpawnLocation()); ClansManager.getInstance().ClanTips.displayTip(TipType.ENTER_NETHER, caller); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/MinibossFireball.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/MinibossFireball.java index 2df5fe663..e085b326b 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/MinibossFireball.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/MinibossFireball.java @@ -44,8 +44,8 @@ public class MinibossFireball implements Listener { double range = hitMap.get(cur); - ClansManager.getInstance().getCondition().Factory().Ignite("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0)), 7 * range, false, false); - ClansManager.getInstance().getCondition().Factory().Falling("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0)), 10, false, true); + ClansManager.getInstance().getCondition().Factory().Ignite("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0).value()), 7 * range, false, false); + ClansManager.getInstance().getCondition().Factory().Falling("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0).value()), 10, false, true); UtilAction.velocity(cur, UtilAlg.getTrajectory(proj.getLocation().add(0, -0.5, 0), cur.getEyeLocation()), 1.6 * range, false, 0, 0.8 * range, 1.2, true); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/NetherMinibossManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/NetherMinibossManager.java index d486c3188..3d4da1f7e 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/NetherMinibossManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/NetherMinibossManager.java @@ -1,16 +1,18 @@ package mineplex.game.clans.clans.nether.miniboss; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; import mineplex.core.common.util.UtilMath; -import mineplex.core.recharge.Recharge; +import mineplex.core.common.util.UtilTime; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.nether.NetherManager; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntitySpawnEvent; @@ -19,23 +21,60 @@ import com.google.common.collect.Lists; public class NetherMinibossManager implements Listener { - private static final long TIME_BETWEEN_MINIBOSS_TARGET_PLAYER = 10000; + private static final long MINIBOSS_SPAWN_RATE = 10000; private NetherManager _manager; + private HashMap _spawns = new HashMap<>(); + private long _lastSpawned; private boolean _allowSpawn = false; public NetherMinibossManager(NetherManager manager) { _manager = manager; new MinibossFireball(); - Bukkit.getPluginManager().registerEvents(this, manager.getPlugin()); + manager.runSyncLater(() -> + { + List sort = Lists.newArrayList(); + sort.add(new Location(manager.getNetherWorld(), -18, 142, 61)); + sort.add(new Location(manager.getNetherWorld(), -39, 133, -25)); + sort.add(new Location(manager.getNetherWorld(), -102, 133, -99)); + sort.add(new Location(manager.getNetherWorld(), -27, 141, -140)); + sort.add(new Location(manager.getNetherWorld(), 32, 143, -95)); + sort.add(new Location(manager.getNetherWorld(), 43, 134, 22)); + sort.add(new Location(manager.getNetherWorld(), 102, 141, -31)); + sort.add(new Location(manager.getNetherWorld(), 151, 136, 34)); + sort.sort(new Comparator() + { + public int compare(Location o1, Location o2) + { + if (UtilMath.offset2d(o1, manager.getNetherWorld().getSpawnLocation()) < UtilMath.offset(o2, manager.getNetherWorld().getSpawnLocation())) + { + return -1; + } + return 1; + } + }); + for (int i = 0; i < 3; i++) + { + _spawns.put(sort.get(i).add(0.5, 1.5, 0.5), NetherMinibossType.ARCHER); + } + for (int i = 3; i < 6; i++) + { + _spawns.put(sort.get(i).add(0.5, 1.5, 0.5), NetherMinibossType.WARRIOR); + } + for (int i = 6; i < 8; i++) + { + _spawns.put(sort.get(i).add(0.5, 1.5, 0.5), NetherMinibossType.GHAST); + } + Bukkit.getPluginManager().registerEvents(this, manager.getPlugin()); + }, 20L); } - private void spawnAttacker(Player player) + private void spawnAttacker(Location loc) { - NetherMinibossType bossType = NetherMinibossType.values()[UtilMath.r(NetherMinibossType.values().length)]; + NetherMinibossType bossType = _spawns.get(loc); _allowSpawn = true; - bossType.getNewInstance(player.getLocation()); + bossType.getNewInstance(loc); _allowSpawn = false; } @@ -59,18 +98,12 @@ public class NetherMinibossManager implements Listener return; } - List targets = Lists.newArrayList(); - targets.addAll(_manager.InNether.keySet()); - - for (Player player : targets) + if (!_manager.InNether.isEmpty() && UtilTime.elapsed(_lastSpawned, MINIBOSS_SPAWN_RATE)) { - if (player.isDead() || !player.isValid()) + _lastSpawned = System.currentTimeMillis(); + for (Location spawn : _spawns.keySet()) { - continue; - } - if (_manager.isInNether(player) && Recharge.Instance.use(player, "Nether Miniboss Spawn", TIME_BETWEEN_MINIBOSS_TARGET_PLAYER, false, false)) - { - spawnAttacker(player); + spawnAttacker(spawn); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/bosses/GhastMiniboss.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/bosses/GhastMiniboss.java index 79d2ae5ea..150814f82 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/bosses/GhastMiniboss.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/nether/miniboss/bosses/GhastMiniboss.java @@ -2,17 +2,21 @@ package mineplex.game.clans.clans.nether.miniboss.bosses; import java.util.Random; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.nether.miniboss.MinibossFireball; import mineplex.game.clans.clans.nether.miniboss.NetherMiniBoss; import mineplex.game.clans.items.runes.RuneManager.RuneAttribute; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Ghast; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.inventory.ItemStack; @@ -80,7 +84,20 @@ public class GhastMiniboss extends NetherMiniBoss @Override public void update() { - tryFireballVolley(); + Player target = null; + for (Player test : UtilPlayer.getInRadius(getEntity().getLocation(), 25).keySet()) + { + if (test.getGameMode() == GameMode.SURVIVAL && !ClansManager.getInstance().getIncognitoManager().Get(test).Hidden) + { + target = test; + break; + } + } + if (target != null) + { + UtilEnt.LookAt(getEntity(), target.getLocation()); + tryFireballVolley(); + } } @EventHandler @@ -88,10 +105,6 @@ public class GhastMiniboss extends NetherMiniBoss { if (event.getEntity().getShooter() != null && event.getEntity().getShooter().equals(getEntity())) { - if (!MinibossFireball.isFireball(event.getEntity())) - { - event.setCancelled(true); - } ClansManager.getInstance().runSyncLater(() -> { if (event.getEntity() == null || event.getEntity().isDead() || !event.getEntity().isValid()) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java index de615ec5f..a1fe7a874 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java @@ -44,7 +44,7 @@ public class ClansScoreboardManager extends ScoreboardManager private void init() { - setTitle("Clans " + Clans.VERSION); + setTitle("Clans " + Clans.getMap()); ScoreboardData data = getData("default", true); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java index 5252cb23d..1227c8edb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementClan.java @@ -1,10 +1,7 @@ package mineplex.game.clans.clans.scoreboard.elements; -import java.util.ArrayList; import java.util.List; -import org.bukkit.entity.Player; - import mineplex.core.common.util.C; import mineplex.core.common.util.UtilTime; import mineplex.core.scoreboard.ScoreboardManager; @@ -12,6 +9,10 @@ import mineplex.core.scoreboard.elements.ScoreboardElement; import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansManager; +import org.bukkit.entity.Player; + +import com.google.common.collect.Lists; + public class ScoreboardElementClan implements ScoreboardElement { private ClansManager _clansManager; @@ -24,22 +25,28 @@ public class ScoreboardElementClan implements ScoreboardElement @Override public List getLines(ScoreboardManager manager, Player player, List out) { - List output = new ArrayList(); + List output = Lists.newArrayList(); ClanInfo clanInfo = _clansManager.getClan(player); if (clanInfo != null) { - output.add(C.cYellow + "Clan " + C.cWhite + clanInfo.getName()); - output.add(C.cYellow + "Online " + C.cWhite + clanInfo.getOnlinePlayers().size() + "/" + clanInfo.getMembers().size()); - + output.add(C.cYellowB + "Clan"); + output.add(_clansManager.getClanUtility().mRel(_clansManager.getRelation(player, player), clanInfo.getName(), false)); + output.add(" "); // Energy if (clanInfo.getEnergyCostPerMinute() > 0) - output.add(C.cYellow + "Energy " + C.cWhite + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT)); + { + output.add(C.cYellowB + "Clan Energy"); + output.add(C.cGreen + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT)); + output.add(" "); + } } else { - output.add(C.cYellow + "You are not in a Clan"); + output.add(C.cYellowB + "Clan"); + output.add("No Clan"); + output.add(" "); } return output; diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java index 5b6cb24f4..c514a2119 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayer.java @@ -5,6 +5,8 @@ import java.util.List; import org.bukkit.entity.Player; +import com.google.common.collect.Lists; + import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; import mineplex.core.scoreboard.ScoreboardManager; @@ -25,11 +27,14 @@ public class ScoreboardElementPlayer implements ScoreboardElement @Override public List getLines(ScoreboardManager manager, Player player, List out) { - List output = new ArrayList(); - output.add(C.cYellow + "Gold " + C.cWhite + manager.getDonation().Get(player).GetBalance(CurrencyType.GOLD) + ""); - String regionString = C.xWilderness + "Wilderness"; + List output = Lists.newArrayList(); + output.add(C.cYellowB + "Gold"); + output.add(C.cGold + manager.getDonation().Get(player).GetBalance(CurrencyType.GOLD)); - output.add(" "); + output.add(" "); + + output.add(C.cYellowB + "Territory"); + String regionString = C.xWilderness + "Wilderness"; ClanTerritory claim = _clansManager.getClanUtility().getClaim(player.getLocation()); if (claim != null) { @@ -41,17 +46,18 @@ public class ScoreboardElementPlayer implements ScoreboardElement //Trust if (relation == ClansUtility.ClanRelation.ALLY_TRUST) + { regionString += C.mBody + "(" + C.mElem + "Trusted" + C.mBody + ")"; - + } } -// if (_clansManager.getNetherManager().isInNether(player)) -// { -// regionString = C.cRed + "The Nether"; -// } + if (_clansManager.getNetherManager().isInNether(player)) + { + regionString = C.cClansNether + "The Nether"; + } output.add(regionString); - + return output; } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java index 1c26486b8..4c0b4939f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java @@ -1,15 +1,5 @@ package mineplex.game.clans.clans.siege; -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Slime; -import org.bukkit.event.EventHandler; -import org.bukkit.event.block.BlockPlaceEvent; - -import com.google.gson.Gson; - import mineplex.core.MiniPlugin; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; @@ -21,6 +11,7 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.clans.siege.command.GiveWeaponCommand; import mineplex.game.clans.clans.siege.outpost.OutpostManager; import mineplex.game.clans.clans.siege.repository.SiegeWeaponRepository; import mineplex.game.clans.clans.siege.repository.tokens.SiegeWeaponToken; @@ -30,6 +21,16 @@ import mineplex.game.clans.core.repository.ClanTerritory; import mineplex.game.clans.spawn.Spawn; import net.minecraft.server.v1_8_R3.Material; +import org.bukkit.Location; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Slime; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockPlaceEvent; + +import com.google.gson.Gson; + public class SiegeManager extends MiniPlugin { private ClansManager _clansManager; @@ -79,6 +80,8 @@ public class SiegeManager extends MiniPlugin }) ) ); + + addCommand(new GiveWeaponCommand(this)); } @EventHandler @@ -222,12 +225,12 @@ public class SiegeManager extends MiniPlugin public boolean trySpawnCannon(Player player, Location location) { -// if (_clansManager.getNetherManager().isInNether(player)) -// { -// _clansManager.message(player, "You are not allowed to place this in " + F.clansNether("The Nether") + "."); -// -// return false; -// } + if (_clansManager.getNetherManager().isInNether(player)) + { + _clansManager.message(player, "You are not allowed to place this in " + F.clansNether("The Nether") + "."); + + return false; + } if (!_clansManager.isInClan(player)) { diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/command/GiveWeaponCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/command/GiveWeaponCommand.java new file mode 100644 index 000000000..2a2589632 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/command/GiveWeaponCommand.java @@ -0,0 +1,26 @@ +package mineplex.game.clans.clans.siege.command; + +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilPlayer; +import mineplex.game.clans.clans.siege.SiegeManager; +import mineplex.game.clans.clans.siege.weapon.Cannon; + +public class GiveWeaponCommand extends CommandBase +{ + public GiveWeaponCommand(SiegeManager plugin) + { + super(plugin, Rank.ADMIN, "giveweapon", "siegeweapon", "givecannon"); + } + + @Override + public void Execute(Player caller, String[] args) + { + UtilInv.insert(caller, Cannon.CANNON_ITEM.clone()); + UtilPlayer.message(caller, F.main(Plugin.getName(), "You have been given a cannon!")); + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java index 7f270cd9a..883211b4f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java @@ -1,95 +1,24 @@ package mineplex.game.clans.clans.siege.weapon.projectile; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.Chest; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilItem; -import mineplex.core.common.util.UtilMath; -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.UtilServer; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; +import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; import mineplex.game.clans.core.repository.ClanTerritory; -import net.minecraft.server.v1_8_R3.Explosion; -public class Crater implements Listener +import org.bukkit.Location; + +public class Crater { - public static final Material CHARRED_TYPE = Material.OBSIDIAN; - private final SiegeWeapon _weapon; private final Location _origin; - private final long _birthTime; - - private final List _blocks; - public Crater(SiegeWeapon weapon, WeaponProjectile projectile, Location origin) { _weapon = weapon; _origin = origin; - - _birthTime = System.currentTimeMillis(); - _blocks = new ArrayList<>(); - - UtilServer.getPluginManager().registerEvents(this, _weapon.getClans().getPlugin()); - createExplosion(); } - @EventHandler - public void updateEffects(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - { - return; - } - - _blocks.stream().filter(block -> block.Type == CHARRED_TYPE).forEach(block -> { - long lifetime = System.currentTimeMillis() - _birthTime; - - long max = 80000; - - if (block.Location.getBlock().getType() != CHARRED_TYPE) - { - return; - } - - // Water touching the charred blocks - if (UtilBlock.getInRadius(block.Location, 1.6).keySet().stream().filter(water -> water.getType() == Material.WATER).iterator().hasNext()) - { - return; - } - - if (lifetime < max) - { - UtilParticle.PlayParticleToAll(ParticleType.FLAME, block.Location.clone().add(.5, 1, .5), new Vector(0, 0, 0), .0f, 3, ViewDist.MAX); - UtilParticle.PlayParticleToAll(lifetime >= max / 1.4 ? ParticleType.SMOKE : ParticleType.LARGE_SMOKE, block.Location.clone().add(.5, .8, .5), new Vector(0, 0, 0), .0f, 1, ViewDist.MAX); - } - else - { - HandlerList.unregisterAll(this); - } - }); - } - private void createExplosion() { ClanTerritory terr = _weapon.getClans().getClanUtility().getClaim(_origin); @@ -98,58 +27,12 @@ public class Crater implements Listener { return; } - - boolean explosion = _origin.getWorld().createExplosion(_origin, 2.6f); - - boolean floating = _origin.distance(UtilBlock.nearestFloor(_origin)) > 0.6; - - if (explosion) + ClanInfo clan = ClansManager.getInstance().getClanUtility().getOwner(terr); + if (clan != null && !ClansManager.getInstance().getWarManager().isBeingBesiegedBy(clan, _weapon.getOwner())) { - for (Block block : UtilBlock.getInRadius(_origin.getBlock(), 2.6f).keySet()) - { - boolean charred = false; - double dist = block.getLocation().distance(_origin); - - if (floating) - { - if (!block.getRelative(BlockFace.DOWN).getType().equals(CHARRED_TYPE) - && !block.getRelative(BlockFace.DOWN).getType().equals(Material.AIR) - && Math.random() > 0.79) - { - charred = true; - } - } - else - { - if (block.getRelative(BlockFace.UP).getType().equals(Material.AIR) - && !block.getRelative(BlockFace.DOWN).getType().equals(CHARRED_TYPE) - && !block.getRelative(BlockFace.DOWN).getType().equals(Material.AIR) - && Math.random() > 0.79) - { - charred = true; - } - } - - if (block.getType().equals(Material.SMOOTH_BRICK)) - { - charred = false; - } - - if (block.getType().equals(Material.BEDROCK)) - { - charred = false; - } - - if (charred) - { - CraterBlock charredBlock = new CraterBlock(block.getLocation(), dist, CHARRED_TYPE, (byte) 0); - - charredBlock.set(); - - _blocks.add(charredBlock); - } - } + return; } + + _origin.getWorld().createExplosion(_origin, 2.6f); } - -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java index 39a1e2680..1892dae30 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarManager.java @@ -7,12 +7,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.plugin.java.JavaPlugin; - import mineplex.core.MiniPlugin; import mineplex.core.common.util.C; import mineplex.core.common.util.Callback; @@ -31,10 +25,18 @@ import mineplex.game.clans.clans.ClansUtility; import mineplex.game.clans.clans.event.ClanDisbandedEvent; import mineplex.game.clans.clans.event.ClansPlayerDeathEvent; import mineplex.game.clans.clans.war.command.WarPointsCommand; -import mineplex.game.clans.clans.war.event.WarInvasionEndEvent; -import mineplex.game.clans.clans.war.event.WarInvasionStartEvent; +import mineplex.game.clans.clans.war.event.WarSiegeEndEvent; +import mineplex.game.clans.clans.war.event.WarSiegeStartEvent; import mineplex.game.clans.core.war.ClanWarData; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.plugin.java.JavaPlugin; + public class WarManager extends MiniPlugin implements ScoreboardElement { public static final int WAR_START_POINTS = 0; @@ -45,18 +47,17 @@ public class WarManager extends MiniPlugin implements ScoreboardElement private final ClansManager _clansManager; /** - * Map of the active war invasions. This is indexed by the clan that is being invaded on - * We will need to access this when blocks are broken in the invaded on clan's land! + * Map of the active war sieges. This is indexed by the clan that is being besieged */ - private Map> _invadedMap; - private Map> _invaderMap; + private Map> _besiegedMap; + private Map> _besiegerMap; public WarManager(JavaPlugin plugin, ClansManager clansManager) { super("ClanWar Manager", plugin); _clansManager = clansManager; - _invadedMap = new HashMap>(); - _invaderMap = new HashMap>(); + _besiegedMap = new HashMap<>(); + _besiegerMap = new HashMap<>(); } public ClansManager getClansManager() @@ -64,41 +65,38 @@ public class WarManager extends MiniPlugin implements ScoreboardElement return _clansManager; } - public List getInvasionsOn(ClanInfo invaded) + public List getSiegesOn(ClanInfo besieged) { - return _invadedMap.get(invaded.getName()); + return _besiegedMap.get(besieged.getName()); } - public List getInvasionsFor(ClanInfo invader) + public List getSiegesFor(ClanInfo besieger) { - return _invaderMap.get(invader.getName()); + return _besiegerMap.get(besieger.getName()); } - public boolean isBeingInvaded(ClanInfo clanInfo) + public boolean isBeingBesieged(ClanInfo clanInfo) { - List invasions = _invadedMap.get(clanInfo.getName()); - return invasions != null && !invasions.isEmpty(); + List sieges = _besiegedMap.get(clanInfo.getName()); + return sieges != null && !sieges.isEmpty(); } - public boolean isInvading(ClanInfo clanInfo) + public boolean isBesieging(ClanInfo clanInfo) { - List invasions = _invaderMap.get(clanInfo.getName()); - return invasions != null && !invasions.isEmpty(); + List sieges = _besiegerMap.get(clanInfo.getName()); + return sieges != null && !sieges.isEmpty(); } - - public boolean allowFromInvade(Location location, Player player) + + public boolean isBeingBesiegedBy(ClanInfo besieged, ClanInfo besieger) { - ClanInfo clanInfo = _clansManager.getClanUtility().getOwner(location); - ClanInfo playerClan = _clansManager.getClan(player); - if (clanInfo != null) + List sieges = _besiegedMap.get(besieged.getName()); + if (sieges != null && !sieges.isEmpty()) { - List invasions = _invadedMap.get(clanInfo.getName()); - if (invasions != null) + for (WarSiege siege : sieges) { - for (WarInvasion invasion : invasions) + if (siege.getBesiegingClan().equals(besieger.getName())) { - if (invasion.getInvaderClan().equals(playerClan.getName())) - return true; + return true; } } } @@ -106,14 +104,6 @@ public class WarManager extends MiniPlugin implements ScoreboardElement return false; } - /** - * Clear all invasions against clan. This is typically used for when a clan is deleted - */ -// public void clearInvasions(String clan) -// { -// List invasions = -// } - @EventHandler public void handleDeath(final ClansPlayerDeathEvent event) { @@ -184,106 +174,107 @@ public class WarManager extends MiniPlugin implements ScoreboardElement private void checkWarComplete(ClanWarData war) { - String invaderClan = null; - String invadedClan = null; + String besiegerClan = null; + String besiegedClan = null; if (war.getClanAPoints() >= WAR_FINISH_POINTS) { - // Clan A invades Clan B - invaderClan = war.getClanA(); - invadedClan = war.getClanB(); + besiegerClan = war.getClanA(); + besiegedClan = war.getClanB(); } else if (war.getClanBPoints() >= WAR_FINISH_POINTS) { - // Clan B invades Clan A - invaderClan = war.getClanB(); - invadedClan = war.getClanA(); + besiegerClan = war.getClanB(); + besiegedClan = war.getClanA(); } - if (invadedClan != null && invaderClan != null) + if (besiegedClan != null && besiegerClan != null) { // Reset War to 0:0 war.resetPoints(); war.setCooldown(WAR_COOLDOWN); - WarInvasion invasion = new WarInvasion(invadedClan, invaderClan); - startInvasion(invasion); + WarSiege siege = new WarSiege(besiegedClan, besiegerClan); + startSiege(siege); } } - private void startInvasion(WarInvasion invasion) + private void startSiege(WarSiege siege) { - String invaded = invasion.getInvadedClan(); - String invader = invasion.getInvaderClan(); + String besieged = siege.getBesiegedClan(); + String besieger = siege.getBesiegingClan(); - addInvasion(invaded, invasion, _invadedMap); - addInvasion(invader, invasion, _invaderMap); + addSiege(besieged, siege, _besiegedMap); + addSiege(besieger, siege, _besiegerMap); - WarInvasionStartEvent event = new WarInvasionStartEvent(invasion); + WarSiegeStartEvent event = new WarSiegeStartEvent(siege); UtilServer.getServer().getPluginManager().callEvent(event); } - private void addInvasion(String name, WarInvasion invasion, Map> invasionMap) + private void addSiege(String name, WarSiege siege, Map> siegeMap) { - if (invasionMap.containsKey(name)) + if (siegeMap.containsKey(name)) { - invasionMap.get(name).add(invasion); + siegeMap.get(name).add(siege); } else { - LinkedList invasions = new LinkedList(); - invasions.add(invasion); - invasionMap.put(name, invasions); + LinkedList sieges = new LinkedList<>(); + sieges.add(siege); + siegeMap.put(name, sieges); } } @EventHandler - public void clearInvasions(UpdateEvent event) + public void clearSieges(UpdateEvent event) { if (event.getType() != UpdateType.SEC) return; long currentTime = System.currentTimeMillis(); - Iterator>> iterator = _invadedMap.entrySet().iterator(); + Iterator>> iterator = _besiegedMap.entrySet().iterator(); while (iterator.hasNext()) { - List invasions = iterator.next().getValue(); - Iterator invasionIterator = invasions.iterator(); - while (invasionIterator.hasNext()) + List sieges = iterator.next().getValue(); + Iterator siegeIterator = sieges.iterator(); + while (siegeIterator.hasNext()) { - WarInvasion invasion = invasionIterator.next(); - if (currentTime >= invasion.getEndTime()) + WarSiege siege = siegeIterator.next(); + if (currentTime >= siege.getEndTime()) { - WarInvasionEndEvent endEvent = new WarInvasionEndEvent(invasion); + WarSiegeEndEvent endEvent = new WarSiegeEndEvent(siege); Bukkit.getServer().getPluginManager().callEvent(endEvent); - List invaderList = _invaderMap.get(invasion.getInvaderClan()); - if (invaderList != null) + List besiegerList = _besiegerMap.get(siege.getBesiegingClan()); + if (besiegerList != null) { - invaderList.remove(invasion); - if (invaderList.isEmpty()) _invaderMap.remove(invasion.getInvaderClan()); + besiegerList.remove(siege); + if (besiegerList.isEmpty()) + { + _besiegerMap.remove(siege.getBesiegingClan()); + } } - invasionIterator.remove(); + siegeIterator.remove(); } } - if (invasions.isEmpty()) + if (sieges.isEmpty()) iterator.remove(); } } @EventHandler - public void onInvasionStart(WarInvasionStartEvent event) + public void onSiegeStart(WarSiegeStartEvent event) { - Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + " can now invade " + F.elem(event.getWarInvasion().getInvadedClan()))); + Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarSiege().getBesiegingClan()) + " can now besiege " + F.elem(event.getWarSiege().getBesiegedClan()))); } @EventHandler - public void onInvasionEnd(WarInvasionEndEvent event) + public void onSiegeEnd(WarSiegeEndEvent event) { - Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + "'s invasion against " + F.elem(event.getWarInvasion().getInvadedClan()) + " has ended.")); + Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarSiege().getBesiegingClan()) + "'s siege against " + F.elem(event.getWarSiege().getBesiegedClan()) + " has ended.")); } @@ -297,9 +288,29 @@ public class WarManager extends MiniPlugin implements ScoreboardElement public void cancelDisband(ClanDisbandedEvent event) { ClanInfo clan = event.getClan(); - if (isBeingInvaded(clan) || isInvading(clan)) + if (isBeingBesieged(clan) || isBesieging(clan)) + { + UtilPlayer.message(event.getDisbander(), F.main("Clans", "Clans cannot be disbanded in the middle of a siege")); + event.setCancelled(true); + } + } + + @EventHandler + public void onPlaceTNT(BlockPlaceEvent event) + { + if (event.getBlockPlaced().getType() == Material.TNT) + { + event.setCancelled(true); + event.setBuild(false); + UtilPlayer.message(event.getPlayer(), F.main("Clans", "TNT cannot be used outside of a siege cannon!")); + } + } + + @EventHandler + public void onTNTDispense(BlockDispenseEvent event) + { + if (event.getItem().getType() == Material.TNT) { - UtilPlayer.message(event.getDisbander(), F.main("Clans", "Clans cannot be disbanded in the middle of an invasion")); event.setCancelled(true); } } @@ -313,32 +324,32 @@ public class WarManager extends MiniPlugin implements ScoreboardElement if (clan != null) { - List invadedList = _invadedMap.get(clan.getName()); - List invaderList = _invaderMap.get(clan.getName()); + List besiegedList = _besiegedMap.get(clan.getName()); + List besiegerList = _besiegerMap.get(clan.getName()); - if (invaderList != null && !invaderList.isEmpty()) + if (besiegerList != null && !besiegerList.isEmpty()) { - for (WarInvasion invasion : invaderList) + for (WarSiege siege : besiegerList) { element.add(" "); - element.add(C.cPurpleB + "Invading"); - element.add(" " + invasion.getInvadedClan()); - element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); + element.add(C.cPurpleB + "Besieging"); + element.add(" " + siege.getBesiegedClan()); + element.add(" " + UtilTime.convertString(siege.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); } } - if (invadedList != null && !invadedList.isEmpty()) + if (besiegedList != null && !besiegedList.isEmpty()) { - for (WarInvasion invasion : invadedList) + for (WarSiege siege : besiegedList) { element.add(" "); - element.add(C.cRedB + "Invaded"); - element.add(" " + invasion.getInvaderClan()); - element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); + element.add(C.cRedB + "Besieged"); + element.add(" " + siege.getBesiegingClan()); + element.add(" " + UtilTime.convertString(siege.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); } } } return element; } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarInvasion.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarSiege.java similarity index 54% rename from Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarInvasion.java rename to Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarSiege.java index 1358aa376..12f124c72 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarInvasion.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/WarSiege.java @@ -1,16 +1,16 @@ package mineplex.game.clans.clans.war; -public class WarInvasion +public class WarSiege { - private String _invadedClan; - private String _invaderClan; + private String _besiegedClan; + private String _besiegingClan; private long _startTime; private long _endTime; - public WarInvasion(String invadedClan, String invaderClan) + public WarSiege(String besiegedClan, String besiegingClan) { - _invadedClan = invadedClan; - _invaderClan = invaderClan; + _besiegedClan = besiegedClan; + _besiegingClan = besiegingClan; _startTime = System.currentTimeMillis(); _endTime = _startTime + WarManager.INVADE_LENGTH; } @@ -20,14 +20,14 @@ public class WarInvasion return _endTime - System.currentTimeMillis(); } - public String getInvadedClan() + public String getBesiegedClan() { - return _invadedClan; + return _besiegedClan; } - public String getInvaderClan() + public String getBesiegingClan() { - return _invaderClan; + return _besiegingClan; } public long getStartTime() @@ -39,4 +39,4 @@ public class WarInvasion { return _endTime; } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarInvasionEndEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarSiegeEndEvent.java similarity index 52% rename from Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarInvasionEndEvent.java rename to Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarSiegeEndEvent.java index 048ed8dd1..dcd300afb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarInvasionEndEvent.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarSiegeEndEvent.java @@ -1,29 +1,29 @@ package mineplex.game.clans.clans.war.event; +import mineplex.game.clans.clans.war.WarSiege; + import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import mineplex.game.clans.clans.war.WarInvasion; - /** - * Called when a war invasion is ended + * Called when a war siege is ended */ -public class WarInvasionEndEvent extends Event +public class WarSiegeEndEvent extends Event { - private WarInvasion _warInvasion; + private WarSiege _warSiege; - public WarInvasionEndEvent(WarInvasion warInvasion) + public WarSiegeEndEvent(WarSiege warSiege) { - _warInvasion = warInvasion; + _warSiege = warSiege; } - public WarInvasion getWarInvasion() + public WarSiege getWarSiege() { - return _warInvasion; + return _warSiege; } // Bukkit event stuff private static final HandlerList handlers = new HandlerList(); public static HandlerList getHandlerList() { return handlers; } public HandlerList getHandlers() { return handlers; } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarInvasionStartEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarSiegeStartEvent.java similarity index 51% rename from Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarInvasionStartEvent.java rename to Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarSiegeStartEvent.java index 9f3d10f0b..30e7d2d79 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarInvasionStartEvent.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/war/event/WarSiegeStartEvent.java @@ -1,29 +1,29 @@ package mineplex.game.clans.clans.war.event; +import mineplex.game.clans.clans.war.WarSiege; + import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import mineplex.game.clans.clans.war.WarInvasion; - /** - * Called when a war invasion is started + * Called when a war siege is started */ -public class WarInvasionStartEvent extends Event +public class WarSiegeStartEvent extends Event { - private WarInvasion _warInvasion; + private WarSiege _warSiege; - public WarInvasionStartEvent(WarInvasion warInvasion) + public WarSiegeStartEvent(WarSiege warSiege) { - _warInvasion = warInvasion; + _warSiege = warSiege; } - public WarInvasion getWarInvasion() + public WarSiege getWarSiege() { - return _warInvasion; + return _warSiege; } // Bukkit event stuff private static final HandlerList handlers = new HandlerList(); public static HandlerList getHandlerList() { return handlers; } public HandlerList getHandlers() { return handlers; } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/EventTerrainFinder.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/EventTerrainFinder.java index 4cc189f34..6e4f8dcb2 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/EventTerrainFinder.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/EventTerrainFinder.java @@ -1,74 +1,74 @@ package mineplex.game.clans.clans.worldevent; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Random; import java.util.Set; -import org.bukkit.Chunk; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilTime; +import mineplex.core.common.util.UtilTime.TimeUnit; +import mineplex.core.common.util.UtilWorld; +import mineplex.game.clans.clans.ClansManager; + import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import mineplex.core.common.util.EnclosedObject; -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilWorld; -import mineplex.game.clans.clans.ClansManager; -import mineplex.game.clans.clans.regions.ClansRegions; +import com.google.common.collect.Lists; public class EventTerrainFinder { - private WorldEventManager _eventManager; + private static final long EVENT_AREA_COOLDOWN = UtilTime.convert(3, TimeUnit.HOURS, TimeUnit.MILLISECONDS); private ClansManager _clansManager; - private ClansRegions _clansRegions; - public EventTerrainFinder(WorldEventManager eventManager, ClansManager clansManager, ClansRegions clansRegions) + public EventTerrainFinder(ClansManager clansManager) { - _eventManager = eventManager; _clansManager = clansManager; - _clansRegions = clansRegions; } - public double posNeg() + public Location findAreaInBorderlands(boolean force) { - if (Math.random() > 0.5) return -1; - return 1; - } - - public Location findAreaInBorderlands(World world, int size, int vert) - { - for (int i = 0; i < 150; i++) + List locs = Lists.newArrayList(); + locs.addAll(Arrays.asList(EventLocation.values())); + locs.sort(new Comparator() { - EnclosedObject loc = new EnclosedObject<>(); - - if (_clansManager.getClanUtility().getClanByClanName("Borderlands") == null) + public int compare(EventLocation loc1, EventLocation loc2) { - System.out.println("[WORLD EVENT] FATAL ERROR: CLAN BORDERLANDS NOT FOUND."); - break; + if (!UtilTime.elapsed(loc1.getLastUsed(), EVENT_AREA_COOLDOWN)) + { + return 1; + } + if (!UtilTime.elapsed(loc2.getLastUsed(), EVENT_AREA_COOLDOWN)) + { + return -1; + } + int[] rand = new int[] {1, -1}; + return rand[new Random().nextInt(rand.length)]; } - - _clansManager.getClanUtility().getClanByClanName("Borderlands").getClaimSet().stream().filter(claim -> Math.random() > .5).filter(claim -> Math.random() > .5).filter(claim -> Math.random() > .3).filter(claim -> Math.random() > .7).limit(1).forEach(claim -> { - Chunk chunk = UtilWorld.strToChunk(claim); - - loc.Set(UtilBlock.getHighest(chunk.getWorld(), chunk.getBlock(0, 0, 0)).getLocation()); - }); - - if (!UtilWorld.isBoxInWorldBorder(world, loc.Get().clone().subtract(size * 2, vert, size * 2), loc.Get().clone().add(size * 2, vert, size * 2))) + }); + + for (EventLocation loc : locs) + { + if (!UtilTime.elapsed(loc.getLastUsed(), EVENT_AREA_COOLDOWN)) { continue; } - - if (loc.Get() == null) + if (_clansManager.getClanUtility().getClaim(loc.getLocation()) == null || _clansManager.getClanUtility().getClaim(loc.getLocation()).Owner.contains("Borderlands")) { - continue; + loc.use(); + return loc.getLocation(); } - - System.out.println("Done finding area... [success]"); - - // Success - return loc.Get(); } - System.out.println("Failed to find area..."); + if (force && !locs.isEmpty()) + { + EventLocation loc = locs.get(UtilMath.r(locs.size())); + loc.use(); + return loc.getLocation(); + } return null; } @@ -129,4 +129,47 @@ public class EventTerrainFinder return null; } -} + + private static enum EventLocation + { + NORTH_1("world", -495, 73, -1028), + NORTH_2("world", 197, 66, -1018), + NORTH_3("world", 948, 71, -959), + EAST_1("world", 1109, 66, -753), + EAST_2("world", 1141, 68, 31), + EAST_3("world", 1044, 71, 603), + SOUTH_1("world", 690, 71, 895), + SOUTH_2("world", 144, 66, 1012), + SOUTH_3("world", -1093, 71, 895), + WEST_1("world", -937, 71, 559), + WEST_2("world", -1092, 67, -9), + WEST_3("world", -969, 71, -441); + + private String _world; + private double _x, _y, _z; + private long _last = 0; + + private EventLocation(String worldName, double x, double y, double z) + { + _world = worldName; + _x = x; + _y = y; + _z = z; + } + + public Location getLocation() + { + return new Location(UtilWorld.getWorld(_world), _x, _y, _z); + } + + public Long getLastUsed() + { + return _last; + } + + public void use() + { + _last = System.currentTimeMillis(); + } + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/WorldEventManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/WorldEventManager.java index 63408e797..c8b82fea9 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/WorldEventManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/WorldEventManager.java @@ -1,6 +1,5 @@ package mineplex.game.clans.clans.worldevent; -import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -9,6 +8,7 @@ import java.util.Random; import mineplex.core.MiniPlugin; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilServer; import mineplex.core.scoreboard.ScoreboardManager; import mineplex.core.scoreboard.elements.ScoreboardElement; @@ -35,8 +35,11 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; +import com.google.common.collect.Lists; + public class WorldEventManager extends MiniPlugin implements ScoreboardElement { + private static final double ARENA_RADIUS = 40; private final List _runningEvents; private Random _random; @@ -55,7 +58,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement super("World Event", plugin); _random = new Random(); - _terrainFinder = new EventTerrainFinder(this, clansManager, clansRegions); + _terrainFinder = new EventTerrainFinder(clansManager); _clansManager = clansManager; _damageManager = damageManager; _lootManager = lootManager; @@ -86,7 +89,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement { for (WorldEvent event : _runningEvents) { - if (event.isInBounds(location)) + if (UtilMath.offset2d(location, event.getCenterLocation()) <= ARENA_RADIUS) { return true; } @@ -102,7 +105,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement { for (WorldEvent e : _runningEvents) { - if (e.isInBounds(event.GetPlayer().getLocation())) + if (isInEvent(event.GetPlayer().getLocation())) { event.SetCancelled(true); } @@ -189,7 +192,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement { WorldEventType[] types = WorldEventType.values(); WorldEventType type = types[_random.nextInt(types.length)]; - Location location = _terrainFinder.findAreaInBorderlands(Bukkit.getWorlds().get(0), type.getAreaNeeded(), type.getAreaNeeded()); + Location location = _terrainFinder.findAreaInBorderlands(false); if (location != null) { initializeEvent(type.createInstance(this, location, _skillFactory)); @@ -228,10 +231,11 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement return null; } - public WorldEvent startEventFromType(Location location, WorldEventType eventType) + public WorldEvent startEventFromType(WorldEventType eventType) { if (eventType != null) { + Location location = _terrainFinder.findAreaInBorderlands(true); WorldEvent event = eventType.createInstance(this, location, _skillFactory); if (event != null) { @@ -287,7 +291,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement @Override public List getLines(ScoreboardManager manager, Player player, List out) { - List output = new ArrayList(); + List output = Lists.newArrayList(); Iterator iterator = _runningEvents.iterator(); while (iterator.hasNext()) @@ -296,7 +300,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement if (event.getState() == EventState.LIVE) { - output.add(" "); + output.add(" "); output.add(C.cAqua + C.Bold + "Event"); Location eventLocation = event.getCenterLocation(); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/command/StartCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/command/StartCommand.java index d5090804b..e95f7fa48 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/command/StartCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/worldevent/command/StartCommand.java @@ -27,7 +27,7 @@ public class StartCommand extends CommandBase try { WorldEventType eventType = WorldEventType.valueOf(args[0]); - WorldEvent event = Plugin.startEventFromType(caller.getLocation(), eventType); + WorldEvent event = Plugin.startEventFromType(eventType); if (event == null) { @@ -35,7 +35,7 @@ public class StartCommand extends CommandBase } else { - UtilPlayer.message(caller, F.main(Plugin.getName(), "Started WorldEvent " + F.elem(args[0]) + " at your current location")); + UtilPlayer.message(caller, F.main(Plugin.getName(), "Started WorldEvent " + F.elem(args[0]) + "!")); } } catch (IllegalArgumentException e) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java index 4ebc47b56..00d5ef316 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java @@ -6,7 +6,8 @@ import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilInv; -import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.common.util.UtilMath; +import mineplex.core.itemstack.ItemBuilder; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileUser; import mineplex.core.recharge.Recharge; @@ -155,7 +156,7 @@ public abstract class ItemUsable extends Item implements IThrown if (_throwExpire >= 0) expire = _throwExpire; - org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(GetType())); + org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), new ItemBuilder(GetType()).setTitle(UtilMath.random.nextDouble() + "").build()); UtilAction.velocity(ent, player.getLocation().getDirection(), _throwPower, false, 0, 0.2, 10, false); Factory.Throw().AddThrow(ent, player, this, expire, _throwPlayer, _throwPlayer, _throwBlock, _throwIdle, _throwPickup, 0.5f); diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/GolemBoss.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/GolemBoss.java index 81d3db9a0..1e6c7ffc7 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/GolemBoss.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/GolemBoss.java @@ -17,7 +17,7 @@ public class GolemBoss extends WorldEvent { public GolemBoss(DamageManager damageManager, BlockRestore blockRestore, ConditionManager conditionManager, ProjectileManager projectileManager, Location cornerLocation) { - super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Iron Wizard", cornerLocation, "schematic/Golem.schematic"); + super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Iron Wizard", cornerLocation); } @Override diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/abilities/GolemDeadlyTremor.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/abilities/GolemDeadlyTremor.java index 94fb81098..36c72f340 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/abilities/GolemDeadlyTremor.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/ironwizard/abilities/GolemDeadlyTremor.java @@ -56,7 +56,7 @@ public class GolemDeadlyTremor extends BossAbility @Override public void tick() { - for (Player player : UtilPlayer.getInRadius(getLocation(), 40).keySet()) + for (Player player : UtilPlayer.getInRadius(getLocation(), 30).keySet()) { player.playSound(player.getLocation(), Sound.MINECART_BASE, 0.2f, 0.2f); diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonBoss.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonBoss.java index dd785dfb8..f6a1a6af7 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonBoss.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonBoss.java @@ -20,8 +20,7 @@ public class SkeletonBoss extends WorldEvent public SkeletonBoss(DamageManager damageManager, BlockRestore blockRestore, ConditionManager conditionManager, ProjectileManager projectileManager, Location cornerLocation) { - super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Skeleton King", cornerLocation, - "schematic/Golem.schematic"); + super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Skeleton King", cornerLocation); } @Override diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonCreature.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonCreature.java index 8b0e4865c..885e1814a 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonCreature.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/boss/skeletonking/SkeletonCreature.java @@ -210,7 +210,6 @@ public class SkeletonCreature extends EventCreature { if (getHealth() <= test) { - Bukkit.broadcastMessage(test + "Verified"); wraithUse = test; break; }