diff options
Diffstat (limited to 'src/main')
31 files changed, 932 insertions, 417 deletions
diff --git a/src/main/java/com/redstoner/modules/afk/AFK.cmd b/src/main/java/com/redstoner/modules/afk/AFK.cmd index 6353e33..c9921e5 100644 --- a/src/main/java/com/redstoner/modules/afk/AFK.cmd +++ b/src/main/java/com/redstoner/modules/afk/AFK.cmd @@ -13,6 +13,14 @@ command afk { run afksilent -s; } + [optional:-s] [bool:ignoreMovement] { + run afkignore -s ignoreMovement; + } + + [optional:-s] [bool:ignoreMovement] [string:reason...] { + run afkfull -s ignoreMovement reason; + } + [optional:-s] [string:reason...] { run afkreason -s reason; } diff --git a/src/main/java/com/redstoner/modules/afk/AFK.java b/src/main/java/com/redstoner/modules/afk/AFK.java index ee96137..417f32e 100644 --- a/src/main/java/com/redstoner/modules/afk/AFK.java +++ b/src/main/java/com/redstoner/modules/afk/AFK.java @@ -15,7 +15,7 @@ import org.bukkit.event.HandlerList; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 1, revision = 0, compatible = 4) public class AFK implements Module { private AFKListener listener; @@ -63,11 +63,52 @@ public class AFK implements Module { return afk(sender, silent, ""); } + @Command(hook = "afkignore") + public boolean afk(CommandSender sender, boolean silent, boolean ignoreMovement) { + return afk(sender, silent, ignoreMovement, ""); + } + @Command(hook = "afkreason") public boolean afk(CommandSender sender, boolean silent, String reason) { - if (AFKUtil.isAfk(sender)) { + if (silent == false && reason.equals("help")) + return false; + + return afkmain(sender, silent, reason, false); + } + + @Command(hook = "afkfull") + public boolean afk(CommandSender sender, boolean silent, boolean ignoreMovement, String reason) { + boolean oldIgnoringMovement = AFKUtil.isIgnoringMovement(sender); + DataManager.setState(sender, "afk_ignoreMovement", ignoreMovement); + + if (AFKUtil.isAfk(sender) && oldIgnoringMovement != ignoreMovement) { + if (ignoreMovement) + getLogger().message(sender, "Your movements will now be ignored."); + else + getLogger().message(sender, "Your movements will no longer be ignored."); + return afkmain(sender, silent, reason, true); + } + else if (AFKUtil.isAfk(sender)) { + if (ignoreMovement) + getLogger().message(sender, "Your movements will still be ignored."); + else + getLogger().message(sender, "Your movements will still not be ignored."); + return afkmain(sender, silent, reason, true); + } + return afkmain(sender, silent, reason, false); + } + + public boolean afkmain(CommandSender sender, boolean silent, String reason, boolean keepAFK) { + boolean isAFK = AFKUtil.isAfk(sender); + + if ( isAFK && reason.equals("") && !keepAFK) AFKUtil.unAfk(sender, silent); - } else { + + else if (isAFK && !reason.equals("")) { + DataManager.setData(sender, "afk_reason", reason); + getLogger().message(sender, "Your reason has been updated."); + } + else if (!keepAFK) { DataManager.setData(sender, "afk_time", System.currentTimeMillis()); DataManager.setData(sender, "afk_reason", reason); DataManager.setState(sender, "afk_silent", silent); @@ -78,7 +119,7 @@ public class AFK implements Module { return true; } - + private boolean getListenSetting(String name, String def) { return DataManager.getConfigOrDefault(name, def).equals("listen"); } diff --git a/src/main/java/com/redstoner/modules/afk/AFKListener.java b/src/main/java/com/redstoner/modules/afk/AFKListener.java index fab0b5e..a4b4154 100644 --- a/src/main/java/com/redstoner/modules/afk/AFKListener.java +++ b/src/main/java/com/redstoner/modules/afk/AFKListener.java @@ -1,6 +1,8 @@ package com.redstoner.modules.afk; import com.redstoner.misc.Utils; + +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.*; @@ -33,12 +35,17 @@ public class AFKListener implements Listener { @EventHandler public void onMove(PlayerMoveEvent event) { + Player player = event.getPlayer(); + + if (!AFKUtil.isAfk(player) || AFKUtil.isVanished(player) || AFKUtil.isIgnoringMovement(player)) + return; + double distance = event.getFrom().distance(event.getTo()); boolean moved = distance > 0; boolean looked = (event.getFrom().getPitch() != event.getTo().getPitch()) || (event.getFrom().getYaw() != event.getTo().getYaw()); - if ((move && moved) || (look && looked)) AFKUtil.checkedUnAfk(event.getPlayer()); + if ((move && moved) || (look && looked)) AFKUtil.unAfk(event.getPlayer()); } @EventHandler diff --git a/src/main/java/com/redstoner/modules/afk/AFKUtil.java b/src/main/java/com/redstoner/modules/afk/AFKUtil.java index 3746632..22f4284 100644 --- a/src/main/java/com/redstoner/modules/afk/AFKUtil.java +++ b/src/main/java/com/redstoner/modules/afk/AFKUtil.java @@ -8,10 +8,15 @@ import org.bukkit.entity.Player; public class AFKUtil { protected static void unAfk(CommandSender sender, boolean silent) { DataManager.setState(sender, "afk", false); - + DataManager.setState(sender, "afk_ignoreMovement", false); + if (!silent) Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null); } + protected static void unAfk(CommandSender sender) { + unAfk(sender, isSilent(sender)); + } + protected static boolean isAfk(CommandSender sender) { return DataManager.getState(sender, "afk"); } @@ -23,7 +28,11 @@ public class AFKUtil { protected static boolean isSilent(CommandSender sender) { return DataManager.getState(sender, "afk_silent"); } - + + protected static boolean isIgnoringMovement(CommandSender sender) { + return DataManager.getState(sender, "afk_ignoreMovement"); + } + protected static void checkedUnAfk(Player player) { if (isAfk(player) && !isVanished(player)) unAfk(player, isSilent(player)); } diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd index 5e1206c..a0d8fb2 100644 --- a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd +++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd @@ -3,7 +3,7 @@ command bpm { alias toggle; alias mod; - perm blockplacemods.use; + perm utils.blockplacemods; type player; [empty] { diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java index 1306235..0f4cb34 100644 --- a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -8,7 +8,8 @@ import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.misc.CommandHolderType; import com.redstoner.misc.Main; import com.redstoner.modules.Module; -import com.redstoner.modules.blockplacemods.mods.ModBetterDirectional; +import com.redstoner.modules.blockplacemods.mods.ModLogDirectional; +import com.redstoner.modules.blockplacemods.mods.ModPlayerDirectional; import com.redstoner.modules.blockplacemods.mods.ModCauldron; import com.redstoner.modules.blockplacemods.mods.ModSlab; import com.redstoner.modules.datamanager.DataManager; @@ -27,7 +28,7 @@ import java.util.Map; @Commands (CommandHolderType.File) @AutoRegisterListener -@Version (major = 4, minor = 1, revision = 1, compatible = 4) +@Version (major = 5, minor = 2, revision = 1, compatible = 4) public class BlockPlaceMods implements Module, Listener { private static final Map<String, BlockPlaceMod> mods = new HashMap<>(); private static final List<BlockPlaceMod> enabledMods = new ArrayList<>(); @@ -35,8 +36,10 @@ public class BlockPlaceMods implements Module, Listener { private final BlockPlaceMod[] modsToRegister = { new ModCauldron(), new ModSlab(), - new ModBetterDirectional("Observer", Material.OBSERVER, "observers", false), - new ModBetterDirectional("Piston", Material.PISTON, "pistons", false), + new ModLogDirectional("Observer", Material.OBSERVER, "observers", false), + new ModLogDirectional("Piston", Material.PISTON, "pistons", false), + new ModPlayerDirectional("Repeater", Material.REPEATER, "repeaters", true, true, false), + new ModPlayerDirectional("Comparator", Material.COMPARATOR, "comparators", true, true, false), }; @Override @@ -51,6 +54,7 @@ public class BlockPlaceMods implements Module, Listener { if (mod.onEnable()) { enabledMods.add(mod); Bukkit.getPluginManager().registerEvents(mod, Main.plugin); + getLogger().info("Loaded mod, &e" + mod.name + "&7."); } else { getLogger().warn("Failed to enable the mod, &e" + mod.name + "&7!"); } diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModLogDirectional.java index 99a9f5d..fac5727 100644 --- a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java +++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModLogDirectional.java @@ -12,7 +12,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; -public class ModBetterDirectional extends BlockPlaceMod { +public class ModLogDirectional extends BlockPlaceMod { private static final BlockFace[][][] dirMap = { { { null, null, null }, @@ -33,14 +33,14 @@ public class ModBetterDirectional extends BlockPlaceMod { private final Material material; - public ModBetterDirectional(String name, Material material, String materialPlural, boolean enabledByDefault) { + public ModLogDirectional(String name, Material material, String materialPlural, boolean enabledByDefault) { super( name, "With this mod enabled " + materialPlural + " are placed with the bottom on the block clicked.", ModType.STATELESS, null, enabledByDefault, - "BetterDirectional" + material.name().toLowerCase() + "LogDirectional" + material.name().toLowerCase() ); this.material = material; diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModPlayerDirectional.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModPlayerDirectional.java new file mode 100644 index 0000000..97b5432 --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModPlayerDirectional.java @@ -0,0 +1,66 @@ +package com.redstoner.modules.blockplacemods.mods; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Directional; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +import com.redstoner.modules.blockplacemods.BlockPlaceMod; +import com.redstoner.modules.blockplacemods.ModType; + +public class ModPlayerDirectional extends BlockPlaceMod{ + + private final Material material; + private final boolean towards; + + public ModPlayerDirectional(String name, Material material, String materialPlural, boolean towards, boolean invertLogic, boolean enabledByDefault) { + super( + name, + "With this mod enabled " + materialPlural + " are placed facing " + (towards? "towards you." : "away from you."), + ModType.STATELESS, null, + enabledByDefault, + "PlayerDirectional" + material.name().toLowerCase() + ); + + this.material = material; + this.towards = invertLogic? !towards : towards; + } + + @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + Player player = event.getPlayer(); + Block block = event.getBlock(); + + if (block.getType() == material && !player.isSneaking() + && hasEnabled(player) && player.getGameMode() == GameMode.CREATIVE) { + + Directional data = (Directional) block.getBlockData(); + + data.setFacing(getNewDirection(player, towards)); + block.setBlockData(data); + } + } + + private BlockFace getNewDirection(Player player, boolean towards) { + double rotation = normalAngle(player.getLocation().getYaw()); + + if (rotation >= 315 || rotation < 45) // South + return towards? BlockFace.NORTH : BlockFace.SOUTH; + if (rotation >= 45 && rotation < 135) // West + return towards? BlockFace.EAST : BlockFace.WEST; + if (rotation >= 135 && rotation < 225) // North + return towards? BlockFace.SOUTH : BlockFace.NORTH; + else // East + return towards? BlockFace.WEST : BlockFace.EAST; + } + + private double normalAngle(double angle) { + return (angle %= 360) >= 0 ? angle : (angle + 360); + } + +} diff --git a/src/main/java/com/redstoner/modules/chat/Chat.cmd b/src/main/java/com/redstoner/modules/chat/Chat.cmd index 48d3983..112a6f2 100644 --- a/src/main/java/com/redstoner/modules/chat/Chat.cmd +++ b/src/main/java/com/redstoner/modules/chat/Chat.cmd @@ -81,10 +81,18 @@ command unmute { command chatonly { alias co; - perm utilschat.chatonly; + perm utils.chat.chatonly; [empty] { run chatonly; help Shows that you're only able to chat, nothing else.; type player; } } + +command resetchatformatting { + [empty] { + run reset_formatting; + help Resets the formatting to defaults.; + type console; + } +} diff --git a/src/main/java/com/redstoner/modules/chat/Chat.java b/src/main/java/com/redstoner/modules/chat/Chat.java index ebe2d07..7472ced 100644 --- a/src/main/java/com/redstoner/modules/chat/Chat.java +++ b/src/main/java/com/redstoner/modules/chat/Chat.java @@ -1,5 +1,6 @@ package com.redstoner.modules.chat; +import java.lang.reflect.Method; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -7,6 +8,7 @@ import java.util.Set; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.Sound; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; @@ -29,24 +31,23 @@ import com.redstoner.modules.datamanager.DataManager; import com.redstoner.modules.ignore.Ignore; import net.nemez.chatapi.ChatAPI; -import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 1, revision = 1, compatible = 4) public class Chat implements Module, Listener { private final Map<String, String> defaults = new HashMap<>(); private Set<UUID> chatonly = new HashSet<>(); public Chat() { - defaults.put("chat", " %n %c§7→§r %m"); + defaults.put("chat", " %n %c%w→§r %m"); defaults.put("me", " §7- %n %c§7⇦ %m"); defaults.put("action", " §7- %n %c§7⇦ %m"); - defaults.put("say", " §7[§9%n§7]%c§7:§r %m"); - defaults.put("shrug", " %n %c§7→§r %m ¯\\_(ツ)_/¯"); + defaults.put("say", " §7[§9%n§7]%c%w:§r %m"); + defaults.put("shrug", " %n %c%w→§r %m ¯\\_(ツ)_/¯"); defaults.put("print", "%m"); defaults.put("%c", "§c*"); - defaults.put("%c-hover", "§cChat Only"); + defaults.put("%w-default", "§7"); } @Override @@ -58,9 +59,15 @@ public class Chat implements Module, Listener { DataManager.setConfig("shrug", defaults.get("shrug")); DataManager.setConfig("print", defaults.get("print")); DataManager.setConfig("%c", defaults.get("%c")); - DataManager.setConfig("%c-hover", defaults.get("%c-hover")); + DataManager.setConfig("%w-default", defaults.get("§7")); } + @Command(hook = "reset_formatting") + public void resetFormatting(CommandSender sender) { + firstLoad(); + sender.sendMessage("Chat Formats have been reset to defaults."); + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); @@ -203,28 +210,51 @@ public class Chat implements Module, Listener { } String raw = (String) DataManager.getConfigOrDefault(format, defaults.get(format)); - String formatted = raw.replace("%n", name).replace("%m", message); + String formatted = raw.replace("%n", name); BroadcastFilter filter = wrap(ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null, event); - if (isChatOnly) { - - String part1 = formatted.substring(0, formatted.indexOf("%c")); - String part2 = formatted.substring(formatted.indexOf("%c") + 2); - String indicatior = (String) DataManager.getConfigOrDefault("%c", defaults.get("%c")); - String indicatiorHover = (String) DataManager.getConfigOrDefault("%c-hover", defaults.get("%c-hover")); + formatted = !isChatOnly? formatted.replaceAll("%c", "") : formatted.replace("%c", (String) DataManager.getConfigOrDefault("%c", defaults.get("%c"))); + + + if (sender instanceof Player) + formatted = formatted.replace("%w", (String) DataManager.getConfigOrDefault(((Player)sender).getWorld().getName() + ".%w", + (String) DataManager.getConfigOrDefault("%w-default", defaults.get("%w-default")))); + else + formatted = formatted.replace("%w", ""); + + if (ModuleLoader.exists("Mentio")) { + for (Player player : Bukkit.getOnlinePlayers()) + if (filter.sendTo(player)) { + ChatAPI.createMessage(player, sender).appendText(getMentioMessage(sender, player, formatted, message)).send(); + } + Bukkit.getConsoleSender().sendMessage(ChatAPI.colorify(sender, formatted.replace("%m", message))); - Message msg = ChatAPI.createMessage(null) - .appendText(part1) - .appendTextHover(indicatior, indicatiorHover) - .appendText(part2); - Utils.broadcast("", msg, filter); - return true; } - - Utils.broadcast("", ChatAPI.colorify(sender, formatted.replace("%c", "")), filter); - + else + Utils.broadcast("", ChatAPI.colorify(sender, formatted.replace("%m", message)), filter); + return true; } + + private String getMentioMessage(CommandSender sender, Player player, String format, String message) { + try { + Module mod = ModuleLoader.getModule("Mentio"); + Method m = mod.getClass().getDeclaredMethod("modifyMessageWithMentio", CommandSender.class, Player.class, String.class); + m.setAccessible(true); + + String msg = (String) m.invoke(mod, sender, player, message); + + if (msg != null) { + player.playSound(player.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); + return format.replace("%m", msg); + } + else + return format.replace("%m", message); + + } catch (Exception e) { + return format.replace("%m", message); + } + } public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event) { if (event == null) return filter; diff --git a/src/main/java/com/redstoner/modules/chatalias/Chatalias.java b/src/main/java/com/redstoner/modules/chatalias/Chatalias.java index df7e8e1..ce9ec07 100644 --- a/src/main/java/com/redstoner/modules/chatalias/Chatalias.java +++ b/src/main/java/com/redstoner/modules/chatalias/Chatalias.java @@ -88,10 +88,6 @@ public class Chatalias implements Module, Listener { keyword = keyword.replace("RND;", ""); String[] results = replacement.split(" \\|\\| "); - for (String str : results) { - System.out.println(str); - } - int rand = ThreadLocalRandom.current().nextInt(0, results.length); replacement = results[rand]; diff --git a/src/main/java/com/redstoner/modules/discord/Discord.java b/src/main/java/com/redstoner/modules/discord/Discord.java index d61aa6b..dc3818f 100644 --- a/src/main/java/com/redstoner/modules/discord/Discord.java +++ b/src/main/java/com/redstoner/modules/discord/Discord.java @@ -25,7 +25,7 @@ import com.redstoner.modules.Module; import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 2, compatible = 4) public class Discord implements Module { private MysqlTable table; @@ -87,28 +87,33 @@ public class Discord implements Module { String token = null; int tries = 0; - while (token == null) { - token = randomToken(8); - Object[] results = table.get("token", new MysqlConstraint("token", ConstraintOperator.EQUAL, token)); + Object[] existingToken = table.get("token", new MysqlConstraint("uuid", ConstraintOperator.EQUAL, pUUID)); + + if (existingToken.length > 0) + token = (String) existingToken[0]; + else { + while (token == null) { + token = randomToken(8); + Object[] results = table.get("token", new MysqlConstraint("token", ConstraintOperator.EQUAL, token)); + + if (results.length > 0) { + token = null; + tries++; + } + + if (tries > 10) break; + } - if (results.length > 0) { - token = null; - tries++; + if (token == null) { + new Message(sender, null).appendText( + "\n&4Could not find an unused token in 10 tries (a 1 in over 20 trillion chance)! Please take a screenshot and run the command again!") + .send(); + return; } - if (tries > 10) break; - } + table.insert(token, pUUID, "0"); - if (token == null) { - new Message(sender, null).appendText( - "\n&4Could not find an unused token in 10 tries (a 1 in over 20 trillion chance)! Please take a screenshot and run the command again!") - .send(); - return; } - - table.delete(new MysqlConstraint("uuid", ConstraintOperator.EQUAL, pUUID)); - table.insert(pUUID, token); - new Message(sender, null).appendText("\n&cRedstoner&7 has a &2Discord&7 Now! \nClick ") .appendLinkHover("&e" + inviteLink, inviteLink, "&aClick to Join").appendText("&7 to join. \n\nTo sync your rank, copy ") .appendSuggestHover("&e" + token, token, "&aClick to Copy").appendText("&7 into &3#rank-sync&7.\n").send(); diff --git a/src/main/java/com/redstoner/modules/friends/Friends.cmd b/src/main/java/com/redstoner/modules/friends/Friends.cmd index ea205c9..336a769 100644 --- a/src/main/java/com/redstoner/modules/friends/Friends.cmd +++ b/src/main/java/com/redstoner/modules/friends/Friends.cmd @@ -1,8 +1,11 @@ command friends { + alias friend; + perm utils.friends; + type player; + add [string:name] { run add name; - help Adds a friend to your friendlist.; - perm utils.friends; + help Adds a friend to your friend list.; } add [string:name] [string:group] { run add_grouped name group; @@ -11,8 +14,7 @@ command friends { } remove [string:name] { run del name; - help Removes a friend from your friendlist.; - perm utils.friends; + help Removes a friend from your friend list.; } remove [string:name] [string:group] { run del_grouped name group; @@ -22,7 +24,6 @@ command friends { list { run list; help Shows a list of all your friends.; - perm utils.friends; } list [string:group] { run list_group group; @@ -34,5 +35,14 @@ command friends { help Shows all your friend groups that have at least one person in them.; perm utils.friends.groups; } - type player; + group { + [string:groupName] { + run list_group groupName; + help Shows a list of all friends in that group.; + perm utils.friends.groups; + } + run list_groups; + help Shows all your friend groups that have at least one person in them.; + perm utils.friends.groups; + } }
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/friends/Friends.java b/src/main/java/com/redstoner/modules/friends/Friends.java index 9e06a3f..16ca023 100644 --- a/src/main/java/com/redstoner/modules/friends/Friends.java +++ b/src/main/java/com/redstoner/modules/friends/Friends.java @@ -11,6 +11,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.json.simple.JSONArray; @@ -27,41 +28,48 @@ import com.redstoner.modules.CoreModule; import com.redstoner.modules.Module; import com.redstoner.modules.datamanager.DataManager; +import net.nemez.chatapi.click.Message; + @AutoRegisterListener @Commands(CommandHolderType.File) -@Version(major = 5, minor = 0, revision = 0, compatible = 4) -public class Friends implements CoreModule { +@Version(major = 5, minor = 1, revision = 1, compatible = 4) +public class Friends implements CoreModule, Listener { + + private static int GROUP_PREFIX_LENGETH = 6; + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent e) { - JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray()); + Player player = e.getPlayer(); + JSONArray friended_by = (JSONArray) DataManager.getOrDefault(player, "friended_by", new JSONArray()); for (Object obj : friended_by) { UUID uuid = UUID.fromString((String) obj); Player p = Bukkit.getPlayer(uuid); - if (p != null && p.canSee(e.getPlayer())) { - getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just joined!"); + if (p != null && p.canSee(player)) { + getLogger().message(p, "Your friend &e" + player.getDisplayName() + "&7 just joined!"); p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); } } - JSONArray notifications = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "scheduled_notifications", new JSONArray()); - - for (Object obj : notifications) { - getLogger().message(e.getPlayer(), (String) obj); - } + JSONArray notifications = (JSONArray) DataManager.getOrDefault(player, "scheduled_notifications", new JSONArray()); + for (Object obj : notifications) + getLogger().message(player, (String) obj); + DataManager.setData(player, "scheduled_notifications", new JSONArray()); + DataManager.save(player); } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerLeave(PlayerQuitEvent e) { - JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray()); + Player player = e.getPlayer(); + JSONArray friended_by = (JSONArray) DataManager.getOrDefault(player, "friended_by", new JSONArray()); for (Object obj : friended_by) { UUID uuid = UUID.fromString((String) obj); Player p = Bukkit.getPlayer(uuid); - if (p != null && p.canSee(e.getPlayer())) { - getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just left!"); + if (p != null && p.canSee(player)) { + getLogger().message(p, "Your friend &e" + player.getDisplayName() + "&7 just left!"); p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); } } @@ -76,10 +84,10 @@ public class Friends implements CoreModule { } OfflinePlayer p = Bukkit.getPlayer(target); - - if (p == null) p = Bukkit.getOfflinePlayer(target); - if (p == null) { - getLogger().message(sender, true, "That player couldn't be found!"); + + if (p == null) p = Bukkit.getOfflinePlayer(target); + if (p == null || !p.hasPlayedBefore()) { + getLogger().message(sender, true, "That player has never joined the server!"); return true; } @@ -93,24 +101,25 @@ public class Friends implements CoreModule { friends.add(p.getUniqueId().toString()); DataManager.setData(sender, "friends", friends); DataManager.save(sender); - + JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", new JSONArray())); friended_by.add(getID(sender)); - DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by); + DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by); DataManager.save(p.getUniqueId().toString()); - + getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!"); - if (p instanceof Player) { + if (p instanceof Player) getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!"); - } else { + else { JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); notifications.add("&e" + Utils.getName(sender) + "&7 added you as a friend!"); notifications.remove("&e" + Utils.getName(sender) + "&7 removed you as a friend!"); DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); + DataManager.save(p.getUniqueId().toString()); } return true; @@ -127,33 +136,34 @@ public class Friends implements CoreModule { OfflinePlayer p = Bukkit.getPlayer(target); if (p == null) p = Bukkit.getOfflinePlayer(target); - if (p == null) { - getLogger().message(sender, true, "That player couldn't be found!"); + if (p == null || !p.hasPlayedBefore()) { + getLogger().message(sender, true, "That player has neevr joined the server!"); return true; } - JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray())); + JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "group." + group, new JSONArray())); if (friends.contains(p.getUniqueId().toString())) { - getLogger().message(sender, true, "This person already is part of that friendsgroup!"); + getLogger().message(sender, true, "This person already is part of that friendgroup!"); return true; } friends.add(p.getUniqueId().toString()); - DataManager.setData(sender, "groups." + group, friends); + DataManager.setData(sender, "group." + group, friends); DataManager.save(sender); getLogger().message(sender, "&e" + p.getName() + "&7 is now part of the group &e" + group + "&7!"); - if (p instanceof Player) { - getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); - } else { + if (p instanceof Player) + getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7added you to their friendgroup &e" + group + "&7!"); + else { JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); - notifications.add("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); - notifications.remove("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); + notifications.add("&e" + Utils.getName(sender) + " &7added you to their friendgroup &e" + group + "&7!"); + notifications.remove("&e" + Utils.getName(sender) + " &7removed you from their friendgroup &e" + group + "&7!"); DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); + DataManager.save(p.getUniqueId().toString()); } return true; @@ -163,14 +173,14 @@ public class Friends implements CoreModule { @Command(hook = "del") public boolean del(CommandSender sender, String target) { if (target.equalsIgnoreCase("CONSOLE")) { - getLogger().message(sender, true, "You can't add console to your friends!"); + getLogger().message(sender, true, "You can't have console as your friends!"); return true; } OfflinePlayer p = Bukkit.getPlayer(target); if (p == null) p = Bukkit.getOfflinePlayer(target); - if (p == null) { + if (p == null || !p.hasPlayedBefore()) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } @@ -185,24 +195,25 @@ public class Friends implements CoreModule { friends.remove(p.getUniqueId().toString()); DataManager.setData(sender, "friends", friends); DataManager.save(sender); - + JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", new JSONArray())); - DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by); friended_by.remove(getID(sender)); - + + DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by); DataManager.save(p.getUniqueId().toString()); getLogger().message(sender, "You are no longer friends with &e" + p.getName() + "&7!"); - if (p instanceof Player) { + if (p instanceof Player) getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 removed you as a friend!"); - } else { + else { JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); notifications.add("&e" + Utils.getName(sender) + "&7 removed you as a friend!"); notifications.remove("&e" + Utils.getName(sender) + "&7 added you as a friend!"); DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); + DataManager.save(p.getUniqueId().toString()); } return true; @@ -219,33 +230,34 @@ public class Friends implements CoreModule { OfflinePlayer p = Bukkit.getPlayer(target); if (p == null) p = Bukkit.getOfflinePlayer(target); - if (p == null) { + if (p == null || !p.hasPlayedBefore()) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } - JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray())); + JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "group." + group, new JSONArray())); if (!friends.contains(p.getUniqueId().toString())) { - getLogger().message(sender, true, "This person isn't a part of that friendsgroup!"); + getLogger().message(sender, true, "This person isn't a part of that friendgroup!"); return true; } friends.add(p.getUniqueId().toString()); - DataManager.setData(sender, "groups." + group, friends); + DataManager.setData(sender, "group." + group, friends); DataManager.save(sender); - + getLogger().message(sender, "&e" + p.getName() + "&7 is no longer a part of the group &e" + group + "&7!"); - if (p instanceof Player) { - getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); - } else { + if (p instanceof Player) + getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7removed you from their friendgroup &e" + group + "&7!"); + else { JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); - notifications.add("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); - notifications.remove("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); + notifications.add("&e" + Utils.getName(sender) + " &7removed you from their friendgroup &e" + group + "&7!"); + notifications.remove("&e" + Utils.getName(sender) + " &7added you to their friendgroup &e" + group + "&7!"); DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); + DataManager.save(p.getUniqueId().toString()); } return true; @@ -256,21 +268,27 @@ public class Friends implements CoreModule { JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()); if (friends.size() == 0) { - getLogger().message(sender, true, "You didn't add anyone to your friends list yet."); - } else { - StringBuilder sb = new StringBuilder(); - - for (Object o : friends.toArray()) { - UUID id = UUID.fromString((String) o); - Player p = Bukkit.getPlayer(id); - - if (p != null) sb.append(p.getDisplayName() + "&7, "); - else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, "); + getLogger().message(sender, true, "You haven't added anyone to your friends list yet."); + return true; + } + + Message msg = new Message(sender, null) + .appendText(getLogger().getHeader() + "&7You have a total of &e" + friends.size() + "&7 friends:\n"); + + for (int i = 0; i < friends.size(); i++) { + UUID id = UUID.fromString((String) friends.get(i)); + Player p = Bukkit.getPlayer(id); + if (p != null) + msg.appendSuggestHover("&a" + p.getName(), "/msg " + p.getName() + " ", "&aONLINE\n&9" + + p.getDisplayName() + "\n&7" + id.toString() + "\n\n&oClick to send a message."); + else { + String op = Bukkit.getOfflinePlayer(id).getName(); + msg.appendSuggestHover("&c" + op, "/mail send " + op + " ", "&cOFFLINE\n&7" + id.toString() + "\n\n&oClick to send a message."); } - - String out = sb.toString().replaceAll(", $", ""); - getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends:", out); + if (i != friends.size() - 1) + msg.appendText("&7, "); } + msg.send(); return true; } @@ -281,43 +299,88 @@ public class Friends implements CoreModule { if (friends.size() == 0) { getLogger().message(sender, true, "You didn't add anyone to this group yet."); - } else { - StringBuilder sb = new StringBuilder(); - - for (Object o : friends.toArray()) { - UUID id = UUID.fromString((String) o); - Player p = Bukkit.getPlayer(id); - - if (p != null) sb.append(p.getDisplayName() + "&7, "); - else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, "); + return true; + } + + Message msg = new Message(sender, null) + .appendText(getLogger().getHeader() + "&7You have a total of &e" + friends.size() + "&7 friends added to this group[&e" + group + "&7]:"); + + for (int i = 0; i < friends.size(); i++) { + UUID id = UUID.fromString((String) friends.get(i)); + Player p = Bukkit.getPlayer(id); + if (p != null) + msg.appendSuggestHover("&a" + p.getName(), "/msg " + p.getName() + " ", "&aONLINE\n&9" + + p.getDisplayName() + "\n&7" + id.toString() + "\n\n&oClick to send a message."); + else { + String op = Bukkit.getOfflinePlayer(id).getName(); + msg.appendSuggestHover("&c" + op, "/mail send " + op + " ", "&cOFFLINE\n&7" + id.toString() + "\n\n&oClick to send a message."); } - - String out = sb.toString().replaceAll(", $", ""); - getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends added to this group:", out); + if (i != friends.size() - 1) + msg.appendText("&7, "); } + msg.send(); - return true; + return true; } + private String getFriendsInGroup(CommandSender sender, String group) { + JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, group == null? "friends" : "group." + group, new JSONArray()); + + if (friends.size() == 0) + return "This group is Empty"; + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < friends.size(); i++) { + UUID id = UUID.fromString((String) friends.get(i)); + Player p = Bukkit.getPlayer(id); + if (p != null) + sb.append("&a" + p.getName()); + else + sb.append("&c" + Bukkit.getOfflinePlayer(id).getName()); + + if (i != friends.size() - 1) + sb.append("&7, "); + } + + return sb.toString(); + } + + private int getSizeOfGroup(CommandSender sender, String group) { + return ((JSONArray) DataManager.getOrDefault(sender, group == null? "friends" : "group." + group, new JSONArray())).size(); + } + @Command(hook = "list_groups") public boolean list_groups(CommandSender sender) { JSONObject raw = (JSONObject) DataManager.getOrDefault(sender, null, new JSONObject()); Set<?> keys = raw.keySet(); if (keys.size() == 0 || (keys.contains("friends") && keys.size() == 1)) { - getLogger().message(sender, true, "You don't have any custom groups made yet."); + getLogger().message(sender, true, "You don't haven't created any friendgroups yet."); return true; - } else { - StringBuilder sb = new StringBuilder(); - - for (Object o : keys) { - sb.append("&e" + ((String) o).substring(6) + "&7, "); - } - - String out = sb.toString().replaceAll(", $", ""); - getLogger().message(sender, "", out); } - + + Message msg = new Message(sender, null) + .appendText(getLogger().getHeader() + "&7You have a total of &e" + keys.size() + "&7 friendgroups:\n"); + + if (keys.contains("friends")) { + msg.appendSendChatHover("&6friends", "/friends list", + "&7Size: " + getSizeOfGroup(sender, null) + "\n\n" + getFriendsInGroup(sender, null)) + .appendText("&7, "); + keys.remove("friends"); + } + + Object[] keysArray= keys.toArray(); + for (int i = 0; i < keysArray.length; i++) { + String group = ((String) keysArray[i]).substring(GROUP_PREFIX_LENGETH); + msg.appendSendChatHover("&e" + group, "/friends list " + group, + "&7Size: " + getSizeOfGroup(sender, group) + "\n\n" + getFriendsInGroup(sender, group)); + + if (i != keysArray.length - 1) + msg.appendText("&7, "); + } + + msg.send(); return true; } diff --git a/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd index 0426952..da70816 100644 --- a/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd +++ b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd @@ -4,17 +4,17 @@ command lc { list { run list_cmd; - help re-lists already scanned chunks; + help Re-lists already scanned chunks.; } [int:amount] { run scan_cmd amount; - help scans for laggy chunks; + help Scans for laggy chunks.; } tp [int:number] { run tp number; - help teleports to the specified chunk; + help Teleports to the specified chunk.; type player; } } diff --git a/src/main/java/com/redstoner/modules/list/List.java b/src/main/java/com/redstoner/modules/list/List.java index 6fa0a64..78a35a9 100644 --- a/src/main/java/com/redstoner/modules/list/List.java +++ b/src/main/java/com/redstoner/modules/list/List.java @@ -86,7 +86,7 @@ public class List implements Module if (rank.contains("builder") || all) shownAnything |= show(sender, "&aBuilders", getPlayers(sender, "group.builder", "group.trusted"), all); if (rank.contains("trusted") || all) - shownAnything |= show(sender, "&3Trusteds", getPlayers(sender, "group.trusted", "group.trainingmod"), all); + shownAnything |= show(sender, "&3Trusted", getPlayers(sender, "group.trusted", "group.trainingmod"), all); if (rank.contains("trainingmod") || rank.contains("mit") || all) shownAnything |= show(sender, "&cTrainingmod &e•", getPlayers(sender, "group.trainingmod", "group.mod"), all); diff --git a/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java index d32e29c..e7eb9d4 100644 --- a/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java +++ b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java @@ -22,6 +22,7 @@ import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; +import com.redstoner.logging.PrivateLogManager; import com.redstoner.misc.CommandHolderType; import com.redstoner.misc.Main; import com.redstoner.misc.mysql.JSONManager; @@ -36,7 +37,7 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 1, revision = 0, compatible = 5) public class LoginSecurity implements Module, Listener { protected static Map<UUID, Location> loggingIn; @@ -67,6 +68,12 @@ public class LoginSecurity implements Module, Listener } loggingIn = new HashMap<>(); Bukkit.getServer().getPluginManager().registerEvents(new CancelledEventsHandler(this), Main.plugin); + + PrivateLogManager.register(this, "login", "$s issued LoginSecurity's login command"); + PrivateLogManager.register(this, "register", "$s issued LoginSecurity's register command"); + PrivateLogManager.register(this, "cgpass", "$s issued LoginSecurity's cgpass command"); + PrivateLogManager.register(this, "rmpass", "$s issued LoginSecurity's rmpass command"); + return true; } diff --git a/src/main/java/com/redstoner/modules/mail/Mail.java b/src/main/java/com/redstoner/modules/mail/Mail.java index ee26842..8f56792 100644 --- a/src/main/java/com/redstoner/modules/mail/Mail.java +++ b/src/main/java/com/redstoner/modules/mail/Mail.java @@ -24,20 +24,17 @@ import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; -import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.misc.CommandHolderType; import com.redstoner.misc.JsonManager; import com.redstoner.misc.Main; -import com.redstoner.misc.Utils; import com.redstoner.modules.Module; import com.redstoner.modules.datamanager.DataManager; -import com.redstoner.modules.ignore.Ignore; import net.nemez.chatapi.ChatAPI; @AutoRegisterListener @Commands(CommandHolderType.File) -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 4, compatible = 4) public class Mail implements Module, Listener { @@ -226,7 +223,7 @@ public class Mail implements Module, Listener if (!op.hasPlayedBefore()) getLogger().message(sender, true, "&e" + player + "&7 has never joined the server."); else - sendMessage(sender, op.getPlayer().getUniqueId().toString(), message, null); + sendMessage(sender, op.getUniqueId().toString(), message, null); } @Command(hook = "reply") @@ -247,13 +244,13 @@ public class Mail implements Module, Listener public void sendMessage(CommandSender sender, String r_uuid, String message, String chain) { - Player r = Bukkit.getOfflinePlayer(UUID.fromString(r_uuid)).getPlayer(); + OfflinePlayer r = Bukkit.getOfflinePlayer(UUID.fromString(r_uuid)); - if (ModuleLoader.exists("Ignore") ? !Ignore.getIgnoredBy(sender).sendTo(r) : false) - { - getLogger().message(sender, true, Utils.getName(r) + " has ignored you. Your message was not sent."); - return; - } + //if (ModuleLoader.exists("Ignore") ? !Ignore.getIgnoredBy(sender).sendTo(r) : false) + //{ + // getLogger().message(sender, true, Utils.getName(r) + " has ignored you. Your message was not sent."); + // return; + //} String s_uuid = ((Player)sender).getUniqueId().toString(); @@ -283,7 +280,7 @@ public class Mail implements Module, Listener if (r.isOnline()) { int num = playerToMsg.get(r_uuid).size(); - ChatAPI.createMessage(r) + ChatAPI.createMessage((Player)r) .appendText(getLogger().getPrefix() + "&7You got &e" + num + "&7 message" + (num == 1? "" : "s") + "! Do ") .appendSendChatHover("&e/mail", "/mail", "Click to read your messages") .appendText("&7 to read them.") @@ -400,7 +397,7 @@ public class Mail implements Module, Listener String uuid = ((Player)sender).getUniqueId().toString(); Map<Integer,Msg> list = archives.get(uuid); - if (id < 0 || id >= list.size()) { + if (id < 0 || list == null || !list.containsKey(id)) { getLogger().message(sender, true, "You have no archived messages with that ID."); return; } diff --git a/src/main/java/com/redstoner/modules/mail/Msg.java b/src/main/java/com/redstoner/modules/mail/Msg.java index 8bb666f..3db812c 100644 --- a/src/main/java/com/redstoner/modules/mail/Msg.java +++ b/src/main/java/com/redstoner/modules/mail/Msg.java @@ -3,8 +3,9 @@ package com.redstoner.modules.mail; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; +//import org.bukkit.entity.Player; import org.json.simple.JSONObject; import net.nemez.chatapi.ChatAPI; @@ -56,9 +57,9 @@ public class Msg { } public String getChain() { - Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString(sender)); - String line = getPrefix(p) + p.getName() + "&7:&f " + message; + String line = "&9" + p.getName() + "&7:&f " + message; if (chain == null) return line; @@ -67,17 +68,14 @@ public class Msg { } public void showMinimal(CommandSender viewer, Theme theme, boolean showDisplayName) { - Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); - String name = getPrefix(p) + p.getName(); + OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString(sender)); + String name = "&9" + p.getName(); Message msg = ChatAPI.createMessage(viewer) .appendText(theme.getBracketColor() + "[") .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) .appendText(theme.getBracketColor() + "] "); - if (showDisplayName) - msg.appendTextHover(p.getDisplayName(), name); - else - msg.appendText(name); + msg.appendText(name); msg.appendText(theme.getColonColor() + ": "); if (chain == null) msg.appendText(message).send(); @@ -86,8 +84,8 @@ public class Msg { } public void showSimple(CommandSender viewer, Theme theme, boolean showDisplayName) { - Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); - String name = getPrefix(p) + p.getName(); + OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString(sender)); + String name = "&9" + p.getName(); Message msg = ChatAPI.createMessage(viewer) .appendText(theme.getBracketColor() + "[") @@ -95,10 +93,7 @@ public class Msg { .appendText(theme.getBracketColor() + "][") .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) .appendText(theme.getBracketColor() + "] "); - if (showDisplayName) - msg.appendTextHover(p.getDisplayName(), name); - else - msg.appendText(name); + msg.appendText(name); msg.appendText(theme.getColonColor() + ": "); if (chain == null) msg.appendText(message).send(); @@ -107,8 +102,8 @@ public class Msg { } public void showNormal(CommandSender viewer, Theme theme, boolean showDisplayName) { - Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); - String name = getPrefix(p) + p.getName(); + OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString(sender)); + String name = "&9" + p.getName(); Message msg = ChatAPI.createMessage(viewer) .appendText(theme.getBracketColor() + "[") @@ -118,10 +113,7 @@ public class Msg { .appendText(theme.getBracketColor() + "][") .appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply") .appendText(theme.getBracketColor() + "] "); - if (showDisplayName) - msg.appendTextHover(p.getDisplayName(), name); - else - msg.appendText(name); + msg.appendText(name); msg.appendText(theme.getColonColor() + ": "); if (chain == null) msg.appendText(message).send(); @@ -130,8 +122,8 @@ public class Msg { } public void showFull(CommandSender viewer, Theme theme, boolean showDisplayName) { - Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); - String name = getPrefix(p) + p.getName(); + OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString(sender)); + String name = "&9" + p.getName(); Message msg = ChatAPI.createMessage(viewer) .appendText(theme.getBracketColor() + "[") @@ -143,10 +135,7 @@ public class Msg { .appendText(theme.getBracketColor() + "][") .appendSendChatHover(theme.getArchiveColor() + "Archive", "/mail archive " + id + " ", "&6Archive") .appendText(theme.getBracketColor() + "] "); - if (showDisplayName) - msg.appendTextHover(p.getDisplayName(), name); - else - msg.appendText(name); + msg.appendText(name); msg.appendText(theme.getColonColor() + ": "); if (chain == null) msg.appendText(message).send(); @@ -155,8 +144,8 @@ public class Msg { } public void showArchived(CommandSender viewer, Theme theme, boolean showDisplayName) { - Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); - String name = getPrefix(p) + p.getName(); + OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString(sender)); + String name = "&9" + p.getName(); Message msg = ChatAPI.createMessage(viewer) .appendText(theme.getBracketColor() + "[") @@ -164,28 +153,26 @@ public class Msg { .appendText(theme.getBracketColor() + "][") .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) .appendText(theme.getBracketColor() + "] "); - if (showDisplayName) - msg.appendTextHover(p.getDisplayName(), name); - else - msg.appendText(name); + msg.appendText(name); msg.appendText(theme.getColonColor() + ": "); if (chain == null) msg.appendText(message).send(); else msg.appendTextHover(message, chain).send(); } - - private String getPrefix(Player player) - { - String[] teams = new String[] {"admin", "mod", "trainingmod", "helper", "trusted", "builder", "member", "visitor"}; - String[] prefixes = new String[] {"&4", "&c", "&c", "&9", "&3", "&a", "&f", "&7"}; - - for (int i = 0; i < teams.length; i++) - if (player.hasPermission("group." + teams[i])) - return prefixes[i]; - return "&7"; - } + +// private String getPrefix(Player player) +// { +// String[] teams = new String[] {"admin", "mod", "trainingmod", "helper", "trusted", "builder", "member", "visitor"}; +// String[] prefixes = new String[] {"&4", "&c", "&c", "&9", "&3", "&a", "&f", "&7"}; +// +// for (int i = 0; i < teams.length; i++) +// if (player.hasPermission("group." + teams[i])) +// return prefixes[i]; +// return "&7"; +// +// } @SuppressWarnings("unchecked") public JSONObject toJSONObject() { diff --git a/src/main/java/com/redstoner/modules/mentio/Mentio.java b/src/main/java/com/redstoner/modules/mentio/Mentio.java index 0f2169e..bca0d3c 100644 --- a/src/main/java/com/redstoner/modules/mentio/Mentio.java +++ b/src/main/java/com/redstoner/modules/mentio/Mentio.java @@ -3,15 +3,10 @@ package com.redstoner.modules.mentio; import java.io.File; import java.util.ArrayList; import java.util.UUID; -import java.util.regex.Pattern; -import org.bukkit.Sound; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -19,26 +14,26 @@ import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; -import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.misc.CommandHolderType; import com.redstoner.misc.JsonManager; import com.redstoner.misc.Main; import com.redstoner.modules.Module; -import com.redstoner.modules.ignore.Ignore; -import net.nemez.chatapi.click.Message; +import net.nemez.chatapi.ChatAPI; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 1, revision = 0, compatible = 4) public class Mentio implements Module, Listener { private File mentioLocation = new File(Main.plugin.getDataFolder(), "mentio.json"); private JSONObject mentios; + public static Mentio instance; @Override public boolean onEnable() { + instance = this; loadMentios(); return true; } @@ -119,43 +114,37 @@ public class Mentio implements Module, Listener return mentios; } - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerChat(AsyncPlayerChatEvent event) + public String modifyMessageWithMentio(CommandSender permholder, Player player, String message) { - if (event.isCancelled()) - return; - for (Player player : event.getRecipients()) + UUID uuid = player.getUniqueId(); + JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString()); + playerMentios = defaultMentio(playerMentios, player); + + for (Object raw : playerMentios) { - if (ModuleLoader.exists("Ignore") ? !Ignore.getIgnoredBy(event.getPlayer()).sendTo(player) : false) - return; - UUID uuid = player.getUniqueId(); - JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString()); - playerMentios = defaultMentio(playerMentios, player); - for (Object raw : playerMentios) - { - String mentio = (String) raw; - if (event.getMessage().toLowerCase().contains(mentio.toLowerCase())) - { - event.getRecipients().remove(player); - String temp = event.getMessage().replaceAll("(?i)" + Pattern.quote(mentio) + ".*", ""); - String lastColorCodes = "§r"; - char lastChar = ' '; - for (char c : temp.toCharArray()) - { - if (lastChar == '§') - lastColorCodes += "§" + c; - lastChar = c; - } - Message m = new Message(player, event.getPlayer()); - m.appendText(event.getFormat().replace("%1$s", event.getPlayer().getDisplayName()).replace("%2$s", - event.getMessage().replaceFirst("(?i)(" + Pattern.quote(mentio) + ")([^ ]*)", - "§a§o$1$2" + lastColorCodes))); - m.send(); - player.playSound(player.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); - return; + String mentio = (String) raw; + + String messageLC = message.toLowerCase(); + String mentioLC = mentio.toLowerCase(); + if (messageLC.contains(mentioLC)) + { + char color = 'r'; + int index = messageLC.indexOf(mentioLC); + for (int i = index; i > 0; i--) { + char next = messageLC.charAt(i-1); + char cur = messageLC.charAt(i); + if((next == '§' || next == '&') && ("" + cur).matches("[a-f0-9r]")) { + color = cur; + break; + } } + return ChatAPI.colorify(permholder, message.substring(0, index) + + "§a§o" + message.substring(index, index + mentio.length()) + "§r" + (permholder.hasPermission(ChatAPI.PERMISSION_CHAT_COLOR)? "&" + color : "")) + + message.substring(index + mentio.length()); } } + return null; + } private void loadMentios() diff --git a/src/main/java/com/redstoner/modules/misc/Misc.java b/src/main/java/com/redstoner/modules/misc/Misc.java index c773e6b..6436191 100644 --- a/src/main/java/com/redstoner/modules/misc/Misc.java +++ b/src/main/java/com/redstoner/modules/misc/Misc.java @@ -13,6 +13,9 @@ import net.nemez.chatapi.click.Message; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; import org.bukkit.command.CommandSender; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -21,6 +24,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.potion.PotionEffect; @@ -30,7 +34,7 @@ import java.util.UUID; @Commands (CommandHolderType.File) @AutoRegisterListener -@Version (major = 5, minor = 0, revision = 0, compatible = 4) +@Version (major = 5, minor = 2, revision = 0, compatible = 4) public class Misc implements Module, Listener { private static final String[] SUDO_BLACKLIST = new String[] { "(.*:)?e?sudo", @@ -72,6 +76,13 @@ public class Misc implements Module, Listener { player.teleport(player.getWorld().getSpawnLocation()); } + + event.setJoinMessage(null); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + event.setQuitMessage(null); } // Disables spectator teleportation @@ -86,20 +97,60 @@ public class Misc implements Module, Listener { } } + private static final Material[] LIQUID_FLOW_EXCEPTIONS = { + Material.AIR, + Material.CAVE_AIR, + Material.VOID_AIR, + Material.WATER, + Material.LAVA + }; + + private static final Material[] PROTECTED_REDSTONE_BLOCKS = { + Material.REDSTONE_WIRE, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, + Material.COMPARATOR, Material.REPEATER, Material.RAIL, Material.ACTIVATOR_RAIL, + Material.DETECTOR_RAIL, Material.TRIPWIRE, Material.TRIPWIRE_HOOK, + Material.ACACIA_BUTTON,Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON, + Material.JUNGLE_BUTTON, Material.OAK_BUTTON, Material.SPRUCE_BUTTON, + Material.STONE_BUTTON, Material.LEVER, Material.ACACIA_PRESSURE_PLATE, + Material.BIRCH_PRESSURE_PLATE, Material.DARK_OAK_PRESSURE_PLATE, + Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Material.JUNGLE_PRESSURE_PLATE, + Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE, + Material.SPRUCE_PRESSURE_PLATE, Material.STONE_PRESSURE_PLATE + }; + // Disables water and lava breaking stuff @EventHandler public void onLiquidFlow(BlockFromToEvent event) { - Material m = event.getToBlock().getType(); - - switch (m) { - case AIR: - case WATER: - case LAVA: - return; - default: { - event.setCancelled(true); - } + Block toBlock = event.getToBlock(); + Material m = toBlock.getType(); + String world = toBlock.getWorld().getName(); + String protectionLevel = (String) DataManager.getConfigOrDefault(world, "rs-only"); + + for (Material exception : LIQUID_FLOW_EXCEPTIONS) + if (m == exception) return; + + if (protectionLevel.equals("rs-only")) { + for (Material rs : PROTECTED_REDSTONE_BLOCKS) + if (m == rs) { + event.setCancelled(true); + return; + } + return; + } + else if (!protectionLevel.equals("all")){ + DataManager.setConfig(world, "rs-only"); + getLogger().warn("Invalid config option for Water in the world, &e" + world + "&7. Setting to default."); + onLiquidFlow(event); + } + + + BlockData data = toBlock.getBlockData(); + + if (!(data instanceof Waterlogged)) { + event.setCancelled(true); } + + } @Command (hook = "tempadddef") @@ -334,4 +385,4 @@ public class Misc implements Module, Listener { return typeE; } -}
\ No newline at end of file +} diff --git a/src/main/java/com/redstoner/modules/naming/Naming.cmd b/src/main/java/com/redstoner/modules/naming/Naming.cmd index f21f15a..22f4b41 100644 --- a/src/main/java/com/redstoner/modules/naming/Naming.cmd +++ b/src/main/java/com/redstoner/modules/naming/Naming.cmd @@ -1,11 +1,3 @@ -command anvil { - perm utils.naming; - [empty] { - run anvil; - type player; - help Opens anvil GUI.; - } -} command name { perm utils.naming; [string:name...] { @@ -19,6 +11,6 @@ command lore { [optional:-a] [string:lore...] { run lore -a lore; type player; - help Adds lore to item in hand.; + help Adds lore to item in hand. Use &e-a&b to append to the lore.; } }
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/naming/Naming.java b/src/main/java/com/redstoner/modules/naming/Naming.java index f445336..1bfd0c6 100644 --- a/src/main/java/com/redstoner/modules/naming/Naming.java +++ b/src/main/java/com/redstoner/modules/naming/Naming.java @@ -1,13 +1,14 @@ package com.redstoner.modules.naming; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.regex.Pattern; -import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -20,22 +21,22 @@ import com.redstoner.modules.Module; import net.md_5.bungee.api.ChatColor; @Commands(CommandHolderType.File) -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 3, revision = 0, compatible = 4) public class Naming implements Module -{ - @Command(hook = "anvil") - public void anvil(CommandSender sender) - { - Player player = (Player) sender; - Inventory inv = Bukkit.getServer().createInventory(player, InventoryType.ANVIL); - player.openInventory(inv); - } +{ + private final Pattern COLOR_CHECK = Pattern.compile(".*&[\\da-fk-or].*"); + private final ItemStack[] COST = new ItemStack[] {new ItemStack(Material.IRON_INGOT, 1)}; @Command(hook = "name") public void name(CommandSender sender, String name) { + Player player = (Player) sender; + + if (player.getGameMode() == GameMode.SURVIVAL && !processSurvivalPlayer(player, name, "rename the item")) + return; + name = ChatColor.translateAlternateColorCodes('&', name); - ItemStack item = ((Player) sender).getInventory().getItemInMainHand(); + ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta meta = item.getItemMeta(); if (meta == null) { @@ -44,14 +45,19 @@ public class Naming implements Module } meta.setDisplayName(name); item.setItemMeta(meta); - getLogger().message(sender, "Name set to " + name); - ((Player) sender).updateInventory(); + getLogger().message(sender, "Name set to &f&o" + name + "&7."); + player.updateInventory(); } @Command(hook = "lore") public void lore(CommandSender sender, boolean append, String lore) { - ItemStack item = ((Player) sender).getInventory().getItemInMainHand(); + Player player = (Player) sender; + + if (player.getGameMode() == GameMode.SURVIVAL && !processSurvivalPlayer(player, lore, append? "append to the lore" : "add lore to the item")) + return; + + ItemStack item = player.getInventory().getItemInMainHand(); ItemMeta meta = item.getItemMeta(); if (meta == null) { @@ -69,7 +75,31 @@ public class Naming implements Module currentLore.add(lore); meta.setLore(currentLore); item.setItemMeta(meta); - getLogger().message(sender, "Lore set to " + lore); - ((Player) sender).updateInventory(); + if (append) + getLogger().message(sender, "Appended the following line to the lore: &5&o" + lore + "&7."); + else + getLogger().message(sender, "Lore set to &5&o" + lore + "&7."); + player.updateInventory(); + } + + private boolean processSurvivalPlayer(Player player, String str, String operation) { + + int levelsNeeded = COLOR_CHECK.matcher(str).matches()? 2 : 1; + int levels = player.getLevel(); + + if (levels < levelsNeeded) { + getLogger().message(player, true, "You don't have enough levels. " + (levelsNeeded == 1? + "You need &e1&7 level to " + operation + "." : + "You need &e2&7 levels to " + operation + " with color/formatting.")); + return false; + } + + HashMap<Integer, ItemStack> result = player.getInventory().removeItem(COST); + if (result.size() > 0) { + getLogger().message(player, true, "You don't have enough resources. You need &e1&7 iron ingot to " + operation + "."); + return false; + } + player.setLevel(levels - levelsNeeded); + return true; } } diff --git a/src/main/java/com/redstoner/modules/saylol/Saylol.cmd b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd index b81605a..f8512c1 100644 --- a/src/main/java/com/redstoner/modules/saylol/Saylol.cmd +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd @@ -41,6 +41,11 @@ command lol { run matchlol -i regex; perm utils.lol.match; } + page [int:num] { + help Shows you page <num>. Used in /lol search, /lol match, and /lol list.; + run page num; + perm utils.lol.page; + } [empty] { help Lols.; run saylol; diff --git a/src/main/java/com/redstoner/modules/saylol/Saylol.java b/src/main/java/com/redstoner/modules/saylol/Saylol.java index a523615..4f30342 100644 --- a/src/main/java/com/redstoner/modules/saylol/Saylol.java +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.java @@ -1,14 +1,22 @@ package com.redstoner.modules.saylol; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; import org.json.simple.JSONArray; import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; import com.redstoner.coremods.moduleLoader.ModuleLoader; @@ -24,14 +32,17 @@ import net.nemez.chatapi.ChatAPI; import net.nemez.chatapi.click.ClickCallback; import net.nemez.chatapi.click.Message; +@AutoRegisterListener @Commands(CommandHolderType.File) -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 1, revision = 0, compatible = 4) public class Saylol implements Module { private long lastLol = 0; private File lolLocation = new File(Main.plugin.getDataFolder(), "lol.json"); private JSONArray lols, handlers; private final String LOL_PREFIX = "§8[§blol§8] "; + private Map<CommandSender, List<Integer>> searchCache = new HashMap<>(); + private final int PAGE_SIZE = 10; @SuppressWarnings("unchecked") @Override @@ -84,6 +95,7 @@ public class Saylol implements Module } }); saveLols(); + searchCache.clear(); } return true; } @@ -104,6 +116,7 @@ public class Saylol implements Module getLogger().message(sender, "Successfully deleted the lol: " + lols.remove(id)); handlers.remove(id); saveLols(); + searchCache.clear(); return true; } @@ -124,6 +137,7 @@ public class Saylol implements Module getLogger().message(sender, "Successfully changed the lol: &e" + lols.get(id) + " &7to: &e" + text); lols.set(id, text); saveLols(); + searchCache.clear(); return true; } @@ -195,18 +209,20 @@ public class Saylol implements Module @Command(hook = "listlols") public boolean listLols(CommandSender sender, int page) { + searchCache.put(sender, Arrays.asList(-1)); + if (lols.size() == 0) { getLogger().message(sender, true, "There are no lols yet!"); return true; } page = page - 1; - int start = page * 10; - int end = start + 10; - int pages = (int) Math.ceil(lols.size() / 10d); + int start = page * PAGE_SIZE; + int end = start + PAGE_SIZE; + int pages = getMaxPage(lols.size()); if (start < 0) { - getLogger().message(sender, true, "Page number too small, must be at least 0!"); + getLogger().message(sender, true, "Page number too small, must be at least 1!"); return true; } if (start > lols.size()) @@ -216,7 +232,7 @@ public class Saylol implements Module } Message m = new Message(sender, null); m.appendText(getLogger().getHeader().replace("\n", "")); - m.appendText("&ePage " + (page + 1) + "/" + pages + ":"); + m.appendText(" &ePage " + (page + 1) + "/" + pages + ":"); for (int i = start; i < end && i < lols.size(); i++) m.appendCallback("\n&a" + i + "&8: &e" + lols.get(i), getCallback(i)); m.send(); @@ -231,52 +247,117 @@ public class Saylol implements Module @Command(hook = "searchlol") public boolean search(CommandSender sender, boolean sensitive, String text) - { - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader().replace("\n", "")); - boolean found = false; + { + searchCache.remove(sender); + + List<Integer> results = new ArrayList<>(); + if (!sensitive) text = text.toLowerCase(); for (int i = 0; i < lols.size(); i++) { String lol = (String) lols.get(i); if ((sensitive ? lol : lol.toLowerCase()).contains(text)) - { - m.appendCallback("\n&a" + i + "&8: &e" + lol, getCallback(i)); - found = true; - } + results.add(i); } - if (!found) + if (results.isEmpty()) { getLogger().message(sender, "&cCouldn't find any matching lols."); - else - m.send(); + return true; + } + + searchCache.put(sender, results); + + Message m = new Message(sender, null); + m.appendText(getLogger().getHeader().replace("\n", "")); + + int size = results.size(); + if (size > PAGE_SIZE) + m.appendText(" &ePage 1/" + getMaxPage(size) + ":"); + + for (int i = 0; i < size && i < PAGE_SIZE; i++) + m.appendCallback("\n&a" + i + "&8: &e" + lols.get(results.get(i)), getCallback(i)); + + m.appendText("\n&7Use /lol page <number> to look at other pages."); + m.send(); return true; } @Command(hook = "matchlol") public boolean match(CommandSender sender, boolean sensitive, String regex) { - Message m = new Message(sender, null); - m.appendText(getLogger().getHeader().replace("\n", "")); - boolean found = false; + + searchCache.remove(sender); + + List<Integer> results = new ArrayList<>(); + if (!sensitive) regex = regex.toLowerCase(); for (int i = 0; i < lols.size(); i++) { String lol = (String) lols.get(i); if ((sensitive ? lol : lol.toLowerCase()).matches(regex)) - { - m.appendCallback("\n&a" + i + "&8: &e" + lol, getCallback(i)); - found = true; - } + results.add(i); } - if (!found) + if (results.isEmpty()) { getLogger().message(sender, "&cCouldn't find any matching lols."); - else + return true; + } + + searchCache.put(sender, results); + + Message m = new Message(sender, null); + m.appendText(getLogger().getHeader().replace("\n", "")); + + int size = results.size(); + if (size > PAGE_SIZE) + m.appendText(" &ePage 1/" + getMaxPage(size) + ":"); + + for (int i = 0; i < size && i < PAGE_SIZE; i++) + m.appendCallback("\n&a" + i + "&8: &e" + lols.get(i), getCallback(i)); + + m.appendText("\n&7Use /lol page <number> to look at other pages."); + m.send(); + + return true; + } + + @Command(hook = "page") + public boolean page(CommandSender sender, int page) { + List<Integer> results = searchCache.get(sender); + + if (results == null || results.size() == 0) { + getLogger().message(sender, true, "There's nothing to page through. Either you haven't" + + " done a relivent command, or the lols have changed since you have."); + return true; + } + + int pages = getMaxPage(results.size()); + + if (results.get(0) == -1) + listLols(sender, page); + else if (page < 1 || page > pages) + getLogger().message(sender, true, "Page number not on range. Must be between &e1&7 and &e" + pages + "&7."); + else { + Message m = new Message(sender, null); + m.appendText(getLogger().getHeader().replace("\n", " &ePage " + page + "/" + pages + ":")); + + for (int i = page*PAGE_SIZE-PAGE_SIZE; i < page*PAGE_SIZE; i++) + m.appendCallback("\n&a" + i + "&8: &e" + lols.get(i), getCallback(i)); + m.send(); + } return true; } + @EventHandler + public void onLeave(PlayerQuitEvent e) { + searchCache.remove(e.getPlayer()); + } + + public int getMaxPage(int size) { + return (int) Math.ceil(size / (double) PAGE_SIZE); + } + public void saveLols() { JsonManager.save(lols, lolLocation); @@ -295,6 +376,6 @@ public class Saylol implements Module public void clickAction(Player player, int index) { if (player.hasPermission("utils.lol.id")) - Bukkit.dispatchCommand(player, "lol id " + index); + Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(player, "lol id " + index)); } } diff --git a/src/main/java/com/redstoner/modules/seen/Seen.cmd b/src/main/java/com/redstoner/modules/seen/Seen.cmd index 213aa34..7a22e20 100644 --- a/src/main/java/com/redstoner/modules/seen/Seen.cmd +++ b/src/main/java/com/redstoner/modules/seen/Seen.cmd @@ -23,7 +23,7 @@ command firstseen { } } command playtime { - perm utils.playtime; + perm utils.seen.playtime; [empty] { type player; run playtimeDef; diff --git a/src/main/java/com/redstoner/modules/survival/Survival.cmd b/src/main/java/com/redstoner/modules/survival/Survival.cmd new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/main/java/com/redstoner/modules/survival/Survival.cmd diff --git a/src/main/java/com/redstoner/modules/survival/Survival.java b/src/main/java/com/redstoner/modules/survival/Survival.java new file mode 100644 index 0000000..87a0f36 --- /dev/null +++ b/src/main/java/com/redstoner/modules/survival/Survival.java @@ -0,0 +1,113 @@ +package com.redstoner.modules.survival; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerGameModeChangeEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Main; +import com.redstoner.modules.Module; +import com.redstoner.modules.datamanager.DataManager; + +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import net.nemez.chatapi.ChatAPI; + +@Commands(CommandHolderType.File) +@AutoRegisterListener +@Version(major = 5, minor = 0, revision = 7, compatible = 4) +public class Survival implements Module, Listener { + + @EventHandler + public void onPlayerTeleport(PlayerTeleportEvent e) { + if (e.getPlayer().getGameMode() != GameMode.SURVIVAL) + return; + World w1 = e.getFrom().getWorld(); + World w2 = e.getTo().getWorld(); + + checkSleep(w1); + if (!w1.getName().equals(w2.getName())) + checkSleep(w2); + } + + @EventHandler + public void onLeave(PlayerQuitEvent e) { + if (e.getPlayer().getGameMode() == GameMode.SURVIVAL) + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> checkSleep(e.getPlayer().getWorld()), 2); + } + + @EventHandler + public void onGamemodeChange(PlayerGameModeChangeEvent e) { + if (e.getNewGameMode() == GameMode.SURVIVAL || e.getPlayer().getGameMode() == GameMode.SURVIVAL) + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> checkSleep(e.getPlayer().getWorld()), 2); + } + + boolean suspendEvents = false; + + private int lastPer = 0; + + public void checkSleep(World world) { + if (suspendEvents || !canSleep(world.getTime(), world.isThundering()) || world.getPlayers().size() == 0) + return; + + if (!((String)DataManager.getConfigOrDefault(world.getName() + ".enabled", "false")).equals("true")) + return; + + int sleepingPlayers = 0; + int totalPlayers = 0; + + for (Player p : world.getPlayers()) + if (p.isSleeping() && p.getGameMode() == GameMode.SURVIVAL) + sleepingPlayers++; + + for (Player p : world.getPlayers()) + if (p.getGameMode() == GameMode.SURVIVAL) + totalPlayers++; + + if (totalPlayers == 0) + return; + + int perSleeping = 100 * sleepingPlayers / totalPlayers; + int perNeeded =Integer.parseInt((String) DataManager.getConfigOrDefault(world.getName() + ".perNeededToSleep", "51")); + + if (perSleeping == lastPer) + return; + if (perSleeping >= perNeeded) { + notifyPlayers(world.getPlayers(), "&e" + perSleeping + "%&f were sleeping. The &6sun&f is rising!"); + world.setTime(23450); + world.setStorm(false); + world.setThundering(false); + suspendEvents = true; + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> resumeEvents(), 20); + } + else + notifyPlayers(world.getPlayers(), "&e" + perSleeping + "%&f are sleeping. &e" + perNeeded + "%&f needed"); + lastPer = perSleeping; + } + + public boolean resumeEvents() { + suspendEvents = false; + lastPer = 0; + return true; + } + + public boolean canSleep(long time, boolean thundering) { + return !(time < 12300 || time > 23850) || thundering; + } + + public void notifyPlayers(List<Player> players, String msg) { + for (Player p : players) + ChatAPI.sendActionBar(p, "&0[&2Sleep&0] " + msg); + } +} diff --git a/src/main/java/com/redstoner/modules/survival/module.info b/src/main/java/com/redstoner/modules/survival/module.info new file mode 100644 index 0000000..c8a5a00 --- /dev/null +++ b/src/main/java/com/redstoner/modules/survival/module.info @@ -0,0 +1,3 @@ +displayName: Survival +category: Other +description: A module to contain features related to the survival worlds
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/teleport/Teleport.cmd b/src/main/java/com/redstoner/modules/teleport/Teleport.cmd index ca78ab5..b6323d7 100644 --- a/src/main/java/com/redstoner/modules/teleport/Teleport.cmd +++ b/src/main/java/com/redstoner/modules/teleport/Teleport.cmd @@ -84,7 +84,7 @@ command tpall { command tpaccept { alias tpyes; - perm utils.teleport.request; + perm utils.teleport.tpa; type player; [empty] { @@ -99,7 +99,7 @@ command tpaccept { command tpcancel { alias tpastop; - perm utils.teleport.request; + perm utils.teleport.tpa; type player; [empty] { @@ -114,7 +114,7 @@ command tpcancel { command tpdeny { alias tpno; - perm utils.teleport.request; + perm utils.teleport.tpa; type player; [empty] { @@ -131,7 +131,7 @@ command tplist { alias etplist; alias tpl; alias etpl; - perm utils.teleport.request; + perm utils.teleport.tpa; type player; [empty] { diff --git a/src/main/java/com/redstoner/modules/teleport/Teleport.java b/src/main/java/com/redstoner/modules/teleport/Teleport.java index b43d820..5313427 100644 --- a/src/main/java/com/redstoner/modules/teleport/Teleport.java +++ b/src/main/java/com/redstoner/modules/teleport/Teleport.java @@ -1,6 +1,7 @@ package com.redstoner.modules.teleport; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Stack; @@ -25,32 +26,30 @@ import net.nemez.chatapi.ChatAPI; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 5, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 3, compatible = 4) public class Teleport implements Module, Listener { public static final String PERMISSION_TELEPORT = "utils.teleport.tp"; - public static final String PERMISSION_TELEPORT_OTHER = "utils.teleport.tp.other"; - + public static final String PERMISSION_TELEPORT_OTHER = "utils.teleport.tp.other"; + private Map<Player, Map<Player, TPAType>> pending_requests = new HashMap<>(); private Map<Player, Stack<Player>> last_request = new HashMap<>(); private Map<Player, Stack<Player>> last_request_got = new HashMap<>(); - + @Command(hook = "tploc") public void tploc(CommandSender sender, int x, int y, int z) { Player p = (Player) sender; - + p.teleport(new Location(p.getWorld(), x, y, z), TeleportCause.COMMAND); getLogger().message(sender, "Teleported to &e(" + x + "," + y + "," + z + ")&7."); } - + @Command(hook = "tploc2") public void tploc2(CommandSender sender, String player, int x, int y, int z) { Player p = Bukkit.getPlayer(player); - + if (p == null) playerDoesNotExistError(sender, player); - else if (sender.getName().equals(p.getName())) - cannotTpToYourself(sender); else { p.teleport(new Location(p.getWorld(), x, y, z), TeleportCause.COMMAND); getLogger().message(sender, "Teleported &e" + p.getDisplayName() + @@ -60,14 +59,14 @@ public class Teleport implements Module, Listener : sender.getName()) + "&7."); } } - + @Command(hook = "tp") public void teleport(CommandSender sender, String player) { if (!sender.hasPermission(PERMISSION_TELEPORT)) { tpa(sender, player); return; } - + Player p = Bukkit.getPlayer(player); if (p == null) playerDoesNotExistError(sender, player); @@ -78,24 +77,30 @@ public class Teleport implements Module, Listener getLogger().message(sender, "Teleported to &e" + p.getDisplayName() + "&7."); } } - + @Command(hook = "tp2") public void teleport(CommandSender sender, String player, String player2) { - if (!sender.hasPermission(PERMISSION_TELEPORT) - && sender.getName().equalsIgnoreCase(player2)) { - tpahere(sender, player); + if (!sender.hasPermission(PERMISSION_TELEPORT)) { + if (sender.getName().equalsIgnoreCase(player)) { + tpa(sender, player); + } else if (sender.getName().equalsIgnoreCase(player2)) { + tpahere(sender, player); + } else { + getLogger().message(sender, true, "You do not have the permission to teleport other players."); + } + return; } - + Player p1 = Bukkit.getPlayer(player); - Player p2 = Bukkit.getPlayer(player); - + Player p2 = Bukkit.getPlayer(player2); + if (p1 == null) playerDoesNotExistError(sender, player); else if (p2 == null) playerDoesNotExistError(sender, player2); else if (p1.getName().equals(p2.getName())) - cannotTpToYourself(sender); + getLogger().message(sender, true, "You can't teleport a player to themselves."); else { p1.teleport(p2, TeleportCause.COMMAND); getLogger().message(sender, "&e" +p1.getDisplayName() + "&7 has been teleported to &e" + @@ -105,7 +110,7 @@ public class Teleport implements Module, Listener ((Player)sender).getDisplayName(): sender.getName())); } } - + @Command(hook = "tphere") public void tphere(CommandSender sender, String player) { Player p = Bukkit.getPlayer(player); @@ -119,40 +124,40 @@ public class Teleport implements Module, Listener getLogger().message(p, "&e" + ((Player)sender).getDisplayName() + "&7 has teleported you to them."); } } - + @Command(hook = "tpa") public void tpa(CommandSender sender, String player) { Player p = Bukkit.getPlayer(player); if (p == null) - playerDoesNotExistError(sender, player); - + playerDoesNotExistError(sender, player); + else if (sender.getName().equals(p.getName())) cannotTpToYourself(sender); - + else if ( (Boolean) DataManager.getOrDefault(p, "allow-tpa", true) == false ) getLogger().message(sender, true, "&e" + p.getDisplayName() + "&7 doesn't accept TPA requests."); - + else { Player s = (Player) sender; insertIntoMaps(s, p, TPAType.TPA); getLogger().message(sender, "TPA request sent to &e" + p.getDisplayName() + "&7."); notifyAskie(p, s, TPAType.TPA); } - + } - + @Command(hook = "tpahere") public void tpahere(CommandSender sender, String player) { Player p = Bukkit.getPlayer(player); if (p == null) - playerDoesNotExistError(sender, player); - + playerDoesNotExistError(sender, player); + else if (sender.getName().equals(p.getName())) cannotTpToYourself(sender); - + else if ( (Boolean) DataManager.getOrDefault(p, "allow-tpahere", true) == false ) getLogger().message(sender, true, "&e" + p.getDisplayName() + "&7 doesn't accept TPA Here requests."); - + else { Player s = (Player) sender; insertIntoMaps(s, p, TPAType.TPAHERE); @@ -160,7 +165,7 @@ public class Teleport implements Module, Listener notifyAskie(p, s, TPAType.TPAHERE); } } - + @Command(hook = "tpall") public void tpall(CommandSender sender) { Player to = (Player) sender; @@ -172,7 +177,7 @@ public class Teleport implements Module, Listener } getLogger().message(sender, "Everyone has sucessfully teleported to you."); } - + @Command(hook = "tpall2") public void tpall2(CommandSender sender, String player) { Player to = Bukkit.getPlayer(player); @@ -180,7 +185,7 @@ public class Teleport implements Module, Listener playerDoesNotExistError(sender, player); return; } - + String s = (sender instanceof Player? ((Player)sender).getDisplayName() :sender.getName()); for (Player p : Bukkit.getOnlinePlayers()) { p.teleport(to, TeleportCause.COMMAND); @@ -188,35 +193,35 @@ public class Teleport implements Module, Listener } getLogger().message(sender, "Everyone was sucessfully teleported to &e" + to.getDisplayName() + "&7."); } - + @Command(hook = "tpaccept") public void tpaccept(CommandSender sender) { Player to = (Player) sender; Player from = getLastRequestGot(to); - + if (from == null) getLogger().message(sender, true, "You have no incoming TPA requests."); else - teleport(to, from, pending_requests.get(to).get(from)); + teleport(to, from, pending_requests.get(to).get(from)); } - + @Command(hook = "tpaccept2") public void tpaccept2(CommandSender sender, String player) { Player to = (Player) sender; Player from = Bukkit.getPlayer(player); - + if (from == null) { playerDoesNotExistError(sender, player); return; } - + if (from.getName().equals(sender.getName())) { cannotTpToYourself(sender); return; } - + Map<Player, TPAType> m = pending_requests.get(to); - + if (m == null) getLogger().message(sender, true, "You have no incoming TPA requests."); else if (!m.containsKey(from)) @@ -224,117 +229,117 @@ public class Teleport implements Module, Listener else teleport(to, from, m.get(from)); } - - + + private void teleport(Player to, Player from, TPAType type) { switch (pending_requests.get(to).get(from)) { case TPA: from.teleport(to, TeleportCause.COMMAND); break; case TPAHERE: to.teleport(from, TeleportCause.COMMAND); break; } clearRequest(to, from); - + getLogger().message(from, "&e" + to.getDisplayName() + "&7 has &aaccepted&7 your TPA request."); getLogger().message(to, "You've &aaccepted&7 &e" + from.getDisplayName() + "&7's TPA request."); } - + @Command(hook = "tpdeny") public void tpdeny(CommandSender sender) { Player to = (Player) sender; Player from = getLastRequestGot(to); - + if (from == null) { getLogger().message(sender, true, "You have no incoming TPA requests."); return; } - + clearRequest(to, from); - + getLogger().message(from, "&e" + to.getDisplayName() + "&7 has &cdenied&7 your TPA request."); getLogger().message(to, "You've &cdenied&7 &e" + from.getDisplayName() + "&7's TPA request."); } - + @Command(hook = "tpdeny2") public void tpdeny2(CommandSender sender, String player) { Player to = (Player) sender; Player from = Bukkit.getPlayer(player); - + if (from == null) { playerDoesNotExistError(sender, player); return; } - + if (from.getName().equals(sender.getName())) { cannotTpToYourself(sender); return; } - + Map<Player, TPAType> m = pending_requests.get(to); - + if (m == null) getLogger().message(sender, true, "You have no incoming TPA requests."); - + else if (!m.containsKey(from)) getLogger().message(sender, true, "&e" + from.getDisplayName() + "&7 doesn't have an active TPA request with you."); - + else { clearRequest(to, from); getLogger().message(from, "&e" + to.getDisplayName() + "&7 has &cdenied&7 your TPA request."); getLogger().message(to, "You've &cdenied&7 &e" + from.getDisplayName() + "&7's TPA request."); } } - + @Command(hook = "tpacancel") public void tpacancel(CommandSender sender) { Player from = (Player) sender; Player to = getLastRequest(from); - + if (to == null) getLogger().message(sender, true, "You don't have outgoing TPA requests."); else cancel(to, from); } - + @Command(hook = "tpacancel2") public void tpacancel2(CommandSender sender, String player) { Player from = (Player) sender; Player to = Bukkit.getPlayer(player); - + if (to == null) playerDoesNotExistError(sender, player); else cancel(to, from); } - + private void cancel(Player to, Player from) { Stack<Player> s = last_request.get(from); - + if (s == null) getLogger().message(from, true, "You have no outgoing TPA requests."); - + else if (!s.contains(to)) getLogger().message(from, true, "You didn't send a TPA request to &e" + to.getDisplayName() + "&7."); - + else { clearRequest(to, from); getLogger().message(to, "&e" + from.getDisplayName() + "&7 has &ccanceled&7 their request."); getLogger().message(from, "You &ccanceled&7 your request to &e" + to.getDisplayName() + "&7."); } } - + @Command(hook = "tplist") public void tplist(CommandSender sender) { Player to = (Player) sender; - + Map<Player,TPAType> m = pending_requests.get(to); - + if (m == null) { getLogger().message(sender, true, "You don't have any incoming TPA requests."); return; } ChatAPI.send(sender, getLogger().getHeader()); ChatAPI.send(sender, ""); - + for (Player from : m.keySet()) { ChatAPI.createMessage(sender) .appendText("&e" + from.getDisplayName() + "&7: ") @@ -344,10 +349,10 @@ public class Teleport implements Module, Listener .send(); } } - + @Command(hook = "tptoggle") public void tptoggle(CommandSender sender, String status) { - + switch (status.toLowerCase()) { case "all": DataManager.setData(sender, "allow-tpa", true); @@ -372,28 +377,28 @@ public class Teleport implements Module, Listener } getLogger().message(sender, "Status set to &e" + status + "&7."); } - + private void playerDoesNotExistError(CommandSender sender, String player) { getLogger().message(sender, true, "The player, &e" + player + "&7, is not online."); } private void cannotTpToYourself(CommandSender sender) { getLogger().message(sender, true, "You can't teleport to yourself."); } - + private void insertIntoMaps(Player from, Player to, TPAType type) { Map<Player, TPAType> m = pending_requests.getOrDefault(to, new HashMap<>()); m.put(from, type); pending_requests.put(to, m); - + Stack<Player> s1 = last_request.getOrDefault(from, new Stack<>()); s1.push(to); last_request.put(from, s1); - + Stack<Player> s2 = last_request_got.getOrDefault(to, new Stack<>()); s2.push(from); last_request_got.put(to, s2); } - + private void notifyAskie(Player to, Player from, TPAType type) { ChatAPI.createMessage(to) .appendText(getLogger().getPrefix() + "&e" + from.getDisplayName() @@ -405,7 +410,7 @@ public class Teleport implements Module, Listener .appendSendChatHover("&cDeny", "/tpdeny " + from.getName(), "&eClick to &cDeny") .send(); } - + private Player getLastRequest(Player from) { Stack<Player> stack = last_request.get(from); if (stack == null) @@ -417,7 +422,7 @@ public class Teleport implements Module, Listener last_request.put(from, stack); return toReturn; } - + private Player getLastRequestGot(Player to) { Stack<Player> stack = last_request_got.get(to); if (stack == null) @@ -429,16 +434,16 @@ public class Teleport implements Module, Listener last_request_got.put(to, stack); return toReturn; } - + private void clearRequest(Player to, Player from) { Stack<Player> s1 = last_request.get(from); Stack<Player> s2 = last_request_got.get(to); Map<Player, TPAType> m = pending_requests.get(to); - + s1.remove(to); s2.remove(from); m.remove(from); - + if (s1.isEmpty()) last_request.remove(from); else @@ -450,38 +455,46 @@ public class Teleport implements Module, Listener if (m.isEmpty()) pending_requests.remove(from); else - pending_requests.put(from, m); + pending_requests.put(from, m); } - + @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { Player p = event.getPlayer(); - + pending_requests.remove(p); last_request.remove(p); last_request_got.remove(p); - - for (Player fl : pending_requests.keySet()) { + + Iterator<Player> pr_iterator = pending_requests.keySet().iterator(); + while (pr_iterator.hasNext()) { + Player fl = pr_iterator.next(); Map<Player, TPAType> m = pending_requests.get(fl); m.remove(p); if (m.isEmpty()) - pending_requests.remove(fl); + pr_iterator.remove(); else pending_requests.put(fl, m); } - for (Player fl : last_request.keySet()) { + + Iterator<Player> lr_iterator = last_request.keySet().iterator(); + while (lr_iterator.hasNext()) { + Player fl = lr_iterator.next(); Stack<Player> s = last_request.get(fl); s.remove(p); if (s.isEmpty()) - last_request.remove(fl); + lr_iterator.remove(); else last_request.put(fl, s); } - for (Player fl : last_request_got.keySet()) { + + Iterator<Player> lrg_iterator = last_request_got.keySet().iterator(); + while (lrg_iterator.hasNext()) { + Player fl = lrg_iterator.next(); Stack<Player> s = last_request_got.get(fl); s.remove(p); if (s.isEmpty()) - last_request_got.remove(fl); + lrg_iterator.remove(); else last_request_got.put(fl, s); } |