diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java index ede793bef..1f2835f13 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java @@ -56,11 +56,11 @@ public class MotdManager implements Listener, Runnable //String motdLine = "§f§l◄ §c§lMaintenance§f§l ►"; //String motdLine = "§f§l◄ §a§lCarl the Creeper§f§l ►"; // String motdLine = " §2§l§n M O N S T E R M A Z E B E T A §f"; - String motdLine = " §f§l◄ §b§lNew Game§f§l ▬ §3§lChampions CTF§f§l ►"; + String motdLine = " §f❄ §2§lWinter Update §f❄ §2§lSnow Fight §f❄"; //String motdLine = " §d§lRank Sale §a§l40% Off"); //String motdLine = " §f§l◄§c§lMAINTENANCE§f§l►"); - updateMainMotd(" §f§l§m §8§l§m[ §r §6§lMineplex§r §f§lGames§r §8§l§m ]§f§l§m §r", motdLine); + updateMainMotd(" §c§m §f§m §c§m §f§m §2§l§m[ §r §c§lMineplex§r §f§lGames§r §2§l§m ]§f§m §c§m §f§m §c§m §r", motdLine); System.out.println("Updated Bungee MOTD"); } } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java index 8bbac15bc..771b1ec52 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java @@ -110,4 +110,29 @@ public class UtilText { return s.length() <= maxLength ? s : s.substring(0, maxLength); } + public static String arrayToString(X[] array, String delimiter) + { + StringBuilder string = new StringBuilder(); + + int index = 0; + for (X x : array) + { + string.append(x.toString()); + + if (index != array.length - 1) + { + string.append(delimiter); + } + + index++; + } + + return string.toString(); + } + + public static String arrayToString(X[] array) + { + return arrayToString(array, null); + } + } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java index b4ac74e62..ef2a4da64 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java @@ -84,19 +84,6 @@ public class ServerCommand extends CommandBase else deniedAccess = true; } - else if (servUp.contains("CLANS-")) - { - if (playerRank.has(Rank.MODERATOR)) - { - Plugin.sendPlayerToServer(player, args[0]); - } - else - { - UtilPlayer.message(player, - F.main(Plugin.getName(), C.cRed + "You must join clans through the hub! Join " + C.cGold + "ClansHub-1" - + C.cRed + "!")); - } - } else { Plugin.sendPlayerToServer(player, args[0]); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java index 53c774a0e..272b5fe38 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/ExclusivePreferencesPage.java @@ -189,6 +189,6 @@ public class ExclusivePreferencesPage extends ShopPageBase= _teamNames.length) + continue; + //Update Team team = _scoreboard.getTeam(_teamNames[i]); if (team == null) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 4b60646f1..7ec46f8f9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -91,41 +91,14 @@ public class StatsManager extends MiniDbClientPlugin UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue)); // Verify stat is in our local cache, if not add it remotely. - if (!_stats.containsKey(statName)) + registerNewStat(statName, new Runnable() { - runAsync(new Runnable() + @Override + public void run() { - public void run() - { - synchronized (_statSync) - { - // If many players come in for a new stat, when the first add finishes the others are queued to add again - // This makes a second check for the stat name (already added before lock was released) - // Then it pops into queue and forgets adding the new stat to db. - if (_stats.containsKey(statName)) - { - addToQueue(statName, player, value); - return; - } - - _repository.addStat(statName); - - _stats.clear(); - - for (Stat stat : _repository.retrieveStats()) - { - _stats.put(stat.Name, stat.Id); - } - - addToQueue(statName, player, value); - } - } - }); - } - else - { - addToQueue(statName, player, value); - } + addToQueue(statName, player, value); + } + }); } private void addToQueue(String statName, Player player, long value) @@ -192,23 +165,51 @@ public class StatsManager extends MiniDbClientPlugin public boolean incrementStat(final int accountId, final String statName, final long value) { - if (_stats.containsKey(statName)) - return false; - - final NautHashMap> uploadQueue = new NautHashMap>(); - uploadQueue.put(accountId, new NautHashMap()); - uploadQueue.get(accountId).put(_stats.get(statName), value); - - runAsync(new Runnable() + // This will register a new stat if we don't have one, otherwise it will just run the callback + registerNewStat(statName, new Runnable() { + @Override public void run() { + final NautHashMap> uploadQueue = new NautHashMap>(); + uploadQueue.put(accountId, new NautHashMap()); + uploadQueue.get(accountId).put(_stats.get(statName), value); + _repository.saveStats(uploadQueue); } }); return true; } + + private void registerNewStat(final String statName, final Runnable callback) + { + runAsync(new Runnable() + { + public void run() + { + synchronized (_statSync) + { + if (_stats.containsKey(statName)) + { + if (callback != null) callback.run(); + return; + } + + _repository.addStat(statName); + + _stats.clear(); + + for (Stat stat : _repository.retrieveStats()) + { + _stats.put(stat.Name, stat.Id); + } + + if (callback != null) callback.run(); + } + } + }); + } public int getStatId(String statName) { 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 0e35252e8..ce3ff1b86 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -49,7 +49,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer; public class Clans extends JavaPlugin { - public static final String VERSION = "0.16"; + public static final String VERSION = "0.17b"; private String WEB_CONFIG = "webServer"; // Modules diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java index dc53b6069..5e82714fe 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java @@ -462,7 +462,7 @@ public class ClanInfo public boolean isOnline() { - return isOnlineNow() || System.currentTimeMillis() - _lastOnline.getTime() < Clans.getOnlineTime(); + return isOnlineNow();// || System.currentTimeMillis() - _lastOnline.getTime() < Clans.getOnlineTime(); } public String getProtected() diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java index 7cfea3b08..9d06f8fa4 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansDataAccessLayer.java @@ -17,13 +17,15 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilWorld; import mineplex.game.clans.clans.event.ClanCreatedEvent; import mineplex.game.clans.clans.event.ClanDeleteEvent; +import mineplex.game.clans.clans.event.ClanJoinEvent; +import mineplex.game.clans.clans.event.ClanLeaveEvent; import mineplex.game.clans.clans.event.ClanSetHomeEvent; import mineplex.game.clans.clans.scoreboard.ClansScoreboardManager; import mineplex.game.clans.clans.tntGenerator.TntGenerator; -import mineplex.game.clans.core.war.ClanWarData; import mineplex.game.clans.core.repository.ClanRepository; import mineplex.game.clans.core.repository.ClanTerritory; import mineplex.game.clans.core.repository.tokens.ClanToken; +import mineplex.game.clans.core.war.ClanWarData; public class ClansDataAccessLayer { @@ -201,6 +203,15 @@ public class ClansDataAccessLayer public void join(final ClanInfo clan, final Player player, final ClanRole role, final Callback callback) { + ClanJoinEvent event = new ClanJoinEvent(clan, player); + + UtilServer.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + runAsync(new Runnable() { @Override @@ -259,6 +270,15 @@ public class ClansDataAccessLayer { if (clan == null) return; + ClanLeaveEvent event = new ClanLeaveEvent(clan, clansPlayer); + + UtilServer.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + runAsync(new Runnable() { @Override @@ -636,6 +656,10 @@ public class ClansDataAccessLayer { final Timestamp currentTime = new Timestamp(System.currentTimeMillis()); final ClanWarData war = new ClanWarData(clanA.getName(), clanB.getName(), score, currentTime, currentTime, 0); + + // Memory + clanA.addWar(war); + clanB.addWar(war); runAsync(new Runnable() { @@ -649,10 +673,6 @@ public class ClansDataAccessLayer @Override public void run() { - // Memory - clanA.addWar(war); - clanB.addWar(war); - _manager.log("Initiator war for [" + clanA.getName() + "] against [" + clanB.getName() + "]."); if (warCallback != null) warCallback.run(war); 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 aa8efa0bb..d97ad7c78 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 @@ -66,6 +66,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClanTips.TipType; import mineplex.game.clans.clans.ClansUtility.ClanRelation; +import mineplex.game.clans.clans.claimview.ClaimVisualizer; import mineplex.game.clans.clans.commands.ClanManagementCommand; import mineplex.game.clans.clans.commands.ClansAllyChatCommand; import mineplex.game.clans.clans.commands.ClansChatCommand; @@ -304,6 +305,8 @@ public class ClansManager extends MiniClientPluginimplements IRelati loadClan(token); } +// new ClaimVisualizer(plugin, this); + // RedisDataRepository(ConnectionData writeConn, ConnectionData // readConn, Region region, Class elementType, String elementLabel) // Initialize default region factions and territory @@ -672,7 +675,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati if (clan == null) { event.setFormat(rank + C.cYellow + "%1$s " + C.cWhite + "%2$s"); - System.out.println(_clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : " ") + event.getMessage()); + System.out.println(_clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + event.getMessage()); return; } @@ -692,7 +695,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati String message = event.getMessage(); message = _chat.getFilteredMessage(event.getPlayer(), message); ClanRelation rel = _clanUtility.rel(clan, otherClan); - String formatted = rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + (event.getPlayer().getGameMode().equals(GameMode.CREATIVE) ? C.cRed + "Creative " : " ") + C.cWhite + message; + String formatted = rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + C.cWhite + message; other.sendMessage(formatted); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java index c30741532..c27bcf57a 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansUtility.java @@ -717,11 +717,11 @@ public class ClansUtility return false; } -// if (clan.getEnergy() == 0) -// { -// Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You must purchase energy at a shop before you can claim land.")); -// return false; -// } + if (clan.getEnergy() == 0) + { + Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You must purchase energy at a shop before you can claim land.")); + return false; + } String chunk = UtilWorld.chunkToStr(caller.getLocation().getChunk()); ClanInfo ownerClan = getOwner(caller.getLocation()); @@ -740,11 +740,11 @@ public class ClansUtility } } -// if (clan.getClaims() >= clan.getClaimsMax()) -// { -// Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "Your Clan cannot claim more Territory.")); -// return false; -// } + if (clan.getClaims() >= clan.getClaimsMax()) + { + Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "Your Clan cannot claim more Territory.")); + return false; + } // Adjacent boolean selfAdj = false; @@ -1084,7 +1084,7 @@ public class ClansUtility } // Event - PlayerUnClaimTerritoryEvent event = new PlayerUnClaimTerritoryEvent(caller, caller.getLocation().getChunk()); + PlayerUnClaimTerritoryEvent event = new PlayerUnClaimTerritoryEvent(caller, caller.getLocation().getChunk(), ownerClan); UtilServer.getServer().getPluginManager().callEvent(event); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java new file mode 100644 index 000000000..9408255bd --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/ClaimVisualizer.java @@ -0,0 +1,351 @@ +package mineplex.game.clans.clans.claimview; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.Vector; + +import mineplex.core.MiniPlugin; +import mineplex.core.common.util.F; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilBlock; +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.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilWorld; +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.claimview.commands.ClaimVisualizeCommand; +import mineplex.game.clans.clans.event.ClanDisbandedEvent; +import mineplex.game.clans.clans.event.ClanLeaveEvent; +import mineplex.game.clans.clans.event.PlayerClaimTerritoryEvent; +import mineplex.game.clans.clans.event.PlayerUnClaimTerritoryEvent; +import net.minecraft.server.v1_8_R3.EnumDirection; + +public class ClaimVisualizer extends MiniPlugin +{ + private ClansManager _clansManager; + + private List _visualizing; + + private NautHashMap> _calculated; + + public ClaimVisualizer(JavaPlugin plugin, ClansManager clansManager) + { + super("Claim Visualizer", plugin); + + _clansManager = clansManager; + _visualizing = new ArrayList<>(); + _calculated = new NautHashMap<>(); + + for (ClanInfo clan : _clansManager.getClanMap().values()) + { + _calculated.put(clan, new NautHashMap()); + } + } + + @Override + public void addCommands() + { + addCommand(new ClaimVisualizeCommand(this)); + } + + @EventHandler + public void update(UpdateEvent event) + { + if (event.getType() != UpdateType.SLOWER) + { + return; + } + + _calculated.clear(); + for (ClanInfo clan : _clansManager.getClanMap().values()) + { + _calculated.put(clan, new NautHashMap()); + + for (String serialized : clan.getClaimSet()) + { + calculate(clan, serialized); + } + } + } + + @EventHandler + public void runVisualization(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + { + return; + } + + for (String name : _visualizing) + { + Player player = Bukkit.getPlayer(name); + + if (player != null && _clansManager.isInClan(player)) + { + visualize(player); + } + } + } + + private void visualize(Player player) + { + for (String serialized : _clansManager.getClan(player).getClaimSet()) + { + if (!_calculated.get(_clansManager.getClan(player)).containsKey(serialized)) + { + calculate(_clansManager.getClan(player), serialized); + } + } + + draw(player, _calculated.get(_clansManager.getClan(player)).values()); + } + + private void draw(Player player, Collection chunks) + { + for (VisualizedChunkData chunk : chunks) + { + if (!chunk.getChunk().getWorld().equals(player.getWorld())) + { + // return not break because a clan can't have claims in different worlds. + return; + } + + if (UtilMath.offset2d(chunk.getChunk().getBlock(0, 0, 0).getLocation(), player.getLocation()) > 36) + { + break; + } + + for (int x = 0; x < 16; x++) + { + for (int z = 0; z < 16; z++) + { + if (chunk.shouldDisplayEdge(x, z) && (z == 0 || z == 15 || x == 0 || x == 15)) + { + Block block = chunk.getChunk().getBlock(x, 0, z); + + UtilParticle.PlayParticle(ParticleType.RED_DUST, + new Location( + chunk.getChunk().getWorld(), + block.getX() + .5, + UtilBlock.getHighest(player.getWorld(), block.getX(), block.getZ()).getY() + .5, + block.getZ() + .5), + new Vector(0f, 0f, 0f), 0f, 1, ViewDist.NORMAL, player); + } + } + } + } + } + + private void calculate(ClanInfo clan, String serialized) + { + Chunk chunk = UtilWorld.strToChunk(serialized); + + List dirs = new ArrayList<>(); + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX(), chunk.getZ() - 1)))) + { + dirs.add(EnumDirection.NORTH); + } + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX() + 1, chunk.getZ())))) + { + dirs.add(EnumDirection.EAST); + } + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX(), chunk.getZ() + 1)))) + { + dirs.add(EnumDirection.SOUTH); + } + + if (!clan.getClaimSet().contains(UtilWorld.chunkToStr(chunk.getWorld().getChunkAt(chunk.getX() - 1, chunk.getZ())))) + { + dirs.add(EnumDirection.WEST); + } + + VisualizedChunkData cached = new VisualizedChunkData(chunk, dirs); + + _calculated.get(clan).put(serialized, cached); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) + { + if (isVisualizing(event.getPlayer())) + { + disableVisualizer(event.getPlayer()); + } + } + + @EventHandler + public void onKick(PlayerKickEvent event) + { + if (isVisualizing(event.getPlayer())) + { + disableVisualizer(event.getPlayer()); + } + } + + @EventHandler + public void onLeave(ClanLeaveEvent event) + { + if (isVisualizing(event.getPlayer().getPlayerName())) + { + disableVisualizer(event.getPlayer().getPlayerName()); + } + } + + @EventHandler + public void onClanDisband(ClanDisbandedEvent event) + { + for (Player player : event.getClan().getOnlinePlayers()) + { + if (isVisualizing(player)) + { + disableVisualizer(player); + } + } + } + + @EventHandler + public void update(ClanInfo clan) + { + _calculated.clear(); + + for (String serialized : clan.getClaimSet()) + { + calculate(clan, serialized); + } + } + + @EventHandler + public void onUnclaim(PlayerUnClaimTerritoryEvent event) + { + if (event.getClan().getClaimCount() == 1) + { + for (Player player : event.getClan().getOnlinePlayers()) + { + if (isVisualizing(player)) + { + disableVisualizer(player); + } + } + } + } + + public boolean isVisualizing(Player player) + { + return _visualizing.contains(player.getName()); + } + + public boolean isVisualizing(String name) + { + return _visualizing.contains(name); + } + + public void enableVisualizer(String name) + { + enableVisualizer(UtilServer.getServer().getPlayer(name)); + } + + public void disableVisualizer(String name) + { + disableVisualizer(UtilServer.getServer().getPlayer(name)); + } + + public void toggleVisualizer(Player player) + { + if (_visualizing.contains(player.getName())) + { + disableVisualizer(player); + } + else + { + enableVisualizer(player); + } + } + + public void enableVisualizer(Player player) + { + if (player == null) + { + return; + } + + if (!_clansManager.isInClan(player)) + { + UtilPlayer.message(player, F.main("Clans", "You must be in a clan to visualize claims.")); + return; + } + + ClanInfo clan = _clansManager.getClan(player); + + if (clan.getClaimCount() == 0) + { + UtilPlayer.message(player, F.main("Clans", "Your Clan does not have any claims!")); + return; + } + + _visualizing.add(player.getName()); + UtilPlayer.message(player, F.main("Clans", "You are now visualizing your claims.")); + + for (VisualizedChunkData chunk : _calculated.get(clan).values()) + { + if (!chunk.getChunk().getWorld().equals(player.getWorld())) + { + // return not break because a clan can't have claims in different worlds. + return; + } + + if (UtilMath.offset2d(chunk.getChunk().getBlock(0, 0, 0).getLocation(), player.getLocation()) > 36) + { + break; + } + + for (int x = 0; x < 16; x++) + { + for (int z = 0; z < 16; z++) + { + if (chunk.shouldDisplayEdge(x, z) && (z == 0 || z == 15 || x == 0 || x == 15)) + { + Block block = chunk.getChunk().getBlock(x, 0, z); + } + } + } + } + } + + public void disableVisualizer(Player player) + { + if (player == null) + { + return; + } + + if (!_visualizing.contains(player.getName())) + { + UtilPlayer.message(player, F.main("Clans", "You are anot visualizing your claims.")); + return; + } + + _visualizing.remove(player.getName()); + UtilPlayer.message(player, F.main("Clans", "You are no longer visualizing your claims.")); + } + +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java new file mode 100644 index 000000000..1427f20ae --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/VisualizedChunkData.java @@ -0,0 +1,57 @@ +package mineplex.game.clans.clans.claimview; + +import java.util.List; + +import org.bukkit.Chunk; + +import net.minecraft.server.v1_8_R3.EnumDirection; + +public class VisualizedChunkData +{ + private List _displayableEdges; + private Chunk _chunk; + + public long _start; + + public VisualizedChunkData(Chunk chunk, List dir) + { + _chunk = chunk; + _displayableEdges = dir; + _start = System.currentTimeMillis(); + } + + public double getLife() + { + return (double) (System.currentTimeMillis() - _start); + } + + public boolean shouldDisplayEdge(int x, int z) + { + if (z == 15 && !_displayableEdges.contains(EnumDirection.SOUTH)) + { + return false; + } + + if (x == 15 && !_displayableEdges.contains(EnumDirection.EAST)) + { + return false; + } + + if (x == 0 && !_displayableEdges.contains(EnumDirection.WEST)) + { + return false; + } + + if (z == 0 && !_displayableEdges.contains(EnumDirection.NORTH)) + { + return false; + } + + return true; + } + + public Chunk getChunk() + { + return _chunk; + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java new file mode 100644 index 000000000..dcfa074c9 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/claimview/commands/ClaimVisualizeCommand.java @@ -0,0 +1,22 @@ +package mineplex.game.clans.clans.claimview.commands; + +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.game.clans.clans.claimview.ClaimVisualizer; + +public class ClaimVisualizeCommand extends CommandBase +{ + public ClaimVisualizeCommand(ClaimVisualizer plugin) + { + super(plugin, Rank.ALL, "showclaims"); + } + + @Override + public void Execute(Player caller, String[] args) + { + Plugin.toggleVisualizer(caller); + } + +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java index 546c63774..cda7ab480 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClanManagementCommand.java @@ -38,7 +38,6 @@ import mineplex.game.clans.items.legendaries.WindBlade; public class ClanManagementCommand extends CommandBase { - private ClansManager _clansManager; public ClanManagementCommand(ClansManager plugin) 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 b956eedfe..f9bab36a5 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 @@ -1,5 +1,6 @@ package mineplex.game.clans.clans.commands; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; @@ -24,6 +25,7 @@ import mineplex.game.clans.clans.ClanTips.TipType; import mineplex.game.clans.clans.ClansBlacklist; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.ClientClan; +import mineplex.game.clans.clans.event.ClanJoinEvent; import mineplex.game.clans.clans.event.ClansCommandExecutedEvent; import mineplex.game.clans.tutorials.Tutorial; import mineplex.game.clans.tutorials.TutorialManager; @@ -382,6 +384,10 @@ public class ClansCommand extends CommandBase _manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "The clan " + F.elem("Clan " + clan.getName()) + " is full and cannot be joined!")); return; } + + ClanJoinEvent event = new ClanJoinEvent(clan, caller); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) return; // Task Plugin.getClanDataAccess().join(clan, caller, ClanRole.RECRUIT, new Callback() diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java index be19befc8..a37102d7b 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/RestartTutCommand.java @@ -6,6 +6,8 @@ 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.UtilPlayer; import mineplex.core.task.TaskManager; import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.tutorials.Tutorial; @@ -22,6 +24,12 @@ public class RestartTutCommand extends CommandBase @Override public void Execute(Player caller, String[] args) { + if (ClansManager.getInstance().getClan(caller) != null) + { + UtilPlayer.message(caller, F.main("Tutorial", "You cannot restart the tutorial while in a clan")); + return; + } + if (ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null && ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).isSafe(caller.getLocation())) { @@ -43,7 +51,7 @@ public class RestartTutCommand extends CommandBase } else { - TutorialManager.Instance.sendTutorialMsg(caller, "You must be in a safezone to restart the tutorial."); + TutorialManager.Instance.sendTutorialMsg(caller, F.main("Clans", "You must be in a Safe Zone to restart the tutorial.")); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java new file mode 100644 index 000000000..3c5f6156d --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/ClanLeaveEvent.java @@ -0,0 +1,56 @@ +package mineplex.game.clans.clans.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import mineplex.game.clans.clans.ClanInfo; +import mineplex.game.clans.clans.ClansPlayer; + +public class ClanLeaveEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + + private ClansPlayer _player; + + private ClanInfo _clan; + + private boolean _cancelled; + + public ClanLeaveEvent(ClanInfo clan, ClansPlayer clansPlayer) + { + _player = clansPlayer; + + _clan = clan; + } + + public ClansPlayer getPlayer() + { + return _player; + } + + public ClanInfo getClan() + { + return _clan; + } + + public void setCancelled(boolean cancelled) + { + _cancelled = cancelled; + } + + public boolean isCancelled() + { + return _cancelled; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java index 41ef2e8b1..8d83363d6 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/event/PlayerUnClaimTerritoryEvent.java @@ -5,19 +5,23 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import mineplex.game.clans.clans.ClanInfo; + public class PlayerUnClaimTerritoryEvent extends Event { private static final HandlerList handlers = new HandlerList(); private Player _unClaimer; private Chunk _unClaimedChunk; + private ClanInfo _clan; private boolean _cancelled; - public PlayerUnClaimTerritoryEvent(Player unClaimer, Chunk unClaimedChunk) + public PlayerUnClaimTerritoryEvent(Player unClaimer, Chunk unClaimedChunk, ClanInfo clan) { _unClaimer = unClaimer; _unClaimedChunk = unClaimedChunk; + _clan = clan; } public Player getUnClaimer() @@ -35,6 +39,11 @@ public class PlayerUnClaimTerritoryEvent extends Event _cancelled = cancelled; } + public ClanInfo getClan() + { + return _clan; + } + public boolean isCancelled() { return _cancelled; 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 dcefd85aa..c337f063f 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 @@ -42,19 +42,17 @@ public class ClansScoreboardManager extends ScoreboardManager private void init(TutorialManager tutorialManager) { - setTitle(" MINEPLEX CLANS "); + setTitle("Clans Alpha " + Clans.VERSION); ScoreboardData data = getData("default", true); - data.write(C.cGreen + "Clans Alpha " + Clans.VERSION); - data.writeEmpty(); data.writeElement(new ScoreboardElementClan(_clansManager)); data.writeElement(new ScoreboardElementPlayer(_clansManager)); - data.writeElement(new ScoreboardElementPlayerCount(_clansManager)); - - data.writeElement(_worldEvent); +// data.writeElement(new ScoreboardElementPlayerCount(_clansManager)); + data.writeElement(_warManager); - + data.writeElement(_worldEvent); + for (Tutorial tutorial : tutorialManager.getTutorials().values()) { data.writeElement(tutorial); 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 d27d2c34b..5252cb23d 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 @@ -35,8 +35,7 @@ public class ScoreboardElementClan implements ScoreboardElement // 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.cYellow + "Home " + C.cWhite + clanInfo.getBedStatusStr()); + output.add(C.cYellow + "Energy " + C.cWhite + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT)); } else { 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 36d4ac271..d0d710721 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 @@ -27,10 +27,9 @@ public class ScoreboardElementPlayer implements ScoreboardElement { List output = new ArrayList(); output.add(C.cYellow + "Gold " + C.cWhite + manager.getDonation().Get(player).GetBalance(CurrencyType.Gold) + ""); - output.add(""); - String regionString = C.xWilderness + "Wilderness"; + output.add(" "); ClanTerritory claim = _clansManager.getClanUtility().getClaim(player.getLocation()); if (claim != null) { diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java index be56178a3..0c6fb35d5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/elements/ScoreboardElementPlayerCount.java @@ -29,7 +29,7 @@ public class ScoreboardElementPlayerCount implements ScoreboardElement List output = new ArrayList(); output.add(""); - output.add(C.cYellow + "Players Online " + UtilServer.getPlayers().length + "/100"); + output.add(C.cYellow + "Players " + C.cWhite + UtilServer.getPlayers().length + "/100"); return output; } 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 cc017df55..166693db2 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 @@ -97,7 +97,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement { for (WarInvasion invasion : invasions) { - if (invasion.getInvaderClan().equals(playerClan)) + if (invasion.getInvaderClan().equals(playerClan.getName())) return true; } } @@ -125,15 +125,24 @@ public class WarManager extends MiniPlugin implements ScoreboardElement final ClanInfo killerClan = event.getKiller().getClan(); ClanWarData war = clan.getWarData(killerClan); - if (war != null && !war.isOnCooldown()) + if (war != null) { + if (war.isOnCooldown()) + { + // Ignore! + return; + } + + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); + // War already exists + war.increment(killerClan.getName()); ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan); _clansManager.messageClan(killerClan, F.main("Clans", "Your clan gained 1 War Point against " + rel.getColor(false) + clan.getName() + " " + C.Reset + "(" + killerClan.getFormattedWarPoints(clan) + C.Reset + ")")); _clansManager.messageClan(clan, F.main("Clans", "Your clan lost 1 War Point against " + rel.getColor(false) + killerClan.getName() + " " + C.Reset + "(" + clan.getFormattedWarPoints(killerClan) + C.Reset + ")")); - war.increment(killerClan.getName()); checkWarComplete(war); ClanInfo clanA = clan.getName().equals(war.getClanA()) ? clan : killerClan; @@ -142,9 +151,6 @@ public class WarManager extends MiniPlugin implements ScoreboardElement _clansManager.getScoreboard().refresh(killerClan); _clansManager.getScoreboard().refresh(clan); - - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); } else { @@ -155,14 +161,13 @@ public class WarManager extends MiniPlugin implements ScoreboardElement public void run(ClanWarData data) { ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan); + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); + _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); _clansManager.messageClan(killerClan, F.main("Clans", "Your clan gained 1 War Point against " + rel.getColor(false) + clan.getName())); _clansManager.messageClan(clan, F.main("Clans", "Your clan lost 1 War Point against " + rel.getColor(false) + killerClan.getName())); _clansManager.getScoreboard().refresh(killerClan); _clansManager.getScoreboard().refresh(clan); - - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer()); - _clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer()); } }); } @@ -271,7 +276,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement @EventHandler public void onInvasionEnd(WarInvasionEndEvent event) { - Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + "'s invasion against " + F.elem(event.getWarInvasion().getInvaderClan() + " has ended."))); + Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + "'s invasion against " + F.elem(event.getWarInvasion().getInvadedClan()) + " has ended.")); } @@ -301,13 +306,14 @@ public class WarManager extends MiniPlugin implements ScoreboardElement if (clan != null) { - List invadedList = _invadedMap.get(clan); - List invaderList = _invaderMap.get(clan); + List invadedList = _invadedMap.get(clan.getName()); + List invaderList = _invaderMap.get(clan.getName()); if (invaderList != null && !invaderList.isEmpty()) { for (WarInvasion invasion : invaderList) { + element.add(" "); element.add(C.cPurpleB + "Invading"); element.add(" " + invasion.getInvadedClan()); element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); @@ -318,6 +324,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement { for (WarInvasion invasion : invadedList) { + element.add(" "); element.add(C.cRedB + "Invaded"); element.add(" " + invasion.getInvaderClan()); element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java index 16aa30a21..f5e55d42c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/items/attributes/bow/HeavyArrowsAttribute.java @@ -35,6 +35,7 @@ public class HeavyArrowsAttribute extends ItemAttribute @Override public void onAttack(CustomDamageEvent event) { - event.AddKnockback("HeavyAttribute", _knockbackPercent); + double knockback = (_knockbackPercent / 100d) * 6; + event.AddKnockback("Heavy Attribute", knockback); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java index dfca12bb5..50a251707 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java @@ -248,7 +248,7 @@ public class Spawn extends MiniPlugin if (isInSpawn(player)) { - UtilPlayer.message(event.GetPlayer(), F.main("Safe Zone", "You cannot use " + F.skill(event.GetSkillName() + " in " + F.elem("Safe Zone") + "."))); + UtilPlayer.message(event.GetPlayer(), F.main("Safe Zone", "You cannot use " + F.skill(event.GetSkillName()) + " in " + F.elem("Safe Zone") + ".")); event.SetCancelled(true); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java index 166dbc6e8..4d6ae6cc3 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/Tutorial.java @@ -8,6 +8,7 @@ import java.util.Map; import org.bukkit.Color; import org.bukkit.FireworkEffect.Type; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -19,6 +20,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import mineplex.core.common.jsonchat.ClickEvent; @@ -27,6 +29,8 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextMiddle; @@ -40,6 +44,7 @@ import mineplex.core.task.TaskManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.clans.event.ClanJoinEvent; import mineplex.game.clans.clans.event.ClanTipEvent; import mineplex.game.clans.economy.GoldManager; import net.minecraft.server.v1_8_R3.PacketPlayOutChat; @@ -59,6 +64,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public static String SKIPPED_TASK = "tatatatata%sSkip"; public static String AllowedMessage = C.cGold + "TutorialAllowedMessage" + C.Reset; + public static String AllowedBypass = C.cBlue + "Tutorial>"; protected final TutorialManager _manager; protected final GoldManager _goldManager; @@ -66,7 +72,8 @@ public abstract class Tutorial implements ScoreboardElement, Listener protected final TaskManager _taskManager; protected final DonationManager _donationManager; - protected final LinkedHashMap> _tasks; +// protected final LinkedHashMap> _tasks; + private final ArrayList> _tasks; protected final LinkedHashMap> _nameToTask; protected final LinkedHashMap _inTutorial; @@ -89,7 +96,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener _donationManager = donationManager; _taskManager = taskManager; _manager = manager; - _tasks = new LinkedHashMap<>(); + _tasks = new ArrayList>(); _inTutorial = new LinkedHashMap<>(); _nameToTask = new LinkedHashMap<>(); @@ -122,7 +129,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener lines.add(C.cAqua + "Tutorial"); - for (final TutorialTask task : _tasks.values()) + for (final TutorialTask task : _tasks) { if (get(player).CurrentTask.equals(task)) { @@ -142,10 +149,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener return lines; } + + public TutorialTask getTask(int index) + { + return _tasks.get(index); + } protected void addTask(TutorialTask task) { - _tasks.put(_tasks.size() + 1, task); + _tasks.add(task); _nameToTask.put(task.getTechnicalName(), task); } @@ -158,6 +170,11 @@ public abstract class Tutorial implements ScoreboardElement, Listener return get(player).CurrentTask.getID() < task.getID(); } + + private TutorialTask getLastTask() + { + return _tasks.get(_tasks.size() - 1); + } protected void finishTask(final Player player, final TutorialTask task) { @@ -175,8 +192,10 @@ public abstract class Tutorial implements ScoreboardElement, Listener { public void run() { + final TutorialTask lastTask = getLastTask(); // Cycle to next task, or null if last task. - get(player).CurrentTask = task.equals(_tasks.get(_tasks.size())) ? null : _tasks.get(task.getID() + 1); + get(player).CurrentTask = task.equals(lastTask) ? null : _tasks.get(task.getDataId() + 1); + System.out.println("Next Task: " + get(player).CurrentTask); if (!_taskManager.hasCompletedTask(player, String.format(TASK_COMPLETE_TASK, _technicalName, task.getTechnicalName()))) { @@ -185,7 +204,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void run(final Boolean completed) { // If last task, end tutorial. - if (task.equals(_tasks.get(_tasks.size()))) + if (task.equals(lastTask)) { finishFor(player); } @@ -196,7 +215,9 @@ public abstract class Tutorial implements ScoreboardElement, Listener { public void run() { + System.out.println("STARTING NEXT TASK!"); get(player).CurrentTask.startFor(player); + get(player).CurrentTaskStartTime = System.currentTimeMillis(); } }, 30L); } @@ -252,23 +273,22 @@ public abstract class Tutorial implements ScoreboardElement, Listener private void finishFor(final Player player) { - if (player.getOpenInventory() != null) - { - _inTutorial.get(player.getName()).QueuedFinish = true; - return; - } - +// if (player.getOpenInventory() != null) +// { +// _inTutorial.get(player.getName()).QueuedFinish = true; +// return; +// } + _manager.finishTutorial(player); _inTutorial.remove(player.getName()); - - UtilTextMiddle.display(C.cWhite + "Clans Tutorial", C.cGreen + "You have completed the Clans Tutorial!", 20, 20 * 3, 20); + onFinished(player); _manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable() { public void run() { - // Custom Finish Method (usually messages) - onFinished(player); - + UtilTextMiddle.display(C.cWhite + "Clans Tutorial", C.cGreen + "You have completed the Clans Tutorial!", 20, 20 * 3, 20, player); + onFinishedDelay(player); + // Do Reward if (!_taskManager.hasCompletedTask(player, String.format(TUTORIAL_REWARD_TASK, _technicalName))) { @@ -305,6 +325,25 @@ public abstract class Tutorial implements ScoreboardElement, Listener } }, player, String.format(TUTORIAL_REWARD_TASK, _technicalName)); } + else + { + UtilInv.remove(player, Material.IRON_AXE, (byte) 0, 1); + + UtilInv.remove(player, Material.IRON_HELMET, (byte) 0, 1); + UtilInv.remove(player, Material.IRON_CHESTPLATE, (byte) 0, 1); + UtilInv.remove(player, Material.IRON_LEGGINGS, (byte) 0, 1); + UtilInv.remove(player, Material.IRON_BOOTS, (byte) 0, 1); + + ItemStack[] armor = player.getInventory().getArmorContents(); + for (int i = 0 ; i < armor.length; i++) + { + if (UtilItem.isIronProduct(armor[i])) + { + armor[i] = null; + } + } + player.getInventory().setArmorContents(armor); + } _manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable() { @@ -340,13 +379,17 @@ public abstract class Tutorial implements ScoreboardElement, Listener } }, 20 * 2); } - }, 20 * 4); + }, 20 * 2); } // Implementation left to sub classes. protected void onFinished(final Player player) { } + + protected void onFinishedDelay(final Player player) + { + } // Implementation left to sub classes. protected void onBegin(final Player player) @@ -357,7 +400,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener { if (!_manager.isInTutorial(player)) { - _manager._playerTutorials.put(player.getName(), this); + _manager.setTutorial(player, this); } _inTutorial.put(player.getName(), new TutorialClient(player, this)); @@ -380,8 +423,12 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void cancelFor(final Player player) { + get(player).CurrentTask.cleanup(player); + get(player).CurrentTaskStartTime = -1; _inTutorial.remove(player.getName()); + _manager.finishTutorial(player); + if (_ghostMode) { for (Player other : UtilServer.getPlayers()) @@ -402,11 +449,6 @@ public abstract class Tutorial implements ScoreboardElement, Listener return _inTutorial.containsKey(player); } - public Map> getTasks() - { - return _tasks; - } - public boolean hasCompleted(final Player player) { return _taskManager.hasCompletedTask(player, String.format(TUTORIAL_COMPLETE_TASK, _technicalName)); @@ -419,9 +461,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void skip(final Player player) { - new JsonMessage( - AllowedMessage - ) + new JsonMessage("") .extra( F.main( "Tutorial", @@ -435,9 +475,11 @@ public abstract class Tutorial implements ScoreboardElement, Listener .color("yellow") .extra("!") .color("gray") + .sendToPlayer(player); - new JsonMessage( + new JsonMessage("") + .extra( F.main( "Tutorial", "Click " @@ -506,7 +548,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener } } - get(player).CurrentTask.trySendDescription(player); + get(player).CurrentTask.trySendDescription(player, false); } } } @@ -532,6 +574,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener evt.setCancelled(true); } + @EventHandler + public void onJoinClan(ClanJoinEvent event) + { + if (isInTutorial(event.getPlayer())) + { + event.setCancelled(true); + } + } + @EventHandler public void onPlayerJoin(final PlayerJoinEvent evt) { @@ -552,9 +603,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener public void cleanup(Player player) { - if (get(player) != null && get(player).CurrentTask != null) + System.out.println("Cleaning up Player in " + getClass().getName()); + + if (get(player) != null && get(player).CurrentTask != null) + { + System.out.println("Cleaning up current task: " + get(player).CurrentTask.getClass().getName()); get(player).CurrentTask.cleanup(player); - + } + + System.out.println("removing from in tutorial"); _inTutorial.remove(player.getName()); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java index 043647117..ac44d52a1 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialClient.java @@ -11,15 +11,18 @@ public class TutorialClient public long LastDescriptionSentTime = System.currentTimeMillis() - 3000; public boolean InClanOnStart; public boolean QueuedFinish; + public long CurrentTaskStartTime; public TutorialClient(Player player, Tutorial tutorial) { Player = player; - CurrentTask = tutorial._tasks.get(1); + CurrentTask = tutorial.getTask(0); + CurrentTaskStartTime = System.currentTimeMillis(); InClanOnStart = tutorial._clansManager.isInClan(player); - + + /* for (TutorialTask task : tutorial._tasks.values()) { if (TaskManager.Instance.hasCompletedTask(player, String.format( @@ -34,5 +37,6 @@ public class TutorialClient } } } + */ } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java index 7a637f7ba..7468ff139 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialManager.java @@ -25,6 +25,7 @@ import mineplex.game.clans.tutorials.commands.DoSkipTutorialCommand; import mineplex.game.clans.tutorials.commands.SkipTutorialCommand; import mineplex.game.clans.tutorials.gettingstarted.TutorialGettingStarted; import net.md_5.bungee.api.ChatColor; +import net.minecraft.server.v1_8_R3.IChatBaseComponent; import net.minecraft.server.v1_8_R3.PacketPlayOutChat; public class TutorialManager extends MiniPlugin @@ -32,7 +33,7 @@ public class TutorialManager extends MiniPlugin public static TutorialManager Instance; private final Map, Tutorial> _tutorials = new HashMap<>(); - protected final Map _playerTutorials = new HashMap<>(); + private final Map _playerTutorials = new HashMap<>(); private final TaskManager _taskManager; @@ -64,7 +65,7 @@ public class TutorialManager extends MiniPlugin { chat.a.a().remove(0); } - else + else if (!chat.a.a().get(0).c().contains(Tutorial.AllowedBypass)) { if (isInTutorial(packet.getPlayer())) { @@ -138,10 +139,13 @@ public class TutorialManager extends MiniPlugin @EventHandler public void quit(PlayerQuitEvent event) { + System.out.println("Player Quit. In Tutorial: " + isInTutorial(event.getPlayer())); + if (!isInTutorial(event.getPlayer())) return; getTutorial(event.getPlayer()).cleanup(event.getPlayer()); + _playerTutorials.remove(event.getPlayer().getName()); } public void sendTutorialMsg(Player player, String message) @@ -156,6 +160,16 @@ public class TutorialManager extends MiniPlugin sendTutorialMsg(player, message); } } + + public void finishTutorial(Player player) + { + _playerTutorials.remove(player.getName()); + } + + public void setTutorial(Player player, Tutorial tutorial) + { + _playerTutorials.put(player.getName(), tutorial); + } public Tutorial getTutorial(final Player player) { @@ -171,4 +185,72 @@ public class TutorialManager extends MiniPlugin { return _taskManager; } + + // Stolen from UtilTabTitle + private static class TextConverter + { + public static String convert(String text) + { + if (text == null || text.length() == 0) + { + return "\"\""; + } + + char c; + int i; + int len = text.length(); + StringBuilder sb = new StringBuilder(len + 4); + String t; + sb.append('"'); + + for (i = 0; i < len; i += 1) + { + c = text.charAt(i); + switch (c) + { + case '\\': + case '"': + sb.append('\\'); + sb.append(c); + break; + case '/': + sb.append('\\'); + sb.append(c); + break; + case '\b': + sb.append("\\b"); + break; + case '\t': + sb.append("\\t"); + break; + case '\n': + sb.append("\\n"); + break; + case '\f': + sb.append("\\f"); + break; + case '\r': + sb.append("\\r"); + break; + default: + if (c < ' ') + { + t = "000" + Integer.toHexString(c); + sb.append("\\u").append(t.substring(t.length() - 4)); + } + else + { + sb.append(c); + } + } + } + sb.append('"'); + return sb.toString(); + } + + public static String setPlayerName(Player player, String text) + { + return text.replaceAll("(?i)\\{PLAYER\\}", player.getName()); + } + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java index 0934fff08..6b4d2a332 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/TutorialTask.java @@ -1,13 +1,21 @@ package mineplex.game.clans.tutorials; +import java.util.Iterator; + +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import mineplex.core.common.util.C; import mineplex.core.common.util.NautArrayList; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansManager; public class TutorialTask implements Listener @@ -22,6 +30,8 @@ public class TutorialTask implements Listener protected String _description; protected String _finishMessage; + protected String[] _subtasks; + protected Location _taskPos; // How much time after the beginning the task/last teleport it should take to teleport back to _taskPos. @@ -29,7 +39,6 @@ public class TutorialTask implements Listener protected long _descriptionWaitTime = 30000; - protected NautArrayList _playersFinished = new NautArrayList<>(); protected NautArrayList _inTask = new NautArrayList<>(); private long _lastTaskTp; @@ -55,7 +64,7 @@ public class TutorialTask implements Listener { _inTask.add(player.getName()); - trySendDescription(player); + trySendDescription(player, true); customStartFor(player); @@ -92,12 +101,41 @@ public class TutorialTask implements Listener } } + //@EventHandler + //todo: fix the multiline subtitles + public void displaySubtasks(UpdateEvent event) + { + if (!event.getType().equals(UpdateType.SEC)) + { + return; + } + + if (_subtasks == null || _subtasks.length == 0) + { + return; + } + + Iterator iterator = _inTask.iterator(); + while (iterator.hasNext()) + { + Player player = Bukkit.getPlayer(iterator.next()); + + if ((System.currentTimeMillis() - _tutorial.get(player).CurrentTaskStartTime) >= 15000) + { + if (isDoing(player)) + { + UtilTextMiddle.display("", UtilText.arrayToString(_subtasks, "\n"), 1, 25, 25, player); + } + } + } + } + public boolean isDoing(Player player) { return _inTask != null && player != null && _inTask.contains(player.getName()); } - public void trySendDescription(Player player) + public void trySendDescription(Player player, boolean force) { if (!_tutorial.isInTutorial(player)) { @@ -111,19 +149,24 @@ public class TutorialTask implements Listener return; } - if (System.currentTimeMillis() - client.LastDescriptionSentTime > client.CurrentTask.getDescriptionWaitTime()) + if (force || System.currentTimeMillis() - client.LastDescriptionSentTime > client.CurrentTask.getDescriptionWaitTime()) { + String description = _description; + ClanInfo clan = getClans().getClan(player); + if (clan != null) description = description.replace("(clan)", clan.getName()); + description = description.replace("{", C.cAqua).replace("}", C.cWhite); + _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, " "); - _tutorial._manager.sendTutorialMsg(player, C.cYellowB + "Part " + _id + ": " + _displayName); - _tutorial._manager.sendTutorialMsg(player, C.cWhite + " " + _description.replace("{", C.cAqua).replace("}", C.cWhite)); + _tutorial._manager.sendTutorialMsg(player, C.cYellowB + "Part " + (_id + 1) + ": " + _displayName); + _tutorial._manager.sendTutorialMsg(player, C.cWhite + " " + description); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); - UtilTextMiddle.display("", getDisplayName()); + UtilTextMiddle.display("", getDisplayName(), player); client.LastDescriptionSentTime = System.currentTimeMillis(); } @@ -169,30 +212,39 @@ public class TutorialTask implements Listener { return _tutorial._clansManager; } - - public int getID() + + public int getDataId() { return _id; } + public int getID() + { + return _id + 1; + } + public void finishFor(Player player) { customEndFor(player); + cleanup(player); _tutorial.finishTask(player, this); } public void visibleFinish(Player player) { - _inTask.remove(player.getName()); - if (_finishMessage != null) { + String finishMessage = _finishMessage; + ClanInfo clan = getClans().getClan(player); + if (clan != null) finishMessage = finishMessage.replace("(clan)", clan.getName()); + finishMessage = finishMessage.replace("{", C.cAqua).replace("}", C.cWhite); + _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, " "); - _tutorial._manager.sendTutorialMsg(player, C.cWhite + _finishMessage.replace("{", C.cAqua).replace("}", C.cWhite)); + _tutorial._manager.sendTutorialMsg(player, C.cWhite + finishMessage); _tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); } @@ -201,7 +253,6 @@ public class TutorialTask implements Listener public void cleanup(Player player) { _inTask.remove(player.getName()); - _playersFinished.remove(player.getName()); } public long getDescriptionWaitTime() diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java index a3c936754..23edfed24 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskClaim.java @@ -21,7 +21,7 @@ public class TaskClaim extends TutorialTask + "Once claimed, only your Clan can break/place blocks here. " + "This is the perfect place to build a base and stash your items! " + "You can only claim in the Wilderness, and not next to other Clan's Territory. " - + "To claim some territory, go into the Clans GUI by typing {/c} and {Left-Clicking}"; + + "To claim some territory, go into the Clans GUI by typing {/c} and {Left-Clicking} the Territory button. (Looks like a flag)"; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java index ea7d0c3a6..91f065320 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskCustomizeClass.java @@ -48,7 +48,14 @@ public class TaskCustomizeClass extends TutorialTask if (clientclass != null && clientclass.GetSavingCustomBuild() != null && clientclass.GetSavingCustomBuild().AxeSkill != null) { finishFor(player); + iterator.remove(); } } } + + @Override + public void cleanup(Player player) + { + // handled in onUpdate + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java index 69ca5de33..a294434cb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskDisbandClan.java @@ -25,18 +25,6 @@ public class TaskDisbandClan extends TutorialTask @Override public void customStartFor(final Player player) { - if (_tutorial.get(player).InClanOnStart) - { - UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(getManager().getPlugin(), new Runnable(){ - public void run() - { - if (isDoing(player)) - { - finishFor(player); - } - } - }, 6 * 20); - } } @EventHandler @@ -46,6 +34,8 @@ public class TaskDisbandClan extends TutorialTask { return; } + + System.out.println("COMPLETE DISBAND CLAN!"); finishFor(event.getDisbander()); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java index 01584fd32..458e04bb4 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskEquipClass.java @@ -29,6 +29,12 @@ public class TaskEquipClass extends TutorialTask + "Purchase Iron Armor from the PvP Shop. " + "Then put on your armor to equip the Knight Class."; +// _subtasks = new String[] { +// "Open the PvP Shop", +// "Buy Iron Armor Set", +// "Equip Iron Armor" +// }; + _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f); } @@ -56,6 +62,11 @@ public class TaskEquipClass extends TutorialTask public void customStartFor(Player player) { _bought.put(player.getName(), new NautArrayList()); + + if (getClans().getClassManager().Get(player).GetGameClass() != null) + { + finishFor(player); + } } @EventHandler diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java index 39ddfd126..d34c2129e 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskExploreShops.java @@ -57,12 +57,19 @@ public class TaskExploreShops extends TutorialTask if (ClansManager.getInstance().getClan(event.getPlayer()).getEnergyPurchasable() == 0) { finishFor(event.getPlayer()); + _inTask.remove(event.getPlayer().getName()); return; } event.setFree(true); } - + + @Override + public void cleanup(Player player) + { + // handled in on update + } + @EventHandler public void onUpdate(UpdateEvent event) { @@ -78,6 +85,7 @@ public class TaskExploreShops extends TutorialTask if (ClansManager.getInstance().getClan(player).getEnergy() == ClansManager.getInstance().getClan(player).getEnergyMax()) { finishFor(player); + iterator.remove(); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java index 71a8155da..5f0f7926c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskLeaveSpawn.java @@ -6,6 +6,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.tutorials.TutorialTask; @@ -31,6 +33,7 @@ public class TaskLeaveSpawn extends TutorialTask if (player.getLocation().getY() < 100) { finishFor(player); + _inTask.remove(player.getName()); } } @@ -45,12 +48,20 @@ public class TaskLeaveSpawn extends TutorialTask Iterator iterator = _inTask.iterator(); while (iterator.hasNext()) { - Player player = Bukkit.getPlayer(iterator.next()); + String playerName = iterator.next(); + Player player = UtilPlayer.searchExact(playerName); - if (player.getLocation().getY() < 100 && getClans().getClanUtility().getClaim(player.getLocation()) == null) + if (player != null && player.getLocation().getY() < 100 && getClans().getClanUtility().getClaim(player.getLocation()) == null) { finishFor(player); + iterator.remove(); } } } + + @Override + public void cleanup(Player player) + { + // We handle this in update() to avoid ConcurrentModificationException + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java index 3aefb2ab7..6ff1d9b4e 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskMakingMoney.java @@ -34,7 +34,7 @@ public class TaskMakingMoney extends TutorialTask @Override public void customStartFor(Player player) { - player.getInventory().addItem(new ItemStack(Material.CARROT, 1)); + player.getInventory().addItem(new ItemStack(Material.CARROT_ITEM, 1)); } @EventHandler @@ -45,7 +45,7 @@ public class TaskMakingMoney extends TutorialTask return; } - if (!event.getItem().getType().equals(Material.CARROT)) + if (!event.getItem().getType().equals(Material.CARROT_ITEM)) { return; } @@ -61,15 +61,12 @@ public class TaskMakingMoney extends TutorialTask return; } - if (!ClansManager.getInstance().isInClan(event.getPlayer())) - { - return; - } - if (!event.getItem().getType().equals(Material.CARROT_ITEM)) { return; } + + System.out.println("FINISH CARROT"); finishFor(event.getPlayer()); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java index 58c9bb58d..c94324660 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskUseAbility.java @@ -9,14 +9,18 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.CraftingInventory; +import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import mineplex.core.common.util.Callback; import mineplex.core.common.util.NautArrayList; import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilServer; import mineplex.core.task.TaskManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -49,7 +53,6 @@ public class TaskUseAbility extends TutorialTask public void customStartFor(Player player) { _bought.put(player.getName(), new NautArrayList()); - _teleported.put(player.getName(), false); } @Override @@ -70,7 +73,7 @@ public class TaskUseAbility extends TutorialTask { Player _player = Bukkit.getPlayer(iterator.next()); - if (!_teleported.get(_player.getName()) && _player != null && _player.isOnline() && _player.getOpenInventory().getType() == InventoryType.CRAFTING) + if (!_teleported.containsKey(_player.getName()) && _player != null && _player.isOnline() && _player.getOpenInventory().getType() == InventoryType.CRAFTING) { _player.teleport(new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f)); _teleported.put(_player.getName(), true); @@ -78,6 +81,7 @@ public class TaskUseAbility extends TutorialTask } } + /* @EventHandler public void onAbilityUesd(SkillTriggerEvent event) { @@ -88,6 +92,25 @@ public class TaskUseAbility extends TutorialTask finishFor(event.GetPlayer()); } + */ + + @EventHandler + public void onRightClick(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!isDoing(player)) + return; + + if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) + { + ItemStack item = player.getItemInHand(); + if (item != null && item.getType() == Material.IRON_AXE) + { + finishFor(player); + } + } + } @EventHandler public void button(ClansShopAddButtonEvent event) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java index 60e732340..9ece47104 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TaskViewClanDetails.java @@ -16,7 +16,7 @@ public class TaskViewClanDetails extends TutorialTask _technicalName = "CommandClanX"; _description = "Now you can view information about your clan. " - + "To do this type {/c [clan name]}! " + + "To do this type {/c (clan)}! " + "You can also use any clan's name to get some information about them as well."; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java index 0fe1fc7fd..fe2dde3df 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/gettingstarted/TutorialGettingStarted.java @@ -25,7 +25,7 @@ public class TutorialGettingStarted extends Tutorial // addTask(new TaskWelcome(this, 1)); - int id = 0; + int id = -1; addTask(new TaskCreateClan(this, ++id)); addTask(new TaskViewClanDetails(this, ++id)); addTask(new TaskLeaveSpawn(this, ++id)); @@ -49,6 +49,13 @@ public class TutorialGettingStarted extends Tutorial @Override public void onFinished(final Player player) + { + player.resetPlayerTime(); + player.teleport(Spawn.getEastSpawn()); + } + + @Override + protected void onFinishedDelay(Player player) { _manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _manager.sendTutorialMsg(player, C.cYellowB + "CONGRATULATIONS"); @@ -56,11 +63,8 @@ public class TutorialGettingStarted extends Tutorial _manager.sendTutorialMsg(player, C.cWhite + "You have completed the Clans basic tutorial and have been awarded " + C.cAqua + "30,000 Gold"); _manager.sendTutorialMsg(player, C.cWhite + "You can now begin your adventure, but do take a moment to read the signs around spawn for more information!"); _manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); - - player.resetPlayerTime(); - player.teleport(Spawn.getEastSpawn()); } - + @Override public void onBegin(final Player player) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java index eb60ba482..ba2c0d8cd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -117,7 +117,7 @@ public class HolidayManager implements Listener @EventHandler public void blockEffect(UpdateEvent event) { - if (event.getType() == UpdateType.TICK) + if (event.getType() != UpdateType.TICK) return; Iterator blockIterator = _active.iterator();