Merge pull request #117 in MIN/mineplex from clans/alpha to develop

* commit '15d2118bc1701b79576f6d73dc1d4aeca500f11e': (23 commits)
  Added C.Mod rank, and started on rank info.
  changed outpost forcefields to be a bit larger to surround the outpost more.
  made outposts have a "forcefield" whilst they are being built. also made legendary announcements a different color as per Simon's request.
  added server shutdown event, along with making the outposts cleanup on server shutdown to prevent debris of currently in-play outposts sticking around.
  fixed npe on cleanup() because it doesn't check if the holograms are null or not. (they may or may not be null at the time of cleanup() being called depending on the current state of the outpost)
  fixed outpost being built instantly on output block place.
  holograms above outpost block should be centered in the block and made them despawn on outpost death
  legendary pickkup message fix (FINALLY FIXED NOW )
  quick modification to outposts, and fixed the legendary announcements being weird
  updated clans version
  quikc change
  outpost changes, and some other things
  lots of work on outposts, fixed gold dupe glitch, fixed clans ban gui title being "Customize New Gear".
  fixes (?)
  lots of changes that i can't remember at this point
  Lots of changes, specifics: Fixed clans having more than max energy. Made /c home work from anywhere, 20 secs warmup, 30 secs in claimed territory. /c <clan> now works with clans with 18+ players.
  player gold exploit checking. i know this code is strange but please don't delete it. we need it for now.
  a couple more prettificatons to pvp timer messages.
  one more quick message change/fix
  qa changes to pvp safety
  ...
This commit is contained in:
Shaun Bennett 2016-01-08 00:35:15 -06:00
commit b6b455c1c0
85 changed files with 3288 additions and 329 deletions

View File

@ -39,7 +39,7 @@ public class PlayerCache
catch (Exception exception)
{
System.out.println("Error adding player info in PlayerCache : " + exception.getMessage());
exception.printStackTrace();
// exception.printStackTrace();
}
}

View File

@ -9,50 +9,59 @@ import mineplex.core.common.util.UtilPlayer;
public enum Rank
{
//Staff
LT("Leader", ChatColor.GOLD),
OWNER("Owner", ChatColor.GOLD),
DEVELOPER("Dev", ChatColor.GOLD),
ADMIN("Admin", ChatColor.GOLD),
JNR_DEV("Jr.Dev", ChatColor.GOLD),
SUPPORT("Support", ChatColor.BLUE),
SNR_MODERATOR("Sr.Mod", ChatColor.GOLD),
MODERATOR("Mod", ChatColor.GOLD),
HELPER("Trainee", ChatColor.DARK_AQUA),
MAPLEAD("MapLead", ChatColor.BLUE),
MAPDEV("Builder", ChatColor.BLUE),
MEDIA("Media", ChatColor.BLUE),
LT("Leader", ChatColor.GOLD, "Leaders are in charge of special teams\nsuch as the whole staff team or the support!"),
OWNER("Owner", ChatColor.GOLD, "Owners are the Founders of Mineplex\nand they all manage different parts of it!"),
DEVELOPER("Dev", ChatColor.GOLD, "Developers make new games,\nand new features for you to enjoy"),
ADMIN("Admin", ChatColor.GOLD, "Administrators have their own\nSenior Moderator team that they lead!"),
JNR_DEV("Jr.Dev", ChatColor.GOLD, "Junior Developers make new games,\nand new features for you to enjoy"),
SUPPORT("Support", ChatColor.BLUE, "Support Agents take care of all the tickets\nthat get sent to mineplex.com/support"),
CMOD("C.Mod", ChatColor.GOLD, "Clan Moderators are Senior Moderators in\nthe Clans Management team.\nThey mainly moderate only the Clans servers.\nThey are around to help you with any problems on Clans servers."),
SNR_MODERATOR("Sr.Mod", ChatColor.GOLD, "Senior Moderators are in a special\nSenior Moderator team where they have to fulfill team tasks.\nThey are similar to Moderators who you can always ask for help!\nIf you have any questions, just message them using /a"),
MODERATOR("Mod", ChatColor.GOLD, "Moderators are here to moderate\nand help players with any concerns they have.\nIf you have any questions, just message them using /a"),
HELPER("Trainee", ChatColor.DARK_AQUA, "Trainees are staff in training,\nand are here to help players and moderate!\nIf you have any questions, just message them using /a"),
MAPLEAD("MapLead", ChatColor.BLUE, "Leader of the Official Build team"),
MAPDEV("Builder", ChatColor.BLUE, "Official Mineplex Map Builders"),
MEDIA("Media", ChatColor.BLUE, "Official Mineplex Artist and/or Designer"),
EVENT("Event", ChatColor.WHITE),
EVENT("Event", ChatColor.WHITE, "???"),
//Media
YOUTUBE("YouTube", ChatColor.RED),
YOUTUBE_SMALL("YT", ChatColor.DARK_PURPLE),
TWITCH("Twitch", ChatColor.DARK_PURPLE),
YOUTUBE("YouTube", ChatColor.RED, "Official Mineplex Youtuber"),
YOUTUBE_SMALL("YT", ChatColor.DARK_PURPLE, "Youtube Content Creators"),
TWITCH("Twitch", ChatColor.DARK_PURPLE, "Official Twitch Live Streamer"),
//Player
TITAN("Titan", ChatColor.RED, true),
LEGEND("Legend", ChatColor.GREEN, true),
HERO("Hero", ChatColor.LIGHT_PURPLE, true),
ULTRA("Ultra", ChatColor.AQUA, true),
ALL("", ChatColor.WHITE);
TITAN("Titan", ChatColor.RED, true, "Mineplex's fourth premium rank\nBuy Titan at mineplex.com/shop"),
LEGEND("Legend", ChatColor.GREEN, true, "Mineplex's third premium rank\nBuy Legend at mineplex.com/shop"),
HERO("Hero", ChatColor.LIGHT_PURPLE, true, "Mineplex's second premium rank\nBuy Hero at mineplex.com/shop"),
ULTRA("Ultra", ChatColor.AQUA, true, "Mineplex's first premium rank\nBuy Ultra at mineplex.com/shop"),
ALL("", ChatColor.WHITE, null);
private ChatColor _color;
private boolean _donor;
private String _info;
public String Name;
Rank(String name, ChatColor color)
Rank(String name, ChatColor color, String info)
{
_color = color;
Name = name;
_donor = false;
_info = info;
}
Rank(String name, ChatColor color, boolean donor)
Rank(String name, ChatColor color, boolean donor, String info)
{
_color = color;
Name = name;
_donor = donor;
_info = info;
}
public String getInfo()
{
return _info;
}
public boolean has(Rank rank)

View File

@ -0,0 +1,33 @@
package mineplex.core.common.events;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.java.JavaPlugin;
public class ServerShutdownEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
private JavaPlugin _plugin;
public ServerShutdownEvent(JavaPlugin plugin)
{
_plugin = plugin;
}
public JavaPlugin getPlugin()
{
return _plugin;
}
public HandlerList getHandlers()
{
return handlers;
}
public static HandlerList getHandlerList()
{
return handlers;
}
}

View File

@ -0,0 +1,62 @@
package mineplex.core.common.util;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class ColorFader {
private final int _loopsBetween;
private final List<RGBData> _colors;
private final LoopIterator<RGBData> _iterator;
private int _loopsSinceLast;
public ColorFader(int loopsBetweenColors, RGBData... colors)
{
this(loopsBetweenColors, Arrays.asList(colors));
}
public ColorFader(int loopsBetweenColors, List<RGBData> colors)
{
_loopsBetween = loopsBetweenColors;
_colors = new LinkedList<>(colors);
_iterator = new LoopIterator<>(_colors);
}
public RGBData next()
{
RGBData rgb;
if (_loopsSinceLast >= _loopsBetween)
{
rgb = _iterator.next();
_loopsSinceLast = 0;
}
else
{
int redStep = (_iterator.peekNext().getFullRed() - _iterator.current().getFullRed()) / _loopsBetween;
int greenStep = (_iterator.peekNext().getFullGreen() - _iterator.current().getFullGreen()) / _loopsBetween;
int blueStep = (_iterator.peekNext().getFullBlue() - _iterator.current().getFullBlue()) / _loopsBetween;
int red = _iterator.current().getFullRed();
int green = _iterator.current().getFullGreen();
int blue = _iterator.current().getFullBlue();
for (int i = 0; i < _loopsSinceLast; i++)
{
red += redStep;
green += greenStep;
blue += blueStep;
}
rgb = new RGBData(red, green, blue);
}
_loopsSinceLast++;
return rgb;
}
}

View File

@ -2,6 +2,8 @@ package mineplex.core.common.util;
import mineplex.core.common.Rank;
import java.util.LinkedList;
import org.bukkit.ChatColor;
public class F
@ -42,9 +44,9 @@ public class F
return C.sysHead + head + "> " + C.sysBody + body;
}
public static String elem(String elem)
public static String elem(Object elem)
{
return C.mElem + elem + ChatColor.RESET + C.mBody;
return C.mElem + elem.toString() + ChatColor.RESET + C.mBody;
}
public static String name(String elem)
@ -198,5 +200,19 @@ public class F
return out;
}
public static String vowelAN(String word)
{
return word.toLowerCase().startsWith("a")
|| word.toLowerCase().startsWith("A")
|| word.toLowerCase().startsWith("e")
|| word.toLowerCase().startsWith("E")
|| word.toLowerCase().startsWith("i")
|| word.toLowerCase().startsWith("I")
|| word.toLowerCase().startsWith("o")
|| word.toLowerCase().startsWith("O")
|| word.toLowerCase().startsWith("u")
|| word.toLowerCase().startsWith("U")
? "an" : "a";
}
}

View File

@ -0,0 +1,83 @@
package mineplex.core.common.util;
import java.util.List;
public class LoopIterator<T>
{
private List<T> _list;
private int _pointer;
public LoopIterator(List<T> list)
{
_list = list;
}
public T next()
{
if (_list.isEmpty())
{
return null;
}
if (++_pointer == _list.size())
{
_pointer = 0;
}
return _list.get(_pointer);
}
public T peekNext()
{
if (_list.isEmpty())
{
return null;
}
int pointer = _pointer;
if (++pointer == _list.size())
{
pointer = 0;
}
return _list.get(pointer);
}
public T peekPrev()
{
if (_list.isEmpty())
{
return null;
}
int pointer = _pointer;
if (--pointer < 0)
{
pointer = _list.size() - 1;
}
return _list.get(pointer);
}
public T prev()
{
if (_list.isEmpty())
{
return null;
}
if (--_pointer < 0)
{
_pointer = _list.size() - 1;
}
return _list.get(_pointer);
}
public T current()
{
return _list.get(_pointer);
}
}

View File

@ -0,0 +1,33 @@
package mineplex.core.common.util;
public class NonFinalInteger
{
private int _value;
public NonFinalInteger()
{
this(0);
}
public NonFinalInteger(int value)
{
_value = value;
}
public NonFinalInteger add(int value)
{
_value += value;
return this;
}
public NonFinalInteger subtract(int value)
{
_value -= value;
return this;
}
public int get()
{
return _value;
}
}

View File

@ -0,0 +1,42 @@
package mineplex.core.common.util;
public class NumericalPulser
{
private double _min;
private double _max;
private double _modifyPerCall;
private double _cur;
private boolean _up;
public NumericalPulser(double min, double max, double modify)
{
_min = min;
_max = max;
_modifyPerCall = modify;
}
public double pulse()
{
if (_up)
{
_cur = UtilMath.clamp(_cur += _modifyPerCall, _min, _max);
if (_cur >= _max)
{
_up = false;
}
}
else
{
_cur = UtilMath.clamp(_cur -= _modifyPerCall, _min, _max);
if (_cur <= _min)
{
_up = true;
}
}
return _cur;
}
}

View File

@ -0,0 +1,53 @@
package mineplex.core.common.util;
public class RGBData
{
private double _red;
private double _green;
private double _blue;
public RGBData(int red, int green, int blue)
{
_red = UtilMath.clamp(((double) red) / 255.d, 0, 1);
_green = UtilMath.clamp(((double) green) / 255.d, 0, 1);
_blue = UtilMath.clamp(((double) blue) / 255.d, 0, 1);
}
public int getFullRed()
{
return (int) (_red * 255);
}
public int getFullGreen()
{
return (int) (_green * 255);
}
public int getFullBlue()
{
return (int) (_blue * 255);
}
public double getRed()
{
return _red;
}
public double getGreen()
{
return _green;
}
public double getBlue()
{
return _blue;
}
public String toString()
{
return "RGB["
+ "red=" + (int) (_red * 255) + ", "
+ "green=" + (int) (_green * 255) + ", "
+ "blue=" + (int) (_blue * 255) + "]";
}
}

View File

@ -15,7 +15,7 @@ import org.bukkit.entity.Player;
import org.bukkit.util.EulerAngle;
import org.bukkit.util.Vector;
import net.minecraft.server.v1_8_R3.EnumDirection;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
public class UtilAlg
{
@ -510,4 +510,9 @@ public class UtilAlg
Math.toRadians(UtilAlg.GetYaw(vector)),
0);
}
public static AxisAlignedBB toBoundingBox(Location a, Location b)
{
return new AxisAlignedBB(a.getX(), a.getY(), a.getZ(), b.getX(), b.getY(), b.getZ());
}
}

View File

@ -7,6 +7,9 @@ import org.bukkit.ChatColor;
*/
public class UtilColor
{
public static final RGBData RgbRed = hexToRgb(0xee0100);
public static final RGBData RgbGold = hexToRgb(0xffd014);
public static final RGBData RgbLightBlue = hexToRgb(0x61fff7);
public static byte chatColorToClayData(ChatColor chatColor)
{
@ -66,4 +69,19 @@ public class UtilColor
return 0;
}
}
public static RGBData hexToRgb(int hex)
{
return new RGBData(hex >> 16, hex >> 8 & 0xFF, hex & 0xFF);
}
public static int rgbToHex(RGBData rgb)
{
return (rgb.getFullRed() << 16 | rgb.getFullGreen() << 8 | rgb.getFullBlue());
}
public static int rgbToHex(int red, int green, int blue)
{
return (red << 16 | green << 8 | blue);
}
}

View File

@ -116,4 +116,15 @@ public class UtilMath
{
return num < min ? min : (num > max ? max : num);
}
public static double random(double min, double max)
{
min = Math.abs(min);
int rand = -random.nextInt((int)(min * 100));
rand += random.nextInt((int)(max * 100));
return ((double) rand) / 100.d;
}
}

View File

@ -14,6 +14,7 @@ import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory;

View File

@ -13,6 +13,7 @@ import mineplex.core.common.CurrencyType;
import org.apache.commons.lang.WordUtils;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
public class UtilText
{
@ -167,7 +168,7 @@ public class UtilText
return fillLine(" ", div) + string + fillLine(" ", div);
}
public static String alignRight(String string, LineFormat lineFormat)
{
int length = getLength(string);
@ -650,5 +651,28 @@ public class UtilText
{
return arrayToString(array, null);
}
public static String getProgress(String prefix, double amount, String suffix, boolean progressDirectionSwap)
{
if (progressDirectionSwap)
amount = 1 - amount;
//Generate Bar
int bars = 24;
String progressBar = C.cGreen + "";
boolean colorChange = false;
for (int i=0 ; i<bars ; i++)
{
if (!colorChange && (float)i/(float)bars >= amount)
{
progressBar += C.cRed;
colorChange = true;
}
progressBar += "";
}
return(prefix == null ? "" : prefix + ChatColor.RESET + " ") + progressBar + (suffix == null ? "" : ChatColor.RESET + " " + suffix);
}
}

View File

@ -30,6 +30,12 @@ public class UtilTime
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_DAY);
return sdf.format(cal.getTime());
}
public static String date(long date)
{
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_DAY);
return sdf.format(date);
}
public static String getDayOfMonthSuffix(final int n)
{

View File

@ -128,7 +128,14 @@ public class CoreClientManager extends MiniPlugin
if (client == null)
{
client = new CoreClient(name);
if (Bukkit.getPlayer(name) != null)
{
client = new CoreClient(Bukkit.getPlayer(name));
}
else
{
client = new CoreClient(name);
}
}
return client;
@ -285,6 +292,76 @@ public class CoreClientManager extends MiniPlugin
});
}
public void loadClientByNameSync(final String playerName, final Runnable runnable)
{
try
{
ClientToken token = null;
Gson gson = new Gson();
// Fails if not in DB and if duplicate.
UUID uuid = loadUUIDFromDB(playerName);
if (uuid == null)
{
try
{
uuid = UUIDFetcher.getUUIDOf(playerName);
}
catch (Exception exception)
{
System.out.println("Error fetching uuid from mojang : " + exception.getMessage());
}
}
String response = "";
if (uuid == null)
{
response = _repository.getClientByName(playerName);
}
else
{
response = _repository.getClientByUUID(uuid);
}
token = gson.fromJson(response, ClientToken.class);
CoreClient client = Add(playerName);
client.SetRank(Rank.valueOf(token.Rank), false);
client.setAccountId(_repository.login(_loginProcessors, _querylessLoginProcessors, uuid.toString(), client.GetPlayerName()));
// JSON sql response
Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response, uuid));
if (client.getAccountId() > 0)
{
PlayerInfo playerInfo = PlayerCache.getInstance().getPlayer(uuid);
if (playerInfo != null)
{
playerInfo.setAccountId(client.getAccountId());
PlayerCache.getInstance().addPlayer(playerInfo);
}
}
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
Bukkit.getServer().getScheduler().runTask(getPlugin(), new Runnable()
{
public void run()
{
if (runnable != null)
runnable.run();
}
});
}
}
public boolean LoadClient(final CoreClient client, final UUID uuid, String ipAddress)
{
TimingManager.start(client.GetPlayerName() + " LoadClient Total.");

View File

@ -296,7 +296,7 @@ public class Chat extends MiniPlugin
}
}
@EventHandler(priority = EventPriority.LOWEST)
@EventHandler(priority = EventPriority.LOW)
public void HandleChat(AsyncPlayerChatEvent event)
{
if (event.isCancelled())

View File

@ -0,0 +1,65 @@
package mineplex.core.delayedtask;
import org.bukkit.Bukkit;
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 mineplex.core.MiniClientPlugin;
import mineplex.core.common.util.Callback;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class DelayedTask extends MiniClientPlugin<DelayedTaskClient>
{
public static DelayedTask Instance;
public DelayedTask(JavaPlugin plugin)
{
super("Delayed Task", plugin);
}
public static void Initialize(JavaPlugin plugin)
{
Instance = new DelayedTask(plugin);
}
public void doDelay(Player player, String task, Callback<DelayedTaskClient> end, Callback<DelayedTaskClient> tick, Callback<DelayedTaskClient> cancel, long wait, boolean allowMovement)
{
Get(player).insert(new Task(Get(player), task, end, tick, cancel, wait, allowMovement));
}
@EventHandler
public void onUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
{
return;
}
for (Player player : Bukkit.getOnlinePlayers())
{
Get(player).tick();
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event)
{
Get(event.getPlayer()).cleanup();
}
@EventHandler
public void onPlayerKick(PlayerKickEvent event)
{
Get(event.getPlayer()).cleanup();
}
@Override
protected DelayedTaskClient AddPlayer(String player)
{
return new DelayedTaskClient(Bukkit.getPlayer(player));
}
}

View File

@ -0,0 +1,82 @@
package mineplex.core.delayedtask;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.entity.Player;
public class DelayedTaskClient
{
public Map<String, Task> Tasks = new HashMap<>();
private Player _player;
public DelayedTaskClient(Player player)
{
_player = player;
}
public void insert(Task task)
{
Tasks.put(task.getName(), task);
}
public long getTimeLeft(String task)
{
if (!Tasks.containsKey(task)) return -1;
return getEndTime(task) - System.currentTimeMillis();
}
public long getEndTime(String task)
{
if (!Tasks.containsKey(task)) return -1;
return Tasks.get(task).getEndTime();
}
public long getStartTime(String task)
{
if (!Tasks.containsKey(task)) return -1;
return Tasks.get(task).getStartTime();
}
public void cleanup()
{
if (Tasks == null)
{
Tasks = new HashMap<>();
}
Tasks.clear();
Tasks = null;
}
public void cleanup(String task)
{
Tasks.remove(task);
}
public void tick()
{
if (Tasks == null)
{
Tasks = new HashMap<>();
}
for (Task task : Tasks.values())
{
if (task.getTick() != null)
{
task.tick();
}
}
}
public Player getPlayer()
{
return _player;
}
}

View File

@ -0,0 +1,95 @@
package mineplex.core.delayedtask;
import org.bukkit.Location;
import mineplex.core.common.util.Callback;
public class Task
{
private DelayedTaskClient _client;
private Callback<DelayedTaskClient> _end;
private Callback<DelayedTaskClient> _tick;
private Callback<DelayedTaskClient> _cancel;
private String _name;
private long _startTime;
private long _endTime;
private Location _startPos;
private boolean _allowMovement;
public Task(DelayedTaskClient client, String task, Callback<DelayedTaskClient> end, Callback<DelayedTaskClient> tick, Callback<DelayedTaskClient> cancel, long taskLength, boolean allowMovement)
{
_client = client;
_name = task;
_end = end;
_tick = tick;
_cancel = cancel;
_startPos = client.getPlayer().getLocation();
_allowMovement = allowMovement;
_startTime = System.currentTimeMillis();
_endTime = _startTime + taskLength;
}
public String getName()
{
return _name;
}
public Callback<DelayedTaskClient> getEnd()
{
return _end;
}
public Callback<DelayedTaskClient> getTick()
{
return _tick;
}
public long getEndTime()
{
return _endTime;
}
public long getStartTime()
{
return _startTime;
}
public void tick()
{
_tick.run(_client);
if (!_allowMovement && _startPos.distance(_client.getPlayer().getLocation()) > 0.3)
{
if (_cancel != null)
{
_cancel.run(_client);
}
if (_end != null)
{
_end.run(_client);
}
_client.cleanup(_name);
return;
}
if (System.currentTimeMillis() >= _endTime)
{
if (_end != null)
{
_end.run(_client);
}
_client.cleanup(_name);
}
}
}

View File

@ -21,6 +21,7 @@ import mineplex.core.common.util.NautHashMap;
import mineplex.core.donation.command.CoinCommand;
import mineplex.core.donation.command.GemCommand;
import mineplex.core.donation.command.GoldCommand;
import mineplex.core.donation.command.SetGoldCommand;
import mineplex.core.donation.repository.DonationRepository;
import mineplex.core.donation.repository.token.DonorTokenWrapper;
import mineplex.core.server.util.TransactionResponse;
@ -49,6 +50,7 @@ public class DonationManager extends MiniDbClientPlugin<Donor>
addCommand(new GemCommand(this));
addCommand(new CoinCommand(this));
addCommand(new GoldCommand(this));
addCommand(new SetGoldCommand(this));
}
@EventHandler
@ -336,6 +338,35 @@ public class DonationManager extends MiniDbClientPlugin<Donor>
}, caller, name, accountId, amount);
}
public void setGold(final Callback<Boolean> callback, final String caller, final String name, final int accountId, final int amount, final boolean updateTotal)
{
_repository.setGold(new Callback<Boolean>()
{
public void run(Boolean success)
{
if (success)
{
if (updateTotal)
{
Donor donor = Get(name);
if (donor != null)
{
donor.setGold(amount);
}
}
}
else
{
System.out.println("SET GOLD FAILED...");
}
if (callback != null)
callback.run(success);
}
}, caller, name, accountId, amount);
}
public void RewardGoldLater(final String caller, final Player player, final int amount)
{
if (!_goldQueue.containsKey(player))
@ -414,7 +445,7 @@ public class DonationManager extends MiniDbClientPlugin<Donor>
@Override
public void processLoginResultSet(String playerName, int accountId, ResultSet resultSet) throws SQLException
{
Get(playerName).addGold(_repository.retrieveDonorInfo(resultSet).getGold());
Get(playerName).setGold(_repository.retrieveDonorInfo(resultSet).getGold());
}
@Override

View File

@ -152,7 +152,11 @@ public class Donor
public void addGold(int amount)
{
_gold = Math.max(0, _gold + amount);
}
public void setGold(int amount)
{
_gold = Math.max(0, amount);
}
public List<CoinTransactionToken> getCoinTransactions()

View File

@ -0,0 +1,75 @@
package mineplex.core.donation.command;
import mineplex.core.account.CoreClient;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.donation.DonationManager;
import org.bukkit.entity.Player;
public class SetGoldCommand extends CommandBase<DonationManager>
{
public SetGoldCommand(DonationManager plugin)
{
super(plugin, Rank.ADMIN, "setgold");
}
@Override
public void Execute(final Player caller, String[] args)
{
if (args == null || args.length < 2)
{
UtilPlayer.message(caller, F.main("Clans", "Error! Usage: " + F.elem("/setgold <player> <amount>")));
return;
}
final String targetName = args[0];
final String goldString = args[1];
Player target = UtilPlayer.searchExact(targetName);
try
{
if (target == null)
{
Plugin.getClientManager().loadClientByName(targetName, new Runnable()
{
public void run()
{
CoreClient client = Plugin.getClientManager().Get(targetName);
if (client != null)
{
setGold(caller, null, targetName, client.getAccountId(), Integer.parseInt(goldString));
}
else
{
UtilPlayer.message(caller, F.main("Gold", "Could not find player " + F.name(targetName)));
}
}
});
}
else
{
setGold(caller, target, target.getName(), Plugin.getClientManager().Get(target).getAccountId(), Integer.parseInt(goldString));
}
}
catch (Exception e)
{
UtilPlayer.message(target, F.main("Clans", "You must provide a valid number in the gold parameter."));
}
}
private void setGold(final Player caller, final Player target, final String targetName, final int accountId, final int gold)
{
Plugin.setGold(new Callback<Boolean>()
{
public void run(Boolean completed)
{
UtilPlayer.message(caller, F.main("Gold", "You set " + F.name(targetName) + "'s Gold to " + F.elem(gold) + "."));
}
}, caller.getName(), targetName, accountId, gold, true);
}
}

View File

@ -31,6 +31,7 @@ public class DonationRepository extends RepositoryBase
private static String INSERT_COIN_TRANSACTION = "INSERT INTO accountCoinTransactions(accountId, reason, coins) VALUES(?, ?, ?);";
private static String UPDATE_ACCOUNT_COINS = "UPDATE accounts SET coins = coins + ? WHERE id = ?;";
private static String UPDATE_ACCOUNT_GOLD = "UPDATE accounts SET gold = gold + ? WHERE id = ?;";
private static String SET_ACCOUNT_GOLD = "UPDATE accounts SET gold = ? WHERE id = ?;";
private static String UPDATE_NULL_ACCOUNT_GEMS_AND_COINS_ = "UPDATE accounts SET gems = ?, coins = ? WHERE id = ? AND gems IS NULL AND coins IS NULL;";
private String _webAddress;
@ -198,6 +199,18 @@ public class DonationRepository extends RepositoryBase
}
}), "Error updating player gold amount in DonationRepository : ");
}
public void setGold(final Callback<Boolean> callback, final String giver, final String name, final int accountId, final int gold)
{
handleDatabaseCall(new DatabaseRunnable(new Runnable()
{
public void run()
{
boolean success = executeUpdate(SET_ACCOUNT_GOLD, new ColumnInt("gold", gold), new ColumnInt("id", accountId)) > 0;
callback.run(success);
}
}), "Error updating player gold amount in DonationRepository : ");
}
@Override
protected void initialize()
@ -233,7 +246,7 @@ public class DonationRepository extends RepositoryBase
while (resultSet.next())
{
donor.addGold(resultSet.getInt(1));
donor.setGold(resultSet.getInt(1));
}
return donor;

View File

@ -173,6 +173,7 @@ public class ItemBuilder
{
for (String lore : lores)
{
if (lore == null) continue;
_lore.add(C.cGray + lore);
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.Core"/>
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.Core.Common"/>
<classpathentry combineaccessrules="false" kind="src" path="/Mineplex.ServerData"/>

View File

@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

View File

@ -13,6 +13,8 @@ import mineplex.core.antihack.AntiHack;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.chat.Chat;
import mineplex.core.command.CommandCenter;
import mineplex.core.common.events.ServerShutdownEvent;
import mineplex.core.delayedtask.DelayedTask;
import mineplex.core.donation.DonationManager;
import mineplex.core.explosion.Explosion;
import mineplex.core.friend.FriendManager;
@ -39,6 +41,7 @@ import mineplex.core.updater.FileUpdater;
import mineplex.core.updater.Updater;
import mineplex.core.visibility.VisibilityManager;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ban.ClansBanManager;
import mineplex.game.clans.items.GearManager;
import mineplex.game.clans.shop.building.BuildingShop;
import mineplex.game.clans.shop.farming.FarmingShop;
@ -50,7 +53,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer;
public class Clans extends JavaPlugin
{
public static final String VERSION = "0.17d";
public static final String VERSION = "0.18";
private String WEB_CONFIG = "webServer";
// Modules
@ -77,6 +80,8 @@ public class Clans extends JavaPlugin
ItemStackFactory.Initialize(this, false);
DelayedTask.Initialize(this);
Recharge.Initialize(this);
VisibilityManager.Initialize(this);
// new ProfileCacheManager(this);
@ -96,7 +101,9 @@ public class Clans extends JavaPlugin
Teleport teleport = new Teleport(this, _clientManager);
Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName());
new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion());
new ClansBanManager(this, _clientManager, _donationManager);
Punish punish = new Punish(this, webServerAddress, _clientManager);
AntiHack.Initialize(this, punish, portal, preferenceManager, _clientManager);
AntiHack.Instance.setKick(false);
@ -169,5 +176,7 @@ public class Clans extends JavaPlugin
// Need to notify WorldEventManager of server shutdown, this seemed like
// the only decent way to do it
_clansManager.onDisable();
getServer().getPluginManager().callEvent(new ServerShutdownEvent(this));
}
}

View File

@ -20,19 +20,19 @@ import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.common.util.UtilWorld;
import mineplex.game.clans.clans.ClansUtility.ClanRelation;
import mineplex.game.clans.core.war.ClanWarData;
import net.minecraft.server.v1_8_R3.Material;
import mineplex.game.clans.clans.tntGenerator.TntGenerator;
import mineplex.game.clans.core.repository.tokens.ClanAllianceToken;
import mineplex.game.clans.core.repository.tokens.ClanMemberToken;
import mineplex.game.clans.core.repository.tokens.ClanTerritoryToken;
import mineplex.game.clans.core.repository.tokens.ClanToken;
import mineplex.game.clans.clans.tntGenerator.TntGenerator;
import mineplex.game.clans.core.repository.tokens.ClanWarToken;
import mineplex.game.clans.core.war.ClanWarData;
import net.minecraft.server.v1_8_R3.Material;
public class ClanInfo
{
@ -374,6 +374,22 @@ public class ClanInfo
player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 2f);
}
}
public void inform(String top, String bottom, String ignore)
{
for (UUID cur : getMembers().keySet())
{
Player player = UtilPlayer.searchExact(cur);
if (player == null)
continue;
if (player.getName().equals(ignore))
continue;
UtilTextMiddle.display(top, bottom, 20, 100, 20, player);
}
}
public String getName()
{
@ -507,6 +523,11 @@ public class ClanInfo
public int getEnergy()
{
if (_energy > getEnergyMax())
{
_energy = getEnergyMax();
}
return _energy;
}

View File

@ -38,8 +38,4 @@ public class ClansBlacklist
return true;
}
public static void addBlacklist(String blacklist) {
BLACKLISTED_NAMES.add(blacklist);
}
}

View File

@ -532,8 +532,8 @@ public class ClansDataAccessLayer
}
// Log
// _manager.log("Added Claim for [" + name + "] at [" + chunk + "] by ["
// + player + "].");
_manager.log("Added Claim for [" + name + "] at [" + chunk + "] by ["
+ player + "].");
return true;
}
@ -595,6 +595,8 @@ public class ClansDataAccessLayer
// Log
if (player != null) _manager.log("Removed Claim for [" + clan.getName() + "] at [" + chunk + "] by [" + player + "].");
else
_manager.log("Removed Claim for [" + clan.getName() + "] at [" + chunk + "] by [NO ONE?!].");
// Bed Removal
if (clan.getHome() != null && UtilWorld.chunkToStr(clan.getHome().getChunk()).equals(chunk))

View File

@ -65,7 +65,9 @@ public class ClansDisplay extends MiniPlugin
boolean safe = Clans.getClanUtility().isSafe(player);
UtilServer.getServer().getPluginManager().callEvent(new PlayerEnterTerritoryEvent(player, client.getOwner(), owner, owner.equals("Wilderness") ? false : Clans.getClanUtility().getClaim(player.getLocation()).isSafe(player.getLocation())));
PlayerEnterTerritoryEvent event = new PlayerEnterTerritoryEvent(player, client.getOwner(), owner, owner.equals("Wilderness") ? false : Clans.getClanUtility().getClaim(player.getLocation()).isSafe(player.getLocation()), true);
UtilServer.getServer().getPluginManager().callEvent(event);
if (!client.isMapOn())
{
@ -87,13 +89,13 @@ public class ClansDisplay extends MiniPlugin
if (showChange)
{
displayOwner(player);
// Event
if (event.willSendMessage()) displayOwner(player);
}
}
else
{
displayOwner(player);
if (event.willSendMessage()) displayOwner(player);
displayMap(player);
}
}

View File

@ -1,9 +1,9 @@
package mineplex.game.clans.clans;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
@ -28,9 +28,11 @@ import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.plugin.java.JavaPlugin;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import mineplex.core.MiniClientPlugin;
import mineplex.core.account.CoreClientManager;
import mineplex.core.achievement.AchievementManager;
@ -72,6 +74,7 @@ import mineplex.game.clans.clans.commands.ClansCommand;
import mineplex.game.clans.clans.commands.ClansLoginManager;
import mineplex.game.clans.clans.commands.KillCommand;
import mineplex.game.clans.clans.commands.MapCommand;
import mineplex.game.clans.clans.commands.Meow;
import mineplex.game.clans.clans.commands.RegionsCommand;
import mineplex.game.clans.clans.data.PlayerClan;
import mineplex.game.clans.clans.event.ClansPlayerDeathEvent;
@ -79,6 +82,7 @@ import mineplex.game.clans.clans.gui.ClanShop;
import mineplex.game.clans.clans.loot.LootManager;
import mineplex.game.clans.clans.map.ItemMapManager;
import mineplex.game.clans.clans.observer.ObserverManager;
import mineplex.game.clans.clans.outpost.OutpostManager;
import mineplex.game.clans.clans.playtime.Playtime;
import mineplex.game.clans.clans.potato.PotatoManager;
import mineplex.game.clans.clans.pvptimer.PvpTimer;
@ -203,6 +207,11 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
{
super("Clans Manager", plugin);
if (serverName.equals("GarboClans-1"))
{
addCommand(new Meow(new OutpostManager(this)));
}
_instance = this;
_serverName = serverName;
@ -366,17 +375,26 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
hologram.start();
}
// Disables beds from being crafted
Iterator<Recipe> it = _plugin.getServer().recipeIterator();
Recipe recipe;
while (it.hasNext())
{
recipe = it.next();
if (recipe != null && recipe.getResult().getType() == Material.BED)
{
it.remove();
}
}
// Iterator<Recipe> it = _plugin.getServer().recipeIterator();
// Recipe recipe;
// while (it.hasNext())
// {
// recipe = it.next();
// if (recipe != null)
// {
// if (recipe.getResult().getType() == Material.SMOOTH_BRICK)
// {
// it.remove();
// }
// }
// }
//
// final ShapedRecipe brrecipe = new ShapedRecipe(new ItemStack(Material.SMOOTH_BRICK, 1));
// brrecipe.shape("XX", "XX", "");
// brrecipe.setIngredient('X', Material.STONE);
// UtilServer.getServer().addRecipe(brrecipe);
//
Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, "Replay|Restrict");
}
@Override
@ -578,12 +596,33 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
clanInfo.playerOnline(player);
}
if (_clientManager.hasRank(player, Rank.DEVELOPER) || player.getName().equals("NewGarbo"))
if (_clientManager.hasRank(player, Rank.DEVELOPER) || player.getUniqueId().toString().equals("d8646a35-33a8-43c6-9e7c-2e871a6b86c9"))
{
player.setOp(true);
}
}
@EventHandler
public void disallowReplayMod(PlayerJoinEvent event)
{
// happens 20 ticks later because player channels don't
// seem to work immediately after joining.
runSyncLater(() -> {
ByteArrayDataOutput bado = ByteStreams.newDataOutput();
bado.writeUTF("no_xray");
bado.writeBoolean(true);
bado.writeUTF("no_noclip");
bado.writeBoolean(true);
bado.writeUTF("only_recording_player");
bado.writeBoolean(true);
event.getPlayer().sendPluginMessage(_plugin, "Replay|Restrict", bado.toByteArray());
}, 20L);
}
@EventHandler
public void denyBow(EntityShootBowEvent event)
{
@ -610,14 +649,74 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
}
}
@EventHandler
public void handlePlayerChat(AsyncPlayerChatEvent event)
private void handleClanChat(AsyncPlayerChatEvent event, ClanInfo clan, String rank)
{
if (event.isCancelled())
for (Player cur : clan.getOnlinePlayers())
{
String message = _chat.getFilteredMessage(event.getPlayer(), event.getMessage());
UtilPlayer.message(cur, String.format(rank + C.cAqua + "%s " + C.cDAqua + "%s", event.getPlayer().getName(), message));
}
}
private void handleAllyChat(AsyncPlayerChatEvent event, ClanInfo clan, String rank)
{
List<Player> recipients = new ArrayList<>();
clan.getOnlinePlayers().forEach(recipients::add);
for (String allyName : clan.getAllyMap().keySet())
{
ClanInfo ally = _clanUtility.getClanByClanName(allyName);
if (ally == null) continue;
ally.getOnlinePlayers().forEach(recipients::add);
}
String message = _chat.getFilteredMessage(event.getPlayer(), event.getMessage());
recipients.forEach(p -> UtilPlayer.message(p, String.format(rank + C.cDGreen + clan.getName() + " " + C.cDGreen + "%s " + C.cGreen + "%s", event.getPlayer().getName(), message)));
recipients.clear();
}
private void handleRegularChat(AsyncPlayerChatEvent event, ClanInfo clan, String rank)
{
if (clan == null)
{
UtilServer.broadcast(String.format(rank + C.cYellow + "%s " + C.cWhite + "%s", event.getPlayer().getName(), event.getMessage()));
return;
}
List<Player> recipients = new ArrayList<>();
for (Player other : UtilServer.getPlayers())
{
ClanInfo otherClan = _clanUtility.getClanByPlayer(other);
if (otherClan == null)
{
recipients.add(other);
}
else
{
String message = _chat.getFilteredMessage(event.getPlayer(), event.getMessage());
ClanRelation rel = _clanUtility.rel(clan, otherClan);
other.sendMessage(rank + rel.getColor(true) + clan.getName() + " " + rel.getColor(false) + event.getPlayer().getName() + " " + C.cWhite + message);
}
}
recipients.forEach(p -> p.sendMessage(String.format(rank + C.cGold + clan.getName() + " " + C.cYellow + "%s " + C.cWhite + "%s", event.getPlayer().getName(), event.getMessage())));
recipients.clear();
}
@EventHandler(priority = EventPriority.LOWEST)
public void handlePlayerChat(AsyncPlayerChatEvent event)
{
event.setCancelled(true);
ClientClan client = Get(event.getPlayer());
if (client == null)
@ -634,91 +733,21 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
if (client.isClanChat() && clan != null)
{
event.setFormat(rank+ C.cAqua + "%1$s " + C.cDAqua + "%2$s");
event.getRecipients().clear();
for (ClansPlayer cur : clan.getMembers().values())
{
Player player = UtilPlayer.searchExact(cur.getUuid());
if (player == null) continue;
event.getRecipients().add(player);
}
handleClanChat(event, clan, rank);
}
else if (client.isAllyChat() && clan != null)
{
event.setFormat(rank+ C.cDGreen + clan.getName() + " " + C.cDGreen + "%1$s " + C.cGreen + "%2$s");
event.getRecipients().clear();
for (ClansPlayer cur : clan.getMembers().values())
{
Player player = UtilPlayer.searchExact(cur.getUuid());
if (player == null) continue;
event.getRecipients().add(player);
}
for (String allyName : clan.getAllyMap().keySet())
{
ClanInfo ally = _clanUtility.getClanByClanName(allyName);
if (ally == null) continue;
for (ClansPlayer cur : ally.getMembers().values())
{
Player player = UtilPlayer.searchExact(cur.getUuid());
if (player == null) continue;
event.getRecipients().add(player);
}
}
handleAllyChat(event, clan, rank);
}
else
{
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.getMessage());
return;
}
event.getRecipients().clear();
event.setFormat(rank + C.cGold + clan.getName() + " " + C.cYellow + "%1$s " + C.cWhite + "%2$s");
for (Player other : UtilServer.getPlayers())
{
ClanInfo otherClan = _clanUtility.getClanByPlayer(other);
if (otherClan == null)
{
event.getRecipients().add(other);
}
else
{
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() + " " + C.cWhite + message;
other.sendMessage(formatted);
}
}
handleRegularChat(event, clan, rank);
}
System.out.println((clan == null ? "" : clan.getName()) + " " + _clientManager.Get(event.getPlayer()).GetRank().name() + " " + event.getPlayer().getName() + " " + event.getMessage());
}
@EventHandler
public void command(PlayerCommandPreprocessEvent event){
if (event.getMessage().startsWith("/blacklist ")){
String blacklist = event.getMessage().split(" ")[1];
ClansBlacklist.addBlacklist(blacklist);
}
}
public void messageClan(ClanInfo clan, String message)
{
for (Player player : clan.getOnlinePlayers())

View File

@ -8,7 +8,7 @@ public class ClansPlayer
private UUID _uuid;
private ClanRole _role;
private boolean _online;
public ClansPlayer(String playerName, UUID uuid, ClanRole role)
{
_playerName = playerName;

View File

@ -0,0 +1,18 @@
package mineplex.game.clans.clans;
public enum ClansPlayerTasks
{
FIRST_SESSION("Clans.FirstSession");
private String _id;
ClansPlayerTasks(String id)
{
_id = id;
}
public String id()
{
return _id;
}
}

View File

@ -0,0 +1,85 @@
package mineplex.game.clans.clans.ban;
import java.sql.Timestamp;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilTime;
public class ClansBan
{
private int _id;
private int _accountId;
private String _reason;
private Timestamp _banTime;
private Timestamp _unbanTime;
private boolean _permanent;
private boolean _removed;
public ClansBan(int id, int accountId, String reason, Timestamp banTime, Timestamp unbanTime, boolean permanent, boolean removed)
{
_id = id;
_accountId = accountId;
_reason = reason;
_banTime = banTime;
_unbanTime = unbanTime;
_permanent = permanent;
_removed = removed;
}
public int getId()
{
return _id;
}
public int getAccountId()
{
return _accountId;
}
public String getReason()
{
return _reason;
}
public Timestamp getBanTime()
{
return _banTime;
}
public long getLength()
{
return _unbanTime.getTime() - _banTime.getTime();
}
public long getTimeLeft()
{
return Math.max(0, _unbanTime.getTime() - System.currentTimeMillis());
}
public Timestamp getUnbanTime()
{
return _unbanTime;
}
public boolean isPermanent()
{
return _permanent;
}
public String getBanTimeFormatted(boolean wording)
{
long time = getTimeLeft();
return time == -1 ? F.time("permanently") : (wording ? "for " : "") + F.time(UtilTime.MakeStr(time));
}
public boolean isRemoved()
{
return _removed;
}
public boolean isActive()
{
return (isPermanent() || getTimeLeft() > 0) && !isRemoved();
}
}

View File

@ -0,0 +1,86 @@
package mineplex.game.clans.clans.ban;
import java.util.List;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilTime;
public class ClansBanClient
{
public int AccountId;
public List<ClansBan> Bans;
public ClansBanClient(int accountId, List<ClansBan> bans)
{
AccountId = accountId;
Bans = bans;
}
public boolean isBanned()
{
for (ClansBan ban : Bans)
{
if (ban.isActive())
{
return true;
}
}
return false;
}
public long getBanTime()
{
long time = 0;
for (ClansBan ban : Bans)
{
if (!ban.isActive())
{
continue;
}
if (ban.isPermanent())
{
return -1;
}
time += ban.getTimeLeft();
}
return time;
}
public String getBanTimeFormatted()
{
long time = getBanTime();
return time == -1 ? F.time("permanently") : "for " + F.time(UtilTime.MakeStr(time));
}
public ClansBan getLongestBan()
{
ClansBan longest = null;
for (ClansBan ban : Bans)
{
if (!ban.isActive())
{
continue;
}
if (longest == null)
{
longest = ban;
continue;
}
if (ban.getTimeLeft() > longest.getTimeLeft())
{
longest = ban;
}
}
return longest;
}
}

View File

@ -0,0 +1,210 @@
package mineplex.game.clans.clans.ban;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.donation.DonationManager;
import mineplex.game.clans.clans.ban.commands.ClansBanCommand;
import mineplex.game.clans.clans.ban.commands.ClansBanListCommand;
import mineplex.game.clans.clans.ban.ui.ClansBanListShop;
import mineplex.game.clans.clans.ban.ui.ClansBanShop;
public class ClansBanManager extends MiniPlugin
{
private CoreClientManager _clientManager;
private ClansBanRepository _repository;
private Map<String, ClansBanClient> _clients;
private Map<String, String> _cache;
private ClansBanShop _shop;
private ClansBanListShop _shop2;
public ClansBanManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager)
{
super("Blacklist", plugin);
_clientManager = clientManager;
_repository = new ClansBanRepository(plugin, this);
_clients = new HashMap<>();
_cache = new HashMap<>();
_shop = new ClansBanShop(this, clientManager, donationManager);
_shop2 = new ClansBanListShop(this, clientManager, donationManager);
}
@Override
public void addCommands()
{
addCommand(new ClansBanCommand(this));
addCommand(new ClansBanListCommand(this));
}
public void ban(ClansBanClient client, String name, long time, String reason, Callback<ClansBanClient> callback)
{
_repository.ban(client.AccountId, time, reason, time == -1);
LoadClient(name, callback);
}
public CoreClientManager getClientManager()
{
return _clientManager;
}
public ClansBanRepository GetRepository()
{
return _repository;
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event)
{
LoadClient(event.getPlayer().getName(), client -> {
if (client.isBanned())
{
String time = UtilTime.convertString(client.getLongestBan().getTimeLeft(), 0, TimeUnit.FIT);
if (client.getLongestBan().isPermanent())
time = "Permanent";
String reason = C.cRedB + "You are banned from Clans for " + time +
"\n" + C.cWhite + client.getLongestBan().getReason()
;
event.getPlayer().kickPlayer(reason);
}
else
{
UtilServer.broadcast(F.sys("Join", event.getPlayer().getName()));
}
});
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event)
{
if (Get(event.getPlayer().getName()) == null)
{
return;
}
if (Get(event.getPlayer().getName()).isBanned())
{
event.setQuitMessage(null);
}
UnloadClient(Get(event.getPlayer().getName()));
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerKicked(PlayerKickEvent event)
{
if (Get(event.getPlayer().getName()) == null)
{
return;
}
if (Get(event.getPlayer().getName()).isBanned())
{
event.setLeaveMessage(null);
}
UnloadClient(Get(event.getPlayer().getName()));
}
public void UnloadClient(ClansBanClient client)
{
String name = "";
for (Entry<String, ClansBanClient> entry : _clients.entrySet())
{
if (entry.getValue().equals(client))
{
name = entry.getKey();
break;
}
}
_clients.remove(name);
}
public void LoadClient(final String name, Callback<ClansBanClient> callback)
{
GetRepository().loadBans(name, client -> {
_clients.put(name, client);
System.out.println("> CLIENTS: " + _clients);
if (callback != null) callback.run(client);
});
}
public ClansBanClient Get(String name)
{
synchronized (this)
{
return _clients.get(name.toLowerCase());
}
}
public ClansBanShop getShop()
{
return _shop;
}
public ClansBanListShop getShop2()
{
return _shop2;
}
public void cache(Player player, String playerName)
{
_cache.put(player.getName(), playerName);
}
public String getCachedName(Player player)
{
return _cache.get(player.getName());
}
public void clearCachedName(String name)
{
_cache.remove(name);
}
public void unban(ClansBanClient target, ClansBan ban, String name, Callback<ClansBanClient> callback)
{
if (target.AccountId != ban.getAccountId())
{
return;
}
_repository.removeBan(ban);
LoadClient(name, callback);
}
public void listRecordedNames(Callback<List<ClansBanClient>> callback)
{
GetRepository().loadAll(callback);
}
}

View File

@ -0,0 +1,206 @@
package mineplex.game.clans.clans.ban;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.NonFinalInteger;
import mineplex.core.database.DBPool;
import mineplex.core.database.RepositoryBase;
import mineplex.core.database.ResultSetCallable;
import mineplex.core.database.column.ColumnBoolean;
import mineplex.core.database.column.ColumnInt;
import mineplex.core.database.column.ColumnTimestamp;
import mineplex.core.database.column.ColumnVarChar;
public class ClansBanRepository extends RepositoryBase
{
private ClansBanManager _manager;
private static final String GET_LONGEST_BAN = "SELECT * FROM clanBans WHERE (NOW() < unbanTime OR permanent=1) AND accountId = ? ORDER BY permanent DESC, unbanTime DESC LIMIT 1;";
private static final String BAN_PLAYER = "INSERT INTO clanBans (accountId, reason, banTime, unbanTime, permanent, removed) VALUES (?, ?, ?, ?, ?, ?);";
private static final String REMOVE_BAN = "UPDATE clanBans SET removed = 1 WHERE id = ?;";
private static final String GET_ALL_BANS = "SELECT * FROM clanBans WHERE accountId = ?;";
private static final String GET_ALL_ACCOUNTS = "SELECT DISTINCT accountId FROM clanBans;";
public ClansBanRepository(JavaPlugin plugin, ClansBanManager manager)
{
super(plugin, DBPool.getAccount());
_manager = manager;
}
public void ban(int accountId, long time, String reason, boolean permanent)
{
executeInsert(BAN_PLAYER, null,
new ColumnInt("accountId", accountId),
new ColumnVarChar("reason", 128, reason),
new ColumnTimestamp("banTime", new Timestamp(System.currentTimeMillis())),
new ColumnTimestamp("unbanTime", new Timestamp(System.currentTimeMillis() + time)),
new ColumnBoolean("permanent", permanent),
new ColumnBoolean("removed", false)
);
}
public void loadBans(final String name, final Callback<ClansBanClient> callback)
{
System.out.println(">> Attempting to load Clans Bans for \"" + name + "\"");
_manager.getClientManager().loadClientByName(name, new Runnable() {
public void run()
{
System.out.println("> Successfully loaded CoreClient");
executeQuery(GET_ALL_BANS, new ResultSetCallable()
{
@Override
public void processResultSet(ResultSet resultSet) throws SQLException
{
System.out.println("> Successfully executed query, result set object: " + resultSet);
final List<ClansBan> list = new ArrayList<ClansBan>();
while (resultSet.next())
{
int id = resultSet.getInt(1);
int accountId = resultSet.getInt(2);
String reason = resultSet.getString(3);
Timestamp banTime = resultSet.getTimestamp(4);
Timestamp unbanTime = resultSet.getTimestamp(5);
boolean permanent = resultSet.getBoolean(6);
boolean removed = resultSet.getBoolean(7);
list.add(new ClansBan(id, accountId, reason, banTime, unbanTime, permanent, removed));
}
callback.run(new ClansBanClient(_manager.getClientManager().Get(name).getAccountId(), list));
System.out.println("> Successfully handled result");
System.out.println(">> FINISH");
}
}, new ColumnInt("accountId", _manager.getClientManager().Get(name).getAccountId()));
}
});
}
public void loadBansSync(final String name, final Callback<ClansBanClient> callback)
{
System.out.println(">> Attempting to load Clans Bans for \"" + name + "\"");
_manager.getClientManager().loadClientByNameSync(name, new Runnable() {
public void run()
{
System.out.println("> Successfully loaded CoreClient");
executeQuery(GET_ALL_BANS, new ResultSetCallable()
{
@Override
public void processResultSet(ResultSet resultSet) throws SQLException
{
System.out.println("> Successfully executed query, result set object: " + resultSet);
final List<ClansBan> list = new ArrayList<ClansBan>();
while (resultSet.next())
{
int id = resultSet.getInt(1);
int accountId = resultSet.getInt(2);
String reason = resultSet.getString(3);
Timestamp banTime = resultSet.getTimestamp(4);
Timestamp unbanTime = resultSet.getTimestamp(5);
boolean permanent = resultSet.getBoolean(6);
boolean removed = resultSet.getBoolean(7);
list.add(new ClansBan(id, accountId, reason, banTime, unbanTime, permanent, removed));
}
callback.run(new ClansBanClient(_manager.getClientManager().Get(name).getAccountId(), list));
System.out.println("> Successfully handled result");
System.out.println(">> FINISH");
}
}, new ColumnInt("accountId", _manager.getClientManager().Get(name).getAccountId()));
}
});
}
public void getLongestBan(final String name, final Callback<ClansBan> callback)
{
if (callback == null)
{
return;
}
_manager.getClientManager().loadClientByName(name, new Runnable(){
public void run()
{
executeQuery(GET_LONGEST_BAN, new ResultSetCallable()
{
@Override
public void processResultSet(ResultSet resultSet) throws SQLException
{
while (resultSet.next())
{
int id = resultSet.getInt(1);
int accountId = resultSet.getInt(2);
String reason = resultSet.getString(3);
Timestamp banTime = resultSet.getTimestamp(4);
Timestamp unbanTime = resultSet.getTimestamp(5);
boolean permanent = resultSet.getBoolean(6);
boolean removed = resultSet.getBoolean(7);
callback.run(new ClansBan(id, accountId, reason, banTime, unbanTime, permanent, removed));
}
}
}, new ColumnInt("accountId", _manager.getClientManager().Get(name).getAccountId()));
}
});
}
public void loadAll(Callback<List<ClansBanClient>> callback)
{
_manager.runAsync(() -> {
executeQuery(GET_ALL_ACCOUNTS, new ResultSetCallable()
{
@Override
public void processResultSet(ResultSet resultSet) throws SQLException
{
final List<ClansBanClient> clients = new ArrayList<>();
final NonFinalInteger resultsProcessed = new NonFinalInteger();
int resultsFound = 0;
while (resultSet.next())
{
resultsFound++;
int accountId = resultSet.getInt(0);
// loadBans(_manager.getClientManager().)
}
System.out.println("Found: " + resultsFound + ", Processed: " + resultsProcessed);
}
});
});
}
@Override
protected void initialize()
{
}
@Override
protected void update()
{
}
public void removeBan(ClansBan ban)
{
executeUpdate(REMOVE_BAN, new ColumnInt("id", ban.getId()));
}
}

View File

@ -0,0 +1,96 @@
package mineplex.game.clans.clans.ban.commands;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.game.clans.clans.ban.ClansBanManager;
public class ClansBanCommand extends CommandBase<ClansBanManager>
{
public ClansBanCommand(ClansBanManager plugin)
{
super(plugin, Rank.ADMIN, "cbans", "cb");
}
@Override
public void Execute(final Player caller, String[] args)
{
if (args == null || args.length < 1)
{
UtilPlayer.message(caller, C.cGold + "/cb <username> <timeInDays(number)/p(ermanent)> <description> - Bans the specified player for the specified amount of time");
UtilPlayer.message(caller, C.cGold + "/cb <username> - Displays the \"Clans Punish\" UI, and will display all of the player's past bans (including current ones)");
}
else if (args.length == 1)
{
final String playerName = args[0];
Plugin.cache(caller, playerName);
Plugin.getShop().attemptShopOpen(caller);
}
else if (args.length > 2)
{
final String playerName = args[0];
final float time;
final boolean permanent = args[1].startsWith("p");
if (!permanent)
{
try
{
time = Float.parseFloat(args[1]);
}
catch(NumberFormatException e)
{
UtilPlayer.message(caller, F.main("Clans", "You must provide a valid floating point number for the time (in days). e.g. " + F.elem("1.5") + ", " + F.elem("3.2") + "."));
return;
}
}
else
{
//Required for compilation reasons
time = 0;
}
String reason = args[2];
for (int i = 3; i < args.length; i++)
{
reason += " " + args[i];
}
final String finalReason = reason;
//Match exact online first
Player target = UtilPlayer.searchExact(playerName);
if (target != null)
{
Plugin.LoadClient(playerName, client -> {
Plugin.ban(client, target.getName(), permanent ? -1 : (long) (time * 24.f * 60.f * 60.f * 1000.f), finalReason, c -> {
UtilPlayer.message(caller, F.main("Clans", F.elem(playerName) + " is now banned " + F.time(c.getBanTimeFormatted()) + "."));
Bukkit.broadcastMessage(F.main("Clans", F.elem(playerName) + " is now banned " + F.time(c.getBanTimeFormatted()) + "."));
Plugin.runSync(() -> target.kickPlayer(C.cRedB + "You have been banned from Clans " + c.getBanTimeFormatted() + "."));
});
});
return;
}
Plugin.LoadClient(playerName, client -> {
Plugin.ban(client, playerName, permanent ? -1 : (long) (time * 24.f * 60.f * 60.f * 1000.f), finalReason, c -> {
UtilPlayer.message(caller, F.main("Clans", F.elem(playerName) + " is now banned " + c.getBanTimeFormatted() + "."));
Bukkit.broadcastMessage(F.main("Clans", F.elem(playerName) + " is now banned " + F.time(c.getBanTimeFormatted()) + "."));
});
});
}
else
{
UtilPlayer.message(caller, C.cGold + "/cp <username> <timeInDays(number)/p(ermanent)> <description> - Bans the specified player for the specified amount of time");
UtilPlayer.message(caller, C.cGold + "/cp <username> - Displays the \"Clans Punish\" UI, and will display all of the player's past bans (including current ones)");
}
}
}

View File

@ -0,0 +1,21 @@
package mineplex.game.clans.clans.ban.commands;
import org.bukkit.entity.Player;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.game.clans.clans.ban.ClansBanManager;
public class ClansBanListCommand extends CommandBase<ClansBanManager>
{
public ClansBanListCommand(ClansBanManager plugin)
{
super(plugin, Rank.ADMIN, "listbans");
}
@Override
public void Execute(final Player caller, String[] args)
{
Plugin.getShop2().attemptShopOpen(caller);
}
}

View File

@ -0,0 +1,32 @@
package mineplex.game.clans.clans.ban.ui;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.game.clans.clans.ban.ClansBanClient;
import mineplex.game.clans.clans.ban.ClansBanManager;
public class ClansBanListPage extends ShopPageBase<ClansBanManager, ClansBanListShop>
{
public ClansBanListPage(final ClansBanManager banManager, final ClansBanListShop shop, final CoreClientManager clientManager, final DonationManager donationManager, final String name, final Player player)
{
super(banManager, shop, clientManager, donationManager, name, player);
buildPage();
}
protected void buildPage()
{
getPlugin().listRecordedNames(clients -> {
for (ClansBanClient client : clients)
{
}
});
}
}

View File

@ -0,0 +1,24 @@
package mineplex.game.clans.clans.ban.ui;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.donation.DonationManager;
import mineplex.core.shop.ShopBase;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.game.clans.clans.ban.ClansBanManager;
public class ClansBanListShop extends ShopBase<ClansBanManager>
{
public ClansBanListShop(final ClansBanManager plugin, final CoreClientManager clientManager, final DonationManager donationManager)
{
super(plugin, clientManager, donationManager, "Clans Punish");
}
@Override
protected ShopPageBase<ClansBanManager, ? extends ShopBase<ClansBanManager>> buildPagesFor(final Player player)
{
return new ClansBanListPage(getPlugin(), this, getClientManager(), getDonationManager(), "Clans Punish", player);
}
}

View File

@ -0,0 +1,62 @@
package mineplex.game.clans.clans.ban.ui;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilTime;
import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.game.clans.clans.ban.ClansBan;
import mineplex.game.clans.clans.ban.ClansBanManager;
public class ClansBanPage extends ShopPageBase<ClansBanManager, ClansBanShop>
{
public ClansBanPage(final ClansBanManager banManager, final ClansBanShop shop, final CoreClientManager clientManager, final DonationManager donationManager, final String name, final Player player)
{
super(banManager, shop, clientManager, donationManager, name, player);
buildPage();
}
protected void buildPage()
{
String name = getPlugin().getCachedName(getPlayer());
getPlugin().LoadClient(name, client -> {
int slot = 0;
for (ClansBan ban : client.Bans)
{
ItemStack item =
new ItemBuilder(ban.isActive() ? Material.EMERALD_BLOCK : Material.REDSTONE_BLOCK)
.setTitle(ban.isActive() ? C.cGreenB + "Active" : C.cRedB + "Inactive")
.addLore(" ")
.addLore("Date banned: " + C.cYellow + UtilTime.date(ban.getBanTime().getTime()))
.addLore("Time left: " + C.cYellow + (ban.isActive() ? ban.getBanTimeFormatted(false) : "None"))
.addLore("Permanent: " + C.cYellow + (ban.isPermanent() ? "Yes" : "No"))
.addLore(C.cGray + "Reason: " + C.cYellow + ban.getReason(), 16)
.addLore("Is Disabled: " + C.cYellow + (ban.isRemoved() ? "Yes" : "No"))
.addLore(!ban.isActive() ? null : C.cDAqua + "Left-Click to disable ban")
.build();
if (ban.isActive())
{
UtilInv.addDullEnchantment(item);
}
addButton(slot++, item, (player, click) -> {
if (ban.isActive())
{
getPlugin().unban(client, ban, name, c -> refresh());
}
});
}
});
}
}

View File

@ -0,0 +1,24 @@
package mineplex.game.clans.clans.ban.ui;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.donation.DonationManager;
import mineplex.core.shop.ShopBase;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.game.clans.clans.ban.ClansBanManager;
public class ClansBanShop extends ShopBase<ClansBanManager>
{
public ClansBanShop(final ClansBanManager plugin, final CoreClientManager clientManager, final DonationManager donationManager)
{
super(plugin, clientManager, donationManager, "Clans Punish");
}
@Override
protected ShopPageBase<ClansBanManager, ? extends ShopBase<ClansBanManager>> buildPagesFor(final Player player)
{
return new ClansBanPage(getPlugin(), this, getClientManager(), getDonationManager(), "Clans Punish", player);
}
}

View File

@ -15,9 +15,12 @@ import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilInput;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.common.util.UtilWorld;
import mineplex.core.delayedtask.DelayedTask;
import mineplex.core.delayedtask.DelayedTaskClient;
import mineplex.core.recharge.Recharge;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClanRole;
@ -27,14 +30,11 @@ 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;
import net.minecraft.server.v1_8_R3.EnumDirection;
public class ClansCommand extends CommandBase<ClansManager>
{
private ClansManager _manager;
public ClansCommand(ClansManager plugin)
{
super(plugin, Rank.ALL, "c", "clan", "clans", "factions");
@ -127,7 +127,7 @@ public class ClansCommand extends CommandBase<ClansManager>
private void forceJoin(Player caller, String[] args)
{
if (!Plugin.getClientManager().hasRank(caller, Rank.ADMIN) && !caller.getName().equals("NewGarbo"))
if (!Plugin.getClientManager().hasRank(caller, Rank.ADMIN) && !caller.getUniqueId().toString().equals("d8646a35-33a8-43c6-9e7c-2e871a6b86c9"))
{
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "This requires ADMIN+ permission."));
return;
@ -741,7 +741,7 @@ public class ClansCommand extends CommandBase<ClansManager>
Plugin.getItemMapManager().setMap(caller);
}
public void home(Player caller, String[] args)
public void home(final Player caller, String[] args)
{
if (args.length > 1)
{
@ -752,7 +752,7 @@ public class ClansCommand extends CommandBase<ClansManager>
}
}
ClanInfo clan = Plugin.getClanUtility().getClanByPlayer(caller);
final ClanInfo clan = Plugin.getClanUtility().getClanByPlayer(caller);
if (clan == null)
{
@ -772,18 +772,6 @@ public class ClansCommand extends CommandBase<ClansManager>
return;
}
if (!Plugin.getClanUtility().isSafe(caller.getLocation()))
{
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You can only use Clan Home from Spawn."));
return;
}
if (!Plugin.getClanUtility().isSpecial(caller.getLocation(), "Spawn"))
{
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You can only use Clan Home from Spawn."));
return;
}
Location home = clan.getHome();
if (!(home.getBlock().getType().equals(Material.BED_BLOCK) && home.add(0, 1, 0).getBlock().getType().equals(Material.AIR)) && home.add(0, 2, 0).getBlock().getType().equals(Material.AIR))
@ -802,14 +790,31 @@ public class ClansCommand extends CommandBase<ClansManager>
* }
*/
// if (!Recharge.Instance.use(caller, "Clans Teleport", "Clans
// Teleport", 300000, true, false, false, false)) return;
if (!Recharge.Instance.use(caller, "Home Teleport", 5 * 60 * 1000, true, false))
{
return;
}
// Do
Plugin.getTeleport().TP(caller, clan.getHome().add(0, 1, 0));
// Inform
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You teleported to your Clan Home " + UtilWorld.locToStrClean(caller.getLocation()) + "."));
DelayedTask.Instance.doDelay(caller, "Home Teleport", new Callback<DelayedTaskClient>() {
public void run(DelayedTaskClient player)
{
// Do
Plugin.getTeleport().TP(caller, clan.getHome().add(0, 1, 0));
// Inform
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You teleported to your Clan Home " + UtilWorld.locToStrClean(caller.getLocation()) + "."));
}
}, new Callback<DelayedTaskClient>() {
public void run(DelayedTaskClient client)
{
UtilTextMiddle.display("", "Teleporting to Clan Home in " + F.elem(UtilTime.MakeStr(Math.max(0, client.getTimeLeft("Home Teleport")))), 0, 5, 0);
}
}, new Callback<DelayedTaskClient>() {
public void run(DelayedTaskClient client)
{
UtilPlayer.message(client.getPlayer(), F.main("Clans", "Teleport has been cancelled due to movement."));
}
}, (Plugin.getClanUtility().getClaim(caller.getLocation()) != null ? 30 : 20) * 1000, false);
}
public void homeSet(Player caller)
@ -881,7 +886,9 @@ public class ClansCommand extends CommandBase<ClansManager>
}
public void infoClan(Player caller, String search)
{System.out.println(search);
{
System.out.println(search);
if (search == null)
{
_manager.getTutorials().sendTutorialMsg(caller, F.main("Clans", "You did not input a search parameter."));

View File

@ -41,8 +41,8 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor
{
if (_queue.contains(event.getPlayer().getName()) && !event.getPlayer().isOp())
{
event.setKickMessage("This is not your Clans home server");
event.setResult(PlayerLoginEvent.Result.KICK_OTHER);
// event.setKickMessage("This is not your Clans home server");
// event.setResult(PlayerLoginEvent.Result.KICK_OTHER);
}
_queue.remove(event.getPlayer().getName());
@ -50,18 +50,18 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor
private void kickPlayer(final String playerName, final String homeServer)
{
runSyncLater(new Runnable()
{
@Override
public void run()
{
Player player = UtilPlayer.searchExact(playerName);
if (player != null && player.isOnline() && !player.isOp())
{
player.kickPlayer("This is not your home server. To play clans, connect to " + homeServer);
}
}
}, 20);
// runSyncLater(new Runnable()
// {
// @Override
// public void run()
// {
// Player player = UtilPlayer.searchExact(playerName);
// if (player != null && player.isOnline() && !player.isOp())
// {
// player.kickPlayer("This is not your home server. To play clans, connect to " + homeServer);
// }
// }
// }, 20);
}
@Override

View File

@ -0,0 +1,22 @@
package mineplex.game.clans.clans.commands;
import org.bukkit.entity.Player;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.game.clans.clans.outpost.Outpost;
import mineplex.game.clans.clans.outpost.OutpostManager;
public class Meow extends CommandBase<OutpostManager>
{
public Meow(OutpostManager plugin)
{
super(plugin, Rank.ALL, "meow");
}
@Override
public void Execute(Player caller, String[] args)
{
caller.getInventory().addItem(Outpost.OUTPOST_ITEM);
}
}

View File

@ -12,9 +12,11 @@ public class PlayerEnterTerritoryEvent extends Event
private String _lastTerritory;
private Player _player;
private boolean _sendMessage;
private boolean _safe;
public PlayerEnterTerritoryEvent(Player player, String lastTerritory, String newTerritory, boolean safe)
public PlayerEnterTerritoryEvent(Player player, String lastTerritory, String newTerritory, boolean safe, boolean sendMessage)
{
_player = player;
_lastTerritory = lastTerritory;
@ -27,6 +29,16 @@ public class PlayerEnterTerritoryEvent extends Event
return _player;
}
public boolean willSendMessage()
{
return _sendMessage;
}
public void setSendMessage(boolean flag)
{
_sendMessage = flag;
}
public String getLastTerritory()
{
return _lastTerritory;

View File

@ -31,7 +31,7 @@ public class ClanWhoPage extends ClanPageBase
public ClanWhoPage(ClansManager plugin, ClanShop shop, CoreClientManager clientManager, DonationManager donationManager, Player player, ClanInfo lookupClan, boolean showBackButton)
{
super(plugin, shop, clientManager, donationManager, lookupClan.getName(), player, 36);
super(plugin, shop, clientManager, donationManager, lookupClan.getName(), player, 45);
_lookupClan = lookupClan;
_showBackButton = showBackButton;

View File

@ -0,0 +1,451 @@
package mineplex.game.clans.clans.outpost;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.FallingBlock;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.ColorFader;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LoopIterator;
import mineplex.core.common.util.NonFinalInteger;
import mineplex.core.common.util.RGBData;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilColor;
import mineplex.core.common.util.UtilEvent;
import mineplex.core.common.util.UtilEvent.ActionType;
import mineplex.core.common.util.UtilItem;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilText;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.hologram.Hologram;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansBlacklist;
import mineplex.game.clans.core.repository.ClanTerritory;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
public class Outpost implements Listener
{
protected static final long MAX_LIFETIME = 5 * 60 * 1000; // 30 minutes
public static final ItemStack OUTPOST_ITEM = new ItemBuilder(Material.NETHERRACK, 1).setRawTitle(C.cBlue + "Outpost").setLore("Seems to be a mystical contraption of some sort!").build();
public static final byte OUTPOST_BLOCK_DATA = (byte) 137;
private OutpostManager _host;
private ClanInfo _clan;
private Location _startCorner;
private Location _origin;
private Location _endCorner;
private Location _forceFieldStart;
private Location _forceFieldEnd;
private Location _core;
private LinkedHashMap<String, OutpostBlock> _blocks;
private LinkedHashMap<String, OutpostBlock> _buildQueue;
private OutpostType _type;
private OutpostState _state;
private Hologram _preHologram;
private Hologram _preHologram2;
private LoopIterator<Vector> _circleStages;
private LoopIterator<Vector> _reverseCircleStages;
private ColorFader _fader = new ColorFader(30, UtilColor.hexToRgb(0x00A296), UtilColor.hexToRgb(0x29E6B6));
private long _spawnTime;
public Outpost(OutpostManager host, ClanInfo clan, Location location, OutpostType type)
{
_host = host;
_clan = clan;
_startCorner = location.clone().subtract(type._size, 1, type._size);
_endCorner = location.clone().add(type._size + .9, type._ySize - 1, type._size + .9);
_forceFieldStart = _startCorner.clone().subtract(3, 0, 3);
_forceFieldEnd = _endCorner.clone().add(3, 0, 3);
_origin = location.clone();
_type = type;
_spawnTime = System.currentTimeMillis();
_core = _type.getCoreLocation(_origin);
_preHologram = new Hologram(_clan.Clans.getHologramManager(), _origin.clone().add(0.5, 2.3, 0.5), F.elem(_clan.getName()) + C.cWhite + "'s Outpost block");
_preHologram2 = new Hologram(_clan.Clans.getHologramManager(), _origin.clone().add(0.5, 3, 0.5), "Despawning: " + UtilText.getProgress(null, 0, null, true));
_preHologram.start();
_preHologram2.start();
_state = OutpostState.AWAITING;
}
private void cleanup()
{
_blocks = null;
if (_preHologram != null) _preHologram.stop();
if (_preHologram2 != null) _preHologram2.stop();
_preHologram = null;
_preHologram2 = null;
_state = OutpostState.DEAD;
_host.queueForRemoval(_clan.getName());
}
@EventHandler
public void onInteract(PlayerInteractEvent event)
{
if (getState() != OutpostState.AWAITING)
{
return;
}
if (!UtilEvent.isAction(event, ActionType.R_BLOCK))
{
return;
}
if (getLifetime() <= 2000)
{
return;
}
if (!_clan.equals(_clan.Clans.getClanUtility().getClanByPlayer(event.getPlayer())))
{
UtilPlayer.message(event.getPlayer(), F.main("Clans", "This is not yours to activate!"));
return;
}
if (event.getClickedBlock() != null && _origin.equals(event.getClickedBlock().getLocation()))
{
if (event.getClickedBlock().getType().equals(Material.NETHERRACK))
{
_origin.getBlock().setType(Material.AIR);
beginConstruction();
}
}
}
@EventHandler
public void onBlockDamage(BlockDamageEvent event)
{
if (event.getBlock().getLocation().equals(_core) && getState() == OutpostState.LIVE)
{
UtilPlayer.message(event.getPlayer(), F.main("Clans", "You have destroyed " + F.elem(_clan.getName()) + "'s Outpost!"));
_core.getBlock().setType(Material.AIR);
_clan.inform("Your Outpost has been destroyed!", null);
UtilTextMiddle.display("Siege", "Your Outpost has been destroyed", 20, 100, 20, _clan.getOnlinePlayersArray());
if (getState() == OutpostState.AWAITING)
{
cleanup();
}
else
{
kill();
}
event.setCancelled(true);
}
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event)
{
if (getState() == OutpostState.AWAITING && event.getBlock().getLocation().equals(_origin))
{
_origin.getBlock().setType(Material.AIR);
_origin.getWorld().dropItem(_origin, OUTPOST_ITEM);
_clan.inform("Your Outpost block has been destroyed.", null);
cleanup();
event.setCancelled(true);
return;
}
_blocks.values().stream().filter(event.getBlock().getLocation()::equals).forEach(block -> {
UtilPlayer.message(event.getPlayer(), F.main("Clans", "You may not break blocks in Outposts."));
event.setCancelled(true);
});
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event)
{
if (UtilAlg.inBoundingBox(event.getBlock().getLocation(), _startCorner, _endCorner))
{
UtilPlayer.message(event.getPlayer(), F.main("Clans", "You may not place blocks in Outposts."));
event.setCancelled(true);
}
}
protected void update()
{
if (_state == OutpostState.AWAITING)
{
if (getLifetime() > 60000)
{
_origin.getBlock().setType(Material.AIR);
_clan.inform("You have lost your Outpost block, as no one activated it fast enough!", null);
cleanup();
return;
}
_preHologram2.setText(UtilText.getProgress(null, UtilMath.clamp(getLifetime(), 0., 60000.) / 60000., null, true));
RGBData color = UtilColor.RgbLightBlue;
for (int x = -_type._size; x <= _type._size; x++)
{
for (int z = -_type._size; z <= _type._size; z++)
{
if (x == -_type._size || x == _type._size || z == -_type._size || z == _type._size)
{
UtilParticle.PlayParticleToAll(ParticleType.RED_DUST, UtilBlock.getHighest(_origin.getWorld(), _origin.clone().add(x + .5, .1, z + .5).getBlockX(), _origin.clone().add(x + .5, .1, z + .5).getBlockZ()).getLocation().add(0.5, 0, 0.5), new Vector(color.getRed(), color.getGreen(), color.getBlue()), 1f, 0, ViewDist.NORMAL);
}
}
}
return;
}
if (_state == OutpostState.CONSTRUCTING)
{
if (_buildQueue.isEmpty())
{
_state = OutpostState.LIVE;
return;
}
else
{
Iterator<String> iterator = _buildQueue.keySet().iterator();
if (iterator.hasNext())
{
_buildQueue.remove(iterator.next()).set();
}
}
// Forcefield
RGBData color = UtilColor.RgbLightBlue;
for (int x = -_type._size; x <= _type._size; x++)
{
for (int z = -_type._size; z <= _type._size; z++)
{
if (x == -_type._size || x == _type._size || z == -_type._size || z == _type._size)
{
UtilParticle.PlayParticleToAll(ParticleType.RED_DUST, _origin.clone().add(x + .5, .1, z + .5), new Vector(color.getRed(), color.getGreen(), color.getBlue()), 1f, 0, ViewDist.NORMAL);
}
}
}
}
RGBData next = _fader.next();
{
RGBData color = _state == OutpostState.LIVE ? next : UtilColor.RgbRed;
Vector nextCircleStage = _circleStages.next();
double circleX = nextCircleStage.getX();
double circleZ = nextCircleStage.getZ();
UtilParticle.PlayParticleToAll(ParticleType.MOB_SPELL, _core.clone().add(circleX + .5, 1.1d, circleZ + .5), new Vector(color.getRed(), color.getGreen(), color.getBlue()), 5.f, 0, ViewDist.NORMAL);
}
{
RGBData color = _state == OutpostState.LIVE ? next : UtilColor.RgbRed;
Vector nextCircleStage = _reverseCircleStages.next();
double circleX = nextCircleStage.getX();
double circleZ = nextCircleStage.getZ();
UtilParticle.PlayParticleToAll(ParticleType.MOB_SPELL, _core.clone().add(circleX + .5, 1.1d, circleZ + .5), new Vector(color.getRed(), color.getGreen(), color.getBlue()), 5.f, 0, ViewDist.NORMAL);
}
}
@EventHandler
public void forcefield(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST && getState() == OutpostState.CONSTRUCTING)
{
return;
}
UtilServer.getPlayersCollection().stream()
.filter(player -> !_clan.isMember(player))
.filter(player -> UtilAlg.inBoundingBox(player.getLocation(), _forceFieldStart, _forceFieldEnd))
.forEach(player -> {
UtilAction.velocity(player, UtilAlg.getTrajectory2d(_core, player.getLocation()), 1, true, 0.8, 0, 1.1, true);
UtilPlayer.message(player, F.main("Clans", "This Outpost is still under construction!"));
player.playSound(player.getLocation(), Sound.NOTE_BASS, 1.0f, 1.0f);
});
}
public void beginConstruction()
{
// Cleanup pre-Outpost stuff
_preHologram.stop();
_preHologram2.stop();
_preHologram = null;
_preHologram = null;
_state = OutpostState.CONSTRUCTING;
_blocks = new LinkedHashMap<>(_buildQueue = _type.createBuildQueue(_origin, _clan.Clans));
_clan.inform("Siege", "Your Outpost is now being constructed.", null);
_circleStages = new LoopIterator<Vector>(circleAround(new Vector(0., 0., 0.), 40, .6d));
List<Vector> reverse = circleAround(new Vector(0., 0., 0.), 40, .6d);
Collections.reverse(reverse);
_reverseCircleStages = new LoopIterator<Vector>(reverse);
//Inform nearby Clans
for (int chunkX = -3; chunkX < 3; chunkX++)
{
for (int chunkZ = -3; chunkZ < 3; chunkZ++)
{
ClanTerritory territory = _clan.Clans.getClanUtility().getClaim(_origin.getWorld().getChunkAt(_origin.getChunk().getX() + chunkX, _origin.getChunk().getZ() + chunkZ));
if (territory != null && ClansBlacklist.isValidClanName(territory.Owner))
{
ClanInfo clan = _clan.Clans.getClanUtility().getClanByClanName(territory.Owner);
clan.inform("A siege has begun near your territory!", null);
UtilTextMiddle.display("Siege", "A Siege has been declared on your Clan!", 20, 100, 20, clan.getOnlinePlayersArray());
}
}
}
}
private List<Vector> circleAround(Vector origin, int points, double radius)
{
List<Vector> list = new LinkedList<>();
double slice = 2 * Math.PI / points;
for (int point = 0; point < points; point++)
{
double angle = slice * point;
list.add(new Vector(origin.getX() + radius * Math.cos(angle), 0, origin.getZ() + radius * Math.sin(angle)));
}
return list;
}
public void instakill()
{
_blocks.values().forEach(OutpostBlock::restore);
cleanup();
}
public void kill()
{
_state = OutpostState.DESTRUCTING;
NonFinalInteger wait = new NonFinalInteger(0);
_blocks.values().stream().filter(block -> UtilMath.random.nextBoolean() || UtilMath.random.nextBoolean() || UtilMath.random.nextBoolean() || UtilMath.random.nextBoolean()).forEach(block ->
_host.runSyncLater(() -> {
UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, block._loc, new Vector(0,0,0), 1f, 1, ViewDist.NORMAL);
_origin.getWorld().playSound(block._loc, Sound.EXPLODE, 1.0f, 1.0f);
}, wait.add(4 + UtilMath.random.nextInt(4)).get())
);
_host.runSyncLater(() -> {
_blocks.values().forEach(block -> {
Material mat = Material.getMaterial(block._id);
if (UtilItem.isTranslucent(mat))
{
block.restore();
return;
}
FallingBlock fall = block._loc.getWorld().spawnFallingBlock(block._loc, block._id, block._data);
fall.setDropItem(false);
Vector vec = UtilAlg.getTrajectory(fall.getLocation(), getExactMiddle());
UtilAction.velocity(fall, vec, 1, false, 0, 0.6, 10, false);
fall.setMetadata("ClansOutpost", new FixedMetadataValue(_clan.Clans.getPlugin(), _clan.getName()));
block.restore();
});
cleanup();
}, wait.get() + 5L);
_clan.inform("Your Clan's Outpost has been destroyed.", null);
}
public ClanInfo getClan()
{
return _clan;
}
public long getLifetime()
{
return System.currentTimeMillis() - _spawnTime;
}
public AxisAlignedBB getBounds()
{
return UtilAlg.toBoundingBox(_startCorner, _endCorner);
}
public Location getExactMiddle()
{
return UtilAlg.getMidpoint(_startCorner, _endCorner);
}
public OutpostState getState()
{
return _state;
}
}

View File

@ -0,0 +1,57 @@
package mineplex.game.clans.clans.outpost;
import java.util.Map;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import mineplex.core.common.util.UtilWorld;
public class OutpostBlock
{
protected Location _loc;
protected int _id;
protected byte _data;
protected int _originalId;
protected byte _originalData;
public OutpostBlock(Map<String, OutpostBlock> blocks, Location loc, int id, byte data)
{
_loc = loc;
_id = id;
_data = data;
String locStr = UtilWorld.locToStr(loc);
if (blocks.containsKey(locStr))
{
_originalId = blocks.get(locStr)._originalId;
_originalData = blocks.get(locStr)._originalData;
}
else
{
_originalId = _loc.getBlock().getTypeId();
_originalData = _loc.getBlock().getData();
}
}
public void set()
{
_loc.getBlock().setTypeIdAndData(_id, _data, false);
if (_id != 0)
{
_loc.getWorld().playEffect(_loc, Effect.STEP_SOUND, Material.getMaterial(_id), 10);
}
}
public void restore()
{
BlockState state = _loc.getBlock().getState();
state.setTypeId(_originalId);
state.setRawData(_originalData);
state.update(true, false);
}
}

View File

@ -0,0 +1,218 @@
package mineplex.game.clans.clans.outpost;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import mineplex.core.MiniPlugin;
import mineplex.core.common.events.ServerShutdownEvent;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilItem;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.event.PlayerClaimTerritoryEvent;
public class OutpostManager extends MiniPlugin
{
private ClansManager _clansManager;
private Map<String, Outpost> _outposts = new HashMap<>();
private List<String> _removalQueue;
public OutpostManager(ClansManager clansManager)
{
super("Outpost Manager", clansManager.getPlugin());
_clansManager = clansManager;
_removalQueue = new ArrayList<>();
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlaceBlock(BlockPlaceEvent event)
{
if (event.getItemInHand().isSimilar(Outpost.OUTPOST_ITEM))
{
if (!Recharge.Instance.use(event.getPlayer(), "Place Outpost", 10000, true, false))
{
event.setCancelled(true);
return;
}
if (Spawn(event.getPlayer(), event.getBlock().getLocation(), OutpostType.ORIGINAL_CLANS))
{
event.getBlock().setData((byte) Outpost.OUTPOST_BLOCK_DATA);
}
else
{
event.setCancelled(true);
}
}
}
public boolean Spawn(Player player, Location location, OutpostType type)
{
if (!_clansManager.isInClan(player))
{
UtilPlayer.message(player, F.main("Clans", "You must be in a Clan to place an Outpost."));
return false;
}
if (location.getBlockY() < 10)
{
UtilPlayer.message(player, F.main("Clans", "You cannot place an Outpost this deep."));
return false;
}
ClanInfo clan = _clansManager.getClan(player);
if (UtilItem.isBoundless(location.clone().subtract(0, 1, 0).getBlock().getType()))
{
UtilPlayer.message(player, F.main("Clans", "An Outpost must not be placed floating."));
return false;
}
if (Get(clan) != null)
{
UtilPlayer.message(player, F.main("Clans", "Your clan already has an outpost"));
return false;
}
if (_clansManager.getClanUtility().getClaim(location) != null)
{
UtilPlayer.message(player, F.main("Clans", "An Outpost must be placed in the Wilderness."));
return false;
}
for (Outpost outpost : _outposts.values())
{
if (UtilMath.offset(location, outpost.getExactMiddle()) < 14)
{
UtilPlayer.message(player, F.main("Clans", "You cannot place an Outpost near other Outposts."));
return false;
}
}
for (int x = -type._size; x < type._size; x++)
{
for (int y = -1; y < type._ySize; y++)
{
for (int z = -type._size; z < type._size; z++)
{
Location loc = location.clone().add(x, y, z);
if (_clansManager.getClanUtility().isClaimed(loc))
{
UtilPlayer.message(player, F.main("Clans", "You cannot place an Outpost where it may intersect with claimed territory."));
return false;
}
if (UtilBlock.airFoliage(location.clone().add(x, -1, z).getBlock()))
{
UtilPlayer.message(player, F.main("Clans", "An Outpost cannot be placed floating."));
return false;
}
}
}
}
_outposts.put(clan.getName(), new Outpost(this, clan, location, type));
_plugin.getServer().getPluginManager().registerEvents(_outposts.get(clan.getName()), _plugin);
return true;
}
@EventHandler
public void onBlockFall(EntityChangeBlockEvent event)
{
if (event.getEntity().hasMetadata("ClansOutpost"))
{
event.setCancelled(true);
}
}
@EventHandler
public void onServerShutdown(ServerShutdownEvent event)
{
for (Outpost outpost : _outposts.values())
{
outpost.instakill();
}
}
@EventHandler
public void onClaim(PlayerClaimTerritoryEvent event)
{
for (Outpost outpost : _outposts.values())
{
if (outpost.getBounds().b(UtilAlg.toBoundingBox(event.getClaimedChunk().getBlock(0, 0, 0).getLocation(), event.getClaimedChunk().getBlock(15, 254, 15).getLocation())))
{
event.setCancelled(true);
UtilPlayer.message(event.getClaimer(), F.main("Clans", "You cannot claim this territory as it overlaps with " + F.elem(outpost.getClan().getName()) + "'s Outpost."));
break;
}
}
}
@EventHandler
public void update(UpdateEvent event)
{
for (Outpost outpost : _outposts.values())
{
if (outpost.getState() != OutpostState.DEAD)
{
if (outpost.getState() == OutpostState.CONSTRUCTING ? event.getType() == UpdateType.FASTER : event.getType() == UpdateType.TICK)
{
outpost.update();
}
}
}
if (event.getType() == UpdateType.FASTER)
{
if (!_removalQueue.isEmpty())
{
HandlerList.unregisterAll(_outposts.remove(_removalQueue.remove(0)));
}
}
if (event.getType() == UpdateType.TWOSEC)
{
for (Outpost outpost : _outposts.values())
{
if (outpost.getState() == OutpostState.LIVE && outpost.getLifetime() > Outpost.MAX_LIFETIME)
{
outpost.kill();
}
}
}
}
public Outpost Get(ClanInfo clan)
{
return _outposts.get(clan.getName().toLowerCase());
}
public void queueForRemoval(String name)
{
_removalQueue.add(name);
}
}

View File

@ -0,0 +1,10 @@
package mineplex.game.clans.clans.outpost;
public enum OutpostState
{
AWAITING,
CONSTRUCTING,
LIVE,
DESTRUCTING,
DEAD;
}

View File

@ -0,0 +1,225 @@
package mineplex.game.clans.clans.outpost;
import java.util.LinkedHashMap;
import org.bukkit.Location;
import org.bukkit.Material;
import mineplex.core.common.util.UtilWorld;
import mineplex.game.clans.clans.ClansManager;
public enum OutpostType
{
ORIGINAL_CLANS(3, 6) {
public LinkedHashMap<String, OutpostBlock> createBuildQueue(Location location, ClansManager clans)
{
LinkedHashMap<String, OutpostBlock> build = new LinkedHashMap<>();
for (int y = -1; y <= _ySize; y++)
{
for (int x = -_size; x <= _size; x++)
{
for (int z = -_size; z <= _size; z++)
{
Location loc = new Location(location.getWorld(), location.getX()+x, location.getY()+y, location.getZ()+z);
if (clans.getClanUtility().isClaimed(loc))
{
continue;
}
boolean added = false;
//Floor
if (y == -1 && Math.abs(x) <= _size-1 && Math.abs(z) <= _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 98, (byte)0));
added = true;
}
//Walls
if (Math.abs(x) == _size || Math.abs(z) == _size)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 98, (byte)0));
added = true;
}
//Roof
if (y == 5 && Math.abs(x) <= _size-1 && Math.abs(z) <= _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 44, (byte)13));
added = true;
}
//Clear
if (!added)
{
if (loc.getBlock().getTypeId() != 0)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 0, (byte) 0));
}
}
}
}
}
for (int y= -1; y <= _ySize; y++)
{
for (int x = -_size; x <= _size; x++)
{
for (int z = -_size; z <= _size; z++)
{
Location loc = new Location(location.getWorld(), location.getX()+x, location.getY()+y, location.getZ()+z);
if (clans.getClanUtility().isClaimed(loc))
{
continue;
}
//Doors
if (y == 0 || y == 1)
{
if (x == 0 && z == _size)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 71, (byte)(y * 8 + 2 + 4)));
}
if (x == 0 && z == -_size)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 71, (byte)(y * 8 + 4)));
}
if (x == _size && z == 0)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 71, (byte)(y * 8 + 3 + 4)));
}
if (x == -_size && z == 0)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 71, (byte)(y * 8 + 1 + 4)));
}
}
//Platform
if (y == 2)
{
if (Math.abs(x) == _size-1 && Math.abs(z) < _size)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 44, (byte)13));
}
if (Math.abs(z) == _size-1 && Math.abs(x) < _size)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 44, (byte)13));
}
}
//Windows
if (y == 4)
{
if (Math.abs(x) == _size && Math.abs(z) < _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 0, (byte)0));
}
if (Math.abs(z) == _size && Math.abs(x) < _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 0, (byte)0));
}
}
//Ladders
if (y >= 0 && y < 3)
{
if (x == _size-1 && z == _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 65, (byte)2));
}
if (x == (-_size)+1 && z == (-_size)+1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 65, (byte)3));
}
}
//Chests
if (y == 0)
{
if (x == _size-1 && z == (-_size)+1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 54, (byte)0));
}
if (x == (-_size)+1 && z == _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 54, (byte)0));
}
if (x == _size-2 && z == (-_size)+1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 54, (byte)0));
}
if (x == (-_size)+2 && z == _size-1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 54, (byte)0));
}
}
//Beacon Floor
if (y == -1)
{
if (Math.abs(x) <= 1 && Math.abs(z) <= 1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 42, (byte)0));
}
}
//Beacon Roof
if (y == 5)
{
if (Math.abs(x) == 1 && Math.abs(z) <= 1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 98, (byte)0));
}
if (Math.abs(z) == 1 && Math.abs(x) <= 1)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 98, (byte)0));
}
}
//Beacon Glass
if (y == 5 && x == 0 && z == 0)
{
build.put(UtilWorld.locToStr(loc), new OutpostBlock(build, loc, 20, (byte)0));
}
}
}
}
//Core
build.put(UtilWorld.locToStr(getCoreLocation(location)), new OutpostBlock(build, getCoreLocation(location), Material.DIAMOND_BLOCK.getId(), (byte)0));
return build;
}
public Location getCoreLocation(Location location)
{
return location.clone().subtract(0, 1, 0);
}
};
protected int _size;
protected int _ySize;
OutpostType(int size, int ySize)
{
_size = size;
_ySize = ySize;
}
public abstract LinkedHashMap<String, OutpostBlock> createBuildQueue(Location location, ClansManager clans);
public abstract Location getCoreLocation(Location location);
}

View File

@ -1,13 +1,18 @@
package mineplex.game.clans.clans.playtime;
import org.bukkit.entity.Player;
import mineplex.core.task.TaskManager;
import mineplex.game.clans.clans.ClansPlayerTasks;
public class PlayingClient
{
public long StartTime;
public boolean FirstSession;
public PlayingClient(boolean first)
public PlayingClient(Player player, TaskManager taskManager)
{
StartTime = System.currentTimeMillis();
FirstSession = first;
FirstSession = taskManager.hasCompletedTask(player, ClansPlayerTasks.FIRST_SESSION.id());
}
}

View File

@ -9,6 +9,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
import mineplex.core.MiniClientPlugin;
import mineplex.core.stats.StatsManager;
import mineplex.core.task.TaskManager;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ClansPlayerStats;
import mineplex.game.clans.clans.playtime.command.PlayTimeCommand;
@ -75,7 +76,7 @@ public class Playtime extends MiniClientPlugin<PlayingClient>
@Override
protected PlayingClient AddPlayer(String player)
{
return new PlayingClient(_statsManager.Get(player).getStat(ClansPlayerStats.PLAY_TIME.id()) == 0);
return new PlayingClient(Bukkit.getPlayer(player), TaskManager.Instance);
}
// Seconds

View File

@ -21,7 +21,7 @@ public class cemde extends CommandBase<StatsManager>
@Override
public void Execute(final Player caller, final String[] args)
{
Plugin.Get(caller).setStat(ClansPlayerStats.PLAY_TIME.id(), 0);
Plugin.Get(caller).setStat(ClansPlayerStats.PLAY_TIME.id(), args.length == 0 ? 0 : Integer.parseInt(args[0]));
_timer.Get(caller).Skipped = false;
_timer.Get(caller).InformedTimes.clear();

View File

@ -1,16 +1,23 @@
package mineplex.game.clans.clans.pvptimer;
import java.util.Iterator;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent;
import mineplex.core.MiniClientPlugin;
import mineplex.core.common.jsonchat.ClickEvent;
import mineplex.core.common.jsonchat.JsonMessage;
import mineplex.core.common.util.C;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
@ -18,17 +25,26 @@ import mineplex.core.stats.StatsManager;
import mineplex.core.task.TaskManager;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanTips.TipType;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.event.ClanTipEvent;
import mineplex.game.clans.clans.event.PlayerEnterTerritoryEvent;
import mineplex.game.clans.clans.playtime.Playtime;
import mineplex.game.clans.clans.playtime.command.cemde;
import mineplex.game.clans.clans.pvptimer.command.PvPTimerCommand;
import mineplex.game.clans.core.repository.ClanTerritory;
import mineplex.game.clans.spawn.Spawn;
import mineplex.minecraft.game.classcombat.Skill.event.SkillTriggerEvent;
import mineplex.minecraft.game.classcombat.event.FireballHitEntityEvent;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
{
private Playtime _tracker;
public static final String SKIPPED_TASK = "PvpTimer.Skipped";
private final int[] DISPLAY_TIMES = { 5, 10, 30, 1 * 60, 2 * 60, 5 * 60, 10 * 60, 20 * 60 };
private ClansManager _clansManager;
private Playtime _tracker;
private static long TIMER_LENGTH = 30 * 60;
@ -36,6 +52,7 @@ public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
{
super("PvP Timer", clans.getPlugin());
_tracker = playtime;
_clansManager = clans;
addCommand(new cemde(statsManager, this));
}
@ -58,6 +75,59 @@ public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
}, caller, "PvpTimer.Skipped");
}
@EventHandler
public void outYouGo(UpdateEvent event)
{
if (event.getType() == UpdateType.SEC)
{
for (Player player : Bukkit.getOnlinePlayers())
{
if (!hasTimer(player)) continue;
ClanTerritory territory = _clansManager.getClanUtility().getClaim(player.getLocation());
if (territory != null && territory.Owner.equals("Borderlands"))
{
UtilAction.velocity(player, UtilAlg.getTrajectory2d(player.getLocation(), Spawn.ORIGIN), 2.6, true, 0.5, 1, 1.35, true);
player.playSound(player.getLocation(), Sound.NOTE_BASS, 1.0f, 1.0f);
UtilPlayer.message(player, " ");
UtilPlayer.message(player, C.cDRedB + ">>" + C.cRed + " You are not permitted to enter the Borderlands while under PvP Safety.");
new JsonMessage(C.cGoldB + "> " + C.cGold + "To permanently disable PvP Safety, click ")
.extra("here")
.color("yellow")
.click(ClickEvent.RUN_COMMAND, "/pvptimer yesiconfirmthatiwouldliketodisablemypvptimerforever")
.extra(".")
.color("gray")
.sendToPlayer(player);
UtilPlayer.message(player, " ");
}
}
}
}
@EventHandler
public void territoryEnter(PlayerEnterTerritoryEvent event)
{
String from = event.getLastTerritory();
String to = event.getNewTerritory();
if (from == null && "Borderlands".equals(to)
|| to == null && "Borderlands".equals(from))
{
event.setSendMessage(false);
}
}
@EventHandler
public void clanTip(ClanTipEvent event)
{
event.setCancelled(hasTimer(event.getPlayer()) && event.getTip() == TipType.ENTER_BORDERLANDS);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event)
{
@ -68,13 +138,13 @@ public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() {
public void run()
{
UtilTextMiddle.display(C.cGold + "PvP Timer", "will end in " + UtilTime.MakeStr(getPvPTimerLeft(player) * 1000), 40, 70, 40, player);
UtilTextMiddle.display(C.cGreen + "PvP Safety", C.cGray + "will end in " + UtilTime.MakeStr(getPvPTimerLeft(player) * 1000), 40, 70, 40, player);
}
}, 10);
UtilPlayer.message(player, F.main("Clans", "You are currently on your PvP timer. It will end in " + F.elem(UtilTime.MakeStr(getPvPTimerLeft(player) * 1000))));
UtilPlayer.message(player, F.main("Clans", "You are currently safe from PvP because you are a new player. This safety will end in " + F.elem(UtilTime.MakeStr(getPvPTimerLeft(player) * 1000))));
UtilPlayer.message(player, F.main("Clans", "Until it ends, you are immune to, and unable to deal PvP damage."));
UtilPlayer.message(player, F.main("Clans", "If you would like to disable the PvP timer permanently, then type " + F.elem("/pvptimer") + ", and follow the instructions given."));
UtilPlayer.message(player, F.main("Clans", "If you would like to disable the PvP safety permanently, then type " + F.elem("/pvp") + "."));
}
}
@ -90,67 +160,60 @@ public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
long time = getPvPTimerLeft(player);
PvpTimerClient client = Get(player);
// end
if (time <= 2)
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " has ended!"));
UtilPlayer.message(player, F.main("Clans", "PvP Safety has ended!"));
UtilPlayer.message(player, F.main("Clans", "You are now completely open to attacks, and you can also attack others."));
player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 1f, 0.75f);
continue;
}
// 5 secs
else if (time <= 5 && !client.InformedTimes.contains(5))
for (int unit : DISPLAY_TIMES)
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("5.0 Seconds")));
UtilTextMiddle.display("Pvp Timer", "ending in 5 Seconds");
client.InformedTimes.add(5);
}
// 10 secs
else if (time <= 10 && !client.InformedTimes.contains(10))
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("10.0 Seconds")));
UtilTextMiddle.display("Pvp Timer", "ending in 10 Seconds");
client.InformedTimes.add(10);
}
// 30 secs
else if (time <= 30 && !client.InformedTimes.contains(30))
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("30.0 Seconds")));
UtilTextMiddle.display("Pvp Timer", "ending in 30 Seconds");
client.InformedTimes.add(30);
}
// 1 minute
else if (time <= 1 * 60 && !client.InformedTimes.contains(1 * 60))
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("1.0 Minute")));
UtilTextMiddle.display("Pvp Timer", "ending in 1 Minute");
client.InformedTimes.add(5);
}
// 5 minutes
else if (time <= 5 * 60 && !client.InformedTimes.contains(5 * 60))
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("5.0 Minutes")));
UtilTextMiddle.display("Pvp Timer", "ending in 5 Minutes");
client.InformedTimes.add(5 * 60);
}
// 10 minutes
else if (time <= 10 * 60 && !client.InformedTimes.contains(10 * 60))
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("10.0 Minutes")));
UtilTextMiddle.display("Pvp Timer", "ending in 10 Minutes");
client.InformedTimes.add(10 * 60);
}
// 20 minutes
else if (time <= 20 * 60 && !client.InformedTimes.contains(20 * 60))
{
UtilPlayer.message(player, F.main("Clans", "Your " + F.elem("Pvp Timer") + " will end in " + F.time("20.0 Minutes")));
UtilTextMiddle.display("Pvp Timer", "ending in 20 Minutes");
client.InformedTimes.add(20 * 60);
if (time <= unit && !client.InformedTimes.contains(unit))
{
UtilPlayer.message(player, F.main("Clans", "PvP Safety will end in " + F.time(UtilTime.MakeStr(unit * 1000))));
UtilTextMiddle.display(C.cGreen + "Pvp Safety", C.cGray + "ending in " + UtilTime.MakeStr(unit * 1000), 20, 80, 20, player);
client.InformedTimes.add(unit);
}
}
}
}
}
}
@EventHandler
public void onSkill(SkillTriggerEvent event)
{
if (event.GetTargets() == null)
{
return;
}
if (event.GetTargets().size() == 1
&& event.GetTargets().get(0) instanceof Player
&& hasTimer((Player) event.GetTargets().get(0)))
{
event.SetCancelled(true);
}
for (Iterator<Entity> iterator = event.GetTargets().iterator(); iterator.hasNext();)
{
Entity entity = iterator.next();
if (entity instanceof Player && hasTimer((Player) entity))
{
iterator.remove();
}
}
}
@EventHandler
public void onFireballHit(FireballHitEntityEvent event)
{
event.setCancelled(event.getHitEntity() instanceof Player && hasTimer((Player) event.getHitEntity()));
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerAttack(CustomDamageEvent event)
{
@ -170,12 +233,12 @@ public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
{
if (damagerTimer)
{
UtilPlayer.message(damager, F.main("Clans", "You and " + F.name(victim.getName()) + " are still on your PvP timer. Type " + F.elem("/pvptimer") + " to disable."));
UtilPlayer.message(damager, F.main("Clans", "You and " + F.name(victim.getName()) + " are still protected from PvP. Type " + F.elem("/pvp") + " to disable."));
bothMsg = true;
}
else if (damager != null)
{
UtilPlayer.message(damager, F.main("Clans", F.name(victim.getName()) + " is still on their Pvp timer."));
UtilPlayer.message(damager, F.main("Clans", F.name(victim.getName()) + " is still protected from PvP."));
}
event.SetCancelled("Pvp Timer");
@ -185,11 +248,11 @@ public class PvpTimer extends MiniClientPlugin<PvpTimerClient>
{
if (victimTimer)
{
if (!bothMsg) UtilPlayer.message(damager, F.main("Clans", "You and " + F.name(victim.getName()) + " are still on your PvP timer. Type " + F.elem("/pvptimer") + " to disable."));
if (!bothMsg) UtilPlayer.message(damager, F.main("Clans", "You and " + F.name(victim.getName()) + " are still under PvP Safety. Type " + F.elem("/pvp") + " to disable."));
}
else if (damager != null)
{
UtilPlayer.message(damager, F.main("Clans", "You are still on your PvP timer."));
UtilPlayer.message(damager, F.main("Clans", "You are still under PvP Safety."));
}
event.SetCancelled("PvP Timer");

View File

@ -6,6 +6,7 @@ import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.jsonchat.ClickEvent;
import mineplex.core.common.jsonchat.JsonMessage;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTime;
@ -25,7 +26,7 @@ public class PvPTimerCommand extends CommandBase<PvpTimer>
{
if (Plugin.Get(caller).Skipped)
{
UtilPlayer.message(caller, F.main("Clans", "You have skipped your PvP timer."));
UtilPlayer.message(caller, F.main("Clans", "You have permanently disabled PvP Safety."));
return;
}
@ -33,12 +34,12 @@ public class PvPTimerCommand extends CommandBase<PvpTimer>
if (pvpTimerLeft == 0)
{
UtilPlayer.message(caller, F.main("Clans", "Your PvP timer has ended."));
UtilPlayer.message(caller, F.main("Clans", "PvP Safety has already ended."));
}
else
{
UtilPlayer.message(caller, F.main("Clans", "You have " + F.elem(UtilTime.MakeStr(pvpTimerLeft * 1000)) + " before your PvP timer runs out."));
new JsonMessage(F.main("Clans", "If you would like to permanently disable Pvp timer, click "))
UtilPlayer.message(caller, F.main("Clans", "You have " + F.elem(UtilTime.MakeStr(pvpTimerLeft * 1000)) + " before PvP Safety runs out for you."));
new JsonMessage(F.main("Clans", "If you would like to permanently disable " + C.mBody + "PvP Safety, click "))
.extra("here")
.color("green")
.click(ClickEvent.RUN_COMMAND, "/pvptimer yesiconfirmthatiwouldliketodisablemypvptimerforever")
@ -53,7 +54,8 @@ public class PvPTimerCommand extends CommandBase<PvpTimer>
if (args[0].equalsIgnoreCase("yesiconfirmthatiwouldliketodisablemypvptimerforever"))
{
Plugin.disableFor(caller);
UtilPlayer.message(caller, F.main("Clans", "You have disabled your Pvp timer."));
UtilPlayer.message(caller, F.main("Clans", "You have disabled PvP Safety."));
UtilPlayer.message(caller, F.main("Clans", "You are now completely open to attacks, and you can also attack others."));
}
}
}

View File

@ -211,7 +211,7 @@ public class ClansRegions extends MiniPlugin
if (_manager.getClaimMap().containsKey(chunkStr))
{
System.out.println("get claim map contains " + chunkStr);
System.out.println("get claim map contains " + chunkStr); // this is really really slowing server startup down. just saying.
continue;
}

View File

@ -1,20 +1,18 @@
package mineplex.game.clans.gameplay;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.inventory.Recipe;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
public class CustomRecipes implements Listener
{
private static final Material[] DISABLED_RECIPES = { Material.EXPLOSIVE_MINECART, Material.JUKEBOX, Material.FISHING_ROD };
private static final Material[] DISABLED_RECIPES = { Material.EXPLOSIVE_MINECART, Material.JUKEBOX, Material.FISHING_ROD, Material.BED };
@EventHandler
public void onPlayerCraftItem(CraftItemEvent event)

View File

@ -10,7 +10,6 @@ import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@ -39,6 +38,7 @@ import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerFishEvent.State;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.weather.WeatherChangeEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
@ -65,6 +65,7 @@ import mineplex.core.common.weight.WeightSet;
import mineplex.minecraft.game.classcombat.Class.ClientClass;
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.minecraft.game.classcombat.Skill.event.BlockTossEvent;
import mineplex.minecraft.game.classcombat.Skill.event.BlockTossLandEvent;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
import mineplex.minecraft.game.core.damage.DamageManager;
@ -101,6 +102,20 @@ public class Gameplay extends MiniPlugin
// }
// }
@EventHandler
public void stopBlockTossExploit(BlockTossLandEvent event)
{
int id = event.Entity.getBlockId();
if (_clansManager.getClanUtility().isClaimed(event.getLocation())
&& (Material.getMaterial(id).name().endsWith("_PLATE")
|| id == Material.STONE_BUTTON.getId()
|| id == Material.WOOD_BUTTON.getId()
|| id == Material.LEVER.getId()))
{
event.setCancelled(true);
}
}
@EventHandler
public void onPlayerFishing(PlayerFishEvent event)
{
@ -434,7 +449,7 @@ public class Gameplay extends MiniPlugin
{
final Block block = event.getBlock();
if (_clansManager.getClanUtility().isSafe(block.getLocation()))
if (_clansManager.getClanUtility().getClaim(block.getLocation()) != null)
{
return;
}
@ -471,15 +486,9 @@ public class Gameplay extends MiniPlugin
}
@EventHandler
public void killRain(UpdateEvent event)
public void killRain(WeatherChangeEvent event)
{
if (event.getType() != UpdateType.TWOSEC){
for (World world : Bukkit.getWorlds()){
world.setWeatherDuration(0);
world.setThunderDuration(0);
world.setThundering(false);
}
}
event.setCancelled(event.toWeatherState());
}
@EventHandler

View File

@ -10,7 +10,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilFile;
import mineplex.core.common.util.UtilFile.ChunkType;
@ -19,8 +18,8 @@ import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ClanTips.TipType;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.gameplay.safelog.npc.NPCManager;
public class SafeLog extends MiniPlugin
@ -96,8 +95,7 @@ public class SafeLog extends MiniPlugin
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event)
{
event.setQuitMessage(null);
UtilServer.broadcast(F.sys("Quit", event.getPlayer().getName()));
event.setQuitMessage(F.sys("Quit", event.getPlayer().getName()));
onPlayerQuit(event.getPlayer());
}
@ -105,8 +103,7 @@ public class SafeLog extends MiniPlugin
@EventHandler
public void onPlayerKicked(PlayerKickEvent event)
{
event.setLeaveMessage(null);
UtilServer.broadcast(F.sys("Quit", event.getPlayer().getName()));
event.setLeaveMessage(F.sys("Quit", event.getPlayer().getName()));
onPlayerQuit(event.getPlayer());
}
@ -115,7 +112,6 @@ public class SafeLog extends MiniPlugin
public void onPlayerJoin(PlayerJoinEvent event)
{
event.setJoinMessage(null);
UtilServer.broadcast(F.sys("Join", event.getPlayer().getName()));
onPlayerJoin(event.getPlayer());
}

View File

@ -13,6 +13,7 @@ import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Skeleton;
import org.bukkit.metadata.FixedMetadataValue;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
@ -20,7 +21,6 @@ import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilFile;
import mineplex.core.common.util.UtilFile.ChunkType;
import mineplex.core.common.util.UtilFile.DataFileChunk;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTime;
@ -28,6 +28,8 @@ import mineplex.core.disguise.DisguiseManager;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.hologram.Hologram;
import mineplex.core.hologram.HologramManager;
import mineplex.game.clans.Clans;
import mineplex.game.clans.clans.ClansManager;
public class CombatLogNPC
{
@ -188,6 +190,7 @@ public class CombatLogNPC
{
Location spawnLoc = player.getLocation();
Skeleton skel = player.getWorld().spawn(spawnLoc, Skeleton.class);
skel.setMetadata("CombatLogNPC", new FixedMetadataValue(ClansManager.getInstance().getPlugin(), player.getUniqueId().toString()));
skel.teleport(spawnLoc);
skel.setHealth(_spawnHealth);
UtilEnt.Vegetate(skel);

View File

@ -8,10 +8,12 @@ import org.bukkit.GameMode;
import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import mineplex.core.MiniPlugin;
@ -20,6 +22,7 @@ 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.spawn.Spawn;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class NPCManager extends MiniPlugin
@ -74,6 +77,18 @@ public class NPCManager extends MiniPlugin
}
}
@EventHandler
public void killNpcs(PlayerJoinEvent event)
{
for (LivingEntity entity : Spawn.getSpawnWorld().getLivingEntities())
{
if (entity.hasMetadata("CombatLogNPC"))
{
entity.remove();
}
}
}
public void despawnLogoutNpc(Player player)
{
CombatLogNPC npc = getLogoutNpc(player);

View File

@ -55,6 +55,8 @@ public class CustomItem
private boolean _dullEnchantment;
public String OriginalOwner = null;
public String getUuid()
{
return _uuid;

View File

@ -8,7 +8,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
@ -23,6 +25,7 @@ import com.google.gson.GsonBuilder;
import mineplex.core.MiniPlugin;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
@ -64,7 +67,6 @@ import mineplex.game.clans.items.legendaries.WindBlade;
import mineplex.game.clans.items.smelting.SmeltingListener;
import mineplex.game.clans.items.ui.GearShop;
import mineplex.serverdata.serialization.RuntimeTypeAdapterFactory;
import net.minecraft.server.v1_8_R3.NBTTagCompound;
import net.minecraft.server.v1_8_R3.Packet;
import net.minecraft.server.v1_8_R3.PacketPlayOutSetSlot;
@ -361,6 +363,7 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
}
catch (Exception exception)
{
exception.printStackTrace();
System.out.println("==========");
System.out.println("GearManager parse problem :");
System.out.println(serialization);
@ -481,7 +484,7 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
if (packet instanceof PacketPlayOutSetSlot)
{
PacketPlayOutSetSlot slotPacket = (PacketPlayOutSetSlot) packet;
slotPacket.c = maskItem(slotPacket.c); // Mask all out-going item
slotPacket.c = maskItem(slotPacket.c, packetInfo.getPlayer()); // Mask all out-going item
// packets
}
else if (packet instanceof PacketPlayOutWindowItems)
@ -490,7 +493,7 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
for (int i = 0; i < itemsPacket.b.length; i++)
{
itemsPacket.b[i] = maskItem(itemsPacket.b[i]); // Mask all
itemsPacket.b[i] = maskItem(itemsPacket.b[i], packetInfo.getPlayer()); // Mask all
// out-going
// item packets
ItemStack item = CraftItemStack.asCraftMirror(itemsPacket.b[i]);
@ -514,7 +517,7 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
return item;
}
private net.minecraft.server.v1_8_R3.ItemStack maskItem(net.minecraft.server.v1_8_R3.ItemStack item)
private net.minecraft.server.v1_8_R3.ItemStack maskItem(net.minecraft.server.v1_8_R3.ItemStack item, Player player)
{
// Cannot mask a null item
if (item == null)
@ -533,18 +536,21 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
List<String> lore = new ArrayList<String>();
CustomItem ci = parseItem(originalItem);
for (String line : originalMeta.getLore())
{
if (!line.startsWith(ITEM_SERIALIZATION_TAG)) // Remove
// serialization
// lines from
// out-going lore
if (!line.startsWith(ITEM_SERIALIZATION_TAG))
{
lore.add(line);
}else{
}
}
if (ci != null && _legendaryWeights.elements().contains(ci.getClass()))
{
lore.add(C.cWhite + "Original Owner: " + C.cYellow + (ci.OriginalOwner == null ? "You" : Bukkit.getOfflinePlayer(UUID.fromString(ci.OriginalOwner)).getName()));
}
net.minecraft.server.v1_8_R3.ItemStack newItem = CraftItemStack.asNMSCopy(originalItem);
CraftItemStack newCopy = CraftItemStack.asCraftMirror(newItem);
ItemMeta newMeta = newCopy.getItemMeta();

View File

@ -3,17 +3,20 @@ package mineplex.game.clans.items;
import java.util.HashSet;
import java.util.Set;
import mineplex.game.clans.items.legendaries.LegendaryItem;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.game.clans.items.legendaries.LegendaryItem;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
/**
* PlayerGear caches and manages a players set of {@link CustomItem}s that they
* currently wield.
@ -55,7 +58,17 @@ public class PlayerGear
if (item != null && item instanceof LegendaryItem)
{
LegendaryItem legendary = (LegendaryItem) item;
legendary.preUpdate(getPlayer());
legendary.update(getPlayer());
if (legendary.OriginalOwner == null)
{
legendary.OriginalOwner = getPlayer().getUniqueId().toString();
UtilServer.broadcast(F.main("Clans", F.elem(getPlayer().getName()) + " has picked up " + F.vowelAN(legendary.getDisplayName()) + " " + legendary.getDisplayName() + C.mBody + "."));
UtilTextMiddle.display(C.cDPurple + "Legendary", F.elem(getPlayer().getName()) + C.cWhite + " picked up " + F.vowelAN(legendary.getDisplayName()) + " " + legendary.getDisplayName() + C.cWhite + ".");
getPlayer().setItemInHand(legendary.toItemStack());
}
}
}
}

View File

@ -62,7 +62,7 @@ public class GiantsBroadsword extends LegendaryItem
private void buffPlayer(Player player)
{
grantPotionEffect(player, PotionEffectType.SLOW, 20, 10);
grantPotionEffect(player, PotionEffectType.REGENERATION, 1, 10);
grantPotionEffect(player, PotionEffectType.SLOW, 40, 10);
grantPotionEffect(player, PotionEffectType.REGENERATION, 40, 10);
}
}

View File

@ -30,6 +30,10 @@ public class LegendaryItem extends CustomItem
// Leave implementation to potential subtypes
}
public void preUpdate(Player wielder)
{
}
public void onAttack(CustomDamageEvent event, Player wielder)
{
// Leave implementation to potential subtypes

View File

@ -74,7 +74,7 @@ public class WindBlade extends LegendaryItem
_burnoutThreshold = 0;
}
if (_messageTimer % 20 == 0)
if (_messageTimer % 5 == 0)
{
UtilPlayer.message(wielder, F.main("Wind Blade", "Flight power damaged whilst scraping the ground! Repairs will be finish in " + F.time(UtilTime.MakeStr(burnoutRemaining)) + "."));
}

View File

@ -89,7 +89,6 @@ public abstract class ClansShopPage<T extends ShopBase<ClansManager>> extends Sh
addShopItem(index, item, (byte) 0, displayName, 1);
}
public void addShopItem(int index, ClansShopItem item)
{
addShopItem(index, item, (byte) 0);

View File

@ -54,6 +54,7 @@ public class Spawn extends MiniPlugin
public static final int SHOP_RADIUS = 48;
public static final String COMBAT_TAG_NAME = "Unsafe";
public static final long COMBAT_TAG_DURATION = 15000;
public static final Location ORIGIN = new Location(getSpawnWorld(), 0, 0, 0);
private static Spawn _instance;
public static Spawn getInstance() { return _instance; }

View File

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Color;
import org.bukkit.FireworkEffect.Type;
@ -31,24 +30,21 @@ 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;
import mineplex.core.donation.DonationManager;
import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketHandler;
import mineplex.core.packethandler.PacketInfo;
import mineplex.core.scoreboard.ScoreboardManager;
import mineplex.core.scoreboard.elements.ScoreboardElement;
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.ClansPlayerTasks;
import mineplex.game.clans.clans.event.ClanJoinEvent;
import mineplex.game.clans.clans.event.ClanTipEvent;
import mineplex.game.clans.clans.playtime.Playtime;
import mineplex.game.clans.economy.GoldManager;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
/**
*
@ -286,6 +282,13 @@ public abstract class Tutorial implements ScoreboardElement, Listener
_inTutorial.remove(player.getName());
onFinished(player);
if (_playtime.Get(player).FirstSession)
{
_playtime.Get(player).StartTime = System.currentTimeMillis();
_playtime.Get(player).FirstSession = false;
TaskManager.Instance.completedTask(null, player, ClansPlayerTasks.FIRST_SESSION.id());
}
_manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(_manager.getPlugin(), new Runnable()
{
public void run()
@ -441,6 +444,13 @@ public abstract class Tutorial implements ScoreboardElement, Listener
player.showPlayer(other);
}
}
if (_playtime.Get(player).FirstSession)
{
_playtime.Get(player).StartTime = System.currentTimeMillis();
_playtime.Get(player).FirstSession = false;
TaskManager.Instance.completedTask(null, player, ClansPlayerTasks.FIRST_SESSION.id());
}
}
public boolean isInTutorial(final Player player)
@ -503,12 +513,6 @@ public abstract class Tutorial implements ScoreboardElement, Listener
{
public void run(Boolean data)
{
if (_playtime.Get(player).FirstSession)
{
_playtime.Get(player).StartTime = System.currentTimeMillis();
_playtime.Get(player).FirstSession = false;
}
cancelFor(player);
}
}, player, String.format(SKIPPED_TASK, _technicalName));

View File

@ -53,12 +53,6 @@ public class TutorialGettingStarted extends Tutorial
{
player.resetPlayerTime();
player.teleport(Spawn.getEastSpawn());
if (_playtime.Get(player).FirstSession)
{
_playtime.Get(player).StartTime = System.currentTimeMillis();
_playtime.Get(player).FirstSession = false;
}
}
@Override

View File

@ -13,6 +13,7 @@ import mineplex.core.aprilfools.AprilFoolsManager;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.chat.Chat;
import mineplex.core.command.CommandCenter;
import mineplex.core.common.events.ServerShutdownEvent;
import mineplex.core.creature.Creature;
import mineplex.core.customdata.CustomDataManager;
import mineplex.core.disguise.DisguiseManager;
@ -66,7 +67,6 @@ import mineplex.minecraft.game.classcombat.shop.ClassCombatShop;
import mineplex.minecraft.game.classcombat.shop.ClassShopManager;
import mineplex.minecraft.game.core.IRelation;
import mineplex.minecraft.game.core.combat.CombatManager;
import mineplex.minecraft.game.core.condition.ConditionManager;
import mineplex.minecraft.game.core.damage.DamageManager;
import mineplex.minecraft.game.core.fire.Fire;
@ -189,7 +189,7 @@ public class Hub extends JavaPlugin implements IRelation
@Override
public void onDisable()
{
getServer().getPluginManager().callEvent(new ServerShutdownEvent(this));
}
@Override

View File

@ -369,7 +369,7 @@ public class ClientClass
UtilPlayer.message(caller, F.main("Skill", "Listing Class Skills:"));
for (SkillType type : SkillType.values())
if (caller.isOp() || type != SkillType.Class)
if ((caller != null && caller.isOp()) || type != SkillType.Class)
if (_skillMap.containsKey(type))
UtilPlayer.message(caller, F.desc(type.toString(), _skillMap.get(type).GetName() + " Lvl" + _skillMap.get(type).getLevel(caller)));
}

View File

@ -37,6 +37,7 @@ import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.minecraft.game.classcombat.Skill.SkillCharge;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
import mineplex.minecraft.game.classcombat.Skill.event.BlockTossEvent;
import mineplex.minecraft.game.classcombat.Skill.event.BlockTossExpireEvent;
import mineplex.minecraft.game.classcombat.Skill.event.BlockTossLandEvent;
import mineplex.minecraft.game.classcombat.Skill.event.SkillEvent;
@ -239,13 +240,15 @@ public class BlockToss extends SkillCharge implements IThrown
//Throw
cur.eject();
double mult = Math.max(0.4, charge * 2);
Material mat = Material.getMaterial(block.getBlockId());
//Action
UtilAction.velocity(block, cur.getLocation().getDirection(), mult, false, 0, 0, 1, true);
Factory.Projectile().AddThrow(block, cur, this, -1, true, true, true, true,
null, 0, 0, null, 0, UpdateType.FASTEST, 1.2f);
//Event
// Generic Event
UtilServer.getServer().getPluginManager().callEvent(new SkillEvent(cur, GetName(), ClassType.Brute));
}
}
@ -369,7 +372,7 @@ public class BlockToss extends SkillCharge implements IThrown
{
if (!event.getBlock().getType().isSolid()) // Falling block is landing and turning block from air to type
{
BlockTossLandEvent landEvent = new BlockTossLandEvent(event.getBlock());
BlockTossLandEvent landEvent = new BlockTossLandEvent(event.getBlock(), ((FallingBlock) event.getEntity()));
Bukkit.getServer().getPluginManager().callEvent(landEvent);
if (landEvent.isCancelled())

View File

@ -21,8 +21,10 @@ import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.minecraft.game.classcombat.Skill.SkillActive;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
import mineplex.minecraft.game.classcombat.event.FireballHitEntityEvent;
public class FireBlast extends SkillActive
{
@ -93,7 +95,7 @@ public class FireBlast extends SkillActive
if (!(proj.getShooter() instanceof Player))
return;
Player player = (Player)proj.getShooter();
//Level
@ -105,7 +107,16 @@ public class FireBlast extends SkillActive
for (LivingEntity cur : hitMap.keySet())
{
double range = hitMap.get(cur);
FireballHitEntityEvent evt = new FireballHitEntityEvent(proj, cur);
UtilServer.getServer().getPluginManager().callEvent(evt);
if (evt.isCancelled())
{
continue;
}
//Damage Event
Factory.Condition().Factory().Ignite(GetName(), cur, player, (2 + (1 * level)) * range, false, false);

View File

@ -9,9 +9,11 @@ import org.bukkit.event.HandlerList;
public class BlockTossLandEvent extends BlockTossEvent
{
public BlockTossLandEvent(Block block)
public FallingBlock Entity;
public BlockTossLandEvent(Block block, FallingBlock fallingBlock)
{
super(block);
Entity = fallingBlock;
}
}

View File

@ -0,0 +1,52 @@
package mineplex.minecraft.game.classcombat.event;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class FireballHitEntityEvent extends Event
{
private static final HandlerList handlers = new HandlerList();
private Projectile _projectile;
private LivingEntity _hitEntity;
private boolean _cancelled;
public FireballHitEntityEvent(Projectile proj, LivingEntity entity)
{
_projectile = proj;
_hitEntity = entity;
}
public Projectile getProjectile()
{
return _projectile;
}
public LivingEntity getHitEntity()
{
return _hitEntity;
}
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

@ -6,15 +6,9 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.CustomTagFix;
import mineplex.core.FoodDupeFix;
import mineplex.core.PacketsInteractionFix;
import mineplex.core.account.CoreClient;
import mineplex.core.customdata.CustomDataManager;
import mineplex.core.giveaway.GiveawayManager;
import mineplex.core.globalpacket.GlobalPacketManager;
import net.minecraft.server.v1_8_R3.BiomeBase;
import net.minecraft.server.v1_8_R3.MinecraftServer;
import mineplex.core.CustomTagFix;
import mineplex.core.account.CoreClientManager;
import mineplex.core.achievement.AchievementManager;
import mineplex.core.antihack.AntiHack;
@ -22,15 +16,19 @@ import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.blood.Blood;
import mineplex.core.chat.Chat;
import mineplex.core.command.CommandCenter;
import mineplex.core.common.events.ServerShutdownEvent;
import mineplex.core.common.util.FileUtil;
import mineplex.core.common.util.UtilServer;
import mineplex.core.cosmetic.CosmeticManager;
import mineplex.core.creature.Creature;
import mineplex.core.customdata.CustomDataManager;
import mineplex.core.disguise.DisguiseManager;
import mineplex.core.donation.DonationManager;
import mineplex.core.friend.FriendManager;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.give.Give;
import mineplex.core.giveaway.GiveawayManager;
import mineplex.core.globalpacket.GlobalPacketManager;
import mineplex.core.hologram.HologramManager;
import mineplex.core.ignore.IgnoreManager;
import mineplex.core.inventory.InventoryManager;
@ -61,6 +59,8 @@ import mineplex.core.visibility.VisibilityManager;
import mineplex.minecraft.game.core.combat.CombatManager;
import mineplex.minecraft.game.core.damage.DamageManager;
import nautilus.game.arcade.game.GameServerConfig;
import net.minecraft.server.v1_8_R3.BiomeBase;
import net.minecraft.server.v1_8_R3.MinecraftServer;
public class Arcade extends JavaPlugin
{
@ -186,6 +186,8 @@ public class Arcade extends JavaPlugin
if (_gameManager.GetGame() != null)
if (_gameManager.GetGame().WorldData != null)
_gameManager.GetGame().WorldData.Uninitialize();
getServer().getPluginManager().callEvent(new ServerShutdownEvent(this));
}
public GameServerConfig ReadServerConfig()

View File

@ -465,7 +465,7 @@ public class Christmas extends SoloGame
{
SantaSay("Well done! You've saved Christmas!", ChristmasAudio.END_WIN2);
for (Player player : GetPlayers(false))
for (final Player player : GetPlayers(false))
{
if (Manager.IsRewardItems())
{

View File

@ -34,7 +34,6 @@ public class ClansOutpost
public void Build()
{
_build = new ArrayList<ClansOutpostBlock>();
for (int y=-1 ; y <= 6 ; y++)