Merge branch 'master' of ssh://184.154.0.242:7999/min/Mineplex

This commit is contained in:
Cheese 2015-12-08 10:31:25 +11:00
commit 719297ebb1
41 changed files with 983 additions and 186 deletions

View File

@ -56,11 +56,11 @@ public class MotdManager implements Listener, Runnable
//String motdLine = "§f§l◄ §c§lMaintenance§f§l ►"; //String motdLine = "§f§l◄ §c§lMaintenance§f§l ►";
//String motdLine = "§f§l◄ §a§lCarl the Creeper§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 = " §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 = " §d§lRank Sale §a§l40% Off");
//String motdLine = " §f§l◄§c§lMAINTENANCE§f§l►"); //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"); System.out.println("Updated Bungee MOTD");
} }
} }

View File

@ -110,4 +110,29 @@ public class UtilText {
return s.length() <= maxLength ? s : s.substring(0, maxLength); return s.length() <= maxLength ? s : s.substring(0, maxLength);
} }
public static <X> 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 <X> String arrayToString(X[] array)
{
return arrayToString(array, null);
}
} }

View File

@ -84,19 +84,6 @@ public class ServerCommand extends CommandBase<Portal>
else else
deniedAccess = true; 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 else
{ {
Plugin.sendPlayerToServer(player, args[0]); Plugin.sendPlayerToServer(player, args[0]);

View File

@ -189,6 +189,6 @@ public class ExclusivePreferencesPage extends ShopPageBase<PreferencesManager, E
public boolean preferencesChanged() public boolean preferencesChanged()
{ {
return _hubInvisibilityToggled || _macReportsToggled || _hubInvisibilityToggled || _hubForcefieldToggled; return _hubInvisibilityToggled || _macReportsToggled || _hubIgnoreVelocityToggled || _hubForcefieldToggled;
} }
} }

View File

@ -106,6 +106,10 @@ public class PlayerScoreboard
continue; continue;
} }
// Ignore extra lines
if (i >= _teamNames.length)
continue;
//Update //Update
Team team = _scoreboard.getTeam(_teamNames[i]); Team team = _scoreboard.getTeam(_teamNames[i]);
if (team == null) if (team == null)

View File

@ -91,41 +91,14 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue)); UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue));
// Verify stat is in our local cache, if not add it remotely. // 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() addToQueue(statName, player, value);
{ }
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);
}
} }
private void addToQueue(String statName, Player player, long value) private void addToQueue(String statName, Player player, long value)
@ -192,23 +165,51 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
public boolean incrementStat(final int accountId, final String statName, final long value) public boolean incrementStat(final int accountId, final String statName, final long value)
{ {
if (_stats.containsKey(statName)) // This will register a new stat if we don't have one, otherwise it will just run the callback
return false; registerNewStat(statName, new Runnable()
final NautHashMap<Integer, NautHashMap<Integer, Long>> uploadQueue = new NautHashMap<Integer, NautHashMap<Integer, Long>>();
uploadQueue.put(accountId, new NautHashMap<Integer, Long>());
uploadQueue.get(accountId).put(_stats.get(statName), value);
runAsync(new Runnable()
{ {
@Override
public void run() public void run()
{ {
final NautHashMap<Integer, NautHashMap<Integer, Long>> uploadQueue = new NautHashMap<Integer, NautHashMap<Integer, Long>>();
uploadQueue.put(accountId, new NautHashMap<Integer, Long>());
uploadQueue.get(accountId).put(_stats.get(statName), value);
_repository.saveStats(uploadQueue); _repository.saveStats(uploadQueue);
} }
}); });
return true; 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) public int getStatId(String statName)
{ {

View File

@ -49,7 +49,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer;
public class Clans extends JavaPlugin public class Clans extends JavaPlugin
{ {
public static final String VERSION = "0.16"; public static final String VERSION = "0.17b";
private String WEB_CONFIG = "webServer"; private String WEB_CONFIG = "webServer";
// Modules // Modules

View File

@ -462,7 +462,7 @@ public class ClanInfo
public boolean isOnline() public boolean isOnline()
{ {
return isOnlineNow() || System.currentTimeMillis() - _lastOnline.getTime() < Clans.getOnlineTime(); return isOnlineNow();// || System.currentTimeMillis() - _lastOnline.getTime() < Clans.getOnlineTime();
} }
public String getProtected() public String getProtected()

View File

@ -17,13 +17,15 @@ import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilWorld; import mineplex.core.common.util.UtilWorld;
import mineplex.game.clans.clans.event.ClanCreatedEvent; import mineplex.game.clans.clans.event.ClanCreatedEvent;
import mineplex.game.clans.clans.event.ClanDeleteEvent; 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.event.ClanSetHomeEvent;
import mineplex.game.clans.clans.scoreboard.ClansScoreboardManager; import mineplex.game.clans.clans.scoreboard.ClansScoreboardManager;
import mineplex.game.clans.clans.tntGenerator.TntGenerator; 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.ClanRepository;
import mineplex.game.clans.core.repository.ClanTerritory; import mineplex.game.clans.core.repository.ClanTerritory;
import mineplex.game.clans.core.repository.tokens.ClanToken; import mineplex.game.clans.core.repository.tokens.ClanToken;
import mineplex.game.clans.core.war.ClanWarData;
public class ClansDataAccessLayer public class ClansDataAccessLayer
{ {
@ -201,6 +203,15 @@ public class ClansDataAccessLayer
public void join(final ClanInfo clan, final Player player, final ClanRole role, final Callback<Boolean> callback) public void join(final ClanInfo clan, final Player player, final ClanRole role, final Callback<Boolean> callback)
{ {
ClanJoinEvent event = new ClanJoinEvent(clan, player);
UtilServer.getServer().getPluginManager().callEvent(event);
if (event.isCancelled())
{
return;
}
runAsync(new Runnable() runAsync(new Runnable()
{ {
@Override @Override
@ -259,6 +270,15 @@ public class ClansDataAccessLayer
{ {
if (clan == null) return; if (clan == null) return;
ClanLeaveEvent event = new ClanLeaveEvent(clan, clansPlayer);
UtilServer.getServer().getPluginManager().callEvent(event);
if (event.isCancelled())
{
return;
}
runAsync(new Runnable() runAsync(new Runnable()
{ {
@Override @Override
@ -636,6 +656,10 @@ public class ClansDataAccessLayer
{ {
final Timestamp currentTime = new Timestamp(System.currentTimeMillis()); final Timestamp currentTime = new Timestamp(System.currentTimeMillis());
final ClanWarData war = new ClanWarData(clanA.getName(), clanB.getName(), score, currentTime, currentTime, 0); final ClanWarData war = new ClanWarData(clanA.getName(), clanB.getName(), score, currentTime, currentTime, 0);
// Memory
clanA.addWar(war);
clanB.addWar(war);
runAsync(new Runnable() runAsync(new Runnable()
{ {
@ -649,10 +673,6 @@ public class ClansDataAccessLayer
@Override @Override
public void run() public void run()
{ {
// Memory
clanA.addWar(war);
clanB.addWar(war);
_manager.log("Initiator war for [" + clanA.getName() + "] against [" + clanB.getName() + "]."); _manager.log("Initiator war for [" + clanA.getName() + "] against [" + clanB.getName() + "].");
if (warCallback != null) warCallback.run(war); if (warCallback != null) warCallback.run(war);

View File

@ -66,6 +66,7 @@ import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanTips.TipType; import mineplex.game.clans.clans.ClanTips.TipType;
import mineplex.game.clans.clans.ClansUtility.ClanRelation; 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.ClanManagementCommand;
import mineplex.game.clans.clans.commands.ClansAllyChatCommand; import mineplex.game.clans.clans.commands.ClansAllyChatCommand;
import mineplex.game.clans.clans.commands.ClansChatCommand; import mineplex.game.clans.clans.commands.ClansChatCommand;
@ -304,6 +305,8 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
loadClan(token); loadClan(token);
} }
// new ClaimVisualizer(plugin, this);
// RedisDataRepository(ConnectionData writeConn, ConnectionData // RedisDataRepository(ConnectionData writeConn, ConnectionData
// readConn, Region region, Class<T> elementType, String elementLabel) // readConn, Region region, Class<T> elementType, String elementLabel)
// Initialize default region factions and territory // Initialize default region factions and territory
@ -672,7 +675,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
if (clan == null) if (clan == null)
{ {
event.setFormat(rank + C.cYellow + "%1$s " + C.cWhite + "%2$s"); 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; return;
} }
@ -692,7 +695,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
String message = event.getMessage(); String message = event.getMessage();
message = _chat.getFilteredMessage(event.getPlayer(), message); message = _chat.getFilteredMessage(event.getPlayer(), message);
ClanRelation rel = _clanUtility.rel(clan, otherClan); 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); other.sendMessage(formatted);
} }
} }

View File

@ -717,11 +717,11 @@ public class ClansUtility
return false; return false;
} }
// if (clan.getEnergy() == 0) if (clan.getEnergy() == 0)
// { {
// Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You must purchase energy at a shop before you can claim land.")); Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You must purchase energy at a shop before you can claim land."));
// return false; return false;
// } }
String chunk = UtilWorld.chunkToStr(caller.getLocation().getChunk()); String chunk = UtilWorld.chunkToStr(caller.getLocation().getChunk());
ClanInfo ownerClan = getOwner(caller.getLocation()); ClanInfo ownerClan = getOwner(caller.getLocation());
@ -740,11 +740,11 @@ public class ClansUtility
} }
} }
// if (clan.getClaims() >= clan.getClaimsMax()) if (clan.getClaims() >= clan.getClaimsMax())
// { {
// Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "Your Clan cannot claim more Territory.")); Clans.getTutorials().sendTutorialMsg(caller, F.main("Clans", "Your Clan cannot claim more Territory."));
// return false; return false;
// } }
// Adjacent // Adjacent
boolean selfAdj = false; boolean selfAdj = false;
@ -1084,7 +1084,7 @@ public class ClansUtility
} }
// Event // Event
PlayerUnClaimTerritoryEvent event = new PlayerUnClaimTerritoryEvent(caller, caller.getLocation().getChunk()); PlayerUnClaimTerritoryEvent event = new PlayerUnClaimTerritoryEvent(caller, caller.getLocation().getChunk(), ownerClan);
UtilServer.getServer().getPluginManager().callEvent(event); UtilServer.getServer().getPluginManager().callEvent(event);

View File

@ -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<String> _visualizing;
private NautHashMap<ClanInfo, NautHashMap<String, VisualizedChunkData>> _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<String, VisualizedChunkData>());
}
}
@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<String, VisualizedChunkData>());
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<VisualizedChunkData> 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<EnumDirection> 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."));
}
}

View File

@ -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<EnumDirection> _displayableEdges;
private Chunk _chunk;
public long _start;
public VisualizedChunkData(Chunk chunk, List<EnumDirection> 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;
}
}

View File

@ -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<ClaimVisualizer>
{
public ClaimVisualizeCommand(ClaimVisualizer plugin)
{
super(plugin, Rank.ALL, "showclaims");
}
@Override
public void Execute(Player caller, String[] args)
{
Plugin.toggleVisualizer(caller);
}
}

View File

@ -38,7 +38,6 @@ import mineplex.game.clans.items.legendaries.WindBlade;
public class ClanManagementCommand extends CommandBase<ClansManager> public class ClanManagementCommand extends CommandBase<ClansManager>
{ {
private ClansManager _clansManager; private ClansManager _clansManager;
public ClanManagementCommand(ClansManager plugin) public ClanManagementCommand(ClansManager plugin)

View File

@ -1,5 +1,6 @@
package mineplex.game.clans.clans.commands; package mineplex.game.clans.clans.commands;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.BlockFace; 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.ClansBlacklist;
import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ClientClan; import mineplex.game.clans.clans.ClientClan;
import mineplex.game.clans.clans.event.ClanJoinEvent;
import mineplex.game.clans.clans.event.ClansCommandExecutedEvent; import mineplex.game.clans.clans.event.ClansCommandExecutedEvent;
import mineplex.game.clans.tutorials.Tutorial; import mineplex.game.clans.tutorials.Tutorial;
import mineplex.game.clans.tutorials.TutorialManager; import mineplex.game.clans.tutorials.TutorialManager;
@ -382,6 +384,10 @@ public class ClansCommand extends CommandBase<ClansManager>
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "The clan " + F.elem("Clan " + clan.getName()) + " is full and cannot be joined!")); _manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "The clan " + F.elem("Clan " + clan.getName()) + " is full and cannot be joined!"));
return; return;
} }
ClanJoinEvent event = new ClanJoinEvent(clan, caller);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) return;
// Task // Task
Plugin.getClanDataAccess().join(clan, caller, ClanRole.RECRUIT, new Callback<Boolean>() Plugin.getClanDataAccess().join(clan, caller, ClanRole.RECRUIT, new Callback<Boolean>()

View File

@ -6,6 +6,8 @@ import org.bukkit.entity.Player;
import mineplex.core.command.CommandBase; import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.task.TaskManager; import mineplex.core.task.TaskManager;
import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.tutorials.Tutorial; import mineplex.game.clans.tutorials.Tutorial;
@ -22,6 +24,12 @@ public class RestartTutCommand extends CommandBase<TutorialManager>
@Override @Override
public void Execute(Player caller, String[] args) 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 if (ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null
&& ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).isSafe(caller.getLocation())) && ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).isSafe(caller.getLocation()))
{ {
@ -43,7 +51,7 @@ public class RestartTutCommand extends CommandBase<TutorialManager>
} }
else 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."));
} }
} }
} }

View File

@ -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;
}
}

View File

@ -5,19 +5,23 @@ import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import mineplex.game.clans.clans.ClanInfo;
public class PlayerUnClaimTerritoryEvent extends Event public class PlayerUnClaimTerritoryEvent extends Event
{ {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private Player _unClaimer; private Player _unClaimer;
private Chunk _unClaimedChunk; private Chunk _unClaimedChunk;
private ClanInfo _clan;
private boolean _cancelled; private boolean _cancelled;
public PlayerUnClaimTerritoryEvent(Player unClaimer, Chunk unClaimedChunk) public PlayerUnClaimTerritoryEvent(Player unClaimer, Chunk unClaimedChunk, ClanInfo clan)
{ {
_unClaimer = unClaimer; _unClaimer = unClaimer;
_unClaimedChunk = unClaimedChunk; _unClaimedChunk = unClaimedChunk;
_clan = clan;
} }
public Player getUnClaimer() public Player getUnClaimer()
@ -35,6 +39,11 @@ public class PlayerUnClaimTerritoryEvent extends Event
_cancelled = cancelled; _cancelled = cancelled;
} }
public ClanInfo getClan()
{
return _clan;
}
public boolean isCancelled() public boolean isCancelled()
{ {
return _cancelled; return _cancelled;

View File

@ -42,19 +42,17 @@ public class ClansScoreboardManager extends ScoreboardManager
private void init(TutorialManager tutorialManager) private void init(TutorialManager tutorialManager)
{ {
setTitle(" MINEPLEX CLANS "); setTitle("Clans Alpha " + Clans.VERSION);
ScoreboardData data = getData("default", true); ScoreboardData data = getData("default", true);
data.write(C.cGreen + "Clans Alpha " + Clans.VERSION);
data.writeEmpty();
data.writeElement(new ScoreboardElementClan(_clansManager)); data.writeElement(new ScoreboardElementClan(_clansManager));
data.writeElement(new ScoreboardElementPlayer(_clansManager)); data.writeElement(new ScoreboardElementPlayer(_clansManager));
data.writeElement(new ScoreboardElementPlayerCount(_clansManager)); // data.writeElement(new ScoreboardElementPlayerCount(_clansManager));
data.writeElement(_worldEvent);
data.writeElement(_warManager); data.writeElement(_warManager);
data.writeElement(_worldEvent);
for (Tutorial tutorial : tutorialManager.getTutorials().values()) for (Tutorial tutorial : tutorialManager.getTutorials().values())
{ {
data.writeElement(tutorial); data.writeElement(tutorial);

View File

@ -35,8 +35,7 @@ public class ScoreboardElementClan implements ScoreboardElement
// Energy // Energy
if (clanInfo.getEnergyCostPerMinute() > 0) 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 + "Energy " + C.cWhite + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT));
output.add(C.cYellow + "Home " + C.cWhite + clanInfo.getBedStatusStr());
} }
else else
{ {

View File

@ -27,10 +27,9 @@ public class ScoreboardElementPlayer implements ScoreboardElement
{ {
List<String> output = new ArrayList<String>(); List<String> output = new ArrayList<String>();
output.add(C.cYellow + "Gold " + C.cWhite + manager.getDonation().Get(player).GetBalance(CurrencyType.Gold) + ""); output.add(C.cYellow + "Gold " + C.cWhite + manager.getDonation().Get(player).GetBalance(CurrencyType.Gold) + "");
output.add("");
String regionString = C.xWilderness + "Wilderness"; String regionString = C.xWilderness + "Wilderness";
output.add(" ");
ClanTerritory claim = _clansManager.getClanUtility().getClaim(player.getLocation()); ClanTerritory claim = _clansManager.getClanUtility().getClaim(player.getLocation());
if (claim != null) if (claim != null)
{ {

View File

@ -29,7 +29,7 @@ public class ScoreboardElementPlayerCount implements ScoreboardElement
List<String> output = new ArrayList<String>(); List<String> output = new ArrayList<String>();
output.add(""); 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; return output;
} }

View File

@ -97,7 +97,7 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
{ {
for (WarInvasion invasion : invasions) for (WarInvasion invasion : invasions)
{ {
if (invasion.getInvaderClan().equals(playerClan)) if (invasion.getInvaderClan().equals(playerClan.getName()))
return true; return true;
} }
} }
@ -125,15 +125,24 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
final ClanInfo killerClan = event.getKiller().getClan(); final ClanInfo killerClan = event.getKiller().getClan();
ClanWarData war = clan.getWarData(killerClan); 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 already exists
war.increment(killerClan.getName());
ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan); ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan);
_clansManager.messageClan(killerClan, F.main("Clans", "Your clan gained 1 War Point against " + rel.getColor(false) + _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 + ")")); 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) + _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 + ")")); killerClan.getName() + " " + C.Reset + "(" + clan.getFormattedWarPoints(killerClan) + C.Reset + ")"));
war.increment(killerClan.getName());
checkWarComplete(war); checkWarComplete(war);
ClanInfo clanA = clan.getName().equals(war.getClanA()) ? clan : killerClan; 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(killerClan);
_clansManager.getScoreboard().refresh(clan); _clansManager.getScoreboard().refresh(clan);
_clansManager.ClanTips.displayTip(TipType.DOMINANCE_RIP, event.getPlayer().getPlayer());
_clansManager.ClanTips.displayTip(TipType.DOMINANCE_NOOICE, event.getKiller().getPlayer());
} }
else else
{ {
@ -155,14 +161,13 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
public void run(ClanWarData data) public void run(ClanWarData data)
{ {
ClansUtility.ClanRelation rel = _clansManager.getClanUtility().rel(clan, killerClan); 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(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.messageClan(clan, F.main("Clans", "Your clan lost 1 War Point against " + rel.getColor(false) + killerClan.getName()));
_clansManager.getScoreboard().refresh(killerClan); _clansManager.getScoreboard().refresh(killerClan);
_clansManager.getScoreboard().refresh(clan); _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 @EventHandler
public void onInvasionEnd(WarInvasionEndEvent event) 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) if (clan != null)
{ {
List<WarInvasion> invadedList = _invadedMap.get(clan); List<WarInvasion> invadedList = _invadedMap.get(clan.getName());
List<WarInvasion> invaderList = _invaderMap.get(clan); List<WarInvasion> invaderList = _invaderMap.get(clan.getName());
if (invaderList != null && !invaderList.isEmpty()) if (invaderList != null && !invaderList.isEmpty())
{ {
for (WarInvasion invasion : invaderList) for (WarInvasion invasion : invaderList)
{ {
element.add(" ");
element.add(C.cPurpleB + "Invading"); element.add(C.cPurpleB + "Invading");
element.add(" " + invasion.getInvadedClan()); element.add(" " + invasion.getInvadedClan());
element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); 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) for (WarInvasion invasion : invadedList)
{ {
element.add(" ");
element.add(C.cRedB + "Invaded"); element.add(C.cRedB + "Invaded");
element.add(" " + invasion.getInvaderClan()); element.add(" " + invasion.getInvaderClan());
element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT)); element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT));

View File

@ -35,6 +35,7 @@ public class HeavyArrowsAttribute extends ItemAttribute
@Override @Override
public void onAttack(CustomDamageEvent event) public void onAttack(CustomDamageEvent event)
{ {
event.AddKnockback("HeavyAttribute", _knockbackPercent); double knockback = (_knockbackPercent / 100d) * 6;
event.AddKnockback("Heavy Attribute", knockback);
} }
} }

View File

@ -248,7 +248,7 @@ public class Spawn extends MiniPlugin
if (isInSpawn(player)) 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); event.SetCancelled(true);
} }
} }

View File

@ -8,6 +8,7 @@ import java.util.Map;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.FireworkEffect.Type; import org.bukkit.FireworkEffect.Type;
import org.bukkit.Material;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; 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.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import mineplex.core.common.jsonchat.ClickEvent; 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.Callback;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilFirework; 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.UtilPlayer;
import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTextMiddle;
@ -40,6 +44,7 @@ import mineplex.core.task.TaskManager;
import mineplex.core.updater.UpdateType; import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.event.ClanJoinEvent;
import mineplex.game.clans.clans.event.ClanTipEvent; import mineplex.game.clans.clans.event.ClanTipEvent;
import mineplex.game.clans.economy.GoldManager; import mineplex.game.clans.economy.GoldManager;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat; 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 SKIPPED_TASK = "tatatatata%sSkip";
public static String AllowedMessage = C.cGold + "TutorialAllowedMessage" + C.Reset; public static String AllowedMessage = C.cGold + "TutorialAllowedMessage" + C.Reset;
public static String AllowedBypass = C.cBlue + "Tutorial>";
protected final TutorialManager _manager; protected final TutorialManager _manager;
protected final GoldManager _goldManager; protected final GoldManager _goldManager;
@ -66,7 +72,8 @@ public abstract class Tutorial implements ScoreboardElement, Listener
protected final TaskManager _taskManager; protected final TaskManager _taskManager;
protected final DonationManager _donationManager; protected final DonationManager _donationManager;
protected final LinkedHashMap<Integer, TutorialTask<?>> _tasks; // protected final LinkedHashMap<Integer, TutorialTask<?>> _tasks;
private final ArrayList<TutorialTask<?>> _tasks;
protected final LinkedHashMap<String, TutorialTask<?>> _nameToTask; protected final LinkedHashMap<String, TutorialTask<?>> _nameToTask;
protected final LinkedHashMap<String, TutorialClient> _inTutorial; protected final LinkedHashMap<String, TutorialClient> _inTutorial;
@ -89,7 +96,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener
_donationManager = donationManager; _donationManager = donationManager;
_taskManager = taskManager; _taskManager = taskManager;
_manager = manager; _manager = manager;
_tasks = new LinkedHashMap<>(); _tasks = new ArrayList<TutorialTask<?>>();
_inTutorial = new LinkedHashMap<>(); _inTutorial = new LinkedHashMap<>();
_nameToTask = new LinkedHashMap<>(); _nameToTask = new LinkedHashMap<>();
@ -122,7 +129,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener
lines.add(C.cAqua + "Tutorial"); lines.add(C.cAqua + "Tutorial");
for (final TutorialTask<?> task : _tasks.values()) for (final TutorialTask<?> task : _tasks)
{ {
if (get(player).CurrentTask.equals(task)) if (get(player).CurrentTask.equals(task))
{ {
@ -142,10 +149,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener
return lines; return lines;
} }
public TutorialTask<?> getTask(int index)
{
return _tasks.get(index);
}
protected void addTask(TutorialTask<?> task) protected void addTask(TutorialTask<?> task)
{ {
_tasks.put(_tasks.size() + 1, task); _tasks.add(task);
_nameToTask.put(task.getTechnicalName(), task); _nameToTask.put(task.getTechnicalName(), task);
} }
@ -158,6 +170,11 @@ public abstract class Tutorial implements ScoreboardElement, Listener
return get(player).CurrentTask.getID() < task.getID(); 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) protected void finishTask(final Player player, final TutorialTask<?> task)
{ {
@ -175,8 +192,10 @@ public abstract class Tutorial implements ScoreboardElement, Listener
{ {
public void run() public void run()
{ {
final TutorialTask<?> lastTask = getLastTask();
// Cycle to next task, or null if last task. // 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()))) 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) public void run(final Boolean completed)
{ {
// If last task, end tutorial. // If last task, end tutorial.
if (task.equals(_tasks.get(_tasks.size()))) if (task.equals(lastTask))
{ {
finishFor(player); finishFor(player);
} }
@ -196,7 +215,9 @@ public abstract class Tutorial implements ScoreboardElement, Listener
{ {
public void run() public void run()
{ {
System.out.println("STARTING NEXT TASK!");
get(player).CurrentTask.startFor(player); get(player).CurrentTask.startFor(player);
get(player).CurrentTaskStartTime = System.currentTimeMillis();
} }
}, 30L); }, 30L);
} }
@ -252,23 +273,22 @@ public abstract class Tutorial implements ScoreboardElement, Listener
private void finishFor(final Player player) private void finishFor(final Player player)
{ {
if (player.getOpenInventory() != null) // if (player.getOpenInventory() != null)
{ // {
_inTutorial.get(player.getName()).QueuedFinish = true; // _inTutorial.get(player.getName()).QueuedFinish = true;
return; // return;
} // }
_manager.finishTutorial(player);
_inTutorial.remove(player.getName()); _inTutorial.remove(player.getName());
onFinished(player);
UtilTextMiddle.display(C.cWhite + "Clans Tutorial", C.cGreen + "You have completed the Clans Tutorial!", 20, 20 * 3, 20);
_manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable() _manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable()
{ {
public void run() public void run()
{ {
// Custom Finish Method (usually messages) UtilTextMiddle.display(C.cWhite + "Clans Tutorial", C.cGreen + "You have completed the Clans Tutorial!", 20, 20 * 3, 20, player);
onFinished(player); onFinishedDelay(player);
// Do Reward // Do Reward
if (!_taskManager.hasCompletedTask(player, String.format(TUTORIAL_REWARD_TASK, _technicalName))) 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)); }, 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() _manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable()
{ {
@ -340,13 +379,17 @@ public abstract class Tutorial implements ScoreboardElement, Listener
} }
}, 20 * 2); }, 20 * 2);
} }
}, 20 * 4); }, 20 * 2);
} }
// Implementation left to sub classes. // Implementation left to sub classes.
protected void onFinished(final Player player) protected void onFinished(final Player player)
{ {
} }
protected void onFinishedDelay(final Player player)
{
}
// Implementation left to sub classes. // Implementation left to sub classes.
protected void onBegin(final Player player) protected void onBegin(final Player player)
@ -357,7 +400,7 @@ public abstract class Tutorial implements ScoreboardElement, Listener
{ {
if (!_manager.isInTutorial(player)) if (!_manager.isInTutorial(player))
{ {
_manager._playerTutorials.put(player.getName(), this); _manager.setTutorial(player, this);
} }
_inTutorial.put(player.getName(), new TutorialClient(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) public void cancelFor(final Player player)
{ {
get(player).CurrentTask.cleanup(player);
get(player).CurrentTaskStartTime = -1;
_inTutorial.remove(player.getName()); _inTutorial.remove(player.getName());
_manager.finishTutorial(player);
if (_ghostMode) if (_ghostMode)
{ {
for (Player other : UtilServer.getPlayers()) for (Player other : UtilServer.getPlayers())
@ -402,11 +449,6 @@ public abstract class Tutorial implements ScoreboardElement, Listener
return _inTutorial.containsKey(player); return _inTutorial.containsKey(player);
} }
public Map<Integer, TutorialTask<?>> getTasks()
{
return _tasks;
}
public boolean hasCompleted(final Player player) public boolean hasCompleted(final Player player)
{ {
return _taskManager.hasCompletedTask(player, String.format(TUTORIAL_COMPLETE_TASK, _technicalName)); 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) public void skip(final Player player)
{ {
new JsonMessage( new JsonMessage("")
AllowedMessage
)
.extra( .extra(
F.main( F.main(
"Tutorial", "Tutorial",
@ -435,9 +475,11 @@ public abstract class Tutorial implements ScoreboardElement, Listener
.color("yellow") .color("yellow")
.extra("!") .extra("!")
.color("gray") .color("gray")
.sendToPlayer(player); .sendToPlayer(player);
new JsonMessage( new JsonMessage("")
.extra(
F.main( F.main(
"Tutorial", "Tutorial",
"Click " "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); evt.setCancelled(true);
} }
@EventHandler
public void onJoinClan(ClanJoinEvent event)
{
if (isInTutorial(event.getPlayer()))
{
event.setCancelled(true);
}
}
@EventHandler @EventHandler
public void onPlayerJoin(final PlayerJoinEvent evt) public void onPlayerJoin(final PlayerJoinEvent evt)
{ {
@ -552,9 +603,15 @@ public abstract class Tutorial implements ScoreboardElement, Listener
public void cleanup(Player player) 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); get(player).CurrentTask.cleanup(player);
}
System.out.println("removing from in tutorial");
_inTutorial.remove(player.getName()); _inTutorial.remove(player.getName());
} }
} }

View File

@ -11,15 +11,18 @@ public class TutorialClient
public long LastDescriptionSentTime = System.currentTimeMillis() - 3000; public long LastDescriptionSentTime = System.currentTimeMillis() - 3000;
public boolean InClanOnStart; public boolean InClanOnStart;
public boolean QueuedFinish; public boolean QueuedFinish;
public long CurrentTaskStartTime;
public TutorialClient(Player player, Tutorial tutorial) public TutorialClient(Player player, Tutorial tutorial)
{ {
Player = player; Player = player;
CurrentTask = tutorial._tasks.get(1); CurrentTask = tutorial.getTask(0);
CurrentTaskStartTime = System.currentTimeMillis();
InClanOnStart = tutorial._clansManager.isInClan(player); InClanOnStart = tutorial._clansManager.isInClan(player);
/*
for (TutorialTask<?> task : tutorial._tasks.values()) for (TutorialTask<?> task : tutorial._tasks.values())
{ {
if (TaskManager.Instance.hasCompletedTask(player, String.format( if (TaskManager.Instance.hasCompletedTask(player, String.format(
@ -34,5 +37,6 @@ public class TutorialClient
} }
} }
} }
*/
} }
} }

View File

@ -25,6 +25,7 @@ import mineplex.game.clans.tutorials.commands.DoSkipTutorialCommand;
import mineplex.game.clans.tutorials.commands.SkipTutorialCommand; import mineplex.game.clans.tutorials.commands.SkipTutorialCommand;
import mineplex.game.clans.tutorials.gettingstarted.TutorialGettingStarted; import mineplex.game.clans.tutorials.gettingstarted.TutorialGettingStarted;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.minecraft.server.v1_8_R3.IChatBaseComponent;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat; import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
public class TutorialManager extends MiniPlugin public class TutorialManager extends MiniPlugin
@ -32,7 +33,7 @@ public class TutorialManager extends MiniPlugin
public static TutorialManager Instance; public static TutorialManager Instance;
private final Map<Class<? extends Tutorial>, Tutorial> _tutorials = new HashMap<>(); private final Map<Class<? extends Tutorial>, Tutorial> _tutorials = new HashMap<>();
protected final Map<String, Tutorial> _playerTutorials = new HashMap<>(); private final Map<String, Tutorial> _playerTutorials = new HashMap<>();
private final TaskManager _taskManager; private final TaskManager _taskManager;
@ -64,7 +65,7 @@ public class TutorialManager extends MiniPlugin
{ {
chat.a.a().remove(0); chat.a.a().remove(0);
} }
else else if (!chat.a.a().get(0).c().contains(Tutorial.AllowedBypass))
{ {
if (isInTutorial(packet.getPlayer())) if (isInTutorial(packet.getPlayer()))
{ {
@ -138,10 +139,13 @@ public class TutorialManager extends MiniPlugin
@EventHandler @EventHandler
public void quit(PlayerQuitEvent event) public void quit(PlayerQuitEvent event)
{ {
System.out.println("Player Quit. In Tutorial: " + isInTutorial(event.getPlayer()));
if (!isInTutorial(event.getPlayer())) if (!isInTutorial(event.getPlayer()))
return; return;
getTutorial(event.getPlayer()).cleanup(event.getPlayer()); getTutorial(event.getPlayer()).cleanup(event.getPlayer());
_playerTutorials.remove(event.getPlayer().getName());
} }
public void sendTutorialMsg(Player player, String message) public void sendTutorialMsg(Player player, String message)
@ -156,6 +160,16 @@ public class TutorialManager extends MiniPlugin
sendTutorialMsg(player, message); 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) public Tutorial getTutorial(final Player player)
{ {
@ -171,4 +185,72 @@ public class TutorialManager extends MiniPlugin
{ {
return _taskManager; 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());
}
}
} }

View File

@ -1,13 +1,21 @@
package mineplex.game.clans.tutorials; package mineplex.game.clans.tutorials;
import java.util.Iterator;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import mineplex.core.common.util.C; import mineplex.core.common.util.C;
import mineplex.core.common.util.NautArrayList; import mineplex.core.common.util.NautArrayList;
import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilText;
import mineplex.core.common.util.UtilTextMiddle; 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; import mineplex.game.clans.clans.ClansManager;
public class TutorialTask<T extends Tutorial> implements Listener public class TutorialTask<T extends Tutorial> implements Listener
@ -22,6 +30,8 @@ public class TutorialTask<T extends Tutorial> implements Listener
protected String _description; protected String _description;
protected String _finishMessage; protected String _finishMessage;
protected String[] _subtasks;
protected Location _taskPos; protected Location _taskPos;
// How much time after the beginning the task/last teleport it should take to teleport back to _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<T extends Tutorial> implements Listener
protected long _descriptionWaitTime = 30000; protected long _descriptionWaitTime = 30000;
protected NautArrayList<String> _playersFinished = new NautArrayList<>();
protected NautArrayList<String> _inTask = new NautArrayList<>(); protected NautArrayList<String> _inTask = new NautArrayList<>();
private long _lastTaskTp; private long _lastTaskTp;
@ -55,7 +64,7 @@ public class TutorialTask<T extends Tutorial> implements Listener
{ {
_inTask.add(player.getName()); _inTask.add(player.getName());
trySendDescription(player); trySendDescription(player, true);
customStartFor(player); customStartFor(player);
@ -92,12 +101,41 @@ public class TutorialTask<T extends Tutorial> 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<String> 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) public boolean isDoing(Player player)
{ {
return _inTask != null && player != null && _inTask.contains(player.getName()); 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)) if (!_tutorial.isInTutorial(player))
{ {
@ -111,19 +149,24 @@ public class TutorialTask<T extends Tutorial> implements Listener
return; 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, " ");
_tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " ");
_tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------");
_tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " ");
_tutorial._manager.sendTutorialMsg(player, C.cYellowB + "Part " + _id + ": " + _displayName); _tutorial._manager.sendTutorialMsg(player, C.cYellowB + "Part " + (_id + 1) + ": " + _displayName);
_tutorial._manager.sendTutorialMsg(player, C.cWhite + " " + _description.replace("{", C.cAqua).replace("}", C.cWhite)); _tutorial._manager.sendTutorialMsg(player, C.cWhite + " " + description);
_tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " ");
_tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------");
UtilTextMiddle.display("", getDisplayName()); UtilTextMiddle.display("", getDisplayName(), player);
client.LastDescriptionSentTime = System.currentTimeMillis(); client.LastDescriptionSentTime = System.currentTimeMillis();
} }
@ -169,30 +212,39 @@ public class TutorialTask<T extends Tutorial> implements Listener
{ {
return _tutorial._clansManager; return _tutorial._clansManager;
} }
public int getID() public int getDataId()
{ {
return _id; return _id;
} }
public int getID()
{
return _id + 1;
}
public void finishFor(Player player) public void finishFor(Player player)
{ {
customEndFor(player); customEndFor(player);
cleanup(player);
_tutorial.finishTask(player, this); _tutorial.finishTask(player, this);
} }
public void visibleFinish(Player player) public void visibleFinish(Player player)
{ {
_inTask.remove(player.getName());
if (_finishMessage != null) 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, " ");
_tutorial._manager.sendTutorialMsg(player, " "); _tutorial._manager.sendTutorialMsg(player, " ");
_tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------");
_tutorial._manager.sendTutorialMsg(player, " "); _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, " ");
_tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------"); _tutorial._manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------");
} }
@ -201,7 +253,6 @@ public class TutorialTask<T extends Tutorial> implements Listener
public void cleanup(Player player) public void cleanup(Player player)
{ {
_inTask.remove(player.getName()); _inTask.remove(player.getName());
_playersFinished.remove(player.getName());
} }
public long getDescriptionWaitTime() public long getDescriptionWaitTime()

View File

@ -21,7 +21,7 @@ public class TaskClaim extends TutorialTask<TutorialGettingStarted>
+ "Once claimed, only your Clan can break/place blocks here. " + "Once claimed, only your Clan can break/place blocks here. "
+ "This is the perfect place to build a base and stash your items! " + "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. " + "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) @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)

View File

@ -48,7 +48,14 @@ public class TaskCustomizeClass extends TutorialTask<TutorialGettingStarted>
if (clientclass != null && clientclass.GetSavingCustomBuild() != null && clientclass.GetSavingCustomBuild().AxeSkill != null) if (clientclass != null && clientclass.GetSavingCustomBuild() != null && clientclass.GetSavingCustomBuild().AxeSkill != null)
{ {
finishFor(player); finishFor(player);
iterator.remove();
} }
} }
} }
@Override
public void cleanup(Player player)
{
// handled in onUpdate
}
} }

View File

@ -25,18 +25,6 @@ public class TaskDisbandClan extends TutorialTask<TutorialGettingStarted>
@Override @Override
public void customStartFor(final Player player) 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 @EventHandler
@ -46,6 +34,8 @@ public class TaskDisbandClan extends TutorialTask<TutorialGettingStarted>
{ {
return; return;
} }
System.out.println("COMPLETE DISBAND CLAN!");
finishFor(event.getDisbander()); finishFor(event.getDisbander());
} }

View File

@ -29,6 +29,12 @@ public class TaskEquipClass extends TutorialTask<TutorialGettingStarted>
+ "Purchase Iron Armor from the PvP Shop. " + "Purchase Iron Armor from the PvP Shop. "
+ "Then put on your armor to equip the Knight Class."; + "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); _taskPos = new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f);
} }
@ -56,6 +62,11 @@ public class TaskEquipClass extends TutorialTask<TutorialGettingStarted>
public void customStartFor(Player player) public void customStartFor(Player player)
{ {
_bought.put(player.getName(), new NautArrayList<Material>()); _bought.put(player.getName(), new NautArrayList<Material>());
if (getClans().getClassManager().Get(player).GetGameClass() != null)
{
finishFor(player);
}
} }
@EventHandler @EventHandler

View File

@ -57,12 +57,19 @@ public class TaskExploreShops extends TutorialTask<TutorialGettingStarted>
if (ClansManager.getInstance().getClan(event.getPlayer()).getEnergyPurchasable() == 0) if (ClansManager.getInstance().getClan(event.getPlayer()).getEnergyPurchasable() == 0)
{ {
finishFor(event.getPlayer()); finishFor(event.getPlayer());
_inTask.remove(event.getPlayer().getName());
return; return;
} }
event.setFree(true); event.setFree(true);
} }
@Override
public void cleanup(Player player)
{
// handled in on update
}
@EventHandler @EventHandler
public void onUpdate(UpdateEvent event) public void onUpdate(UpdateEvent event)
{ {
@ -78,6 +85,7 @@ public class TaskExploreShops extends TutorialTask<TutorialGettingStarted>
if (ClansManager.getInstance().getClan(player).getEnergy() == ClansManager.getInstance().getClan(player).getEnergyMax()) if (ClansManager.getInstance().getClan(player).getEnergy() == ClansManager.getInstance().getClan(player).getEnergyMax())
{ {
finishFor(player); finishFor(player);
iterator.remove();
} }
} }
} }

View File

@ -6,6 +6,8 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; 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.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.tutorials.TutorialTask; import mineplex.game.clans.tutorials.TutorialTask;
@ -31,6 +33,7 @@ public class TaskLeaveSpawn extends TutorialTask<TutorialGettingStarted>
if (player.getLocation().getY() < 100) if (player.getLocation().getY() < 100)
{ {
finishFor(player); finishFor(player);
_inTask.remove(player.getName());
} }
} }
@ -45,12 +48,20 @@ public class TaskLeaveSpawn extends TutorialTask<TutorialGettingStarted>
Iterator<String> iterator = _inTask.iterator(); Iterator<String> iterator = _inTask.iterator();
while (iterator.hasNext()) 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); finishFor(player);
iterator.remove();
} }
} }
} }
@Override
public void cleanup(Player player)
{
// We handle this in update() to avoid ConcurrentModificationException
}
} }

View File

@ -34,7 +34,7 @@ public class TaskMakingMoney extends TutorialTask<TutorialGettingStarted>
@Override @Override
public void customStartFor(Player player) public void customStartFor(Player player)
{ {
player.getInventory().addItem(new ItemStack(Material.CARROT, 1)); player.getInventory().addItem(new ItemStack(Material.CARROT_ITEM, 1));
} }
@EventHandler @EventHandler
@ -45,7 +45,7 @@ public class TaskMakingMoney extends TutorialTask<TutorialGettingStarted>
return; return;
} }
if (!event.getItem().getType().equals(Material.CARROT)) if (!event.getItem().getType().equals(Material.CARROT_ITEM))
{ {
return; return;
} }
@ -61,15 +61,12 @@ public class TaskMakingMoney extends TutorialTask<TutorialGettingStarted>
return; return;
} }
if (!ClansManager.getInstance().isInClan(event.getPlayer()))
{
return;
}
if (!event.getItem().getType().equals(Material.CARROT_ITEM)) if (!event.getItem().getType().equals(Material.CARROT_ITEM))
{ {
return; return;
} }
System.out.println("FINISH CARROT");
finishFor(event.getPlayer()); finishFor(event.getPlayer());
} }

View File

@ -9,14 +9,18 @@ import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import mineplex.core.common.util.Callback; import mineplex.core.common.util.Callback;
import mineplex.core.common.util.NautArrayList; import mineplex.core.common.util.NautArrayList;
import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilServer;
import mineplex.core.task.TaskManager; import mineplex.core.task.TaskManager;
import mineplex.core.updater.UpdateType; import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
@ -49,7 +53,6 @@ public class TaskUseAbility extends TutorialTask<TutorialGettingStarted>
public void customStartFor(Player player) public void customStartFor(Player player)
{ {
_bought.put(player.getName(), new NautArrayList<Material>()); _bought.put(player.getName(), new NautArrayList<Material>());
_teleported.put(player.getName(), false);
} }
@Override @Override
@ -70,7 +73,7 @@ public class TaskUseAbility extends TutorialTask<TutorialGettingStarted>
{ {
Player _player = Bukkit.getPlayer(iterator.next()); 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)); _player.teleport(new Location(Spawn.getSpawnWorld(), 19, 66, -305.844, -100f, 0f));
_teleported.put(_player.getName(), true); _teleported.put(_player.getName(), true);
@ -78,6 +81,7 @@ public class TaskUseAbility extends TutorialTask<TutorialGettingStarted>
} }
} }
/*
@EventHandler @EventHandler
public void onAbilityUesd(SkillTriggerEvent event) public void onAbilityUesd(SkillTriggerEvent event)
{ {
@ -88,6 +92,25 @@ public class TaskUseAbility extends TutorialTask<TutorialGettingStarted>
finishFor(event.GetPlayer()); 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 @EventHandler
public void button(ClansShopAddButtonEvent event) public void button(ClansShopAddButtonEvent event)

View File

@ -16,7 +16,7 @@ public class TaskViewClanDetails extends TutorialTask<TutorialGettingStarted>
_technicalName = "CommandClanX"; _technicalName = "CommandClanX";
_description = "Now you can view information about your clan. " _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."; + "You can also use any clan's name to get some information about them as well.";
} }

View File

@ -25,7 +25,7 @@ public class TutorialGettingStarted extends Tutorial
// addTask(new TaskWelcome(this, 1)); // addTask(new TaskWelcome(this, 1));
int id = 0; int id = -1;
addTask(new TaskCreateClan(this, ++id)); addTask(new TaskCreateClan(this, ++id));
addTask(new TaskViewClanDetails(this, ++id)); addTask(new TaskViewClanDetails(this, ++id));
addTask(new TaskLeaveSpawn(this, ++id)); addTask(new TaskLeaveSpawn(this, ++id));
@ -49,6 +49,13 @@ public class TutorialGettingStarted extends Tutorial
@Override @Override
public void onFinished(final Player player) 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.cDGreenB + C.Strike + "---------------------------------------------");
_manager.sendTutorialMsg(player, C.cYellowB + "CONGRATULATIONS"); _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 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.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 + "---------------------------------------------"); _manager.sendTutorialMsg(player, C.cDGreenB + C.Strike + "---------------------------------------------");
player.resetPlayerTime();
player.teleport(Spawn.getEastSpawn());
} }
@Override @Override
public void onBegin(final Player player) public void onBegin(final Player player)
{ {

View File

@ -117,7 +117,7 @@ public class HolidayManager implements Listener
@EventHandler @EventHandler
public void blockEffect(UpdateEvent event) public void blockEffect(UpdateEvent event)
{ {
if (event.getType() == UpdateType.TICK) if (event.getType() != UpdateType.TICK)
return; return;
Iterator<Block> blockIterator = _active.iterator(); Iterator<Block> blockIterator = _active.iterator();