@Subscribe public void onJoin(PlayerJoinEvent event) { final Player player = event.getUser(); SpongeUtil.removePlayer(player.getName()); final PlotPlayer pp = SpongeUtil.getPlayer(player); final String username = pp.getName(); final StringWrapper name = new StringWrapper(username); final UUID uuid = pp.getUUID(); UUIDHandler.add(name, uuid); ExpireManager.dates.put(uuid, System.currentTimeMillis()); // TODO worldedit bypass if (PS.get().update != null && pp.hasPermission("plots.admin")) { TaskManager.runTaskLater( new Runnable() { @Override public void run() { MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update"); } }, 20); } final Location loc = SpongeUtil.getLocation(player); final Plot plot = MainUtil.getPlot(loc); if (plot == null) { return; } if (Settings.TELEPORT_ON_LOGIN) { MainUtil.teleportPlayer(pp, pp.getLocation(), plot); MainUtil.sendMessage(pp, C.TELEPORTED_TO_ROAD); } PlotListener.plotEntry(pp, plot); }
@Subscribe public void onConnect(PlayerConnectionEvent event) { PlayerConnection connection = event.getConnection(); Player player = connection.getPlayer(); String name = player.getName(); PlotPlayer pp = SpongeUtil.getPlayer(player); if (name.equals("PlotSquared") || pp.getUUID().equals(DBFunc.everyone)) { player.kick(); SpongeUtil.removePlayer(pp.getName()); } }
@Subscribe public void onQuit(PlayerQuitEvent event) { Player player = event.getEntity(); PlotPlayer pp = SpongeUtil.getPlayer(player); ExpireManager.dates.put(pp.getUUID(), System.currentTimeMillis()); EventUtil.unregisterPlayer(pp); // TODO unregister WorldEdit manager // TODO delete plots on ban SpongeUtil.removePlayer(pp.getName()); }
public static boolean claimPlot( final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic) { final boolean result = EventUtil.manager.callClaim(player, plot, false); if (result) { MainUtil.createPlot(player.getUUID(), plot); MainUtil.setSign(player.getName(), plot); MainUtil.sendMessage(player, C.CLAIMED); if (teleport) { MainUtil.teleportPlayer(player, player.getLocation(), plot); } } return !result; }
public String getName(final UUID uuid) { if (uuid == null) { return null; } // check online final PlotPlayer player = getPlayer(uuid); if (player != null) { return player.getName(); } // check cache final StringWrapper name = uuidMap.inverse().get(uuid); if (name != null) { return name.value; } return null; }
public static boolean plotEntry(final PlotPlayer pp, final Plot plot) { if (plot.isDenied(pp.getUUID()) && !Permissions.hasPermission(pp, "plots.admin.entry.denied")) { return false; } Plot last = pp.getMeta("lastplot"); if ((last != null) && !last.getId().equals(plot.getId())) { plotExit(pp, last); } if (ExpireManager.IMP != null) { ExpireManager.IMP.handleEntry(pp, plot); } pp.setMeta("lastplot", plot); EventUtil.manager.callEntry(pp, plot); if (plot.hasOwner()) { HashMap<String, Flag> flags = FlagManager.getPlotFlags(plot); int size = flags.size(); boolean titles = Settings.TITLES; final String greeting; if (size != 0) { Flag titleFlag = flags.get("titles"); if (titleFlag != null) { titles = (Boolean) titleFlag.getValue(); } Flag greetingFlag = flags.get("greeting"); if (greetingFlag != null) { greeting = (String) greetingFlag.getValue(); MainUtil.format( C.PREFIX_GREETING.s() + greeting, plot, pp, false, new RunnableVal<String>() { @Override public void run(String value) { MainUtil.sendMessage(pp, value); } }); } else { greeting = ""; } Flag enter = flags.get("notify-enter"); if (enter != null && (Boolean) enter.getValue()) { if (!Permissions.hasPermission(pp, "plots.flag.notify-enter.bypass")) { for (UUID uuid : plot.getOwners()) { PlotPlayer owner = UUIDHandler.getPlayer(uuid); if (owner != null && !owner.getUUID().equals(pp.getUUID())) { MainUtil.sendMessage( owner, C.NOTIFY_ENTER .s() .replace("%player", pp.getName()) .replace("%plot", plot.getId().toString())); } } } } Flag gamemodeFlag = flags.get("gamemode"); if (gamemodeFlag != null) { if (pp.getGameMode() != gamemodeFlag.getValue()) { if (!Permissions.hasPermission(pp, "plots.gamemode.bypass")) { pp.setGameMode((PlotGameMode) gamemodeFlag.getValue()); } else { MainUtil.sendMessage( pp, StringMan.replaceAll( C.GAMEMODE_WAS_BYPASSED.s(), "{plot}", plot.getId(), "{gamemode}", gamemodeFlag.getValue())); } } } Flag flyFlag = flags.get("fly"); if (flyFlag != null) { pp.setFlight((boolean) flyFlag.getValue()); } Flag timeFlag = flags.get("time"); if (timeFlag != null) { try { long time = (long) timeFlag.getValue(); pp.setTime(time); } catch (Exception e) { FlagManager.removePlotFlag(plot, "time"); } } Flag weatherFlag = flags.get("weather"); if (weatherFlag != null) { pp.setWeather((PlotWeather) weatherFlag.getValue()); } Flag musicFlag = flags.get("music"); if (musicFlag != null) { Integer id = (Integer) musicFlag.getValue(); if ((id >= 2256 && id <= 2267) || (id == 0)) { Location loc = pp.getLocation(); Location lastLoc = pp.getMeta("music"); if (lastLoc != null) { pp.playMusic(lastLoc, 0); if (id == 0) { pp.deleteMeta("music"); } } if (id != 0) { try { pp.setMeta("music", loc); pp.playMusic(loc, id); } catch (Exception ignored) { } } } } else { Location lastLoc = pp.getMeta("music"); if (lastLoc != null) { pp.deleteMeta("music"); pp.playMusic(lastLoc, 0); } } CommentManager.sendTitle(pp, plot); } else if (titles) { greeting = ""; } else { return true; } if (titles) { if (!C.TITLE_ENTERED_PLOT.s().isEmpty() || !C.TITLE_ENTERED_PLOT_SUB.s().isEmpty()) { TaskManager.runTaskLaterAsync( new Runnable() { @Override public void run() { Plot lastPlot = pp.getMeta("lastplot"); if ((lastPlot != null) && plot.getId().equals(lastPlot.getId())) { Map<String, String> replacements = new HashMap<>(); replacements.put("%x%", lastPlot.getId().x + ""); replacements.put("%z%", lastPlot.getId().y + ""); replacements.put("%world%", plot.getArea().toString()); replacements.put("%greeting%", greeting); replacements.put("%alias", plot.toString()); replacements.put("%s", MainUtil.getName(plot.owner)); String main = StringMan.replaceFromMap(C.TITLE_ENTERED_PLOT.s(), replacements); String sub = StringMan.replaceFromMap(C.TITLE_ENTERED_PLOT_SUB.s(), replacements); AbstractTitle.sendTitle(pp, main, sub); } } }, 20); } } return true; } return true; }
public static boolean plotExit(final PlotPlayer pp, Plot plot) { pp.deleteMeta("lastplot"); EventUtil.manager.callLeave(pp, plot); if (plot.hasOwner()) { PlotArea pw = plot.getArea(); if (pw == null) { return true; } if (FlagManager.getPlotFlagRaw(plot, "gamemode") != null) { if (pp.getGameMode() != pw.GAMEMODE) { if (!Permissions.hasPermission(pp, "plots.gamemode.bypass")) { pp.setGameMode(pw.GAMEMODE); } else { MainUtil.sendMessage( pp, StringMan.replaceAll( C.GAMEMODE_WAS_BYPASSED.s(), "{plot}", plot.toString(), "{gamemode}", pw.GAMEMODE.name().toLowerCase())); } } } Flag farewell = FlagManager.getPlotFlagRaw(plot, "farewell"); if (farewell != null) { MainUtil.format( C.PREFIX_FAREWELL.s() + farewell.getValueString(), plot, pp, false, new RunnableVal<String>() { @Override public void run(String value) { MainUtil.sendMessage(pp, value); } }); } Flag leave = FlagManager.getPlotFlagRaw(plot, "notify-leave"); if ((leave != null) && (Boolean) leave.getValue()) { if (!Permissions.hasPermission(pp, "plots.flag.notify-enter.bypass")) { for (UUID uuid : plot.getOwners()) { PlotPlayer owner = UUIDHandler.getPlayer(uuid); if ((owner != null) && !owner.getUUID().equals(pp.getUUID())) { MainUtil.sendMessage( pp, C.NOTIFY_LEAVE .s() .replace("%player", pp.getName()) .replace("%plot", plot.getId().toString())); } } } } if (FlagManager.getPlotFlagRaw(plot, "fly") != null) { PlotGameMode gamemode = pp.getGameMode(); if (gamemode == PlotGameMode.SURVIVAL || (gamemode == PlotGameMode.ADVENTURE)) { pp.setFlight(false); } } if (FlagManager.getPlotFlagRaw(plot, "time") != null) { pp.setTime(Long.MAX_VALUE); } if (FlagManager.getPlotFlagRaw(plot, "weather") != null) { pp.setWeather(PlotWeather.RESET); } Location lastLoc = pp.getMeta("music"); if (lastLoc != null) { pp.deleteMeta("music"); pp.playMusic(lastLoc, 0); } } return true; }
@Override public boolean onCommand(final PlotPlayer plr, final String[] args) { final Location loc = plr.getLocationFull(); final Plot plot = MainUtil.getPlot(loc); if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); } if ((plot == null) || !plot.hasOwner()) { MainUtil.sendMessage(plr, C.PLOT_UNOWNED); return false; } final boolean admin = Permissions.hasPermission(plr, "plots.admin.command.merge"); if (!plot.isOwner(plr.getUUID()) && !admin) { MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); return false; } int direction = -1; if (args.length == 0) { switch (direction(plr.getLocationFull().getYaw())) { case "NORTH": direction = 0; break; case "EAST": direction = 1; break; case "SOUTH": direction = 2; break; case "WEST": direction = 3; break; } } else { for (int i = 0; i < values.length; i++) { if (args[0].equalsIgnoreCase(values[i]) || args[0].equalsIgnoreCase(aliases[i])) { direction = i; break; } } } if (direction == -1) { MainUtil.sendMessage( plr, C.SUBCOMMAND_SET_OPTIONS_HEADER.s() + StringMan.join(values, C.BLOCK_LIST_SEPARATER.s())); MainUtil.sendMessage(plr, C.DIRECTION.s().replaceAll("%dir%", direction(loc.getYaw()))); return false; } PlotId bot = MainUtil.getBottomPlot(plot).id; PlotId top = MainUtil.getTopPlot(plot).id; ArrayList<PlotId> selPlots; final String world = loc.getWorld(); switch (direction) { case 0: // north = -y selPlots = MainUtil.getMaxPlotSelectionIds( world, new PlotId(bot.x, bot.y - 1), new PlotId(top.x, top.y)); break; case 1: // east = +x selPlots = MainUtil.getMaxPlotSelectionIds( world, new PlotId(bot.x, bot.y), new PlotId(top.x + 1, top.y)); break; case 2: // south = +y selPlots = MainUtil.getMaxPlotSelectionIds( world, new PlotId(bot.x, bot.y), new PlotId(top.x, top.y + 1)); break; case 3: // west = -x selPlots = MainUtil.getMaxPlotSelectionIds( world, new PlotId(bot.x - 1, bot.y), new PlotId(top.x, top.y)); break; default: return false; } int size = selPlots.size(); if (Permissions.hasPermissionRange(plr, "plots.merge", Settings.MAX_PLOTS) < size) { MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.merge." + size); return false; } final PlotId botId = selPlots.get(0); final PlotId topId = selPlots.get(selPlots.size() - 1); final PlotId bot1 = MainUtil.getBottomPlot(MainUtil.getPlot(world, botId)).id; final PlotId bot2 = MainUtil.getBottomPlot(MainUtil.getPlot(world, topId)).id; final PlotId top1 = MainUtil.getTopPlot(MainUtil.getPlot(world, topId)).id; final PlotId top2 = MainUtil.getTopPlot(MainUtil.getPlot(world, botId)).id; bot = new PlotId(Math.min(bot1.x, bot2.x), Math.min(bot1.y, bot2.y)); top = new PlotId(Math.max(top1.x, top2.x), Math.max(top1.y, top2.y)); final ArrayList<PlotId> plots = MainUtil.getMaxPlotSelectionIds(world, bot, top); boolean multiMerge = false; final HashSet<UUID> multiUUID = new HashSet<UUID>(); HashSet<PlotId> multiPlots = new HashSet<>(); final UUID u1 = plot.owner; for (final PlotId myid : plots) { final Plot myplot = PS.get().getPlot(world, myid); if (myplot == null || myplot.owner == null) { MainUtil.sendMessage(plr, C.NO_PERM_MERGE.s().replaceAll("%plot%", myid.toString())); return false; } UUID u2 = myplot.owner; if (u2.equals(u1)) { continue; } PlotPlayer p2 = UUIDHandler.getPlayer(u2); if (p2 == null) { MainUtil.sendMessage(plr, C.NO_PERM_MERGE.s().replaceAll("%plot%", myid.toString())); return false; } multiMerge = true; multiPlots.add(myid); multiUUID.add(u2); } if (multiMerge) { if (!Permissions.hasPermission(plr, C.PERMISSION_MERGE_OTHER)) { MainUtil.sendMessage(plr, C.NO_PERMISSION, C.PERMISSION_MERGE_OTHER.s()); return false; } for (final UUID uuid : multiUUID) { PlotPlayer accepter = UUIDHandler.getPlayer(uuid); CmdConfirm.addPending( accepter, C.MERGE_REQUEST_CONFIRM.s().replaceAll("%s", plr.getName()), new Runnable() { @Override public void run() { PlotPlayer accepter = UUIDHandler.getPlayer(uuid); multiUUID.remove(uuid); if (multiUUID.size() == 0) { PlotPlayer pp = UUIDHandler.getPlayer(u1); if (pp == null) { sendMessage(accepter, C.MERGE_NOT_VALID); return; } final PlotWorld plotWorld = PS.get().getPlotWorld(world); if ((EconHandler.manager != null) && plotWorld.USE_ECONOMY) { double cost = plotWorld.MERGE_PRICE; cost = plots.size() * cost; if (cost > 0d) { if (EconHandler.manager.getMoney(plr) < cost) { sendMessage(plr, C.CANNOT_AFFORD_MERGE, cost + ""); return; } EconHandler.manager.withdrawMoney(plr, cost); sendMessage(plr, C.REMOVED_BALANCE, cost + ""); } } final boolean result = EventUtil.manager.callMerge(world, plot, plots); if (!result) { MainUtil.sendMessage(plr, "&cMerge has been cancelled"); return; } MainUtil.sendMessage(plr, C.SUCCESS_MERGE); MainUtil.mergePlots(world, plots, true, true); MainUtil.setSign(UUIDHandler.getName(plot.owner), plot); } MainUtil.sendMessage(accepter, C.MERGE_ACCEPTED); } }); } MainUtil.sendMessage(plr, C.MERGE_REQUESTED); return true; } final PlotWorld plotWorld = PS.get().getPlotWorld(world); if ((EconHandler.manager != null) && plotWorld.USE_ECONOMY) { double cost = plotWorld.MERGE_PRICE; cost = plots.size() * cost; if (cost > 0d) { if (EconHandler.manager.getMoney(plr) < cost) { sendMessage(plr, C.CANNOT_AFFORD_MERGE, cost + ""); return false; } EconHandler.manager.withdrawMoney(plr, cost); sendMessage(plr, C.REMOVED_BALANCE, cost + ""); } } final boolean result = EventUtil.manager.callMerge(world, plot, plots); if (!result) { MainUtil.sendMessage(plr, "&cMerge has been cancelled"); return false; } MainUtil.sendMessage(plr, C.SUCCESS_MERGE); MainUtil.mergePlots(world, plots, true, true); MainUtil.setSign(UUIDHandler.getName(plot.owner), plot); return true; }
/** * Format a string with plot information. * * @param info * @param plot * @param player * @param full * @param whenDone */ public static void format( String info, Plot plot, PlotPlayer player, boolean full, RunnableVal<String> whenDone) { int num = plot.getConnectedPlots().size(); String alias = !plot.getAlias().isEmpty() ? plot.getAlias() : C.NONE.s(); Location bot = plot.getCorners()[0]; String biome = WorldUtil.IMP.getBiome(plot.getArea().worldname, bot.getX(), bot.getZ()); String trusted = getPlayerList(plot.getTrusted()); String members = getPlayerList(plot.getMembers()); String denied = getPlayerList(plot.getDenied()); String seen; if (Settings.Enabled_Components.PLOT_EXPIRY) { if (plot.isOnline()) { seen = C.NOW.s(); } else { int time = (int) (ExpireManager.IMP.getAge(plot) / 1000); seen = time != 0 ? secToTime(time) : C.UNKNOWN.s(); } } else { seen = C.NEVER.s(); } Optional<String> descriptionFlag = plot.getFlag(Flags.DESCRIPTION); String description = descriptionFlag.isPresent() ? Flags.DESCRIPTION.valueToString(descriptionFlag.get()) : C.NONE.s(); StringBuilder flags = new StringBuilder(); HashMap<Flag<?>, Object> flagMap = FlagManager.getPlotFlags(plot.getArea(), plot.getSettings(), true); if (flagMap.isEmpty()) { flags.append(C.NONE.s()); } else { String prefix = ""; for (Map.Entry<Flag<?>, Object> entry : flagMap.entrySet()) { flags.append(prefix).append(C.PLOT_FLAG_LIST.f(entry.getKey().getName(), entry.getValue())); prefix = ", "; } } boolean build = plot.isAdded(player.getUUID()); String owner = plot.getOwners().isEmpty() ? "unowned" : getPlayerList(plot.getOwners()); info = info.replace("%id%", plot.getId().toString()); info = info.replace("%alias%", alias); info = info.replace("%num%", String.valueOf(num)); info = info.replace("%desc%", description); info = info.replace("%biome%", biome); info = info.replace("%owner%", owner); info = info.replace("%members%", members); info = info.replace("%player%", player.getName()); info = info.replace("%trusted%", trusted); info = info.replace("%helpers%", members); info = info.replace("%denied%", denied); info = info.replace("%seen%", seen); info = info.replace("%flags%", flags); info = info.replace("%build%", String.valueOf(build)); info = info.replace("%desc%", "No description set."); if (info.contains("%rating%")) { String newInfo = info; TaskManager.runTaskAsync( () -> { int max = 10; if (Settings.Ratings.CATEGORIES != null && !Settings.Ratings.CATEGORIES.isEmpty()) { max = 8; } String info1; if (full && Settings.Ratings.CATEGORIES != null && Settings.Ratings.CATEGORIES.size() > 1) { double[] ratings = getAverageRatings(plot); String rating = ""; String prefix = ""; for (int i = 0; i < ratings.length; i++) { rating += prefix + Settings.Ratings.CATEGORIES.get(i) + '=' + String.format("%.1f", ratings[i]); prefix = ","; } info1 = newInfo.replaceAll("%rating%", rating); } else { info1 = newInfo.replaceAll( "%rating%", String.format("%.1f", plot.getAverageRating()) + '/' + max); } whenDone.run(info1); }); return; } whenDone.run(info); }
@Override public void unregister(PlotPlayer player) { SpongeUtil.removePlayer(player.getName()); }
@Override public UUID getUUID(final PlotPlayer player) { return UUID.nameUUIDFromBytes( ("OfflinePlayer:" + player.getName().toLowerCase()).getBytes(Charsets.UTF_8)); }