summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinenash <minenash@protonmail.com>2019-01-04 07:10:57 -0500
committerGitHub <noreply@github.com>2019-01-04 07:10:57 -0500
commit973e873716e58e8af80d7ea0ecd86df09f113912 (patch)
tree8e643cf15f4d5cd1cf98211e2f3f5a45790c1efd
parent5c272da0039a2abe039a01b93ec803514f90eca9 (diff)
parent68769254df8cdd12607942ce7a95e22f00c7ffed (diff)
Merge pull request #35 from RedstonerServer/gradle
Updated to 1.13 and a whole lot more
-rw-r--r--.gitignore12
-rw-r--r--build.gradle27
-rw-r--r--src/com/redstoner/modules/afk/AFK.java225
-rw-r--r--src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java206
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/Mod.java24
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java94
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModInventory.java195
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java80
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java49
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java40
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java43
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java46
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java40
-rw-r--r--src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java91
-rw-r--r--src/com/redstoner/modules/buildchat/BuildChat.cmd42
-rw-r--r--src/com/redstoner/modules/buildchat/BuildChat.java207
-rw-r--r--src/com/redstoner/modules/buildteam/BuildTeam.cmd22
-rw-r--r--src/com/redstoner/modules/buildteam/BuildTeam.java56
-rw-r--r--src/com/redstoner/modules/chatalias/Chatalias.cmd16
-rw-r--r--src/com/redstoner/modules/chatgroups/Chatgroups.java400
-rw-r--r--src/com/redstoner/modules/check/Check.cmd8
-rw-r--r--src/com/redstoner/modules/check/Check.java247
-rw-r--r--src/com/redstoner/modules/misc/Misc.cmd50
-rw-r--r--src/com/redstoner/modules/misc/Misc.java281
-rw-r--r--src/com/redstoner/modules/motd/Motd.cmd14
-rw-r--r--src/main/java/com/earth2me/essentials/utils/DateUtil.java (renamed from src/com/earth2me/essentials/utils/DateUtil.java)0
-rw-r--r--src/main/java/com/redstoner/modules/abot/Abot.cmd (renamed from src/com/redstoner/modules/abot/Abot.cmd)0
-rw-r--r--src/main/java/com/redstoner/modules/abot/Abot.java (renamed from src/com/redstoner/modules/abot/Abot.java)38
-rw-r--r--src/main/java/com/redstoner/modules/abot/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/adminchat/Adminchat.cmd (renamed from src/com/redstoner/modules/adminchat/Adminchat.cmd)10
-rw-r--r--src/main/java/com/redstoner/modules/adminchat/Adminchat.java (renamed from src/com/redstoner/modules/adminchat/Adminchat.java)201
-rw-r--r--src/main/java/com/redstoner/modules/adminchat/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/afk/AFK.cmd (renamed from src/com/redstoner/modules/afk/AFK.cmd)14
-rw-r--r--src/main/java/com/redstoner/modules/afk/AFK.java100
-rw-r--r--src/main/java/com/redstoner/modules/afk/AFKListener.java64
-rw-r--r--src/main/java/com/redstoner/modules/afk/AFKUtil.java30
-rw-r--r--src/main/java/com/redstoner/modules/afk/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java42
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd43
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java213
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/ModType.java19
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java73
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java63
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java39
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java78
-rw-r--r--src/main/java/com/redstoner/modules/blockplacemods/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/chat/Chat.cmd (renamed from src/com/redstoner/modules/chat/Chat.cmd)39
-rw-r--r--src/main/java/com/redstoner/modules/chat/Chat.java (renamed from src/com/redstoner/modules/chat/Chat.java)219
-rw-r--r--src/main/java/com/redstoner/modules/chat/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd16
-rw-r--r--src/main/java/com/redstoner/modules/chatalias/Chatalias.java (renamed from src/com/redstoner/modules/chatalias/Chatalias.java)306
-rw-r--r--src/main/java/com/redstoner/modules/chatalias/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/chatgroups/Chatgroups.cmd (renamed from src/com/redstoner/modules/chatgroups/Chatgroups.cmd)4
-rw-r--r--src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java363
-rw-r--r--src/main/java/com/redstoner/modules/chatgroups/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/check/Check.cmd16
-rw-r--r--src/main/java/com/redstoner/modules/check/Check.java320
-rw-r--r--src/main/java/com/redstoner/modules/check/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/clear/Clear.cmd (renamed from src/com/redstoner/modules/clear/Clear.cmd)2
-rw-r--r--src/main/java/com/redstoner/modules/clear/Clear.java (renamed from src/com/redstoner/modules/clear/Clear.java)30
-rw-r--r--src/main/java/com/redstoner/modules/clear/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/cycle/Cycle.cmd (renamed from src/com/redstoner/modules/cycle/Cycle.cmd)4
-rw-r--r--src/main/java/com/redstoner/modules/cycle/Cycle.java (renamed from src/com/redstoner/modules/cycle/Cycle.java)118
-rw-r--r--src/main/java/com/redstoner/modules/cycle/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/damnspam/DamnSpam.cmd (renamed from src/com/redstoner/modules/damnspam/DamnSpam.cmd)3
-rw-r--r--src/main/java/com/redstoner/modules/damnspam/DamnSpam.java (renamed from src/com/redstoner/modules/damnspam/DamnSpam.java)298
-rw-r--r--src/main/java/com/redstoner/modules/damnspam/SpamInput.java (renamed from src/com/redstoner/modules/damnspam/SpamInput.java)14
-rw-r--r--src/main/java/com/redstoner/modules/damnspam/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/datamanager/DataManager.cmd (renamed from src/com/redstoner/modules/datamanager/DataManager.cmd)2
-rw-r--r--src/main/java/com/redstoner/modules/datamanager/DataManager.java (renamed from src/com/redstoner/modules/datamanager/DataManager.java)1071
-rw-r--r--src/main/java/com/redstoner/modules/datamanager/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/discord/Discord.cmd8
-rw-r--r--src/main/java/com/redstoner/modules/discord/Discord.java126
-rw-r--r--src/main/java/com/redstoner/modules/discord/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/friends/Friends.cmd (renamed from src/com/redstoner/modules/friends/Friends.cmd)0
-rw-r--r--src/main/java/com/redstoner/modules/friends/Friends.java (renamed from src/com/redstoner/modules/friends/Friends.java)353
-rw-r--r--src/main/java/com/redstoner/modules/friends/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/ignore/Ignore.cmd (renamed from src/com/redstoner/modules/ignore/Ignore.cmd)5
-rw-r--r--src/main/java/com/redstoner/modules/ignore/Ignore.java (renamed from src/com/redstoner/modules/ignore/Ignore.java)129
-rw-r--r--src/main/java/com/redstoner/modules/ignore/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd (renamed from src/com/redstoner/modules/lagchunks/LagChunks.cmd)1
-rw-r--r--src/main/java/com/redstoner/modules/lagchunks/LagChunks.java (renamed from src/com/redstoner/modules/lagchunks/LagChunks.java)85
-rw-r--r--src/main/java/com/redstoner/modules/lagchunks/LaggyChunk.java (renamed from src/com/redstoner/modules/lagchunks/LaggyChunk.java)0
-rw-r--r--src/main/java/com/redstoner/modules/lagchunks/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/list/List.cmd (renamed from src/com/redstoner/modules/list/List.cmd)2
-rw-r--r--src/main/java/com/redstoner/modules/list/List.java (renamed from src/com/redstoner/modules/list/List.java)2
-rw-r--r--src/main/java/com/redstoner/modules/list/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java (renamed from src/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java)1
-rw-r--r--src/main/java/com/redstoner/modules/loginsecurity/CryptographyHandler.java (renamed from src/com/redstoner/modules/loginsecurity/CryptographyHandler.java)0
-rw-r--r--src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.cmd (renamed from src/com/redstoner/modules/loginsecurity/LoginSecurity.cmd)0
-rw-r--r--src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java (renamed from src/com/redstoner/modules/loginsecurity/LoginSecurity.java)2
-rw-r--r--src/main/java/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java (renamed from src/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java)0
-rw-r--r--src/main/java/com/redstoner/modules/loginsecurity/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/logs/LogEntry.java (renamed from src/com/redstoner/modules/logs/LogEntry.java)0
-rw-r--r--src/main/java/com/redstoner/modules/logs/LogHandler.java (renamed from src/com/redstoner/modules/logs/LogHandler.java)49
-rw-r--r--src/main/java/com/redstoner/modules/logs/Logs.cmd (renamed from src/com/redstoner/modules/logs/Logs.cmd)12
-rw-r--r--src/main/java/com/redstoner/modules/logs/Logs.java (renamed from src/com/redstoner/modules/logs/Logs.java)18
-rw-r--r--src/main/java/com/redstoner/modules/logs/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/mail/Mail.cmd81
-rw-r--r--src/main/java/com/redstoner/modules/mail/Mail.java620
-rw-r--r--src/main/java/com/redstoner/modules/mail/Msg.java206
-rw-r--r--src/main/java/com/redstoner/modules/mail/Theme.java53
-rw-r--r--src/main/java/com/redstoner/modules/mail/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/mentio/Mentio.cmd (renamed from src/com/redstoner/modules/mentio/Mentio.cmd)2
-rw-r--r--src/main/java/com/redstoner/modules/mentio/Mentio.java (renamed from src/com/redstoner/modules/mentio/Mentio.java)44
-rw-r--r--src/main/java/com/redstoner/modules/mentio/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/message/Message.cmd (renamed from src/com/redstoner/modules/message/Message.cmd)5
-rw-r--r--src/main/java/com/redstoner/modules/message/Message.java (renamed from src/com/redstoner/modules/message/Message.java)2
-rw-r--r--src/main/java/com/redstoner/modules/message/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/misc/Misc.cmd91
-rw-r--r--src/main/java/com/redstoner/modules/misc/Misc.java337
-rw-r--r--src/main/java/com/redstoner/modules/misc/MiscUtil.java55
-rw-r--r--src/main/java/com/redstoner/modules/misc/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/motd/Motd.cmd17
-rw-r--r--src/main/java/com/redstoner/modules/motd/Motd.java (renamed from src/com/redstoner/modules/motd/Motd.java)2
-rw-r--r--src/main/java/com/redstoner/modules/motd/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/nametags/Nametags.cmd (renamed from src/com/redstoner/modules/nametags/Nametags.cmd)2
-rw-r--r--src/main/java/com/redstoner/modules/nametags/Nametags.java (renamed from src/com/redstoner/modules/nametags/Nametags.java)4
-rw-r--r--src/main/java/com/redstoner/modules/nametags/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/naming/Naming.cmd (renamed from src/com/redstoner/modules/naming/Naming.cmd)6
-rw-r--r--src/main/java/com/redstoner/modules/naming/Naming.java (renamed from src/com/redstoner/modules/naming/Naming.java)2
-rw-r--r--src/main/java/com/redstoner/modules/naming/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/onlineplayers/OnlinePlayers.java (renamed from src/com/redstoner/modules/onlineplayers/OnlinePlayers.java)2
-rw-r--r--src/main/java/com/redstoner/modules/onlineplayers/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/reports/Reports.cmd (renamed from src/com/redstoner/modules/reports/Reports.cmd)17
-rw-r--r--src/main/java/com/redstoner/modules/reports/Reports.java (renamed from src/com/redstoner/modules/reports/Reports.java)54
-rw-r--r--src/main/java/com/redstoner/modules/reports/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/saylol/Saylol.cmd (renamed from src/com/redstoner/modules/saylol/Saylol.cmd)2
-rw-r--r--src/main/java/com/redstoner/modules/saylol/Saylol.java (renamed from src/com/redstoner/modules/saylol/Saylol.java)2
-rw-r--r--src/main/java/com/redstoner/modules/saylol/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/scriptutils/Scriptutils.cmd (renamed from src/com/redstoner/modules/scriptutils/Scriptutils.cmd)28
-rw-r--r--src/main/java/com/redstoner/modules/scriptutils/Scriptutils.java (renamed from src/com/redstoner/modules/scriptutils/Scriptutils.java)39
-rw-r--r--src/main/java/com/redstoner/modules/scriptutils/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/seen/Seen.cmd (renamed from src/com/redstoner/modules/seen/Seen.cmd)33
-rw-r--r--src/main/java/com/redstoner/modules/seen/Seen.java (renamed from src/com/redstoner/modules/seen/Seen.java)40
-rw-r--r--src/main/java/com/redstoner/modules/seen/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/signalstrength/SignalStrength.cmd (renamed from src/com/redstoner/modules/signalstrength/SignalStrength.cmd)0
-rw-r--r--src/main/java/com/redstoner/modules/signalstrength/SignalStrength.java (renamed from src/com/redstoner/modules/signalstrength/SignalStrength.java)5
-rw-r--r--src/main/java/com/redstoner/modules/signalstrength/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/skullclick/SkullClick.java (renamed from src/com/redstoner/modules/skullclick/SkullClick.java)2
-rw-r--r--src/main/java/com/redstoner/modules/skullclick/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/socialspy/Socialspy.cmd (renamed from src/com/redstoner/modules/socialspy/Socialspy.cmd)11
-rw-r--r--src/main/java/com/redstoner/modules/socialspy/Socialspy.java (renamed from src/com/redstoner/modules/socialspy/Socialspy.java)2
-rw-r--r--src/main/java/com/redstoner/modules/socialspy/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/tag/Tag.cmd (renamed from src/com/redstoner/modules/tag/Tag.cmd)5
-rw-r--r--src/main/java/com/redstoner/modules/tag/Tag.java (renamed from src/com/redstoner/modules/tag/Tag.java)2
-rw-r--r--src/main/java/com/redstoner/modules/tag/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/teleport/Teleport.cmd (renamed from src/com/redstoner/modules/teleport/Teleport.cmd)47
-rw-r--r--src/main/java/com/redstoner/modules/teleport/Teleport.java (renamed from src/com/redstoner/modules/teleport/Teleport.java)81
-rw-r--r--src/main/java/com/redstoner/modules/teleport/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/tilechunks/LaggyTileChunk.java (renamed from src/com/redstoner/modules/tilechunks/LaggyTileChunk.java)0
-rw-r--r--src/main/java/com/redstoner/modules/tilechunks/TileChunks.cmd (renamed from src/com/redstoner/modules/tilechunks/TileChunks.cmd)1
-rw-r--r--src/main/java/com/redstoner/modules/tilechunks/TileChunks.java (renamed from src/com/redstoner/modules/tilechunks/TileChunks.java)2
-rw-r--r--src/main/java/com/redstoner/modules/tilechunks/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/vanish/Vanish.cmd (renamed from src/com/redstoner/modules/vanish/Vanish.cmd)5
-rw-r--r--src/main/java/com/redstoner/modules/vanish/Vanish.java (renamed from src/com/redstoner/modules/vanish/Vanish.java)2
-rw-r--r--src/main/java/com/redstoner/modules/vanish/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/warn/Warn.cmd (renamed from src/com/redstoner/modules/warn/Warn.cmd)4
-rw-r--r--src/main/java/com/redstoner/modules/warn/Warn.java (renamed from src/com/redstoner/modules/warn/Warn.java)2
-rw-r--r--src/main/java/com/redstoner/modules/warn/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/webtoken/WebToken.cmd (renamed from src/com/redstoner/modules/webtoken/WebToken.cmd)0
-rw-r--r--src/main/java/com/redstoner/modules/webtoken/WebToken.java (renamed from src/com/redstoner/modules/webtoken/WebToken.java)2
-rw-r--r--src/main/java/com/redstoner/modules/webtoken/module.info3
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd16
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/WorldBorder.java193
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java46
-rw-r--r--src/main/java/com/redstoner/modules/worldborder/module.info3
-rw-r--r--src/main/java/com/redstoner/utils/CommandException.java (renamed from src/com/redstoner/utils/CommandException.java)0
-rw-r--r--src/main/java/com/redstoner/utils/CommandMap.java (renamed from src/com/redstoner/utils/CommandMap.java)0
-rw-r--r--src/main/java/com/redstoner/utils/ItemProperties.java (renamed from src/com/redstoner/utils/ItemProperties.java)11
-rw-r--r--src/main/java/com/redstoner/utils/ThrowingSupplier.java (renamed from src/com/redstoner/utils/ThrowingSupplier.java)0
171 files changed, 5207 insertions, 4261 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c9c42ba
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+/.gradle/
+/build/
+/bin/
+
+/.settings/
+/.idea/
+
+.classpath
+.project
+
+/.idea/
+/.vscode/ \ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..7d53907
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,27 @@
+apply plugin: "java"
+
+repositories {
+ jcenter()
+ maven { url "https://jitpack.io" }
+
+ maven { url "https://hub.spigotmc.org/nexus/content/repositories/snapshots/" }
+ maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
+}
+
+dependencies {
+ implementation "com.github.RedstonerServer:ModuleLoader:gradle-SNAPSHOT"
+ implementation "com.github.RedstonerServer:CommandManager:master-SNAPSHOT"
+ implementation "com.github.RedstonerServer:ChatAPI:master-SNAPSHOT"
+ implementation "com.github.RedstonerServer:ChestAPI:master-SNAPSHOT"
+
+ compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT'
+}
+
+sourceSets {
+ main {
+ resources {
+ srcDir 'src/main/java'
+ include '**/*.cmd'
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/redstoner/modules/afk/AFK.java b/src/com/redstoner/modules/afk/AFK.java
deleted file mode 100644
index 66cd506..0000000
--- a/src/com/redstoner/modules/afk/AFK.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package com.redstoner.modules.afk;
-
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event;
-import org.bukkit.event.EventException;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.AsyncPlayerChatEvent;
-import org.bukkit.event.player.PlayerCommandPreprocessEvent;
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.event.player.PlayerMoveEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
-import org.bukkit.plugin.EventExecutor;
-
-import com.nemez.cmdmgr.Command;
-import com.redstoner.annotations.AutoRegisterListener;
-import com.redstoner.annotations.Commands;
-import com.redstoner.annotations.Version;
-import com.redstoner.misc.BroadcastFilter;
-import com.redstoner.misc.CommandHolderType;
-import com.redstoner.misc.Main;
-import com.redstoner.misc.Utils;
-import com.redstoner.modules.Module;
-import com.redstoner.modules.datamanager.DataManager;
-
-@Commands(CommandHolderType.File)
-@AutoRegisterListener
-@Version(major = 4, minor = 0, revision = 5, compatible = 5)
-public class AFK implements Module, Listener
-{
- private CustomListener listener;
- boolean move = true, look = false;
-
- @Override
- public void firstLoad()
- {
- Module.super.firstLoad();
- DataManager.setConfig("indicator", "&7[AFK]");
- String[] choices = new String[] {"listen", "ignore"};
- DataManager.setConfig("move", "listen", choices);
- DataManager.setConfig("look", "ignore", choices);
- DataManager.setConfig("chat", "listen", choices);
- DataManager.setConfig("interact", "listen", choices);
- DataManager.setConfig("command", "ignore", choices);
- }
-
- @Override
- public void migrate(Version old)
- {
- Module.super.migrate(old);
- if ((old.major() == 4) && (old.minor() == 0) && (old.revision() == 3))
- {
- String[] choices = new String[] {"listen", "ignore"};
- DataManager.setConfig("look", "ignore", choices);
- }
- }
-
- @Override
- public void postEnable()
- {
- Module.super.postEnable();
- listener = new CustomListener();
- update_afk_listeners(Bukkit.getConsoleSender());
- }
-
- @Override
- public void onDisable()
- {
- Module.super.onDisable();
- HandlerList.unregisterAll(listener);
- }
-
- @Command(hook = "afk")
- public boolean afk(CommandSender sender)
- {
- return afk(sender, "");
- }
-
- @Command(hook = "afk2")
- public boolean afk(CommandSender sender, String reason)
- {
- return afk(sender, reason, false);
- }
-
- public boolean afk(CommandSender sender, String reason, boolean silent)
- {
- if (isafk(sender))
- {
- unafk(sender);
- }
- else
- {
- DataManager.setData(sender, "afk_reason", reason);
- DataManager.setState(sender, "afk", true);
- if (!silent)
- Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is now AFK", null);
- }
- return true;
- }
-
- public void unafk(CommandSender sender)
- {
- DataManager.setState(sender, "afk", false);
- Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is no longer AFK", null);
- }
-
- public boolean isafk(CommandSender sender)
- {
- return DataManager.getState(sender, "afk");
- }
-
- public boolean isVanished(Player player)
- {
- return DataManager.getState(player, "vanished");
- }
-
- @Command(hook = "update_afk_listeners")
- public boolean update_afk_listeners(CommandSender sender)
- {
- Utils.broadcast(null, "Updating afk listeners...", new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return recipient.hasPermission("utils.afk.admin");
- }
- });
- move = DataManager.getConfigOrDefault("move", "listen").equals("listen");
- look = DataManager.getConfigOrDefault("look", "ignore").equals("listen");
- if (move || look)
- Bukkit.getPluginManager().registerEvent(PlayerMoveEvent.class, listener, EventPriority.MONITOR, listener,
- Main.plugin);
- else
- PlayerMoveEvent.getHandlerList().unregister(listener);
- if (DataManager.getConfigOrDefault("chat", "listen").equals("listen"))
- Bukkit.getPluginManager().registerEvent(PlayerInteractEvent.class, listener, EventPriority.MONITOR,
- listener, Main.plugin);
- else
- PlayerInteractEvent.getHandlerList().unregister(listener);
- if (DataManager.getConfigOrDefault("interact", "listen").equals("listen"))
- Bukkit.getPluginManager().registerEvent(AsyncPlayerChatEvent.class, listener, EventPriority.MONITOR,
- listener, Main.plugin);
- else
- AsyncPlayerChatEvent.getHandlerList().unregister(listener);
- if (DataManager.getConfigOrDefault("command", "ignore").equals("listen"))
- Bukkit.getPluginManager().registerEvent(PlayerCommandPreprocessEvent.class, listener, EventPriority.MONITOR,
- listener, Main.plugin);
- else
- PlayerCommandPreprocessEvent.getHandlerList().unregister(listener);
- return true;
- }
-
- @EventHandler
- public void onLeave(PlayerQuitEvent event)
- {
- DataManager.setState(event.getPlayer(), "afk", false);
- }
-}
-
-class CustomListener implements Listener, EventExecutor
-{
- private boolean move = true, look = false;
-
- @Override
- public void execute(Listener listener, Event event) throws EventException
- {
- if (event instanceof PlayerEvent)
- {
- if (event instanceof PlayerMoveEvent)
- {
- PlayerMoveEvent pevent = (PlayerMoveEvent) event;
- double distance = pevent.getFrom().distance(pevent.getTo());
- boolean moved = distance > 0;
- boolean looked = (pevent.getFrom().getPitch() != pevent.getTo().getPitch())
- || (pevent.getFrom().getYaw() != pevent.getTo().getYaw());
- if ((move && moved) || (look && looked))
- {
- Player player = pevent.getPlayer();
- if (isafk(player))
- if (!isVanished(player))
- unafk(player);
- }
- }
- else
- {
- PlayerEvent pevent = (PlayerEvent) event;
- Player player = pevent.getPlayer();
- if (isafk(player))
- if (!isVanished(player))
- unafk(player);
- }
- }
- }
-
- public void unafk(CommandSender sender)
- {
- DataManager.setState(sender, "afk", false);
- Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is no longer AFK", null);
- }
-
- public boolean isafk(CommandSender sender)
- {
- return DataManager.getState(sender, "afk");
- }
-
- public boolean isVanished(Player player)
- {
- return DataManager.getState(player, "vanished");
- }
-
- public void listenMove(boolean move)
- {
- this.move = move;
- }
-
- public void listenLook(boolean look)
- {
- this.look = look;
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
deleted file mode 100644
index 6befbae..0000000
--- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package com.redstoner.modules.blockplacemods;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Listener;
-
-import com.nemez.cmdmgr.Command;
-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.blockplacemods.mods.Mod;
-import com.redstoner.modules.blockplacemods.mods.ModAbstract;
-import com.redstoner.modules.blockplacemods.mods.ModToggledAbstract;
-import com.redstoner.utils.CommandException;
-import com.redstoner.utils.CommandMap;
-
-@Commands(CommandHolderType.None)
-@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 1, compatible = 4)
-public final class BlockPlaceMods implements Module, Listener
-{
- @Override
- public boolean onEnable()
- {
- ModAbstract.registerAll(getLogger());
- for (Mod mod : new ArrayList<>(ModAbstract.getMods().values()))
- {
- mod.registerListeners();
- }
- try
- {
- Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap();
- org.bukkit.command.Command command = new BlockPlaceModsCommand();
- for (String alias : getCommandAliases())
- {
- commandMap.put(alias, command);
- }
- }
- catch (ReflectiveOperationException ex)
- {
- ex.printStackTrace();
- return false;
- }
- return true;
- }
-
- @Override
- public void postEnable()
- {
- setPrefix("BPM");
- }
-
- @Override
- public void onDisable()
- {
- for (Mod mod : ModAbstract.getMods().values())
- {
- mod.unregisterListeners();
- }
- try
- {
- Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap();
- for (String alias : getCommandAliases())
- {
- org.bukkit.command.Command command = commandMap.get(alias);
- if (command != null && command.getClass() == BlockPlaceModsCommand.class)
- {
- commandMap.remove(alias);
- }
- }
- }
- catch (Exception ignored)
- {}
- }
-
- private static String[] getCommandAliases()
- {
- String pluginName = Main.plugin.getName().toLowerCase();
- // @noformat
- return new String[]{"mod", pluginName + ":mod",
- "set", pluginName + ":set",
- "toggle", pluginName + ":toggle"
- };
- // @format
- }
-
- @Command(hook = "mod_empty")
- public void onModEmptyCommand(CommandSender sender)
- {
- onModCommand(sender, "");
- }
-
- @Command(hook = "mod")
- public void onModCommand(CommandSender sender, String input)
- {
- String[] args = new ArrayList<>(Arrays.asList(input.split(" "))).stream()
- .filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new);
- String prefix = "";
- String message;
- try
- {
- if (args.length > 0)
- {
- Mod target = ModAbstract.getMod(args[0].toLowerCase());
- if (target != null)
- {
- prefix += "&7[&2" + capitalize(target.getName()) + "&7]:&a ";
- if (!(sender instanceof Player))
- {
- message = "&cYou must be a player to use any block place mod";
- }
- else
- {
- message = target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length));
- }
- }
- else if (args[0].equalsIgnoreCase("help"))
- {
- message = commandHelp(sender, args);
- }
- else
- {
- message = "&cThat argument could not be recognized";
- }
- }
- else
- {
- message = commandHelp(sender, args);
- }
- }
- catch (CommandException ex)
- {
- message = " &c" + ex.getMessage();
- }
- catch (Throwable t)
- {
- message = " &cAn unexpected error occurred while executing this command.";
- t.printStackTrace();
- }
- getLogger().message(sender, prefix + message);
- }
-
- private String commandHelp(CommandSender sender, String[] args)
- {
- StringBuilder result = new StringBuilder("ยง7BlockPlaceMods adds some redstone-centric utilities");
- result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:");
- List<Mod> mods = new ArrayList<>(new HashSet<>(ModAbstract.getMods().values()));
- mods.sort(Comparator.<Mod> comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1)
- .thenComparing(Mod::getName));
- for (Mod mod : mods)
- {
- result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString())
- .append(mod.getName());
- for (String alias : mod.getAliases())
- {
- result.append('|').append(alias);
- }
- result.append(ChatColor.GRAY.toString()).append(" - ").append(mod.getDescription());
- }
- return result.toString();
- }
-
- private static String capitalize(String modName)
- {
- if (modName.isEmpty())
- {
- return modName;
- }
- char first = modName.charAt(0);
- if (first != (first = Character.toUpperCase(first)))
- {
- char[] result = modName.toCharArray();
- result[0] = first;
- return String.valueOf(result);
- }
- return modName;
- }
-
- private class BlockPlaceModsCommand extends org.bukkit.command.Command
- {
- public BlockPlaceModsCommand()
- {
- super("mod");
- String[] aliases = getCommandAliases();
- setAliases(Arrays.asList(Arrays.copyOfRange(aliases, 1, aliases.length)));
- }
-
- @Override
- public boolean execute(CommandSender sender, String label, String[] args)
- {
- onModCommand(sender, String.join(" ", args));
- return true;
- }
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/Mod.java b/src/com/redstoner/modules/blockplacemods/mods/Mod.java
deleted file mode 100644
index 9a2fcad..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/Mod.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.entity.Player;
-
-import com.redstoner.utils.CommandException;
-
-import java.util.Set;
-
-public interface Mod
-{
- String getName();
-
- String getDescription();
-
- Set<String> getAliases();
-
- Object getDefault();
-
- String runCommand(Player sender, String[] args) throws CommandException;
-
- void registerListeners();
-
- void unregisterListeners();
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java
deleted file mode 100644
index 5a383d8..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryType;
-
-import com.redstoner.misc.Main;
-import com.redstoner.modules.ModuleLogger;
-import com.redstoner.modules.datamanager.DataManager;
-
-public abstract class ModAbstract implements Mod, Listener
-{
- private static final Map<String, Mod> mods = new HashMap<>();
- private final String name;
- private final Set<String> aliases;
- private static ModuleLogger logger;
-
- public static Map<String, Mod> getMods()
- {
- return Collections.unmodifiableMap(mods);
- }
-
- public static Mod getMod(String name)
- {
- return mods.get(name);
- }
-
- public static void registerMod(Mod mod)
- {
- mods.put(mod.getName(), mod);
- for (String alias : mod.getAliases())
- {
- mods.putIfAbsent(alias, mod);
- }
- }
-
- public static void registerAll(final ModuleLogger logger)
- {
- ModAbstract.logger = logger;
- registerMod(new ModToggledCauldron());
- registerMod(new ModToggledPiston());
- registerMod(new ModToggledObserver());
- registerMod(new ModToggledStep());
- registerMod(new ModToggledTorch());
- registerMod(new ModInventory("dropper", InventoryType.DROPPER));
- registerMod(new ModInventory("furnace", InventoryType.FURNACE));
- registerMod(new ModInventory("hopper", InventoryType.HOPPER));
- }
-
- public ModAbstract(String name)
- {
- this.name = Objects.requireNonNull(name);
- this.aliases = new HashSet<>(2);
- logger.info("Loaded mod " + name);
- }
-
- @Override
- public String getName()
- {
- return name;
- }
-
- @Override
- public Set<String> getAliases()
- {
- return aliases;
- }
-
- @Override
- public void registerListeners()
- {
- Bukkit.getPluginManager().registerEvents(this, Main.plugin);
- }
-
- @Override
- public void unregisterListeners()
- {
- HandlerList.unregisterAll(this);
- }
-
- protected void reset(Player player)
- {
- DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName());
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java
deleted file mode 100644
index c6e483e..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import com.redstoner.modules.datamanager.DataManager;
-import com.redstoner.utils.CommandException;
-import com.redstoner.utils.ItemProperties;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.block.BlockState;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.event.inventory.InventoryType;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryHolder;
-import org.bukkit.inventory.ItemStack;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-
-import java.util.Arrays;
-
-public class ModInventory extends ModAbstract
-{
- protected InventoryType inventoryType;
-
- public ModInventory(String name, InventoryType inventoryType)
- {
- super(name);
- this.inventoryType = inventoryType;
- }
-
- private static int highestUsedIndex(ItemStack[] items)
- {
- for (int i = items.length - 1; i >= 0; i--)
- {
- if (items[i] != null)
- {
- return i;
- }
- }
- return -1;
- }
-
- @Override
- public String getDescription()
- {
- return "Controls " + inventoryType.name().toLowerCase() + " placement content";
- }
-
- @Override
- public String runCommand(Player sender, String[] args) throws CommandException
- {
- if (args.length > 0)
- {
- if (args[0].equalsIgnoreCase("clear"))
- {
- reset(sender);
- return "Reset data successfully";
- }
- try
- {
- int slot = Integer.parseInt(args[0]);
- if (slot >= inventoryType.getDefaultSize())
- {
- throw new CommandException(
- "Slot number " + slot + " is too high for " + inventoryType.toString().toLowerCase() + "s");
- }
- if (slot < 0)
- {
- throw new CommandException("Slot number " + slot + " is negative");
- }
- // Set the stored item to the item in the sender's hand
- ItemStack item = sender.getInventory().getItemInMainHand();
- if (item == null || item.getType() == Material.AIR || item.getAmount() == 0)
- {
- // Remove the item.
- // Set item to null to ensure correct itemName below.
- item = null;
- if (present(sender))
- {
- set(sender, slot, null);
- }
- }
- else
- {
- set(sender, slot, item);// don't need to clone because the reference isn't kept
- }
- String itemName = item == null ? "nothing"
- : item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", "");
- return "Set the item in slot " + slot + " to " + itemName;
- }
- catch (NumberFormatException ex)
- {
- if (!args[0].equalsIgnoreCase("help"))
- {
- throw new CommandException("Expected a number indicating the slot that you want to set");
- }
- }
- }
- StringBuilder message = new StringBuilder();
- message.append(" &a### &3Container Mod&a Help ###\n");
- message.append("&7").append(getDescription()).append('\n');
- message.append("&6/mod ").append(getName().toLowerCase())
- .append("&o <slot> &bsets the item in slot to your hand\n");
- message.append("&6/mod ").append(getName().toLowerCase()).append("&o clear &bclears the data\n");
- message.append("&6/mod ").append(getName().toLowerCase()).append("&o help &bshows this help page\n");
- return message.toString();
- }
-
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- if (present(event.getPlayer()) && event.getPlayer().getGameMode() == GameMode.CREATIVE)
- {
- BlockState state = event.getBlock().getState();
- if (state instanceof InventoryHolder)
- {
- Inventory inv = ((InventoryHolder) state).getInventory();
- if (inv.getType() == inventoryType)
- {
- ItemStack[] data = get(event.getPlayer());
- inv.setContents(data);
- state.update();
- }
- }
- }
- }
-
- protected ItemStack[] get(Player player)
- {
- Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName());
- if (obj == null)
- return getDefault();
- JSONArray array = (JSONArray) obj;
- ItemStack[] items = new ItemStack[Math.min(inventoryType.getDefaultSize(), array.size())];
- for (int i = 0, n = items.length; i < n; i++)
- {
- Object obj2 = array.get(i);
- if (obj2 instanceof JSONObject)
- { // if null, items[i] remains null
- items[i] = new ItemProperties().loadFrom((JSONObject) obj2).toItemStack();
- }
- }
- return items;
- }
-
- protected void set(Player player, int index, ItemStack item)
- {
- ItemStack[] data = get(player);
- if (item == null)
- {
- if (index < data.length)
- {
- data[index] = null;
- }
- }
- else
- {
- if (index >= data.length)
- {
- data = Arrays.copyOf(data, index + 1);
- }
- data[index] = item;
- }
- set(player, data);
- }
-
- @SuppressWarnings("unchecked")
- protected void set(Player player, ItemStack[] data)
- {
- if (highestUsedIndex(data) == -1)
- reset(player);
- else
- {
- JSONArray array = new JSONArray();
- for (int i = 0, n = highestUsedIndex(data); i < n; i++)
- {
- ItemStack item = data[i];
- array.add(item == null ? null : new ItemProperties(item).toJSONObject());
- }
- DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array);
- }
- }
-
- protected boolean present(Player player)
- {
- return get(player) != null;
- }
-
- @Override
- public ItemStack[] getDefault()
- {
- return new ItemStack[0];
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java
deleted file mode 100644
index b9b2a7c..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import com.redstoner.modules.datamanager.DataManager;
-import com.redstoner.utils.CommandException;
-import org.bukkit.entity.Player;
-
-public abstract class ModToggledAbstract extends ModAbstract
-{
- protected boolean enabledByDefault;
-
- public ModToggledAbstract(String name, boolean enabledByDefault) {
- super(name);
- this.enabledByDefault = enabledByDefault;
- }
-
- @Override
- public Boolean getDefault() {
- return enabledByDefault;
- }
-
- protected boolean hasEnabled(Player player)
- {
- return (boolean) DataManager.getOrDefault(player.getUniqueId().toString(), "BlockPlaceMods", getName(),
- enabledByDefault);
- }
-
- protected boolean setEnabled(Player sender, boolean enabled)
- {
- if (enabled == hasEnabled(sender))
- return false;
- if (enabled == enabledByDefault)
- reset(sender);
- else
- DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled);
- return true;
- }
-
- @Override
- public String runCommand(Player sender, String[] args) throws CommandException
- {
- if (args.length == 0 || args[0].equalsIgnoreCase("toggle"))
- {
- boolean enabled = hasEnabled(sender);
- setEnabled(sender, !enabled);
- return !enabled ? "Enabled" : "Disabled";
- }
- if (args[0].equalsIgnoreCase("help"))
- {
- StringBuilder message = new StringBuilder();
- message.append(" &a### &3Toggled Mod&a Help ###");
- message.append("\n&7").append(getDescription());
- message.append("\n&6/mod ").append(getName()).append("&o (toggle) &btoggles state");
- message.append("\n&6/mod ").append(getName()).append("&o on/off &bsets state");
- message.append("\n&6/mod ").append(getName()).append("&o help &bshows this help page");
- return message.toString();
- }
- final boolean enable;
- switch (args[0].toLowerCase())
- {
- case "on":
- case "enable":
- case "true":
- enable = true;
- break;
- case "off":
- case "disable":
- case "false":
- enable = false;
- break;
- default:
- throw new CommandException("Input '" + args[0] + "' was not understood. "
- + "Use one of: \non, enable, true, off, disable, false.");
- }
- if (!setEnabled(sender, enable))
- {
- throw new CommandException("Was already " + (enable ? "enabled" : "disabled"));
- }
- return enable ? "Enabled" : "Disabled";
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java
deleted file mode 100644
index 669f093..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.block.Action;
-import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.event.player.PlayerInteractEvent;
-
-public class ModToggledCauldron extends ModToggledAbstract
-{
- public ModToggledCauldron()
- {
- super("cauldron", false);
- }
-
- @Override
- public String getDescription()
- {
- return "If active, placed cauldrons are filled, and they cycle on shiftless right click with redstone or fist";
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler
- public void onPlayerInteract(PlayerInteractEvent event)
- {
- if (event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getPlayer().isSneaking()
- && event.getClickedBlock().getType() == Material.CAULDRON && hasEnabled(event.getPlayer())
- && (event.getPlayer().getGameMode() == GameMode.CREATIVE)
- && (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR))
- {
- Block block = event.getClickedBlock();
- block.setData((byte) ((block.getData() - 1) & 0x3));
- }
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- if (event.getBlock().getType() == Material.CAULDRON && !event.getPlayer().isSneaking()
- && hasEnabled(event.getPlayer()) && (event.getPlayer().getGameMode() == GameMode.CREATIVE))
- {
- event.getBlock().setData((byte) 3);
- }
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java
deleted file mode 100644
index 17c414b..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.GameMode;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.block.BlockPlaceEvent;
-
-/**
- * A mod that makes placement of directional blocks act the way placement of logs does normally.
- * Quartz pillar placement works like this too.
- *
- * Placed blocks face the block you clicked to place them.
- */
-public abstract class ModToggledLogPlaceAbstract extends ModToggledAbstract {
-
- protected ModToggledLogPlaceAbstract(String name, boolean enabledByDefault) {
- super(name, enabledByDefault);
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- Player player = event.getPlayer();
- Block block;
- if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE
- && isApplicableToPlacedBlock(block = event.getBlock()))
- {
- block.setData((byte) getBlockDataForFacing(block.getFace(event.getBlockAgainst())));
- }
- }
-
- protected abstract int getBlockDataForFacing(BlockFace direction);
-
- protected abstract boolean isApplicableToPlacedBlock(Block block);
-
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java
deleted file mode 100644
index 8084bf4..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-
-public class ModToggledObserver extends ModToggledLogPlaceAbstract {
-
- protected ModToggledObserver() {
- super("observer", false);
- }
-
- @Override
- public String getDescription() {
- return "If active, observers face the block you place them against";
- }
-
- @Override
- protected boolean isApplicableToPlacedBlock(Block block) {
- return block.getType() == Material.OBSERVER;
- }
-
- @Override
- protected int getBlockDataForFacing(BlockFace direction) {
- switch (direction) {
- case UP:
- return 0;
- default:
- case DOWN:
- return 1;
- case SOUTH:
- return 2;
- case NORTH:
- return 3;
- case EAST:
- return 4;
- case WEST:
- return 5;
- }
- }
-
-
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java
deleted file mode 100644
index 29e810c..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-
-public class ModToggledPiston extends ModToggledLogPlaceAbstract
-{
- public ModToggledPiston()
- {
- super("piston", false);
- }
-
- @Override
- public String getDescription()
- {
- return "If active, pistons face the block you place them against";
- }
-
- @Override
- protected boolean isApplicableToPlacedBlock(Block block) {
- Material type = block.getType();
- return type == Material.PISTON_BASE || type == Material.PISTON_STICKY_BASE;
- }
-
- @Override
- protected int getBlockDataForFacing(BlockFace direction) {
- switch (direction)
- {
- default:
- case DOWN:
- return 0;
- case UP:
- return 1;
- case NORTH:
- return 2;
- case SOUTH:
- return 3;
- case WEST:
- return 4;
- case EAST:
- return 5;
- }
- }
-
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java
deleted file mode 100644
index fe42fa4..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import org.bukkit.Material;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.block.BlockPlaceEvent;
-
-public class ModToggledStep extends ModToggledAbstract
-{
- public ModToggledStep()
- {
- super("step", true);
- getAliases().add("slab");
- }
-
- @Override
- public String getDescription()
- {
- return "If active, placed steps will always turn upside-down";
- }
-
- @SuppressWarnings("deprecation")
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- if (isStep(event.getBlock().getType()) && !event.getPlayer().isSneaking() && hasEnabled(event.getPlayer()))
- {
- byte data = event.getBlock().getData();
- if (data != (data |= 0x8))
- {
- event.getBlock().setData(data);
- }
- }
- }
-
- private boolean isStep(Material block)
- {
- return block == Material.STEP || block == Material.STONE_SLAB2;
- }
-}
diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java
deleted file mode 100644
index 188bce2..0000000
--- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.redstoner.modules.blockplacemods.mods;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.block.BlockPlaceEvent;
-
-import com.redstoner.misc.Main;
-
-public class ModToggledTorch extends ModToggledAbstract
-{
- private final Set<Block> torchesPlaced = new HashSet<>();
-
- public ModToggledTorch()
- {
- super("torch", true);
- Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2);
- }
-
- @Override
- public String getDescription()
- {
- return "If active, redstone torches placed on a redstone block disappear quickly";
- }
-
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockPlace(BlockPlaceEvent event)
- {
- final Player player = event.getPlayer();
- if (!player.isSneaking() && player.getGameMode() == GameMode.CREATIVE && hasEnabled(player)
- && event.getBlock().getType() == Material.REDSTONE_TORCH_ON)
- {
- if (isAttachedToRedstoneBlock(event.getBlock()))
- {
- torchesPlaced.add(event.getBlock());
- }
- }
- }
-
- @SuppressWarnings("deprecation")
- private boolean isAttachedToRedstoneBlock(Block block)
- {
- BlockFace towardsAgainst = getFaceTowardsBlockAgainst(block.getData());
- return towardsAgainst != null && block.getRelative(towardsAgainst).getType() == Material.REDSTONE_BLOCK;
- }
-
- private BlockFace getFaceTowardsBlockAgainst(byte data)
- {
- switch (data)
- {
- case 1:
- return BlockFace.WEST;
- case 2:
- return BlockFace.EAST;
- case 3:
- return BlockFace.NORTH;
- case 4:
- return BlockFace.SOUTH;
- case 5:
- return BlockFace.DOWN;
- default:
- return null;
- }
- }
-
- private void updateTorches()
- {
- for (Iterator<Block> it = torchesPlaced.iterator(); it.hasNext();)
- {
- Block block = it.next();
- if (block.getType() == Material.REDSTONE_TORCH_OFF)
- {
- block.setType(Material.AIR);
- it.remove();
- }
- else if (block.getType() != Material.REDSTONE_TORCH_ON || !isAttachedToRedstoneBlock(block))
- {
- it.remove();
- }
- }
- }
-}
diff --git a/src/com/redstoner/modules/buildchat/BuildChat.cmd b/src/com/redstoner/modules/buildchat/BuildChat.cmd
deleted file mode 100644
index ddd7d77..0000000
--- a/src/com/redstoner/modules/buildchat/BuildChat.cmd
+++ /dev/null
@@ -1,42 +0,0 @@
-command bc {
- [string:message...] {
- help Sends a message in BuildTeam Chat;
- perm utils.bc;
- run bc_msg message;
- }
-}
-command bcn {
- [string:name] [string:message...] {
- help Sends a message in BuildTeam Chat;
- perm utils.bc;
- type console;
- run bcn_msg name message;
- }
-}
-
-command bckey {
- [string:key] {
- help Sets your BuildTeam Chat key;
- perm utils.bc;
- type player;
- run setbckey key;
- }
-}
-
-command bct {
- on {
- help Turns on bct;
- perm utils.bc;
- run bct_on;
- }
- off {
- help Turns off bct;
- perm utils.bc;
- run bct_off;
- }
- [empty] {
- help toggles BuildTeam Chat;
- perm utils.bc;
- run bct;
- }
-} \ No newline at end of file
diff --git a/src/com/redstoner/modules/buildchat/BuildChat.java b/src/com/redstoner/modules/buildchat/BuildChat.java
deleted file mode 100644
index 4ea0779..0000000
--- a/src/com/redstoner/modules/buildchat/BuildChat.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package com.redstoner.modules.buildchat;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.UUID;
-import java.util.regex.Pattern;
-
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.AsyncPlayerChatEvent;
-import org.json.simple.JSONObject;
-
-import com.nemez.cmdmgr.Command;
-import com.redstoner.annotations.AutoRegisterListener;
-import com.redstoner.annotations.Commands;
-import com.redstoner.annotations.Version;
-import com.redstoner.misc.BroadcastFilter;
-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;
-
-/** BuildTeamChat module. Allows the build team to chat privately using /bc \<message\> as well as a one char prefix or a toggle.
- *
- * @author Pepich */
-@Commands(CommandHolderType.File)
-@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class BuildChat implements Module, Listener
-{
- private static final char defaultKey = ';';
- private static final File keysLocation = new File(Main.plugin.getDataFolder(), "buildchat_keys.json");
- private ArrayList<UUID> bctoggled;
- private static JSONObject keys;
-
- @Override
- public boolean onEnable()
- {
- keys = JsonManager.getObject(keysLocation);
- if (keys == null)
- {
- keys = new JSONObject();
- saveKeys();
- }
- bctoggled = new ArrayList<>();
- return true;
- }
-
- @Command(hook = "bc_msg")
- public boolean bcSay(CommandSender sender, String message)
- {
- String name;
- if (sender instanceof Player)
- name = ((Player) sender).getDisplayName();
- else
- name = sender.getName();
- Utils.broadcast("ยง8[ยงcBCยง8] ยง9" + name + "ยง8: ยงb", message, new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return recipient.hasPermission("utils.bc");
- }
- });
- return true;
- }
-
- @Command(hook = "bcn_msg")
- public boolean bcnSay(CommandSender sender, String name, String message)
- {
- Utils.broadcast("ยง8[ยงcBCยง8] ยง9" + name + "ยง8: ยงb", message, new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return recipient.hasPermission("utils.bc");
- }
- });
- return true;
- }
-
- /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
- *
- * @param sender the issuer of the command.
- * @param _void ignored.
- * @return true. */
- @Command(hook = "bct")
- public boolean bcToggleCommand(CommandSender sender)
- {
- if (bctoggled.contains(((Player) sender).getUniqueId()))
- {
- bctoggled.remove(((Player) sender).getUniqueId());
- getLogger().message(sender, "BCT now ยงcdisabled");
- }
- else
- {
- bctoggled.add(((Player) sender).getUniqueId());
- getLogger().message(sender, "BCT now ยงaenabled");
- }
- return true;
- }
-
- /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
- *
- * @param sender the issuer of the command.
- * @return true. */
- @Command(hook = "bct_on")
- public boolean bcToggleOnCommand(CommandSender sender)
- {
- if (!bctoggled.contains(((Player) sender).getUniqueId()))
- {
- bctoggled.add(((Player) sender).getUniqueId());
- getLogger().message(sender, "BCT now ยงaenabled");
- }
- else
- getLogger().message(sender, "BCT was already enabled");
- return true;
- }
-
- /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
- *
- * @param sender the issuer of the command.
- * @return true. */
- @Command(hook = "bct_off")
- public boolean bcToggleOffCommand(CommandSender sender)
- {
- if (bctoggled.remove(((Player) sender).getUniqueId()))
- getLogger().message(sender, "BCT now ยงcdisabled");
- else
- getLogger().message(sender, "BCT was already disabled");
- return true;
- }
-
- /** Deals with chat events to allow for bckeys and bctoggle.
- *
- * @param event the chat event containing the player and the message. */
- @EventHandler
- public void onPlayerChat(AsyncPlayerChatEvent event)
- {
- Player player = event.getPlayer();
- if (!player.hasPermission("utils.bc"))
- return;
- if (event.getMessage().startsWith(getKey(player)))
- {
- event.setCancelled(true);
- bcSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), ""));
- }
- else if (bctoggled.contains(event.getPlayer().getUniqueId()))
- {
- event.setCancelled(true);
- bcSay(event.getPlayer(), event.getMessage());
- }
- }
-
- /** Sets the bckey of a Player.
- *
- * @param sender the issuer of the command.
- * @param key the key to be set. Set to NULL or "" to get your current key.
- * @return true. */
- @SuppressWarnings("unchecked")
- @Command(hook = "setbckey")
- public boolean setBcKey(CommandSender sender, String key)
- {
- if (key.length() > 1)
- {
- getLogger().message(sender, true,
- "Could not set your key to ยง6" + key + " ยง7, it can be at most one char.");
- return true;
- }
- if (key == null || key.length() == 0)
- {
- getBcKey(sender);
- return true;
- }
- getLogger().message(sender, "Set your key to ยง6" + key);
- keys.put(((Player) sender).getUniqueId().toString(), key + "");
- saveKeys();
- return true;
- }
-
- /** This method will find the ChatgGroup key of any player.
- *
- * @param player the player to get the key from.
- * @return the key. */
- public static String getKey(Player player)
- {
- String key = (String) keys.get(player.getUniqueId().toString());
- return (key == null ? "" + defaultKey : key);
- }
-
- /** Prints a Players bckey to their chat.
- *
- * @param sender the issuer of the command. */
- public void getBcKey(CommandSender sender)
- {
- getLogger().message(sender, "Your current bckey is ยง6" + getKey((Player) sender));
- }
-
- /** Saves the keys. */
- private void saveKeys()
- {
- JsonManager.save(keys, keysLocation);
- }
-}
diff --git a/src/com/redstoner/modules/buildteam/BuildTeam.cmd b/src/com/redstoner/modules/buildteam/BuildTeam.cmd
deleted file mode 100644
index d4f3303..0000000
--- a/src/com/redstoner/modules/buildteam/BuildTeam.cmd
+++ /dev/null
@@ -1,22 +0,0 @@
-command teleport {
- alias tp;
- alias tele;
- [string:player...] {
- run teleport player;
- }
- type player;
-}
-
-command team_add {
- [string:player] {
- run team_add player;
- perm utils.buildteam.manage;
- }
-}
-
-command team_remove {
- [string:player] {
- run team_remove player;
- perm utils.buildteam.manage;
- }
-}
diff --git a/src/com/redstoner/modules/buildteam/BuildTeam.java b/src/com/redstoner/modules/buildteam/BuildTeam.java
deleted file mode 100644
index 986b41c..0000000
--- a/src/com/redstoner/modules/buildteam/BuildTeam.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.redstoner.modules.buildteam;
-
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import com.nemez.cmdmgr.Command;
-import com.redstoner.annotations.Commands;
-import com.redstoner.annotations.Version;
-import com.redstoner.misc.CommandHolderType;
-import com.redstoner.modules.Module;
-
-@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 0, compatible = 4)
-public class BuildTeam implements Module
-{
- @Command(hook = "teleport")
- public boolean teleport(CommandSender sender, String target_name)
- {
- final Player player = (Player) sender;
- final Player target = Bukkit.getPlayer(target_name);
- if (target == null || !player.hasPermission("utils.buildteam.teleport")
- || !target.getLocation().getWorld().getName().equals("BuildTeam"))
- {
- player.performCommand("essentials:tp " + target_name);
- return true;
- }
- player.teleport(target);
- getLogger().message(sender, "Teleported you to &e" + target.getDisplayName() + "&7!");
- return true;
- }
-
- @Command(hook = "team_add")
- public boolean add(CommandSender sender, String target_name)
- {
- if (!target_name.matches("^\\w{2,16}$"))
- {
- getLogger().message(sender, true, "This doesn't look like a valid playername!");
- return true;
- }
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pex user " + target_name + " group add +buildteam");
- return true;
- }
-
- @Command(hook = "team_remove")
- public boolean remove(CommandSender sender, String target_name)
- {
- if (!target_name.matches("^\\w{2,16}$"))
- {
- getLogger().message(sender, true, "This doesn't look like a valid playername!");
- return true;
- }
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pex user " + target_name + " group remove +buildteam");
- return true;
- }
-}
diff --git a/src/com/redstoner/modules/chatalias/Chatalias.cmd b/src/com/redstoner/modules/chatalias/Chatalias.cmd
deleted file mode 100644
index 8af4bb6..0000000
--- a/src/com/redstoner/modules/chatalias/Chatalias.cmd
+++ /dev/null
@@ -1,16 +0,0 @@
-command alias {
- add [flag:-r] [string:keyword] [string:replacement...] {
- help Adds a new alias. Set -r to make it a regex-alias.;
- run addalias -r keyword replacement;
- }
- del [flag:-r] [string:keyword] {
- help Deletes an alias. -r indicates if it was a regex-alias.;
- run delalias -r keyword;
- }
- list {
- help Lists your aliases.;
- run listaliases;
- }
- perm utils.alias;
- type player;
-} \ No newline at end of file
diff --git a/src/com/redstoner/modules/chatgroups/Chatgroups.java b/src/com/redstoner/modules/chatgroups/Chatgroups.java
deleted file mode 100644
index 457702c..0000000
--- a/src/com/redstoner/modules/chatgroups/Chatgroups.java
+++ /dev/null
@@ -1,400 +0,0 @@
-package com.redstoner.modules.chatgroups;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.UUID;
-
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.AsyncPlayerChatEvent;
-import org.json.simple.JSONObject;
-
-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.BroadcastFilter;
-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.ignore.Ignore;
-import com.redstoner.modules.socialspy.Socialspy;
-
-import net.nemez.chatapi.ChatAPI;
-
-/** The ChatGroups module. Allows people to have private sub-chats that can be accessed via a single char prefix or a toggle.
- *
- * @author Pepich */
-@Commands(CommandHolderType.File)
-@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Chatgroups implements Module, Listener
-{
- private static final char defaultKey = ':';
- private static final File groupsLocation = new File(Main.plugin.getDataFolder(), "chatgroups.json");
- private static final File keysLocation = new File(Main.plugin.getDataFolder(), "chatgroup_keys.json");
- private ArrayList<UUID> cgtoggled;
- private static JSONObject groups, keys;
-
- @Override
- public boolean onEnable()
- {
- groups = JsonManager.getObject(groupsLocation);
- if (groups == null)
- {
- groups = new JSONObject();
- saveGroups();
- }
- keys = JsonManager.getObject(keysLocation);
- if (keys == null)
- {
- keys = new JSONObject();
- saveKeys();
- }
- cgtoggled = new ArrayList<>();
- return true;
- }
-
- @Override
- public void onDisable()
- {
- saveKeys();
- saveGroups();
- }
-
- /** Prints chatgroup info (like players in the group, groupname) to the sender.
- *
- * @param sender the issuer of the command.
- * @return true. */
- @SuppressWarnings("unchecked")
- @Command(hook = "cginfo")
- public boolean cgInfo(CommandSender sender)
- {
- String group = getGroup(sender);
- if (group == null)
- getLogger().message(sender, true, "You are not in a chatgroup!");
- else
- {
- ArrayList<String> message = new ArrayList<>();
- message.add("ยง7Your current chatgroup is: ยง6" + group);
- ArrayList<String> players = new ArrayList<>();
- Iterator<String> iter = groups.keySet().iterator();
- while (iter.hasNext())
- {
- String id = iter.next();
- if (((String) groups.get(id)).equals(group))
- {
- if (!id.equals("CONSOLE"))
- {
- UUID uuid = UUID.fromString(id);
- Player p = Bukkit.getPlayer(uuid);
- if (p != null)
- players.add(p.getDisplayName());
- else
- players.add(Bukkit.getOfflinePlayer(UUID.fromString(id)).getName());
- }
- else
- players.add(id);
- }
- }
- StringBuilder sb = new StringBuilder("&6Other players in this group: &9");
- for (String player : players)
- {
- sb.append(player);
- sb.append("&7, &9");
- }
- sb.delete(sb.length() - 2, sb.length());
- message.add(sb.toString());
- getLogger().message(sender, message.toArray(new String[] {}));
- }
- return true;
- }
-
- /** Prints a Players cgkey to their chat.
- *
- * @param sender the issuer of the command. */
- public void getCgKey(CommandSender sender)
- {
- getLogger().message(sender, "Your current cgkey is ยง6" + getKey((Player) sender));
- }
-
- /** Sets the cgkey of a Player.
- *
- * @param sender the issuer of the command.
- * @param key the key to be set. Set to NULL or "" to get your current key.
- * @return true. */
- @SuppressWarnings("unchecked")
- @Command(hook = "setcgkey")
- public boolean setCgKey(CommandSender sender, String key)
- {
- if (key.length() > 1)
- {
- getLogger().message(sender, true,
- "Could not set your key to ยง6" + key + " ยง7, it can be at most one char.");
- return true;
- }
- if (key == null || key.length() == 0)
- {
- getCgKey(sender);
- return true;
- }
- getLogger().message(sender, "Set your key to ยง6" + key);
- keys.put(((Player) sender).getUniqueId().toString(), key + "");
- saveKeys();
- return true;
- }
-
- /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
- *
- * @param sender the issuer of the command.
- * @return true. */
- @Command(hook = "cgtoggle")
- public boolean cgToggleCommand(CommandSender sender)
- {
- if (getGroup(sender) != null)
- if (cgtoggled.contains(((Player) sender).getUniqueId()))
- {
- cgtoggled.remove(((Player) sender).getUniqueId());
- getLogger().message(sender, "CGT now ยงcdisabled");
- }
- else
- {
- cgtoggled.add(((Player) sender).getUniqueId());
- getLogger().message(sender, "CGT now ยงaenabled");
- }
- else
- getLogger().message(sender, true, "You are not in a chatgroup!");
- return true;
- }
-
- /** Lets a CommandSender leave their group.
- *
- * @param sender the command issuer.
- * @return true. */
- @Command(hook = "cgleave")
- public boolean cgLeave(CommandSender sender)
- {
- String group = removeGroup(sender);
- if (group == null)
- {
- getLogger().message(sender, true, "You were not in a chatgroup!");
- return true;
- }
- String name = Utils.getName(sender);
- sendToGroup(group, "&9" + name + " &7left the group!");
- getLogger().message(sender, "Successfully removed you from your group!");
- if (sender instanceof Player)
- cgtoggled.remove(((Player) sender).getUniqueId());
- return true;
- }
-
- /** Lets a CommandSender join a group.
- *
- * @param sender the command issuer.
- * @param name the name of the group.
- * @return true. */
- @Command(hook = "cgjoin")
- public boolean cgJoin(CommandSender sender, String name)
- {
- String pname = Utils.getName(sender);
- String group = getGroup(sender);
- if (group != null && group.equals(name))
- getLogger().message(sender, true, "You were already in group ยง6" + name);
- else
- {
- setGroup(sender, null);
- if (group != null)
- sendToGroup(group, "&9" + pname + " &7left the group!");
- sendToGroup(name, "&9" + pname + " &7joined the group!");
- setGroup(sender, name);
- getLogger().message(sender, "Successfully joined group ยง6" + name);
- }
- return true;
- }
-
- /** Sends a message to a group.
- *
- * @param sender the sender of the message - the message will be sent to the group of the sender.
- * @param message the message to be sent.
- * @return true. */
- @Command(hook = "cgsay")
- public boolean cgSay(CommandSender sender, String message)
- {
- String group = getGroup(sender);
- if (group != null)
- sendToGroup(sender, message);
- else
- getLogger().message(sender, true, "You are not in a chatgroup right now!");
- return true;
- }
-
- /** Deals with chat events to allow for cgkeys and cgtoggle.
- *
- * @param event the chat event containing the player and the message. */
- @EventHandler
- public void onPlayerChat(AsyncPlayerChatEvent event)
- {
- String group = getGroup(event.getPlayer());
- Player player = event.getPlayer();
- if (group != null)
- {
- if (event.getMessage().startsWith(getKey(player)))
- {
- event.setCancelled(true);
- sendToGroup(event.getPlayer(), event.getMessage().substring(1));
- }
- else if (cgtoggled.contains(event.getPlayer().getUniqueId()))
- {
- event.setCancelled(true);
- sendToGroup(event.getPlayer(), event.getMessage());
- }
- }
- }
-
- /** Finds the group of a CommandSender.
- *
- * @param target the CommandSender to get the group of.
- * @return the group of the target or NULL if he doesn't have one. */
- public static String getGroup(CommandSender target)
- {
- if (target instanceof Player)
- return (String) groups.get(((Player) target).getUniqueId().toString());
- else
- return (String) groups.get("CONSOLE");
- }
-
- /** Sets the group of the CommandSender.
- *
- * @param target the CommandSender to set the group of.
- * @param group the name of the group to join. */
- @SuppressWarnings("unchecked")
- private void setGroup(CommandSender target, String group)
- {
- if (target instanceof Player)
- groups.put(((Player) target).getUniqueId().toString(), group);
- else
- groups.put("CONSOLE", group);
- saveGroups();
- }
-
- /** Removes a CommandSender from their chatgroup. Will also save the groups after finishing
- *
- * @param target the CommandSender to get their group removed. */
- private String removeGroup(CommandSender target)
- {
- String group;
- if (target instanceof Player)
- group = (String) groups.remove(((Player) target).getUniqueId().toString());
- else
- group = (String) groups.remove("CONSOLE");
- saveGroups();
- return group;
- }
-
- /** This method will find the ChatgGroup key of any player.
- *
- * @param player the player to get the key from.
- * @return the key. */
- public static String getKey(Player player)
- {
- String key = (String) keys.get(player.getUniqueId().toString());
- return (key == null ? "" + defaultKey : key);
- }
-
- /** This method sends a message to a chatgroup.
- *
- * @param sender the sender of the message. Also defines which group the message will be sent to.
- * @param message the message to be sent. */
- private void sendToGroup(CommandSender sender, String message)
- {
- String name = Utils.getName(sender);
- String group = getGroup(sender);
- message = ChatAPI.colorify(null, message);
-
- BroadcastFilter ignore = ModuleLoader.exists("Ignore")? Ignore.getIgnoredBy(sender) : null;
- Utils.broadcast("ยง8[ยงbCGยง8] ยง9", name + "ยง8: ยง6" + message, new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
-
- String rgroup = getGroup(recipient);
- if ( rgroup != null && (ignore == null? true : ignore.sendTo(recipient)) )
- return rgroup.equals(group);
- else
- return false;
- }
- });
- if (ModuleLoader.getModule("Socialspy") != null)
- {
- Socialspy.spyBroadcast(sender, "ยงe" + group + " ยงa(cg)", message, "/cg", new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return getGroup(recipient) == null || !getGroup(recipient).equals(group);
- }
- });
- }
- if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group))
- {
- getLogger().info(name + " in " + group + ": " + message + " ยง8(hidden)");
- }
- }
-
- /** This method sends a message to a chatgroup.
- *
- * @param sender the sender of the message. Also defines which group the message will be sent to.
- * @param message the message to be sent. */
- private void sendToGroup(String group, String message)
- {
- message = ChatAPI.colorify(null, message);
- Utils.broadcast(null, message, new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- String rgroup = getGroup(recipient);
- if (rgroup != null)
- return rgroup.equals(group);
- else
- return false;
- }
- });
- if (ModuleLoader.getModule("Socialspy") != null)
- {
- Socialspy.spyBroadcast(Bukkit.getConsoleSender(), "ยงe" + group + " ยงa(cg)", message, "/cg",
- new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return getGroup(recipient) == null || !getGroup(recipient).equals(group);
- }
- });
- }
- if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group))
- {
- getLogger().info("In " + group + ": " + message + " ยง8(hidden)");
- }
- }
-
- /** Saves the groups. */
- private void saveGroups()
- {
- JsonManager.save(groups, groupsLocation);
- }
-
- /** Saves the keys. */
- private void saveKeys()
- {
- JsonManager.save(keys, keysLocation);
- }
-}
diff --git a/src/com/redstoner/modules/check/Check.cmd b/src/com/redstoner/modules/check/Check.cmd
deleted file mode 100644
index 87cadbd..0000000
--- a/src/com/redstoner/modules/check/Check.cmd
+++ /dev/null
@@ -1,8 +0,0 @@
-command check {
- perm utils.check;
-
- [string:player] {
- run checkCommand player;
- help Get info on a player;
- }
-} \ No newline at end of file
diff --git a/src/com/redstoner/modules/check/Check.java b/src/com/redstoner/modules/check/Check.java
deleted file mode 100644
index 48bf579..0000000
--- a/src/com/redstoner/modules/check/Check.java
+++ /dev/null
@@ -1,247 +0,0 @@
-package com.redstoner.modules.check;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Serializable;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-
-import org.bukkit.Bukkit;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.command.CommandSender;
-import org.bukkit.event.Listener;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-
-import com.nemez.cmdmgr.Command;
-import com.nemez.cmdmgr.Command.AsyncType;
-import com.nemez.cmdmgr.CommandManager;
-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.Main;
-import com.redstoner.misc.mysql.JSONManager;
-import com.redstoner.misc.mysql.MysqlHandler;
-import com.redstoner.misc.mysql.elements.ConstraintOperator;
-import com.redstoner.misc.mysql.elements.MysqlConstraint;
-import com.redstoner.misc.mysql.elements.MysqlDatabase;
-import com.redstoner.misc.mysql.elements.MysqlTable;
-import com.redstoner.modules.Module;
-
-import net.nemez.chatapi.click.Message;
-
-@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Check implements Module, Listener
-{
- MysqlTable table;
-
- @Override
- public boolean onEnable()
- {
- Map<Serializable, Serializable> config = JSONManager.getConfiguration("check.json");
- if (config == null || !config.containsKey("database") || !config.containsKey("table"))
- {
- getLogger().error("Could not load the Check config file, disabling!");
- return false;
- }
- try
- {
- MysqlDatabase database = MysqlHandler.INSTANCE
- .getDatabase((String) config.get("database") + "?autoReconnect=true");
- table = database.getTable((String) config.get("table"));
- }
- catch (NullPointerException e)
- {
- getLogger().error("Could not use the Check config, disabling!");
- return false;
- }
- return true;
- }
-
- @Override
- public void postEnable()
- {
- CommandManager.registerCommand(getCommandString(), this, Main.plugin);
- }
-
- @SuppressWarnings("deprecation")
- @Command(hook = "checkCommand", async = AsyncType.ALWAYS)
- public void checkCommand(final CommandSender sender, final String player)
- {
- getLogger().message(sender, "&7Please note that the data may not be fully accurate!");
- OfflinePlayer oPlayer;
- oPlayer = Bukkit.getPlayer(player);
- if (oPlayer == null)
- oPlayer = Bukkit.getServer().getOfflinePlayer(player);
- sendData(sender, oPlayer);
- if (ModuleLoader.exists("Tag"))
- Bukkit.dispatchCommand(sender, "tag check " + player);
- }
-
- public String read(URL url)
- {
- String data = "";
- try
- {
- Scanner in = new Scanner(new InputStreamReader(url.openStream()));
- while (in.hasNextLine())
- {
- data += in.nextLine();
- }
- in.close();
- return data;
- }
- catch (IOException e)
- {}
- return null;
- }
-
- public JSONObject getIpInfo(OfflinePlayer player)
- {
- String ip = "";
- if (player.isOnline())
- {
- ip = player.getPlayer().getAddress().getHostString();
- }
- else
- {
- try
- {
- ip = (String) table.get("last_ip", new MysqlConstraint("uuid", ConstraintOperator.EQUAL,
- player.getUniqueId().toString().replace("-", "")))[0];
- }
- catch (Exception e)
- {
- return null;
- }
- }
- try
- {
- URL ipinfo = new URL("https://ipinfo.io/" + ip + "/json");
- String rawJson = read(ipinfo);
- return (JSONObject) new JSONParser().parse(rawJson);
- }
- catch (Exception e)
- {}
- return null;
- }
-
- public String getFirstJoin(OfflinePlayer player)
- {
- Long firstJoin = player.getFirstPlayed();
- Date date = new Date(firstJoin);
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
- return format.format(date);
- }
-
- public String getLastSeen(OfflinePlayer player)
- {
- Long lastSeen = player.getLastPlayed();
- Date date = new Date(lastSeen);
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
- return format.format(date);
- }
-
- public Object[] getWebsiteData(OfflinePlayer player)
- {
- MysqlConstraint constraint = new MysqlConstraint("uuid", ConstraintOperator.EQUAL,
- player.getUniqueId().toString().replace("-", ""));
- try
- {
- int id = (int) table.get("id", constraint)[0];
- String email = (String) table.get("email", constraint)[0];
- boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
- return new Object[] {"https://redstoner.com/users/" + id, email, confirmed};
- }
- catch (Exception e)
- {
- try
- {
- int id = (int) table.get("id", constraint)[0];
- String email = (String) table.get("email", constraint)[0];
- boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
- return new Object[] {"https://redstoner.com/users/" + id, email, confirmed};
- }
- catch (Exception e2)
- {}
- return new Object[] {null};
- }
- }
-
- public String getCountry(JSONObject data)
- {
- return (String) data.get("country");
- }
-
- public String getAllNames(OfflinePlayer player)
- {
- String uuid = player.getUniqueId().toString().replace("-", "");
- String nameString = "";
- try
- {
- String rawJson = read(new URL("https://api.mojang.com/user/profiles/" + uuid + "/names"));
- JSONArray names = (JSONArray) new JSONParser().parse(rawJson);
- for (Object obj : names)
- {
- nameString += "&e" + ((JSONObject) obj).get("name") + "&7, ";
- }
- nameString = nameString.substring(0, nameString.length() - 2);
- return nameString;
- }
- catch (Exception e)
- {}
- return null;
- }
-
- public void sendData(CommandSender sender, OfflinePlayer player)
- {
- try
- {
- JSONObject ipInfo = getIpInfo(player);
- // data
- String firstJoin = getFirstJoin(player);
- String lastSeen = getLastSeen(player);
- firstJoin = (firstJoin.equals("1970-01-01 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + firstJoin;
- lastSeen = (lastSeen.equals("1970-1-1 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + lastSeen;
- Object[] websiteData = getWebsiteData(player);
- String websiteUrl = (websiteData[0] == null) ? "None" : (String) websiteData[0];
- String email = (websiteData[0] == null) ? "Unknown" : (String) websiteData[1];
- boolean emailNotConfirmed = (websiteData[0] == null) ? false : !((boolean) websiteData[2]);
- String country = (ipInfo == null) ? "Unknown" : getCountry(ipInfo);
- String namesUsed = getAllNames(player);
- if (namesUsed == null)
- namesUsed = "None";
- // messages
- List<Message> messages = new ArrayList<>();
- messages.add(new Message(sender, null).appendText(getLogger().getHeader()));
- messages.add(new Message(sender, null).appendText("&7Data provided by redstoner:"));
- messages.add(new Message(sender, null).appendSuggestHover("&6> UUID: &e" + player.getUniqueId().toString(),
- player.getUniqueId().toString(), "Click to copy into chatbox!"));
- messages.add(new Message(sender, null).appendText("&6> First joined: &e" + firstJoin));
- messages.add(new Message(sender, null).appendText("&6> Last seen: &e" + lastSeen));
- messages.add(
- new Message(sender, null).appendText("&6> Website account: &e").appendLink(websiteUrl, websiteUrl));
- messages.add(new Message(sender, null).appendText("&6> Email: &e")
- .appendText((emailNotConfirmed ? "&6> &4Email NOT Confirmed!&e" : "&e") + email));
- messages.add(new Message(sender, null).appendText("&7Data provided by ipinfo:"));
- messages.add(new Message(sender, null).appendText("&6> Country: &e" + country));
- messages.add(new Message(sender, null).appendText("&7Data provided by mojang:"));
- messages.add(new Message(sender, null).appendText("&6> All ingame names used so far: &e" + namesUsed));
- for (Message m : messages)
- m.send();
- }
- catch (Exception e)
- {
- getLogger().message(sender, true, "Sorry, something went wrong while fetching data");
- e.printStackTrace();
- }
- }
-}
diff --git a/src/com/redstoner/modules/misc/Misc.cmd b/src/com/redstoner/modules/misc/Misc.cmd
deleted file mode 100644
index 2a41104..0000000
--- a/src/com/redstoner/modules/misc/Misc.cmd
+++ /dev/null
@@ -1,50 +0,0 @@
-command tempadd {
- perm pex;
- [string:user] [string:group] {
- help Adds a user to a group for 1w.;
- run tempadddef user group;
- }
- [string:user] [string:group] [string:duration] {
- help Adds a user to a group for a specified duration.;
- run tempadd user group duration;
- }
-}
-command echo {
- [string:text...] {
- help Echoes back to you.;
- run echo text;
- }
-}
-command ping {
- [empty] {
- help Pongs :D;
- run ping;
- }
- [string:password] {
- help Pongs :D;
- run ping2 password;
- }
-}
-command sudo {
- perm utils.sudo;
- [string:name] [string:command...] {
- help Sudo'es another user (or console);
- run sudo name command;
- }
-}
-command hasperm {
- [flag:-f] [string:name] [string:node] {
- perm utils.hasperm;
- run hasperm -f name node;
- help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.;
- }
-}
-command nightvision {
-alias nv;
- [empty] {
- run illuminate;
- type player;
- help Gives the player infinte night vision;
- perm utils.illuminate;
- }
-} \ No newline at end of file
diff --git a/src/com/redstoner/modules/misc/Misc.java b/src/com/redstoner/modules/misc/Misc.java
deleted file mode 100644
index 2a533ed..0000000
--- a/src/com/redstoner/modules/misc/Misc.java
+++ /dev/null
@@ -1,281 +0,0 @@
-package com.redstoner.modules.misc;
-
-import java.util.UUID;
-
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.command.CommandSender;
-import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.Listener;
-import org.bukkit.event.block.BlockBreakEvent;
-import org.bukkit.event.block.BlockFromToEvent;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerTeleportEvent;
-import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
-import org.bukkit.potion.PotionEffect;
-import org.bukkit.potion.PotionEffectType;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-
-import com.nemez.cmdmgr.Command;
-import com.redstoner.annotations.AutoRegisterListener;
-import com.redstoner.annotations.Commands;
-import com.redstoner.annotations.Version;
-import com.redstoner.misc.CommandHolderType;
-import com.redstoner.misc.Utils;
-import com.redstoner.modules.Module;
-import net.nemez.chatapi.ChatAPI;
-import net.nemez.chatapi.click.Message;
-
-@Commands(CommandHolderType.File)
-@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Misc implements Module, Listener
-{
- private final String[] sudoBlacklist = new String[] {"(.*:)?e?sudo", "(.*:)?script.*", "(.*:)?stop",
- "(.*:)?modules", "(.*:)?sayn", "(.*:)?pex", "(.*:)?console_.*", "(.*:)?op", "(.*:)?login", "(.*:)?register",
- "(.*:)?.*pass"};
- JSONObject config;
- JSONArray unprotectedRegions;
-
- @EventHandler
- public void onFirstJoin(PlayerJoinEvent event)
- {
- Player player = event.getPlayer();
- if (!player.hasPlayedBefore())
- {
- Utils.broadcast("", "\nยงaยงlPlease welcome ยงf" + player.getDisplayName() + " ยงaยงlto Redstoner!\n", null);
- String[] message = new String[] {" \n \n \n \n \n \n \n \n \n \n \n \n ",
- " &4Welcome to the Redstoner Server!", " &6Before you ask us things, take a quick",
- " &6look at &a&nredstoner.com/info", " \n&6thank you and happy playing ;)", " \n \n"};
- getLogger().message(player, message);
- }
- Material spawnBlock = player.getLocation().getBlock().getType();
- if (spawnBlock == Material.PORTAL || spawnBlock == Material.ENDER_PORTAL)
- {
- getLogger().message(player, "&4Looks like you spawned in a portal... Let me help you out");
- getLogger().message(player, "&6You can use /back if you &nreally&6 want to go back");
- player.teleport(player.getWorld().getSpawnLocation());
- }
- }
-
- // Disables spectator teleportation
- @EventHandler(priority = EventPriority.LOWEST)
- public void onTeleport(PlayerTeleportEvent event)
- {
- Player player = event.getPlayer();
- if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp"))
- {
- event.setCancelled(true);
- getLogger().message(event.getPlayer(), true, "Spectator teleportation is disabled!");
- }
- }
-
- // Disables water and lava breaking stuff
- @EventHandler
- public void onLiquidFlow(BlockFromToEvent event)
- {
- Material m = event.getToBlock().getType();
- switch (m)
- {
- case AIR:
- case WATER:
- case STATIONARY_WATER:
- case LAVA:
- case STATIONARY_LAVA:
- return;
- default:
- {
- event.setCancelled(true);
- }
- }
- }
-
- @Command(hook = "tempadddef")
- public boolean tempAddDef(CommandSender sender, String user, String group)
- {
- return tempAdd(sender, user, group, "604800");
- }
-
- @Command(hook = "tempadd")
- public boolean tempAdd(CommandSender sender, String user, String group, String duration)
- {
- // Use it to make a proper duration output later. Too lazy rn.
- @SuppressWarnings("unused")
- int i = 0;
- try
- {
- i = Integer.valueOf(duration);
- }
- catch (NumberFormatException e)
- {
- getLogger().message(sender, true, "That is not a valid number!");
- return true;
- }
- Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + duration);
- getLogger().message(sender, "Added to group " + group + "for " + duration + " seconds.");
- return true;
- }
-
- @Command(hook = "echo")
- public boolean echo(CommandSender sender, String text)
- {
- sender.sendMessage(ChatAPI.colorify(null, text));
- return true;
- }
-
- @Command(hook = "ping")
- public boolean ping(CommandSender sender)
- {
- if (sender instanceof Player)
- {
- int ping = getPing((Player) sender);
- getLogger().message(sender, "Your ping is " + ping + "ms.");
- }
- else
- {
- sender.sendMessage("Pong!");
- }
- return true;
- }
-
- @Command(hook = "ping2")
- public boolean ping(CommandSender sender, String password)
- {
- if (password.equals("pong"))
- if (sender instanceof Player)
- {
- int ping = getPing((Player) sender);
- getLogger().message(sender, new String[] {"Your ping is " + ping + "ms.", ping < 20
- ? "&aThat's gr8 m8 r8 8/8"
- : (ping < 50 ? "F&eair enough you cunt!"
- : (ping < 100 ? "&eShite, but not shite enough."
- : "&cLooks like the server is about two months ahead of you. GET A NEW FRIGGIN' ISP ALREADY"))});
- }
- else
- getLogger().message(sender, true,
- "M8 you shitty cunt are not supposed to run this shit it's for players only!!!");
- else
- getLogger().message(sender, true, "&4WRONG PASSWORD, 4/3 ATTEMPTS FAILED! BAN COMMENCING!");
- return true;
- }
-
- public int getPing(Player player)
- {
- return ((CraftPlayer) player).getHandle().ping;
- }
-
- @Command(hook = "sudo")
- public boolean sudo(CommandSender sender, String name, String command)
- {
- CommandSender target;
- if (name.equalsIgnoreCase("console"))
- {
- target = Bukkit.getConsoleSender();
- }
- else
- target = Bukkit.getPlayer(name);
- if (target == null)
- {
- getLogger().message(sender, false, "That player couldn't be found!");
- return true;
- }
- if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender()))
- {
- String[] args = command.split(" ");
- for (String regex : sudoBlacklist)
- {
- if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex))
- {
- getLogger().message(sender, true, "You can't sudo anyone into using that command!");
- return true;
- }
- }
- Bukkit.dispatchCommand(target, command.replaceFirst("/", ""));
- getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into running " + command);
- }
- else
- {
- ((Player) target).chat(command);
- getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into saying " + command);
- }
- return true;
- }
-
- @Command(hook = "hasperm")
- public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node)
- {
- Player p;
- if (name.contains("-"))
- try
- {
- p = Bukkit.getPlayer(UUID.fromString(name));
- }
- catch (Exception e)
- {
- if (noformat)
- sender.sendMessage("ERR: Invalid UUID");
- else
- getLogger().message(sender, "That UUID is not valid!");
- return true;
- }
- else
- p = Bukkit.getPlayer(name);
- if (p == null)
- {
- if (noformat)
- {
- Message m = new Message(sender, null);
- m.appendText("ERR: Invalid player");
- m.send();
- }
- else
- {
- getLogger().message(sender, "That player couldn't be found!");
- }
- return true;
- }
-
- if (noformat)
- {
- Message m = new Message(sender, null);
- m.appendText("" + p.hasPermission(node));
- m.send();
- }
- else
- {
- getLogger().message(sender, "" + p.hasPermission(node));
- }
-
- return true;
- }
-
- public boolean canBuild(Player player, Location location)
- {
- BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player);
- Bukkit.getPluginManager().callEvent(event);
- return event.isCancelled();
- }
-
- PotionEffect nightvision = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false);
-
- @Command(hook = "illuminate")
- public void illuminate(CommandSender sender)
- {
- Player player = (Player) sender;
- if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION))
- {
- player.removePotionEffect(PotionEffectType.NIGHT_VISION);
- getLogger().message(sender, "Night Vision Disabled.");
- }
- else
- {
- player.addPotionEffect(nightvision, true);
- getLogger().message(sender, "Night Vision Enabled.");
- }
- }
-} \ No newline at end of file
diff --git a/src/com/redstoner/modules/motd/Motd.cmd b/src/com/redstoner/modules/motd/Motd.cmd
deleted file mode 100644
index 987d1fe..0000000
--- a/src/com/redstoner/modules/motd/Motd.cmd
+++ /dev/null
@@ -1,14 +0,0 @@
-command setmotd {
- [string:motd...] {
- help Sets the motd. Use --reset to reset to default;
- run setmotd motd;
- perm utils.setmotd;
- }
-}
-command getmotd {
- [empty] {
- help Returns the motd;
- run getmotd;
- perm utils.getmotd;
- }
-} \ No newline at end of file
diff --git a/src/com/earth2me/essentials/utils/DateUtil.java b/src/main/java/com/earth2me/essentials/utils/DateUtil.java
index 80daa36..80daa36 100644
--- a/src/com/earth2me/essentials/utils/DateUtil.java
+++ b/src/main/java/com/earth2me/essentials/utils/DateUtil.java
diff --git a/src/com/redstoner/modules/abot/Abot.cmd b/src/main/java/com/redstoner/modules/abot/Abot.cmd
index c8bb2d8..c8bb2d8 100644
--- a/src/com/redstoner/modules/abot/Abot.cmd
+++ b/src/main/java/com/redstoner/modules/abot/Abot.cmd
diff --git a/src/com/redstoner/modules/abot/Abot.java b/src/main/java/com/redstoner/modules/abot/Abot.java
index 728d61c..3cff0c1 100644
--- a/src/com/redstoner/modules/abot/Abot.java
+++ b/src/main/java/com/redstoner/modules/abot/Abot.java
@@ -21,26 +21,22 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Abot implements Module, Listener
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Abot implements Module, Listener {
private File answerFile = new File(Main.plugin.getDataFolder(), "abot.json");
JSONArray answers;
-
+
@EventHandler
- public void onPlayerChat(AsyncPlayerChatEvent event)
- {
- for (Object rawObject : answers)
- {
+ public void onPlayerChat(AsyncPlayerChatEvent event) {
+ for (Object rawObject : answers) {
JSONObject entry = (JSONObject) rawObject;
JSONArray regexes = (JSONArray) entry.get("regex");
- for (Object regex : regexes)
- {
- if (event.getMessage().toLowerCase().matches((String) regex))
- {
+
+ for (Object regex : regexes) {
+ if (event.getMessage().toLowerCase().matches((String) regex)) {
Object hideperm = entry.get("hide-perm");
- if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm))
- {
+
+ if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm)) {
event.setCancelled(true);
getLogger().message(event.getPlayer(), (String) entry.get("message"));
return;
@@ -49,19 +45,17 @@ public class Abot implements Module, Listener
}
}
}
-
+
@Command(hook = "abot_reload")
- public void loadAnswers(CommandSender sender)
- {
+ public void loadAnswers(CommandSender sender) {
answers = JsonManager.getArray(answerFile);
- if (answers == null)
- answers = new JSONArray();
+ if (answers == null) answers = new JSONArray();
+
getLogger().message(sender, "Loaded the abot.json file!");
}
-
+
@Override
- public boolean onEnable()
- {
+ public boolean onEnable() {
loadAnswers(Bukkit.getConsoleSender());
return true;
}
diff --git a/src/main/java/com/redstoner/modules/abot/module.info b/src/main/java/com/redstoner/modules/abot/module.info
new file mode 100644
index 0000000..3be9a79
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/abot/module.info
@@ -0,0 +1,3 @@
+displayName: Abot
+category: Other
+description: An annoying little bot to automatically answer questions in chat \ No newline at end of file
diff --git a/src/com/redstoner/modules/adminchat/Adminchat.cmd b/src/main/java/com/redstoner/modules/adminchat/Adminchat.cmd
index b083eb9..210a3e9 100644
--- a/src/com/redstoner/modules/adminchat/Adminchat.cmd
+++ b/src/main/java/com/redstoner/modules/adminchat/Adminchat.cmd
@@ -1,42 +1,40 @@
command ac {
+ perm utils.ac;
[string:message...] {
help Sends a message in Admin Chat;
- perm utils.ac;
run ac_msg message;
}
}
command acn {
+ perm utils.ac;
[string:name] [string:message...] {
help Sends a message in Admin Chat;
- perm utils.ac;
type console;
run acn_msg name message;
}
}
command ackey {
+ perm utils.ac;
[string:key] {
help Sets your Admin Chat key;
- perm utils.ac;
type player;
run setackey key;
}
}
command act {
+ perm utils.ac;
on {
help Turns on act;
- perm utils.ac;
run act_on;
}
off {
help Turns off act;
- perm utils.ac;
run act_off;
}
[empty] {
help toggles Admin Chat;
- perm utils.ac;
run act;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/adminchat/Adminchat.java b/src/main/java/com/redstoner/modules/adminchat/Adminchat.java
index d736f8f..3d5974d 100644
--- a/src/com/redstoner/modules/adminchat/Adminchat.java
+++ b/src/main/java/com/redstoner/modules/adminchat/Adminchat.java
@@ -25,190 +25,185 @@ import com.redstoner.modules.Module;
import net.nemez.chatapi.ChatAPI;
-/** AdminChat module. Allows staff to chat to other staff using /ac \<message\> as well as a one char prefix or a toggle.
+/**
+ * AdminChat module. Allows staff to chat to other staff using /ac \<message\>
+ * as well as a one char prefix or a toggle.
*
- * @author Pepich */
+ * @author Pepich
+ */
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Adminchat implements Module, Listener
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Adminchat implements Module, Listener {
private static final char defaultKey = ',';
private static final File keysLocation = new File(Main.plugin.getDataFolder(), "adminchat_keys.json");
private ArrayList<UUID> actoggled;
private static JSONObject keys;
-
+
+ private static final BroadcastFilter AC_PERM_BROADCAST_FILTER = new BroadcastFilter() {
+ @Override
+ public boolean sendTo(CommandSender recipient) {
+ return recipient.hasPermission("utils.ac");
+ }
+ };
+
@Override
- public boolean onEnable()
- {
+ public boolean onEnable() {
keys = JsonManager.getObject(keysLocation);
- if (keys == null)
- {
+
+ if (keys == null) {
keys = new JSONObject();
saveKeys();
}
+
actoggled = new ArrayList<>();
return true;
}
-
+
@Command(hook = "ac_msg")
- public boolean acSay(CommandSender sender, String message)
- {
+ public boolean acSay(CommandSender sender, String message) {
String name;
- if (sender instanceof Player)
- name = ((Player) sender).getDisplayName();
- else
- name = sender.getName();
- Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return recipient.hasPermission("utils.ac");
- }
- });
+
+ if (sender instanceof Player) name = ((Player) sender).getDisplayName();
+ else name = sender.getName();
+
+ Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), AC_PERM_BROADCAST_FILTER);
return true;
}
-
+
@Command(hook = "acn_msg")
- public boolean acnSay(CommandSender sender, String name, String message)
- {
- Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- return recipient.hasPermission("utils.ac");
- }
- });
+ public boolean acnSay(CommandSender sender, String name, String message) {
+ Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), AC_PERM_BROADCAST_FILTER);
return true;
}
-
- /** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat.
+
+ /**
+ * Lets a Player toggle their AC toggle status to allow automatically sending
+ * chat messages to admin chat.
*
* @param sender the issuer of the command.
- * @param _void ignored.
- * @return true. */
+ * @param _void ignored.
+ * @return true.
+ */
@Command(hook = "act")
- public boolean acToggleCommand(CommandSender sender)
- {
- if (actoggled.contains(((Player) sender).getUniqueId()))
- {
+ public boolean acToggleCommand(CommandSender sender) {
+ if (actoggled.contains(((Player) sender).getUniqueId())) {
actoggled.remove(((Player) sender).getUniqueId());
getLogger().message(sender, "ACT now ยงcdisabled");
- }
- else
- {
+ } else {
actoggled.add(((Player) sender).getUniqueId());
getLogger().message(sender, "ACT now ยงaenabled");
}
+
return true;
}
-
- /** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat.
+
+ /**
+ * Lets a Player toggle their AC toggle status to allow automatically sending
+ * chat messages to admin chat.
*
* @param sender the issuer of the command.
- * @return true. */
+ * @return true.
+ */
@Command(hook = "act_on")
- public boolean acToggleOnCommand(CommandSender sender)
- {
- if (!actoggled.contains(((Player) sender).getUniqueId()))
- {
+ public boolean acToggleOnCommand(CommandSender sender) {
+ if (!actoggled.contains(((Player) sender).getUniqueId())) {
actoggled.add(((Player) sender).getUniqueId());
getLogger().message(sender, "ACT now ยงaenabled");
- }
- else
+ } else {
getLogger().message(sender, "ACT was already enabled");
+ }
+
return true;
}
-
- /** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat.
+
+ /**
+ * Lets a Player toggle their AC toggle status to allow automatically sending chat messages to admin chat.
*
* @param sender the issuer of the command.
- * @return true. */
+ * @return true.
+ */
@Command(hook = "act_off")
- public boolean acToggleOffCommand(CommandSender sender)
- {
- if (actoggled.contains(((Player) sender).getUniqueId()))
- {
+ public boolean acToggleOffCommand(CommandSender sender) {
+ if (actoggled.contains(((Player) sender).getUniqueId())) {
actoggled.remove(((Player) sender).getUniqueId());
getLogger().message(sender, "ACT now ยงcdisabled");
- }
- else
- {
+ } else {
getLogger().message(sender, "ACT was already disabled");
}
+
return true;
}
-
- /** Deals with chat events to allow for ackeys and actoggle.
+
+ /**
+ * Deals with chat events to allow for ackeys and actoggle.
*
- * @param event the chat event containing the player and the message. */
+ * @param event the chat event containing the player and the message.
+ */
@EventHandler
- public void onPlayerChat(AsyncPlayerChatEvent event)
- {
+ public void onPlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
- if (!player.hasPermission("utils.ac"))
- return;
- if (event.getMessage().startsWith(getKey(player)))
- {
+
+ if (!player.hasPermission("utils.ac")) return;
+
+ if (event.getMessage().startsWith(getKey(player))) {
event.setCancelled(true);
acSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), ""));
- }
- else if (actoggled.contains(event.getPlayer().getUniqueId()))
- {
+ } else if (actoggled.contains(event.getPlayer().getUniqueId())) {
event.setCancelled(true);
acSay(event.getPlayer(), event.getMessage());
}
}
-
- /** Sets the ackey of a Player.
+
+ /**
+ * Sets the ackey of a Player.
*
* @param sender the issuer of the command.
- * @param key the key to be set. Set to NULL or "" to get your current key.
- * @return true. */
+ * @param key the key to be set. Set to NULL or "" to get your current key.
+ * @return true.
+ */
@SuppressWarnings("unchecked")
@Command(hook = "setackey")
- public boolean setAcKey(CommandSender sender, String key)
- {
- if (key.length() > 1)
- {
- getLogger().message(sender, true,
- "Could not set your key to ยง6" + key + " ยง7, it can be at most one char.");
+ public boolean setAcKey(CommandSender sender, String key) {
+ if (key.length() > 1) {
+ getLogger().message(sender, true, "Could not set your key to ยง6" + key + " ยง7, it can be at most one char.");
return true;
}
- if (key == null || key.length() == 0)
- {
+
+ if (key == null || key.length() == 0) {
getAcKey(sender);
return true;
}
+
getLogger().message(sender, "Set your key to ยง6" + key);
keys.put(((Player) sender).getUniqueId().toString(), key + "");
+
saveKeys();
return true;
}
-
- /** This method will find the AdminChat key of any player.
+
+ /**
+ * This method will find the AdminChat key of any player.
*
* @param player the player to get the key from.
- * @return the key. */
- public static String getKey(Player player)
- {
+ * @return the key.
+ */
+ public static String getKey(Player player) {
String key = (String) keys.get(player.getUniqueId().toString());
return (key == null ? "" + defaultKey : key);
}
-
- /** Prints a Players ackey to their chat.
+
+ /**
+ * Prints a Player's ackey to their chat.
*
- * @param sender the issuer of the command. */
- public void getAcKey(CommandSender sender)
- {
+ * @param sender the issuer of the command.
+ */
+ public void getAcKey(CommandSender sender) {
getLogger().message(sender, "Your current ackey is ยง6" + getKey((Player) sender));
}
-
+
/** Saves the keys. */
- private void saveKeys()
- {
+ private void saveKeys() {
JsonManager.save(keys, keysLocation);
}
}
diff --git a/src/main/java/com/redstoner/modules/adminchat/module.info b/src/main/java/com/redstoner/modules/adminchat/module.info
new file mode 100644
index 0000000..90f4391
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/adminchat/module.info
@@ -0,0 +1,3 @@
+displayName: Adminchat
+category: Staff
+description: A secondary chat used for staff to communicate with each other \ No newline at end of file
diff --git a/src/com/redstoner/modules/afk/AFK.cmd b/src/main/java/com/redstoner/modules/afk/AFK.cmd
index 45483da..6353e33 100644
--- a/src/com/redstoner/modules/afk/AFK.cmd
+++ b/src/main/java/com/redstoner/modules/afk/AFK.cmd
@@ -2,13 +2,19 @@ command afk {
alias eafk;
alias away;
alias eaway;
+
+ perm utils.afk;
+
[empty] {
run afk;
- perm utils.afk;
}
- [string:reason...] {
- run afk2 reason;
- perm utils.afk;
+
+ [optional:-s] {
+ run afksilent -s;
+ }
+
+ [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
new file mode 100644
index 0000000..ee96137
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/afk/AFK.java
@@ -0,0 +1,100 @@
+package com.redstoner.modules.afk;
+
+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.Utils;
+import com.redstoner.modules.Module;
+import com.redstoner.modules.datamanager.DataManager;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.event.HandlerList;
+
+@Commands(CommandHolderType.File)
+@AutoRegisterListener
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class AFK implements Module {
+ private AFKListener listener;
+
+ @Override
+ public void firstLoad() {
+ String[] choices = new String[] { "listen", "ignore" };
+
+ DataManager.setConfig("indicator", "&7[AFK]");
+
+ DataManager.setConfig("move", "listen", choices);
+ DataManager.setConfig("look", "ignore", choices);
+ DataManager.setConfig("chat", "listen", choices);
+ DataManager.setConfig("interact", "listen", choices);
+ DataManager.setConfig("command", "ignore", choices);
+ }
+
+ @Override
+ public void migrate(Version old) {
+ if (old.major() == 4 && old.minor() == 0 && old.revision() == 3) {
+ String[] choices = new String[] { "listen", "ignore" };
+ DataManager.setConfig("look", "ignore", choices);
+ }
+ }
+
+ @Override
+ public void postEnable() {
+ listener = new AFKListener();
+
+ Bukkit.getServer().getPluginManager().registerEvents(listener, ModuleLoader.getPlugin());
+ update_afk_listeners(Bukkit.getConsoleSender());
+ }
+
+ @Override
+ public void onDisable() {
+ HandlerList.unregisterAll(listener);
+ }
+
+ @Command(hook = "afk")
+ public boolean afk(CommandSender sender) {
+ return afk(sender, false, "");
+ }
+
+ @Command(hook = "afksilent")
+ public boolean afk(CommandSender sender, boolean silent) {
+ return afk(sender, silent, "");
+ }
+
+ @Command(hook = "afkreason")
+ public boolean afk(CommandSender sender, boolean silent, String reason) {
+ if (AFKUtil.isAfk(sender)) {
+ AFKUtil.unAfk(sender, silent);
+ } else {
+ DataManager.setData(sender, "afk_time", System.currentTimeMillis());
+ DataManager.setData(sender, "afk_reason", reason);
+ DataManager.setState(sender, "afk_silent", silent);
+ DataManager.setState(sender, "afk", true);
+
+ if (!silent) Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is now AFK", null);
+ }
+
+ return true;
+ }
+
+ private boolean getListenSetting(String name, String def) {
+ return DataManager.getConfigOrDefault(name, def).equals("listen");
+ }
+
+ @Command(hook = "update_afk_listeners")
+ public boolean update_afk_listeners(CommandSender sender) {
+ Utils.broadcast(null, "Updating afk listeners...", recipient -> recipient.hasPermission("utils.afk.admin"));
+
+ listener.listenTo(
+ getListenSetting("move", "listen"),
+ getListenSetting("look", "ignore"),
+ getListenSetting("chat", "listen"),
+ getListenSetting("interact", "listen"),
+ getListenSetting("command", "ignore")
+ );
+
+ return true;
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/afk/AFKListener.java b/src/main/java/com/redstoner/modules/afk/AFKListener.java
new file mode 100644
index 0000000..fab0b5e
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/afk/AFKListener.java
@@ -0,0 +1,64 @@
+package com.redstoner.modules.afk;
+
+import com.redstoner.misc.Utils;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.*;
+
+public class AFKListener implements Listener {
+ private boolean
+ move = false,
+ look = false,
+ chat = false,
+ interact = false,
+ command = false;
+
+ protected void listenTo(boolean move, boolean look, boolean chat, boolean interact, boolean command) {
+ this.move = move;
+ this.look = look;
+ this.chat = chat;
+ this.interact = interact;
+ this.command = command;
+
+ String lt = "Listening to:";
+
+ if (move) lt += " move";
+ if (look) lt += " look";
+ if (chat) lt += " chat";
+ if (interact) lt+= " interact";
+ if (command) lt += " command";
+
+ Utils.broadcast(null, lt, recipient -> recipient.hasPermission("utils.afk.admin"));
+ }
+
+ @EventHandler
+ public void onMove(PlayerMoveEvent event) {
+ 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());
+ }
+
+ @EventHandler
+ @SuppressWarnings("deprecation")
+ public void onChat(PlayerChatEvent event) {
+ if (chat) AFKUtil.checkedUnAfk(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onInteract(PlayerInteractEvent event) {
+ if (interact) AFKUtil.checkedUnAfk(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onCommand(PlayerCommandPreprocessEvent event) {
+ if (command) AFKUtil.checkedUnAfk(event.getPlayer());
+ }
+
+ @EventHandler
+ public void onLeave(PlayerQuitEvent event) {
+ AFKUtil.unAfk(event.getPlayer(), true);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/afk/AFKUtil.java b/src/main/java/com/redstoner/modules/afk/AFKUtil.java
new file mode 100644
index 0000000..3746632
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/afk/AFKUtil.java
@@ -0,0 +1,30 @@
+package com.redstoner.modules.afk;
+
+import com.redstoner.misc.Utils;
+import com.redstoner.modules.datamanager.DataManager;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+public class AFKUtil {
+ protected static void unAfk(CommandSender sender, boolean silent) {
+ DataManager.setState(sender, "afk", false);
+
+ if (!silent) Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is no longer AFK", null);
+ }
+
+ protected static boolean isAfk(CommandSender sender) {
+ return DataManager.getState(sender, "afk");
+ }
+
+ protected static boolean isVanished(Player player) {
+ return DataManager.getState(player, "vanished");
+ }
+
+ protected static boolean isSilent(CommandSender sender) {
+ return DataManager.getState(sender, "afk_silent");
+ }
+
+ protected static void checkedUnAfk(Player player) {
+ if (isAfk(player) && !isVanished(player)) unAfk(player, isSilent(player));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/afk/module.info b/src/main/java/com/redstoner/modules/afk/module.info
new file mode 100644
index 0000000..fb1fca6
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/afk/module.info
@@ -0,0 +1,3 @@
+displayName: AFK
+category: Chat
+description: Allows a user to announce they're afk ,and will also notify players messaging them, that they're afk and might not see the message \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java
new file mode 100644
index 0000000..ae7799e
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java
@@ -0,0 +1,42 @@
+package com.redstoner.modules.blockplacemods;
+
+import com.redstoner.modules.datamanager.DataManager;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
+
+public class BlockPlaceMod implements Listener {
+ public final String name;
+ public final String[] aliases;
+ public final String description;
+ public final ModType type;
+ public final String typeDescription;
+
+ public final boolean enabledByDefault;
+
+ protected BlockPlaceMod(String name, String description, ModType type, String typeDescription, boolean enabledByDefault, String... aliases) {
+ this.name = name;
+ this.aliases = aliases;
+ this.description = description;
+
+ this.type = type;
+ this.typeDescription = typeDescription;
+
+ this.enabledByDefault = enabledByDefault;
+ }
+
+ protected final boolean hasEnabled(Player player) {
+ String uuid = player.getUniqueId().toString();
+ return (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", name, enabledByDefault);
+ }
+
+ protected final Object getState(Player player) {
+ String uuid = player.getUniqueId().toString();
+ return DataManager.getOrDefault(uuid, "BlockPlaceMods", name + "_state", null);
+ }
+
+ public boolean onEnable() {
+ return true;
+ }
+
+ public void onDisable() {}
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd
new file mode 100644
index 0000000..5e1206c
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd
@@ -0,0 +1,43 @@
+command bpm {
+ alias set;
+ alias toggle;
+ alias mod;
+
+ perm blockplacemods.use;
+ type player;
+
+ [empty] {
+ help Lists the block place mods and their statuses.;
+ run list_mods;
+ }
+
+ list [empty] {
+ help Lists the block place mods and their statuses.;
+ run list_mods;
+ }
+
+ reset [string:mod] {
+ help Resets the specified mod's settings to the default value.;
+ run reset_mod mod;
+ }
+
+ toggle [string:mod] {
+ help Toggles a block place mod.;
+ run toggle_mod mod;
+ }
+
+ set [string:mod] [string:value] {
+ help Sets the specified mod's state to the specified value. Only works for mods that have a state.;
+ run set_mod_value mod value;
+ }
+
+ [string:mod] {
+ help Toggles a block place mod.;
+ run toggle_mod_no_prefix mod;
+ }
+
+ [string:mod] [string:value] {
+ help Sets the specified mod's state to the specified value. Only works for mods that have a state.;
+ run set_mod_value mod value;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
new file mode 100644
index 0000000..1306235
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java
@@ -0,0 +1,213 @@
+package com.redstoner.modules.blockplacemods;
+
+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.Main;
+import com.redstoner.modules.Module;
+import com.redstoner.modules.blockplacemods.mods.ModBetterDirectional;
+import com.redstoner.modules.blockplacemods.mods.ModCauldron;
+import com.redstoner.modules.blockplacemods.mods.ModSlab;
+import com.redstoner.modules.datamanager.DataManager;
+import net.nemez.chatapi.click.Message;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Commands (CommandHolderType.File)
+@AutoRegisterListener
+@Version (major = 4, minor = 1, 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<>();
+
+ private final BlockPlaceMod[] modsToRegister = {
+ new ModCauldron(),
+ new ModSlab(),
+ new ModBetterDirectional("Observer", Material.OBSERVER, "observers", false),
+ new ModBetterDirectional("Piston", Material.PISTON, "pistons", false),
+ };
+
+ @Override
+ public boolean onEnable() {
+ for (BlockPlaceMod mod : modsToRegister) {
+ mods.put(mod.name.toLowerCase(), mod);
+
+ for (String alias : mod.aliases) {
+ mods.put(alias.toLowerCase(), mod);
+ }
+
+ if (mod.onEnable()) {
+ enabledMods.add(mod);
+ Bukkit.getPluginManager().registerEvents(mod, Main.plugin);
+ } else {
+ getLogger().warn("Failed to enable the mod, &e" + mod.name + "&7!");
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onDisable() {
+ for (BlockPlaceMod mod : enabledMods) {
+ mod.onDisable();
+ HandlerList.unregisterAll(mod);
+ }
+
+ enabledMods.clear();
+ mods.clear();
+ }
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "list_mods")
+ public void listMods(CommandSender sender) {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+
+ Message msg = new Message(sender, sender);
+
+ msg.appendText(getLogger().getHeader() + "\n");
+
+ int curMod = 1;
+ for (BlockPlaceMod mod : modsToRegister) {
+
+ boolean enabled = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name, mod.enabledByDefault);
+ boolean loaded = enabledMods.contains(mod);
+
+ String text = (enabled? "&a" : "&c") + (loaded? "" : "&m") + mod.name;
+ String hover = (enabled? "&aEnabled" : "&cDisabled") + (loaded? "" : "\n&c&oThis mod is not loaded, report to staff!");
+
+ if (mod.type != ModType.STATELESS) {
+ Object state = DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name + "_state", null);
+ if (state != null)
+ hover += ("\n\n&7Value: &e" + state.toString() + "\n&7Type: &e" + mod.type.asString() + " \n&7Meaning: " + mod.typeDescription);
+ }
+
+ hover += "\n\n&7" + mod.description + "\n&e&oClick to " + (enabled? "&c&oDisable" : "&a&oEnable");
+ msg.appendSendChatHover(text, "/bpm " + mod.name, hover);
+
+ if (curMod != modsToRegister.length)
+ msg.appendText("&7, ");
+ curMod++;
+ }
+ msg.appendText("\n\n&2Hover over a mod for details.")
+ .send();
+ }
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "reset_mod")
+ public void resetMod(CommandSender sender, String mod) {
+ BlockPlaceMod bpm = mods.get(mod.toLowerCase());
+
+ if (bpm == null) {
+ getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!");
+ return;
+ }
+
+ Player player = (Player) sender;
+ DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name);
+ DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name + "_state");
+
+ getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been reset back to it's original settings.");
+ }
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod_no_prefix")
+ public void toggleModNoPrefix(CommandSender sender, String mod) {
+ if (mod.equals("help"))
+ try {
+ Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "bpm help 1")).get();
+ } catch (Exception e) {
+ getLogger().message(sender, true, "&4An error accorded trying to show you the help! Please inform a staff member!");
+ e.printStackTrace();
+ }
+ else
+ toggleMod(sender, mod);
+ }
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod")
+ public void toggleMod(CommandSender sender, String mod) {
+ BlockPlaceMod bpm = mods.get(mod.toLowerCase());
+
+ if (bpm == null) {
+ getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!");
+ return;
+ }
+
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+
+ boolean current = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", bpm.name, bpm.enabledByDefault);
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name, !current);
+
+ getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been " + (current ? "&cDisabled&7!" : "&aEnabled&7!"));
+ }
+
+ @Command (async = Command.AsyncType.ALWAYS, hook = "set_mod_value")
+ public void setModValue(CommandSender sender, String mod, String value) {
+ BlockPlaceMod bpm = mods.get(mod.toLowerCase());
+
+ if (bpm == null) {
+ getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!");
+ return;
+ }
+
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+
+ switch (bpm.type) {
+ case STATELESS:
+ getLogger().message(sender, true, "You cannot change the value of a stateless mod!");
+ break;
+ case STRING:
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", value);
+ getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
+ break;
+ case INTEGER:
+ try {
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", Integer.parseInt(value));
+ getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
+ } catch (NumberFormatException e) {
+ getLogger().message(sender, true, "The specified value must be an integer!");
+ }
+ break;
+ case UNSIGNED_INTEGER:
+ try {
+ int val = Integer.parseInt(value);
+
+ if (val < 0) {
+ getLogger().message(sender, true, "The specified value must be zero or a positive integer!");
+ break;
+ }
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val);
+ getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
+ } catch (NumberFormatException e) {
+ getLogger().message(sender, true, "The specified value must be zero or a positive integer!");
+ }
+ break;
+ case REDSTONE_LEVEL:
+ try {
+ int val = Integer.parseInt(value);
+
+ if (val < 1 || val > 15) {
+ getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!");
+ break;
+ }
+ DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val);
+ getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
+ } catch (NumberFormatException e) {
+ getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!");
+ }
+ break;
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/ModType.java b/src/main/java/com/redstoner/modules/blockplacemods/ModType.java
new file mode 100644
index 0000000..d7511d2
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/ModType.java
@@ -0,0 +1,19 @@
+package com.redstoner.modules.blockplacemods;
+
+public enum ModType {
+ STATELESS("Stateless"),
+ INTEGER("Integer"),
+ UNSIGNED_INTEGER("Positive Integer"),
+ STRING("String"),
+ REDSTONE_LEVEL("Redstone Level");
+
+ private String asString;
+
+ private ModType(String asString) {
+ this.asString = asString;
+ }
+
+ public String asString() {
+ return asString;
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java
new file mode 100644
index 0000000..99a9f5d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java
@@ -0,0 +1,73 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.data.Directional;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockPlaceEvent;
+
+public class ModBetterDirectional extends BlockPlaceMod {
+ private static final BlockFace[][][] dirMap = {
+ {
+ { null, null, null },
+ { null, BlockFace.WEST, null }, // (-1, 0, 0)
+ { null, null, null }
+ },
+ {
+ { null, BlockFace.DOWN, null }, // (0, -1, 0)
+ { BlockFace.NORTH, BlockFace.SELF, BlockFace.SOUTH }, // (0, 0, x)
+ { null, BlockFace.UP, null } // (0, 1, 0)
+ },
+ {
+ { null, null, null },
+ { null, BlockFace.EAST, null }, // (1, 0, 0)
+ { null, null, null }
+ }
+ };
+
+ private final Material material;
+
+ public ModBetterDirectional(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()
+ );
+
+ this.material = material;
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getType() == material
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Directional data = (Directional) block.getBlockData();
+
+ data.setFacing(getDirection(event));
+ block.setBlockData(data);
+ }
+ }
+
+ private BlockFace getDirection(BlockPlaceEvent event) {
+ Location original = event.getBlockPlaced().getLocation();
+ Location against = event.getBlockAgainst().getLocation();
+
+ Location dir = original.subtract(against);
+
+ return dirMap[dir.getBlockX() + 1][dir.getBlockY() + 1][dir.getBlockZ() + 1];
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java
new file mode 100644
index 0000000..d28c9ba
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java
@@ -0,0 +1,63 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.GameMode;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.Levelled;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.Action;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+
+public class ModCauldron extends BlockPlaceMod {
+ public ModCauldron() {
+ super(
+ "Cauldron",
+ "With this mod enabled cauldrons are placed filled and cycle on a shiftless right click with an empty hand.",
+ ModType.STATELESS,
+ null,
+ true,
+ "CauldronFill", "AutoCauldron"
+ );
+ }
+
+ @EventHandler
+ public void onPlayerInteract(PlayerInteractEvent event) {
+ if (
+ event.getAction() == Action.RIGHT_CLICK_BLOCK
+ && !event.isCancelled()
+ && !event.getPlayer().isSneaking()
+ && event.getClickedBlock().getType() == Material.CAULDRON
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ && event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR
+ ) {
+ Block block = event.getClickedBlock();
+ Levelled data = (Levelled) block.getBlockData();
+
+ int newLevel = (data.getLevel() + 1) % (data.getMaximumLevel() + 1);
+
+ data.setLevel(newLevel);
+ block.setBlockData(data);
+ }
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getType() == Material.CAULDRON
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Levelled data = (Levelled) block.getBlockData();
+
+ data.setLevel(data.getMaximumLevel());
+ block.setBlockData(data);
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java
new file mode 100644
index 0000000..9e18bef
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java
@@ -0,0 +1,39 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.GameMode;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.type.Slab;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockPlaceEvent;
+
+public class ModSlab extends BlockPlaceMod {
+ public ModSlab() {
+ super(
+ "Slab",
+ "With this mod enabled Slabs are placed on the top half of the block unless you are sneaking.",
+ ModType.STATELESS,
+ null,
+ true,
+ "Step", "AutoSlab", "AutoStep", "SlabRotation", "StepRotation"
+ );
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getBlockData() instanceof Slab
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Slab data = (Slab) block.getBlockData();
+
+ data.setType(Slab.Type.TOP);
+ block.setBlockData(data);
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java
new file mode 100644
index 0000000..a96a2ca
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java
@@ -0,0 +1,78 @@
+package com.redstoner.modules.blockplacemods.mods;
+
+import com.redstoner.misc.Main;
+import com.redstoner.modules.blockplacemods.BlockPlaceMod;
+import com.redstoner.modules.blockplacemods.ModType;
+import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.material.RedstoneTorch;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ModTorch extends BlockPlaceMod {
+ private static final Map<Block, Block> monitorBlocks = new HashMap<>();
+
+ private int monitorId = -1;
+
+ public ModTorch() {
+ super(
+ "Torch",
+ "With this mod enabled redstone torches placed on redstone blocks get auto removed after they turn off.",
+ ModType.STATELESS,
+ null,
+ true,
+ "AutoTorch", "TorchRemoval", "RedstoneTorch"
+ );
+ }
+
+ @Override
+ public boolean onEnable() {
+ monitorId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, () -> {
+ for (Block block : monitorBlocks.keySet()) {
+ Block against = monitorBlocks.get(block);
+
+ if (block.getType() != Material.REDSTONE_TORCH || against.getType() != Material.REDSTONE_BLOCK) {
+ monitorBlocks.remove(block);
+ return;
+ }
+
+ RedstoneTorch data = (RedstoneTorch) block.getBlockData();
+
+ if (!data.isPowered()) {
+ block.setType(Material.AIR);
+ }
+ }
+ }, 2, 2);
+
+ return monitorId != -1;
+ }
+
+ @Override
+ public void onDisable() {
+ Bukkit.getScheduler().cancelTask(monitorId);
+ monitorId = -1;
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+ if (
+ event.getBlock().getType() == Material.REDSTONE_TORCH
+ && !event.getPlayer().isSneaking()
+ && hasEnabled(event.getPlayer())
+ && event.getPlayer().getGameMode() == GameMode.CREATIVE
+ ) {
+ Block block = event.getBlock();
+ Block against = event.getBlockAgainst();
+
+ if (against.getType() == Material.REDSTONE_BLOCK) {
+ monitorBlocks.put(block, against);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/blockplacemods/module.info b/src/main/java/com/redstoner/modules/blockplacemods/module.info
new file mode 100644
index 0000000..2d1904f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/blockplacemods/module.info
@@ -0,0 +1,3 @@
+displayName: BlockPlaceMods
+category: Other
+description: Adds features to block placing. \ No newline at end of file
diff --git a/src/com/redstoner/modules/chat/Chat.cmd b/src/main/java/com/redstoner/modules/chat/Chat.cmd
index fdd65e3..339e128 100644
--- a/src/com/redstoner/modules/chat/Chat.cmd
+++ b/src/main/java/com/redstoner/modules/chat/Chat.cmd
@@ -1,12 +1,12 @@
command me {
- perm utils.me;
+ perm utils.chat.me;
[string:text...] {
help /me's in chat.;
run me text;
}
}
command action {
- perm utils.action;
+ perm utils.chat.action;
[string:text...] {
help /action's in chat.;
run action text;
@@ -14,34 +14,41 @@ command action {
}
command chat {
alias speak;
+ perm utils.chat;
[string:message...] {
- perm utils.chat;
run chat message;
help A way to speak in normal chat with normal formatting if you have ACT or CGT on.;
}
}
+command chatn {
+ alias speakn;
+ perm utils.chat.chatn;
+ [string:name] [string:message...] {
+ run chatn name message;
+ help A way to speak in normal chat with normal formatting for console users.;
+ }
+}
command shrug {
+ perm utils.chat.shrug;
[string:message...] {
- perm utils.shrug;
run shrug message;
help Appends the shrug emoticon to the end of your message.;
}
[empty] {
- perm utils.shrug;
run shrugnoarg;
help Just the shrug emoticon.;
}
}
command say {
- [string:message...] {
- perm utils.say;
+ perm utils.chat.say;
+ [string:message...] {
run say message;
help A replacement for the default say command to make the format be more consistant.;
}
}
command sayn {
+ perm utils.chat.sayn;
[string:name] [string:message...] {
- perm utils.sayn;
type console;
run sayn name message;
help A replacement for the default say command to make the format be more consistant.;
@@ -49,25 +56,35 @@ command sayn {
}
command mute {
+ perm utils.chat.mute;
[string:player] {
- perm utils.chat.admin;
run mute player;
help Mutes a player.;
}
}
command print {
+ perm utils.chat.print;
[string:message...] {
- perm utils.print;
run print message;
help A way to just print something in to chat with all the formatting things a user has.;
}
}
command unmute {
+ perm utils.chat.mute;
[string:player] {
- perm utils.chat.admin;
run unmute player;
help Unmutes a player.;
}
}
+
+command chatonly {
+ alias co;
+ perm utilschat.chatonly;
+ [empty] {
+ run chatonly;
+ help Shows that you're onlu able to chat, nothing else.;
+ type player;
+ }
+} \ No newline at end of file
diff --git a/src/com/redstoner/modules/chat/Chat.java b/src/main/java/com/redstoner/modules/chat/Chat.java
index 3c95609..ebe2d07 100644
--- a/src/com/redstoner/modules/chat/Chat.java
+++ b/src/main/java/com/redstoner/modules/chat/Chat.java
@@ -1,7 +1,10 @@
package com.redstoner.modules.chat;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
@@ -11,6 +14,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
import com.nemez.cmdmgr.Command;
import com.redstoner.annotations.AutoRegisterListener;
@@ -25,184 +29,211 @@ 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 = 4, minor = 1, revision = 0, compatible = 4)
-public class Chat implements Module, Listener
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Chat implements Module, Listener {
private final Map<String, String> defaults = new HashMap<>();
-
- public Chat()
- {
- defaults.put("chat", " %n ยง7โ†’ยงr %m");
- defaults.put("me", " ยง7- %n ยง7โ‡ฆ %m");
- defaults.put("action", " ยง7- %n ยง7โ‡ฆ %m");
- defaults.put("say", " ยง7[ยง9%nยง7]:ยงr %m");
- defaults.put("shrug", " %n ยง7โ†’ยงr %m ยฏ\\_(ใƒ„)_/ยฏ");
+ private Set<UUID> chatonly = new HashSet<>();
+
+ public Chat() {
+ defaults.put("chat", " %n %cยง7โ†’ยง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("print", "%m");
+ defaults.put("%c", "ยงc*");
+ defaults.put("%c-hover", "ยงcChat Only");
}
-
+
@Override
- public void firstLoad()
- {
- Module.super.firstLoad();
+ public void firstLoad() {
DataManager.setConfig("chat", defaults.get("chat"));
DataManager.setConfig("me", defaults.get("me"));
DataManager.setConfig("action", defaults.get("action"));
DataManager.setConfig("say", defaults.get("say"));
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"));
}
-
- @EventHandler(priority = EventPriority.MONITOR)
- public void onPlayerChat(AsyncPlayerChatEvent event)
- {
- if (event.isCancelled())
- return;
+
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onPlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
String message = event.getMessage();
+
event.setCancelled(true);
broadcastFormatted("chat", player, message, event);
}
-
+
+ @EventHandler
+ public void onLeave(PlayerQuitEvent event) {
+ chatonly.remove(event.getPlayer().getUniqueId());
+ }
+
@Command(hook = "me")
- public boolean me(CommandSender sender, String message)
- {
+ public boolean me(CommandSender sender, String message) {
broadcastFormatted("me", sender, message);
return true;
}
-
+
@Command(hook = "chat")
- public boolean chat(CommandSender sender, String message)
- {
+ public boolean chat(CommandSender sender, String message) {
broadcastFormatted("chat", sender, message);
return true;
}
-
+
+ @Command(hook = "chatn")
+ public boolean chatn(CommandSender sender, String name, String message) {
+ broadcastFormatted("chat", sender, message, name);
+ return true;
+ }
+
@Command(hook = "action")
- public boolean action(CommandSender sender, String message)
- {
+ public boolean action(CommandSender sender, String message) {
broadcastFormatted("action", sender, message);
return true;
}
-
+
@Command(hook = "say")
- public boolean say(CommandSender sender, String message)
- {
+ public boolean say(CommandSender sender, String message) {
String name;
- if (sender instanceof Player)
- name = ((Player) sender).getName();
- else
- name = "ยง9CONSOLE";
+
+ if (sender instanceof Player) name = ((Player) sender).getName();
+ else name = "ยง9CONSOLE";
+
broadcastFormatted("say", sender, message, name);
return true;
}
-
+
@Command(hook = "sayn")
- public boolean say(CommandSender sender, String name, String message)
- {
+ public boolean say(CommandSender sender, String name, String message) {
broadcastFormatted("say", sender, message, name);
return true;
}
-
+
@Command(hook = "shrug")
- public boolean shrug(CommandSender sender, String message)
- {
+ public boolean shrug(CommandSender sender, String message) {
broadcastFormatted("shrug", sender, message);
return true;
}
-
+
@Command(hook = "shrugnoarg")
- public boolean shrug(CommandSender sender)
- {
+ public boolean shrug(CommandSender sender) {
broadcastFormatted("shrug", sender, "");
return true;
}
-
+
@Command(hook = "print")
- public boolean print(CommandSender sender, String message)
- {
+ public boolean print(CommandSender sender, String message) {
broadcastFormatted("print", sender, message);
return true;
}
-
+
@Command(hook = "mute")
- public boolean mute(CommandSender sender, String player)
- {
+ public boolean mute(CommandSender sender, String player) {
Player p = Bukkit.getPlayer(player);
- if (p == null)
- {
+
+ if (p == null) {
getLogger().message(sender, true, "That player couldn't be found!");
return true;
}
+
DataManager.setData(p, "muted", true);
+
getLogger().message(sender, "Muted player &e" + Utils.getName(p) + "&7!");
getLogger().message(p, "You have been &cmuted&7!");
+
return true;
}
-
+
@Command(hook = "unmute")
- public boolean unmute(CommandSender sender, String player)
- {
+ public boolean unmute(CommandSender sender, String player) {
Player p = Bukkit.getPlayer(player);
- if (p == null)
- {
+
+ if (p == null) {
getLogger().message(sender, true, "That player couldn't be found!");
return true;
}
+
DataManager.setData(p, "muted", false);
+
getLogger().message(sender, "Unmuted player &e" + Utils.getName(p) + "&7!");
getLogger().message(p, "You have been &aunmuted&7!");
+
return true;
}
-
- public boolean broadcastFormatted(String format, CommandSender sender, String message)
- {
+
+ @Command(hook = "chatonly")
+ public void chatonly(CommandSender sender) {
+ UUID uuid = ((Player) sender).getUniqueId();
+
+ if (chatonly.contains(uuid)) {
+ chatonly.remove(uuid);
+ getLogger().message(sender, "You are no longer tagged with being only able to chat.");
+ } else {
+ chatonly.add(uuid);
+ getLogger().message(sender, "You are now tagged with being only able to chat.");
+ }
+ }
+
+ public boolean broadcastFormatted(String format, CommandSender sender, String message) {
return broadcastFormatted(format, sender, message, Utils.getName(sender), null);
}
-
- public boolean broadcastFormatted(String format, CommandSender sender, String message, String name)
- {
+
+ public boolean broadcastFormatted(String format, CommandSender sender, String message, String name) {
return broadcastFormatted(format, sender, message, name, null);
}
-
- public boolean broadcastFormatted(String format, CommandSender sender, String message, AsyncPlayerChatEvent event)
- {
+
+ public boolean broadcastFormatted(String format, CommandSender sender, String message, AsyncPlayerChatEvent event) {
return broadcastFormatted(format, sender, message, Utils.getName(sender), event);
}
-
- public boolean broadcastFormatted(String format, CommandSender sender, String message, String name,
- AsyncPlayerChatEvent event)
- {
- if ((boolean) DataManager.getOrDefault(sender, "muted", false))
- {
+
+ public boolean broadcastFormatted(String format, CommandSender sender, String message, String name, AsyncPlayerChatEvent event) {
+ boolean isChatOnly = sender instanceof Player && chatonly.contains(((Player) sender).getUniqueId());
+
+ if ((boolean) DataManager.getOrDefault(sender, "muted", false)) {
getLogger().message(sender, true, "You have been muted!");
- getLogger().info(" &7User &e" + Utils.getName(sender) + " &7tried to &e" + format + " &7(&e" + message
- + "&7) while being &cmuted&7.");
+ getLogger().info(" &7User &e" + Utils.getName(sender) + " &7tried to &e" + format + " &7(&e" + message + "&7) while being &cmuted&7.");
return false;
}
+
String raw = (String) DataManager.getConfigOrDefault(format, defaults.get(format));
String formatted = raw.replace("%n", name).replace("%m", message);
- Utils.broadcast("", ChatAPI.colorify(sender, formatted),
- wrap(ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null, event));
+ 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"));
+
+ 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);
+
return true;
}
-
- public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event)
- {
- if (event == null)
- return filter;
- else
- return new BroadcastFilter()
- {
- @Override
- public boolean sendTo(CommandSender recipient)
- {
- if (recipient instanceof ConsoleCommandSender)
- return true;
- return filter.sendTo(recipient) && event.getRecipients().contains(recipient);
- }
- };
+
+ public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event) {
+ if (event == null) return filter;
+ else return new BroadcastFilter() {
+ @Override
+ public boolean sendTo(CommandSender recipient) {
+ if (recipient instanceof ConsoleCommandSender || filter == null) return true;
+ return filter.sendTo(recipient) && event.getRecipients().contains(recipient);
+ }
+ };
}
}
diff --git a/src/main/java/com/redstoner/modules/chat/module.info b/src/main/java/com/redstoner/modules/chat/module.info
new file mode 100644
index 0000000..a2ace0e
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/chat/module.info
@@ -0,0 +1,3 @@
+displayName: Chat
+category: Chat
+description: Stylizes chat and adds a bunch of chat commands, including &e/me&7 and &e/shrug \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd b/src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd
new file mode 100644
index 0000000..b84f54c
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd
@@ -0,0 +1,16 @@
+command alias {
+ add [flag:-r] [flag:-rnd] [string:keyword] [string:replacement...] {
+ help Adds a new alias. Set -r to make it a regex-alias. \nSet -rnd to make it a random alias and use `&e || &b` (with the spaces) to separate the results.;
+ run addalias -r -rnd keyword replacement;
+ }
+ del [flag:-r] [flag:-rnd] [string:keyword] {
+ help Deletes an alias. -r indicates if it was a regex-alias and -rnd indicates if it was a random-alias. ;
+ run delalias -r -rnd keyword;
+ }
+ list {
+ help Lists your aliases.;
+ run listaliases;
+ }
+ perm utils.alias;
+ type player;
+} \ No newline at end of file
diff --git a/src/com/redstoner/modules/chatalias/Chatalias.java b/src/main/java/com/redstoner/modules/chatalias/Chatalias.java
index eb13b4d..df7e8e1 100644
--- a/src/com/redstoner/modules/chatalias/Chatalias.java
+++ b/src/main/java/com/redstoner/modules/chatalias/Chatalias.java
@@ -1,9 +1,9 @@
package com.redstoner.modules.chatalias;
import java.io.File;
-import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
@@ -32,286 +32,304 @@ import net.nemez.chatapi.ChatAPI;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Chatalias implements Module, Listener
-{
- private final String[] commands = new String[] {"e?r", "e?m .+?", "e?t", "e?w", "e?msg .+?", "e?message .+?",
- "e?whisper .+?", "e?me", "cgsay", "ac", "bc", "say", "sayn .+?", "chat", "shrug", "action"};
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Chatalias implements Module, Listener {
+ private final String[] commands = new String[] { "e?r", "e?m .+?", "e?t", "e?w", "e?msg .+?", "e?message .+?", "e?whisper .+?", "e?me", "cgsay", "ac", "bc",
+ "say", "sayn .+?", "chat", "shrug", "action", "speak", "chatn", "speakn" };
private JSONObject aliases = new JSONObject();
-
+
@Override
- public boolean onEnable()
- {
- for (Player p : Bukkit.getOnlinePlayers())
- {
+ public boolean onEnable() {
+ for (Player p : Bukkit.getOnlinePlayers()) {
loadAliases(p.getUniqueId());
}
+
return true;
}
-
+
@Override
- public void onDisable()
- {
- for (Object key : aliases.keySet())
- {
+ public void onDisable() {
+ for (Object key : aliases.keySet()) {
UUID uuid = UUID.fromString((String) key);
saveAliases(uuid);
}
}
-
+
@EventHandler
- public void onPlayerJoin(PlayerJoinEvent event)
- {
+ public void onPlayerJoin(PlayerJoinEvent event) {
loadAliases(event.getPlayer().getUniqueId());
}
-
+
@EventHandler
- public void onPlayerLeave(PlayerQuitEvent event)
- {
+ public void onPlayerLeave(PlayerQuitEvent event) {
aliases.remove(event.getPlayer().getUniqueId().toString());
}
-
+
@SuppressWarnings("unchecked")
@EventHandler(priority = EventPriority.LOWEST)
- public void onPlayerChat(AsyncPlayerChatEvent event)
- {
+ public void onPlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
- if (!aliases.containsKey(uuid.toString()))
- {
+
+ if (!aliases.containsKey(uuid.toString())) {
loadAliases(player.getUniqueId());
- if (!aliases.containsKey(uuid.toString()))
- return;
+
+ if (!aliases.containsKey(uuid.toString())) return;
}
+
JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString());
boolean changed = false;
- for (Object key : playerAliases.keySet())
- {
+
+ for (Object key : playerAliases.keySet()) {
String keyword = (String) key;
String replacement = (String) playerAliases.get(key);
- if (keyword.startsWith("R: "))
- {
+
+ if (keyword.startsWith("RND;")) {
+ 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];
+ }
+
+ if (keyword.startsWith("R: ")) {
keyword = keyword.replace("R: ", "");
event.setMessage(event.getMessage().replaceAll(keyword, replacement));
- }
- else
- {
- if (keyword.startsWith("N: "))
- keyword = keyword.replace("N: ", "");
- else
- {
+ } else {
+ if (keyword.startsWith("N: ")) keyword = keyword.replace("N: ", "");
+ else {
changed = true;
playerAliases.put("N: " + key, replacement);
}
+
event.setMessage(event.getMessage().replace(keyword, replacement));
}
+
int maxLength;
- try
- {
+
+ try {
maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length."));
- }
- catch (NumberFormatException e)
- {
+ } catch (NumberFormatException e) {
maxLength = 255;
}
- if (event.getMessage().length() > maxLength)
- {
+
+ if (event.getMessage().length() > maxLength) {
getLogger().message(player, true, "The generated message is too long!");
event.setCancelled(true);
return;
}
}
+
event.setMessage(ChatAPI.colorify(event.getPlayer(), event.getMessage()));
- if (changed)
- saveAliases(uuid);
+
+ if (changed) saveAliases(uuid);
}
-
+
@EventHandler(priority = EventPriority.LOWEST)
- public void onPlayerCommand(PlayerCommandPreprocessEvent event)
- {
- if (event.isCancelled())
- return;
+ public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
+ if (event.isCancelled()) return;
+
boolean listening = false;
String command = "";
- for (String s : commands)
- {
+
+ for (String s : commands) {
command = "^\\/(.*:)?" + s + " ";
- if (event.getMessage().matches(command + ".*"))
- {
+
+ if (event.getMessage().matches(command + ".*")) {
listening = true;
break;
}
}
- if (!listening)
- return;
+
+ if (!listening) return;
+
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString());
String temp = event.getMessage().replaceAll(command, "");
+
command = event.getMessage().replaceAll(Pattern.quote(temp) + "$", "");
event.setMessage(event.getMessage().replaceFirst(Pattern.quote(command), ""));
- for (Object key : playerAliases.keySet())
- {
+
+ for (Object key : playerAliases.keySet()) {
String keyword = (String) key;
String replacement = (String) playerAliases.get(key);
- if (keyword.startsWith("R: "))
- {
+
+ if (keyword.startsWith("RND;")) {
+ keyword = keyword.replace("RND;", "");
+ String[] results = replacement.split(" \\|\\| ");
+
+ int rand = ThreadLocalRandom.current().nextInt(0, results.length);
+
+ replacement = results[rand];
+ }
+
+ if (keyword.startsWith("R: ")) {
keyword = keyword.replace("R: ", "");
event.setMessage(event.getMessage().replaceAll(keyword, replacement));
- }
- else
- {
- if (keyword.startsWith("N: "))
- keyword = keyword.replace("N: ", "");
+ } else {
+ if (keyword.startsWith("N: ")) keyword = keyword.replace("N: ", "");
event.setMessage(event.getMessage().replace(keyword, replacement));
}
+
int maxLength;
- try
- {
+
+ try {
maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length."));
- }
- catch (NumberFormatException e)
- {
+ } catch (NumberFormatException e) {
maxLength = 255;
}
- if (event.getMessage().length() > maxLength)
- {
+
+ if (event.getMessage().length() > maxLength) {
getLogger().message(player, true, "The generated message is too long!");
event.setCancelled(true);
+
return;
}
}
+
event.setMessage(command + event.getMessage());
}
-
+
@SuppressWarnings("unchecked")
@Command(hook = "addalias")
- public boolean addAlias(CommandSender sender, boolean regex, String keyword, String replacement)
- {
- if (regex && keyword.equals(".*"))
- {
+ public boolean addAlias(CommandSender sender, boolean regex, boolean random, String keyword, String replacement) {
+ if (regex && keyword.equals(".*")) {
getLogger().message(sender, true, "You may not define the wildcard regex as an alias.");
return true;
}
+
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
JSONObject data = (JSONObject) aliases.get(uuid.toString());
- keyword = (regex ? "R: " : "N: ") + keyword;
- if (!data.containsKey(keyword))
- {
+ keyword = (random ? "RND;" : "") + (regex ? "R: " : "N: ") + keyword;
+
+ if (!data.containsKey(keyword)) {
int maxAmount;
- try
- {
+
+ try {
maxAmount = Integer.valueOf(getPermissionContent(player, "utils.alias.amount."));
- }
- catch (NumberFormatException e)
- {
+ } catch (NumberFormatException e) {
maxAmount = 25;
}
- if (data.size() == maxAmount)
- {
+
+ if (data.size() == maxAmount) {
getLogger().message(sender, true, "You already reached your maximum of aliases!");
return true;
}
}
+
data.put(keyword, replacement);
- if (sender.hasPermission("essentials.chat.color"))
- getLogger().message(sender,
- "Successfully created alias " + keyword.substring(3) + " ยง7-> " + replacement + " ยง7for you.");
- else
- getLogger().message(sender,
- "Successfully created alias " + keyword.substring(3) + " ยง7-> " + replacement + " ยง7for you.");
+
+ if (sender.hasPermission("essentials.chat.color")) {
+ getLogger().message(sender, "Successfully created alias " + keyword.substring(random ? 7 : 3) + " ยง7-> " + replacement + " ยง7for you.");
+ } else {
+ getLogger().message(sender, "Successfully created alias " + keyword.substring(random ? 7 : 3) + " ยง7-> " + replacement + " ยง7for you.");
+ }
+
saveAliases(uuid);
return true;
}
-
+
@Command(hook = "delalias")
- public boolean delAlias(CommandSender sender, boolean regex, String keyword)
- {
+ public boolean delAlias(CommandSender sender, boolean regex, boolean random, String keyword) {
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
JSONObject data = (JSONObject) aliases.get(uuid.toString());
- keyword = (regex ? "R: " : "N: ") + keyword;
- if (data.remove(keyword) != null)
- {
+
+ keyword = (random ? "RND;" : "") + (regex ? "R: " : "N: ") + keyword;
+
+ if (data.remove(keyword) != null) {
getLogger().message(sender, "Successfully removed the alias!");
saveAliases(uuid);
+
return true;
- }
- else
- {
- getLogger().message(sender, true, "That alias doesn't exist! Hint: regex/no regex does matter for this.");
+ } else {
+ getLogger().message(sender, true, "That alias doesn't exist! Hint: regex/no regex and random/not random does matter for this.");
return true;
}
}
-
+
@Command(hook = "listaliases")
- public boolean listAliases(CommandSender sender)
- {
- ArrayList<String> message = new ArrayList<>();
+ public boolean listAliases(CommandSender sender) {
+ ChatAPI.createMessage(sender).appendText(getLogger().getHeader()).send();
+
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
JSONObject data = (JSONObject) aliases.get(uuid.toString());
- for (Object key : data.keySet())
- message.add((String) key + " ยง7-> " + data.get(key));
- getLogger().message(sender, message.toArray(new String[] {}));
+
+ for (Object key : data.keySet()) {
+ String d_key = (String) key;
+ d_key = d_key.replace("RND;N:", "RND:").replace("RND;R:", "R-RND:");
+
+ ChatAPI.createMessage(sender).appendText(d_key + " ยง7-> " + data.get(key)).send();
+ }
+
return true;
}
-
- private String getPermissionContent(Player player, String permnode)
- {
+
+ private String getPermissionContent(Player player, String permnode) {
Set<PermissionAttachmentInfo> perms = player.getEffectivePermissions();
- for (PermissionAttachmentInfo perm : perms)
- if (perm.getPermission().toString().startsWith(permnode))
- return perm.getPermission().replace(permnode, "");
+
+ for (PermissionAttachmentInfo perm : perms) if (perm.getPermission().toString().startsWith(permnode)) return perm.getPermission().replace(permnode, "");
return null;
}
-
+
@SuppressWarnings("unchecked")
- private void loadAliases(UUID uuid)
- {
+ private void loadAliases(UUID uuid) {
JSONObject defaults = new JSONObject();
- defaults.put("dataFormat", "v1");
+ defaults.put("dataFormat", "v2");
+
JSONObject data = new JSONObject();
data.put("N: ./", "/");
+
defaults.put("data", data);
- JSONObject playerAliases = JsonManager
- .getObject(new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
- if (playerAliases == null)
- {
+
+ JSONObject playerAliases = JsonManager.getObject(new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
+
+ if (playerAliases == null) {
playerAliases = defaults;
}
+
String dataFormat = (String) playerAliases.get("dataFormat");
- if (dataFormat == null)
- {
+
+ if (dataFormat == null) {
JSONObject temp = new JSONObject();
- temp.put("dataFormat", "v1");
+ temp.put("dataFormat", "v2");
+
JSONObject tempAliases = new JSONObject();
- {
- for (Object key : playerAliases.keySet())
- {
- tempAliases.put("N: " + key, playerAliases.get(key));
- }
+
+ for (Object key : playerAliases.keySet()) {
+ tempAliases.put("N: " + key, playerAliases.get(key));
}
+
temp.put("data", tempAliases);
aliases.put(uuid.toString(), temp.get("data"));
- }
- else if (dataFormat.equals("v1"))
+
+ } else if (dataFormat.equals("v2")) {
+ aliases.put(uuid.toString(), playerAliases.get("data"));
+ } else if (dataFormat.equals("v1")) {
aliases.put(uuid.toString(), playerAliases.get("data"));
- else
- {
+ saveAliases(uuid);
+ } else {
getLogger().error("Unknown data format for alias set of player " + uuid.toString());
aliases.put(uuid.toString(), ((JSONObject) defaults.get("data")).clone());
saveAliases(uuid);
}
}
-
+
@SuppressWarnings("unchecked")
- private void saveAliases(UUID uuid)
- {
+ private void saveAliases(UUID uuid) {
JSONObject temp = new JSONObject();
- temp.put("dataFormat", "v1");
+
+ temp.put("dataFormat", "v2");
temp.put("data", aliases.get(uuid.toString()));
+
JsonManager.save(temp, new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
}
}
diff --git a/src/main/java/com/redstoner/modules/chatalias/module.info b/src/main/java/com/redstoner/modules/chatalias/module.info
new file mode 100644
index 0000000..caa70a1
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/chatalias/module.info
@@ -0,0 +1,3 @@
+displayName: ChatAlias
+category: Chat
+description: Allows players to create aliases. For example wb -> Welcome Back \ No newline at end of file
diff --git a/src/com/redstoner/modules/chatgroups/Chatgroups.cmd b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.cmd
index 33fd0c5..8aabdee 100644
--- a/src/com/redstoner/modules/chatgroups/Chatgroups.cmd
+++ b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.cmd
@@ -1,4 +1,5 @@
command cgt {
+ perm utils.chatgroups;
[empty] {
help Toggles your cgtoggle status.;
type player;
@@ -6,6 +7,7 @@ command cgt {
}
}
command cgkey {
+ perm utils.chatgroups;
[string:key] {
help Sets your chatgroup key.;
run setcgkey key;
@@ -13,12 +15,14 @@ command cgkey {
}
}
command cgsay {
+ perm utils.chatgroups;
[string:message...] {
help Chats in your chatgroup.;
run cgsay message;
}
}
command cg {
+ perm utils.chatgroups;
join [string:group] {
help Joins a chatgroup.;
run cgjoin group;
diff --git a/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java
new file mode 100644
index 0000000..6609786
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java
@@ -0,0 +1,363 @@
+package com.redstoner.modules.chatgroups;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.UUID;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.json.simple.JSONObject;
+
+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.BroadcastFilter;
+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.ignore.Ignore;
+import com.redstoner.modules.socialspy.Socialspy;
+
+import net.nemez.chatapi.ChatAPI;
+
+/**
+ * The ChatGroups module. Allows people to have private sub-chats that can be
+ * accessed via a single char prefix or a toggle.
+ *
+ * @author Pepich
+ */
+@Commands(CommandHolderType.File)
+@AutoRegisterListener
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Chatgroups implements Module, Listener {
+ private static final char defaultKey = ':';
+ private static final File groupsLocation = new File(Main.plugin.getDataFolder(), "chatgroups.json");
+ private static final File keysLocation = new File(Main.plugin.getDataFolder(), "chatgroup_keys.json");
+ private ArrayList<UUID> cgtoggled;
+ private static JSONObject groups, keys;
+
+ @Override
+ public boolean onEnable() {
+ groups = JsonManager.getObject(groupsLocation);
+ if (groups == null) {
+ groups = new JSONObject();
+ saveGroups();
+ }
+ keys = JsonManager.getObject(keysLocation);
+ if (keys == null) {
+ keys = new JSONObject();
+ saveKeys();
+ }
+ cgtoggled = new ArrayList<>();
+ return true;
+ }
+
+ @Override
+ public void onDisable() {
+ saveKeys();
+ saveGroups();
+ }
+
+ /**
+ * Prints chatgroup info (like players in the group, groupname) to the sender.
+ *
+ * @param sender the issuer of the command.
+ * @return true.
+ */
+ @SuppressWarnings("unchecked")
+ @Command(hook = "cginfo")
+ public boolean cgInfo(CommandSender sender) {
+ String group = getGroup(sender);
+ if (group == null) getLogger().message(sender, true, "You are not in a chatgroup!");
+ else {
+ ArrayList<String> message = new ArrayList<>();
+ message.add("ยง7Your current chatgroup is: ยง6" + group);
+ ArrayList<String> players = new ArrayList<>();
+ Iterator<String> iter = groups.keySet().iterator();
+ while (iter.hasNext()) {
+ String id = iter.next();
+ if (((String) groups.get(id)).equals(group)) {
+ if (!id.equals("CONSOLE")) {
+ UUID uuid = UUID.fromString(id);
+ Player p = Bukkit.getPlayer(uuid);
+ if (p != null) players.add(p.getDisplayName());
+ else players.add(Bukkit.getOfflinePlayer(UUID.fromString(id)).getName());
+ } else players.add(id);
+ }
+ }
+ StringBuilder sb = new StringBuilder("&6Other players in this group: &9");
+ for (String player : players) {
+ sb.append(player);
+ sb.append("&7, &9");
+ }
+ sb.delete(sb.length() - 2, sb.length());
+ message.add(sb.toString());
+ getLogger().message(sender, message.toArray(new String[] {}));
+ }
+ return true;
+ }
+
+ /**
+ * Prints a Players cgkey to their chat.
+ *
+ * @param sender the issuer of the command.
+ */
+ public void getCgKey(CommandSender sender) {
+ getLogger().message(sender, "Your current cgkey is ยง6" + getKey((Player) sender));
+ }
+
+ /**
+ * Sets the cgkey of a Player.
+ *
+ * @param sender the issuer of the command.
+ * @param key the key to be set. Set to NULL or "" to get your current key.
+ * @return true.
+ */
+ @SuppressWarnings("unchecked")
+ @Command(hook = "setcgkey")
+ public boolean setCgKey(CommandSender sender, String key) {
+ if (key.length() > 1) {
+ getLogger().message(sender, true, "Could not set your key to ยง6" + key + " ยง7, it can be at most one char.");
+ return true;
+ }
+ if (key == null || key.length() == 0) {
+ getCgKey(sender);
+ return true;
+ }
+ getLogger().message(sender, "Set your key to ยง6" + key);
+ keys.put(((Player) sender).getUniqueId().toString(), key + "");
+ saveKeys();
+ return true;
+ }
+
+ /**
+ * Lets a Player toggle their auto-cg status to allow for automatically sending
+ * chat messages to their chatgroup.
+ *
+ * @param sender the issuer of the command.
+ * @return true.
+ */
+ @Command(hook = "cgtoggle")
+ public boolean cgToggleCommand(CommandSender sender) {
+ if (getGroup(sender) != null) if (cgtoggled.contains(((Player) sender).getUniqueId())) {
+ cgtoggled.remove(((Player) sender).getUniqueId());
+ getLogger().message(sender, "CGT now ยงcdisabled");
+ } else {
+ cgtoggled.add(((Player) sender).getUniqueId());
+ getLogger().message(sender, "CGT now ยงaenabled");
+ }
+ else getLogger().message(sender, true, "You are not in a chatgroup!");
+ return true;
+ }
+
+ /**
+ * Lets a CommandSender leave their group.
+ *
+ * @param sender the command issuer.
+ * @return true.
+ */
+ @Command(hook = "cgleave")
+ public boolean cgLeave(CommandSender sender) {
+ String group = removeGroup(sender);
+ if (group == null) {
+ getLogger().message(sender, true, "You were not in a chatgroup!");
+ return true;
+ }
+ String name = Utils.getName(sender);
+ sendToGroup(group, "&9" + name + " &7left the group!");
+ getLogger().message(sender, "Successfully removed you from your group!");
+ if (sender instanceof Player) cgtoggled.remove(((Player) sender).getUniqueId());
+ return true;
+ }
+
+ /**
+ * Lets a CommandSender join a group.
+ *
+ * @param sender the command issuer.
+ * @param name the name of the group.
+ * @return true.
+ */
+ @Command(hook = "cgjoin")
+ public boolean cgJoin(CommandSender sender, String name) {
+ String pname = Utils.getName(sender);
+ String group = getGroup(sender);
+ if (group != null && group.equals(name)) getLogger().message(sender, true, "You were already in group ยง6" + name);
+ else {
+ setGroup(sender, null);
+ if (group != null) sendToGroup(group, "&9" + pname + " &7left the group!");
+ sendToGroup(name, "&9" + pname + " &7joined the group!");
+ setGroup(sender, name);
+ getLogger().message(sender, "Successfully joined group ยง6" + name);
+ }
+ return true;
+ }
+
+ /**
+ * Sends a message to a group.
+ *
+ * @param sender the sender of the message - the message will be sent to the
+ * group of the sender.
+ * @param message the message to be sent.
+ * @return true.
+ */
+ @Command(hook = "cgsay")
+ public boolean cgSay(CommandSender sender, String message) {
+ String group = getGroup(sender);
+ if (group != null) sendToGroup(sender, message);
+ else getLogger().message(sender, true, "You are not in a chatgroup right now!");
+ return true;
+ }
+
+ /**
+ * Deals with chat events to allow for cgkeys and cgtoggle.
+ *
+ * @param event the chat event containing the player and the message.
+ */
+ @EventHandler
+ public void onPlayerChat(AsyncPlayerChatEvent event) {
+ String group = getGroup(event.getPlayer());
+ Player player = event.getPlayer();
+ if (group != null) {
+ if (event.getMessage().startsWith(getKey(player))) {
+ event.setCancelled(true);
+ sendToGroup(event.getPlayer(), event.getMessage().substring(1));
+ } else if (cgtoggled.contains(event.getPlayer().getUniqueId())) {
+ event.setCancelled(true);
+ sendToGroup(event.getPlayer(), event.getMessage());
+ }
+ }
+ }
+
+ /**
+ * Finds the group of a CommandSender.
+ *
+ * @param target the CommandSender to get the group of.
+ * @return the group of the target or NULL if he doesn't have one.
+ */
+ public static String getGroup(CommandSender target) {
+ if (target instanceof Player) return (String) groups.get(((Player) target).getUniqueId().toString());
+ else return (String) groups.get("CONSOLE");
+ }
+
+ /**
+ * Sets the group of the CommandSender.
+ *
+ * @param target the CommandSender to set the group of.
+ * @param group the name of the group to join.
+ */
+ @SuppressWarnings("unchecked")
+ private void setGroup(CommandSender target, String group) {
+ if (target instanceof Player) groups.put(((Player) target).getUniqueId().toString(), group);
+ else groups.put("CONSOLE", group);
+ saveGroups();
+ }
+
+ /**
+ * Removes a CommandSender from their chatgroup. Will also save the groups after
+ * finishing
+ *
+ * @param target the CommandSender to get their group removed.
+ */
+ private String removeGroup(CommandSender target) {
+ String group;
+ if (target instanceof Player) group = (String) groups.remove(((Player) target).getUniqueId().toString());
+ else group = (String) groups.remove("CONSOLE");
+ saveGroups();
+ return group;
+ }
+
+ /**
+ * This method will find the ChatgGroup key of any player.
+ *
+ * @param player the player to get the key from.
+ * @return the key.
+ */
+ public static String getKey(Player player) {
+ String key = (String) keys.get(player.getUniqueId().toString());
+ return (key == null ? "" + defaultKey : key);
+ }
+
+ /**
+ * This method sends a message to a chatgroup.
+ *
+ * @param sender the sender of the message. Also defines which group the
+ * message will be sent to.
+ * @param message the message to be sent.
+ */
+ private void sendToGroup(CommandSender sender, String message) {
+ String name = Utils.getName(sender);
+ String group = getGroup(sender);
+ message = ChatAPI.colorify(null, message);
+
+ BroadcastFilter ignore = ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null;
+ Utils.broadcast("ยง8[ยงbCGยง8] ยง9", name + "ยง8: ยง6" + message, new BroadcastFilter() {
+ @Override
+ public boolean sendTo(CommandSender recipient) {
+
+ String rgroup = getGroup(recipient);
+ if (rgroup != null && (ignore == null ? true : ignore.sendTo(recipient))) return rgroup.equals(group);
+ else return false;
+ }
+ });
+ if (ModuleLoader.getModule("Socialspy") != null) {
+ Socialspy.spyBroadcast(sender, "ยงe" + group + " ยงa(cg)", message, "/cg", new BroadcastFilter() {
+ @Override
+ public boolean sendTo(CommandSender recipient) {
+ return getGroup(recipient) == null || !getGroup(recipient).equals(group);
+ }
+ });
+ }
+ if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) {
+ getLogger().info(name + " in " + group + ": " + message + " ยง8(hidden)");
+ }
+ }
+
+ /**
+ * This method sends a message to a chatgroup.
+ *
+ * @param sender the sender of the message. Also defines which group the
+ * message will be sent to.
+ * @param message the message to be sent.
+ */
+ private void sendToGroup(String group, String message) {
+ message = ChatAPI.colorify(null, message);
+ Utils.broadcast(null, message, new BroadcastFilter() {
+ @Override
+ public boolean sendTo(CommandSender recipient) {
+ String rgroup = getGroup(recipient);
+ if (rgroup != null) return rgroup.equals(group);
+ else return false;
+ }
+ });
+ if (ModuleLoader.getModule("Socialspy") != null) {
+ Socialspy.spyBroadcast(Bukkit.getConsoleSender(), "ยงe" + group + " ยงa(cg)", message, "/cg", new BroadcastFilter() {
+ @Override
+ public boolean sendTo(CommandSender recipient) {
+ return getGroup(recipient) == null || !getGroup(recipient).equals(group);
+ }
+ });
+ }
+ if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) {
+ getLogger().info("In " + group + ": " + message + " ยง8(hidden)");
+ }
+ }
+
+ /** Saves the groups. */
+ private void saveGroups() {
+ JsonManager.save(groups, groupsLocation);
+ }
+
+ /** Saves the keys. */
+ private void saveKeys() {
+ JsonManager.save(keys, keysLocation);
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/chatgroups/module.info b/src/main/java/com/redstoner/modules/chatgroups/module.info
new file mode 100644
index 0000000..553654c
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/chatgroups/module.info
@@ -0,0 +1,3 @@
+displayName: ChatGroups
+category: Chat
+description: Adds a secondary chat for people who speak a different language or working on projects together \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/check/Check.cmd b/src/main/java/com/redstoner/modules/check/Check.cmd
new file mode 100644
index 0000000..1fd7d0d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/check/Check.cmd
@@ -0,0 +1,16 @@
+command check {
+ perm utils.check;
+
+ [string:player] {
+ run checkCommand player;
+ help Get info on a player;
+ }
+}
+command ipinfo {
+ perm utils.check;
+
+ [string:ip] {
+ run ipinfo ip;
+ help Get the info about the given IP.;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/check/Check.java b/src/main/java/com/redstoner/modules/check/Check.java
new file mode 100644
index 0000000..8ebdcc0
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/check/Check.java
@@ -0,0 +1,320 @@
+package com.redstoner.modules.check;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Scanner;
+import java.util.concurrent.ExecutionException;
+
+import com.redstoner.exceptions.NonSaveableConfigException;
+import com.redstoner.misc.mysql.Config;
+import org.bukkit.Bukkit;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.command.CommandSender;
+import org.bukkit.event.Listener;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+
+import com.nemez.cmdmgr.Command;
+import com.nemez.cmdmgr.Command.AsyncType;
+import com.nemez.cmdmgr.CommandManager;
+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.Main;
+import com.redstoner.misc.mysql.MysqlHandler;
+import com.redstoner.misc.mysql.elements.ConstraintOperator;
+import com.redstoner.misc.mysql.elements.MysqlConstraint;
+import com.redstoner.misc.mysql.elements.MysqlDatabase;
+import com.redstoner.misc.mysql.elements.MysqlTable;
+import com.redstoner.modules.Module;
+
+import net.nemez.chatapi.click.Message;
+
+@Commands(CommandHolderType.File)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Check implements Module, Listener {
+ MysqlTable table;
+ String noTableReason;
+
+ @Override
+ public boolean onEnable() {
+ Config config;
+
+ try {
+ config = Config.getConfig("check.json");
+ } catch (IOException | org.json.simple.parser.ParseException e1) {
+ e1.printStackTrace();
+ return false;
+ }
+
+ if (config == null || !config.containsKey("database") || !config.containsKey("table")) {
+ getLogger().warn("Could not load the Check config file, ip info for offline users and website data will be unavaliable!");
+ noTableReason = "Could not load the config file";
+
+ config.put("database", "redstoner");
+ config.put("table", "users");
+
+ try {
+ config.save();
+ getLogger().info("A default config file has been created for you.");
+ } catch (IOException | NonSaveableConfigException e) {
+ getLogger().error("A default config file was unable to be created.");
+ }
+
+ return true;
+ }
+
+ try {
+ getLogger().info("Attempting to load the database and the table, this might take a few seconds.");
+ MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase(config.get("database") + "?autoReconnect=true");
+ table = database.getTable(config.get("table"));
+ } catch (Exception e) {
+ getLogger().warn("Could not use the Check config file, ip info for offline users and website data will be unavaliable!");
+ noTableReason = "Could not use the config file";
+ }
+
+ return true;
+ }
+
+ @Override
+ public void postEnable() {
+ CommandManager.registerCommand(getCommandString(), this, Main.plugin);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Command(hook = "checkCommand", async = AsyncType.ALWAYS)
+ public void checkCommand(final CommandSender sender, final String player) {
+ OfflinePlayer oPlayer = Bukkit.getPlayer(player);
+ if (oPlayer == null) oPlayer = Bukkit.getServer().getOfflinePlayer(player);
+
+ sendData(sender, oPlayer);
+
+ if (ModuleLoader.exists("Tag")) {
+ try {
+ Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "tag check " + player)).get();
+ } catch (ExecutionException | InterruptedException e) {
+ Message msg = new Message(sender, null);
+ msg.appendText("&4Running /tag check failed! Please inform a dev about this incident!");
+
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Command(hook = "ipinfo", async = AsyncType.ALWAYS)
+ public void ipinfo(final CommandSender sender, final String ip) {
+ String[] info = getIpInfo(ip);
+
+ Message msg = new Message(sender, null);
+
+ if (info == null) {
+ msg.appendText("\n&6> &cData Unavailable");
+ } else {
+ String region = info[1];
+ String asn = info[2];
+ String org = info[3];
+
+ msg.appendText("\n&6> IP: ").appendSuggestHover("&e" + ip, ip, "Click to copy!");
+ msg.appendText("\n&6> Region: ").appendSuggestHover("&e" + region, region, "Click to copy!");
+ msg.appendText("\n&6> ASN: ").appendSuggestHover("&e" + asn, asn, "Click to copy!");
+ msg.appendText("\n&6> Org: ").appendSuggestHover("&e" + org, org, "Click to copy!");
+ }
+
+ msg.send();
+ }
+
+ public String read(URL url) {
+ String data = "";
+
+ try {
+ Scanner in = new Scanner(new InputStreamReader(url.openStream()));
+
+ while (in.hasNextLine()) {
+ data += in.nextLine();
+ }
+
+ in.close();
+ return data;
+ } catch (IOException e) {}
+
+ return null;
+ }
+
+ public String[] getIpInfo(OfflinePlayer player) {
+ String ip = "";
+
+ if (player.isOnline()) {
+ ip = player.getPlayer().getAddress().getHostString();
+ } else if (table != null) {
+ try {
+ ip = (String) table.get("last_ip", new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString().replace("-", "")))[0];
+ } catch (Exception e) {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ return getIpInfo(ip);
+ }
+
+ public String[] getIpInfo(String ip) {
+ String[] info = new String[4];
+
+ try {
+ URL ipinfo = new URL("https://ipapi.co/" + ip + "/json");
+ JSONObject json = (JSONObject) new JSONParser().parse(read(ipinfo));
+
+ info[0] = ip;
+
+ Object o_country = json.get("country_name");
+ Object o_region = json.get("region");
+ Object o_asn = json.get("asn");
+ Object o_org = json.get("org");
+
+ String country = o_country == null ? "Unknown" : (String) o_country;
+ String region = o_region == null ? "" : ", " + (String) o_region;
+ String asn = o_asn == null ? "Unknown" : (String) o_asn;
+ String org = o_org == null ? "Unknown" : (String) o_org;
+
+ info[1] = country.equals("") ? "Unknown" : country + (region.equals(", ") ? "" : region);
+ info[2] = asn.equals("") ? "Unknown" : asn;
+ info[3] = org.equals("") ? "Unknown" : org;
+
+ return info;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public String getFirstJoin(OfflinePlayer player) {
+ Long firstJoin = player.getFirstPlayed();
+ Date date = new Date(firstJoin);
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+
+ return format.format(date);
+ }
+
+ public String getLastSeen(OfflinePlayer player) {
+ Long lastSeen = player.getLastPlayed();
+ Date date = new Date(lastSeen);
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+
+ return format.format(date);
+ }
+
+ public Object[] getWebsiteData(OfflinePlayer player) {
+ if (table == null)
+ return null;
+
+ MysqlConstraint constraint = new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString().replace("-", ""));
+
+ try {
+ int id = (int) table.get("id", constraint)[0];
+ String email = (String) table.get("email", constraint)[0];
+ boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
+
+ return new Object[] { "https://redstoner.com/users/" + id, email, confirmed };
+ } catch (Exception e) {
+ try {
+ int id = (int) table.get("id", constraint)[0];
+ String email = (String) table.get("email", constraint)[0];
+ boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
+
+ return new Object[] { "https://redstoner.com/users/" + id, email, confirmed };
+ } catch (Exception e2) {}
+
+ return new Object[] { null };
+ }
+ }
+
+ public String getAllNames(OfflinePlayer player) {
+ String uuid = player.getUniqueId().toString().replace("-", "");
+ String nameString = "";
+
+ try {
+ String rawJson = read(new URL("https://api.mojang.com/user/profiles/" + uuid + "/names"));
+ JSONArray names = (JSONArray) new JSONParser().parse(rawJson);
+
+ for (Object obj : names) {
+ nameString += "&e" + ((JSONObject) obj).get("name") + "&7, ";
+ }
+
+ nameString = nameString.substring(0, nameString.length() - 2);
+ return nameString;
+ } catch (Exception e) {}
+
+ return "None";
+ }
+
+ public void sendData(CommandSender sender, OfflinePlayer player) {
+ try {
+ // data
+ String uuid = player.getUniqueId().toString();
+
+ String firstJoin = getFirstJoin(player);
+ String lastSeen = getLastSeen(player);
+ firstJoin = (firstJoin.equals("1970-01-01 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + firstJoin;
+ lastSeen = (lastSeen.equals("1970-1-1 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + lastSeen;
+
+ Object[] websiteData = getWebsiteData(player);
+
+
+ String[] ipInfo = getIpInfo(player);
+
+ String namesUsed = getAllNames(player);
+
+ // messages
+ Message msg = new Message(sender, null);
+
+ msg.appendText("\n" + getLogger().getHeader());
+ msg.appendText("\n&7Data provided by redstoner:");
+ msg.appendText("\n&6> UUID: ").appendSuggestHover("&e" + uuid, uuid, "Click to copy!");
+ msg.appendText("\n&6> First joined: &e" + firstJoin);
+ msg.appendText("\n&6> Last Seen: &e" + lastSeen);
+
+ if (websiteData != null) {
+ String websiteUrl = (websiteData[0] == null) ? "None" : (String) websiteData[0];
+ String email = (websiteData[0] == null) ? "Unknown" : (String) websiteData[1];
+ boolean emailNotConfirmed = (websiteData[0] == null) ? false : !((boolean) websiteData[2]);
+
+ msg.appendText("\n&6> Website account: &e").appendLink(websiteUrl, websiteUrl);
+ msg.appendText("\n&6> Email: &e" + (emailNotConfirmed ? "\n&6> &cEmail NOT Confirmed!" : "")).appendSuggestHover("&e" + email, email, "Click to copy!");
+ }
+ else {
+ msg.appendTextHover("\n&6> Website account: &cData Unavailable", "&c" + noTableReason);
+ msg.appendTextHover("\n&6> Email: &cData Unavailable", "&c" + noTableReason);
+ }
+ msg.appendText("\n\n&7Data provided by ipapi.co:");
+
+ if (ipInfo == null && table == null) {
+ msg.appendTextHover("\n&6> &cData Unavailable", "&c" + noTableReason);
+ } else if (ipInfo == null) {
+ msg.appendText("\n&6> &cData Unavailable");
+ } else {
+ String ip = ipInfo[0];
+ String region = ipInfo[1];
+ String asn = ipInfo[2];
+ String org = ipInfo[3];
+
+ msg.appendText("\n&6> IP: ").appendSuggestHover("&e" + ip, ip, "Click to copy!");
+ msg.appendText("\n&6> Region: ").appendSuggestHover("&e" + region, region, "Click to copy!");
+ msg.appendText("\n&6> ASN: ").appendSuggestHover("&e" + asn, asn, "Click to copy!");
+ msg.appendText("\n&6> Org: ").appendSuggestHover("&e" + org, org, "Click to copy!");
+ }
+
+ msg.appendText("\n\n&7Data provided by mojang:");
+ msg.appendText("\n&6> All ingame names used so far: &e" + namesUsed);
+ msg.send();
+ } catch (Exception e) {
+ getLogger().message(sender, true, "Sorry, something went wrong while fetching data");
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/check/module.info b/src/main/java/com/redstoner/modules/check/module.info
new file mode 100644
index 0000000..e680102
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/check/module.info
@@ -0,0 +1,3 @@
+displayName: Check
+category: Staff
+description: A tool to get basic data about players, such as forums account, playtimes and similar \ No newline at end of file
diff --git a/src/com/redstoner/modules/clear/Clear.cmd b/src/main/java/com/redstoner/modules/clear/Clear.cmd
index 117804b..0c86e30 100644
--- a/src/com/redstoner/modules/clear/Clear.cmd
+++ b/src/main/java/com/redstoner/modules/clear/Clear.cmd
@@ -7,7 +7,7 @@ command clear{
}
[string:player] {
help Clears someone elses inventory;
- perm utils.admin.clear;
+ perm utils.clear.other;
run clearother player;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/clear/Clear.java b/src/main/java/com/redstoner/modules/clear/Clear.java
index a6ea86f..10e0df8 100644
--- a/src/com/redstoner/modules/clear/Clear.java
+++ b/src/main/java/com/redstoner/modules/clear/Clear.java
@@ -12,33 +12,31 @@ import com.redstoner.misc.CommandHolderType;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Clear implements Module
-{
+@Version(major = 4, minor = 0, revision = 0, compatible = 4)
+public class Clear implements Module {
@Command(hook = "clear")
- public boolean clearInventory(CommandSender sender)
- {
+ public boolean clearInventory(CommandSender sender) {
Player player = (Player) sender;
+
Inventory inv = player.getInventory();
- for (int i = 0; i < 36; i++)
- inv.clear(i);
+ for (int i = 0; i < 36; i++) inv.clear(i);
+
getLogger().message(sender, "Cleared your inventory!");
return true;
}
-
+
@Command(hook = "clearother")
- public boolean clearOtherInventory(CommandSender sender, String name)
- {
+ public boolean clearOtherInventory(CommandSender sender, String name) {
Player player = Bukkit.getPlayer(name);
- if (player == null)
- getLogger().message(sender, true, "That player couldn't be found!");
- else
- {
+
+ if (player == null) getLogger().message(sender, true, "That player couldn't be found!");
+ else {
Inventory inv = player.getInventory();
- for (int i = 0; i < 36; i++)
- inv.clear(i);
+ for (int i = 0; i < 36; i++) inv.clear(i);
+
getLogger().message(sender, "Cleared " + player.getDisplayName() + "&7's inventory!");
}
+
return true;
}
}
diff --git a/src/main/java/com/redstoner/modules/clear/module.info b/src/main/java/com/redstoner/modules/clear/module.info
new file mode 100644
index 0000000..5e5d0b2
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/clear/module.info
@@ -0,0 +1,3 @@
+displayName: Clear
+category: Other
+description: Allows players to clear their inventories \ No newline at end of file
diff --git a/src/com/redstoner/modules/cycle/Cycle.cmd b/src/main/java/com/redstoner/modules/cycle/Cycle.cmd
index dc8e10a..dd67999 100644
--- a/src/com/redstoner/modules/cycle/Cycle.cmd
+++ b/src/main/java/com/redstoner/modules/cycle/Cycle.cmd
@@ -1,12 +1,12 @@
command cycle {
+ perm utils.cycle;
+ type player;
on {
help Turns on cycle;
- type player;
run cycle_on;
}
off {
help Turns off cycle;
- type player;
run cycle_off;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/cycle/Cycle.java b/src/main/java/com/redstoner/modules/cycle/Cycle.java
index b0a6310..40334b1 100644
--- a/src/com/redstoner/modules/cycle/Cycle.java
+++ b/src/main/java/com/redstoner/modules/cycle/Cycle.java
@@ -24,119 +24,109 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Cycle implements Module, Listener
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Cycle implements Module, Listener {
private File cycleFile = new File(Main.plugin.getDataFolder(), "cycle.json");
private JSONArray no_cyclers;
-
+
@Override
- public boolean onEnable()
- {
+ public boolean onEnable() {
no_cyclers = JsonManager.getArray(cycleFile);
- if (no_cyclers == null)
- no_cyclers = new JSONArray();
+ if (no_cyclers == null) no_cyclers = new JSONArray();
+
return true;
}
-
+
@Override
- public void onDisable()
- {
+ public void onDisable() {
saveCyclers();
}
-
- private void saveCyclers()
- {
+
+ private void saveCyclers() {
JsonManager.save(no_cyclers, cycleFile);
}
-
+
@Command(hook = "cycle_on")
- public boolean cycleOn(CommandSender sender)
- {
+ public boolean cycleOn(CommandSender sender) {
UUID uid = ((Player) sender).getUniqueId();
- if (no_cyclers.remove(uid.toString()))
- {
+
+ if (no_cyclers.remove(uid.toString())) {
getLogger().message(sender, "Cycle enabled!");
saveCyclers();
- }
- else
- getLogger().message(sender, "Cycle was already enabled!");
+ } else getLogger().message(sender, "Cycle was already enabled!");
+
return true;
}
-
+
@SuppressWarnings("unchecked")
@Command(hook = "cycle_off")
- public boolean cycleOff(CommandSender sender)
- {
+ public boolean cycleOff(CommandSender sender) {
UUID uid = ((Player) sender).getUniqueId();
- if (!no_cyclers.contains(uid.toString()))
- {
+
+ if (!no_cyclers.contains(uid.toString())) {
getLogger().message(sender, "Cycle disabled!");
no_cyclers.add(uid.toString());
saveCyclers();
- }
- else
- getLogger().message(sender, "Cycle was already disabled!");
+ } else getLogger().message(sender, "Cycle was already disabled!");
+
return true;
}
-
+
@EventHandler
- public void onInventoryCycle(PlayerItemHeldEvent event)
- {
+ public void onInventoryCycle(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
UUID uid = player.getUniqueId();
- if (!player.getGameMode().equals(GameMode.CREATIVE) || player.isSneaking()
- || no_cyclers.contains(uid.toString()))
- return;
+
+ if (!player.getGameMode().equals(GameMode.CREATIVE) || player.isSneaking() || no_cyclers.contains(uid.toString())) return;
+
int prev_slot = event.getPreviousSlot();
int new_slot = event.getNewSlot();
- if (prev_slot == 0 && new_slot == 8)
- shift(player, false);
- else if (prev_slot == 8 && new_slot == 0)
- shift(player, true);
+
+ if (prev_slot == 0 && new_slot == 8) shift(player, false);
+ else if (prev_slot == 8 && new_slot == 0) shift(player, true);
}
-
- private void shift(Player player, boolean down)
- {
+
+ private void shift(Player player, boolean down) {
Inventory inv = player.getInventory();
ItemStack[] items = inv.getStorageContents();
+
int shift = down ? -9 : 9;
shift = (shift + items.length) % items.length;
- for (int i = 0; i < 4; i++)
- {
+
+ for (int i = 0; i < 4; i++) {
items = join(subset(items, shift, items.length), subset(items, 0, shift));
+
ItemStack[] hotbar = subset(items, 0, 9);
boolean found = false;
- for (ItemStack item : hotbar)
- if (item != null)
- {
- found = true;
- break;
- }
- if (found)
+
+ for (ItemStack item : hotbar) if (item != null) {
+ found = true;
break;
+ }
+
+ if (found) break;
}
+
inv.setStorageContents(items);
}
-
- private ItemStack[] subset(ItemStack[] items, int start, int end)
- {
+
+ private ItemStack[] subset(ItemStack[] items, int start, int end) {
ItemStack[] result = new ItemStack[end - start];
- for (int i = start; i < end; i++)
- {
+
+ for (int i = start; i < end; i++) {
result[i - start] = items[i];
}
+
return result;
}
-
- private ItemStack[] join(ItemStack[] items1, ItemStack[] items2)
- {
+
+ private ItemStack[] join(ItemStack[] items1, ItemStack[] items2) {
ItemStack[] result = new ItemStack[items1.length + items2.length];
- for (int i = 0; i < items1.length; i++)
- result[i] = items1[i];
+
+ for (int i = 0; i < items1.length; i++) result[i] = items1[i];
int offset = items1.length;
- for (int i = 0; i < items2.length; i++)
- result[i + offset] = items2[i];
+ for (int i = 0; i < items2.length; i++) result[i + offset] = items2[i];
+
return result;
}
}
diff --git a/src/main/java/com/redstoner/modules/cycle/module.info b/src/main/java/com/redstoner/modules/cycle/module.info
new file mode 100644
index 0000000..ecfd0b0
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/cycle/module.info
@@ -0,0 +1,3 @@
+displayName: Cycle
+category: Other
+description: Basically more hotbars. When you scroll over, it will load the next line of your inventory as your hotbar \ No newline at end of file
diff --git a/src/com/redstoner/modules/damnspam/DamnSpam.cmd b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.cmd
index 404968e..bf7f06a 100644
--- a/src/com/redstoner/modules/damnspam/DamnSpam.cmd
+++ b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.cmd
@@ -1,15 +1,14 @@
command damnspam {
perm utils.damnspam;
+ type player;
[double:seconds] {
run damnspamSingle seconds;
help Set single input cooldown for button or lever.;
- type player;
}
[double:secondsOff] [double:secondsOn] {
run damnspamDouble secondsOff secondsOn;
help Set input cooldown after it's been turned off and turned on (for lever only).;
- type player;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/damnspam/DamnSpam.java b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.java
index d825843..c9e1777 100644
--- a/src/com/redstoner/modules/damnspam/DamnSpam.java
+++ b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.java
@@ -39,309 +39,309 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class DamnSpam implements Module, Listener
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class DamnSpam implements Module, Listener {
File configFile = new File(Main.plugin.getDataFolder(), "DamnSpam.json");
+
Map<String, SpamInput> inputs;
- boolean changingInput = false;
List<Material> acceptedInputs;
+
HashMap<Material, int[][]> attachedBlocks;
HashMap<Player, SpamInput> players;
+
+ boolean changingInput = false;
int maxTimeout = 240;
+
String timeoutErrorString = "The timeout must be -1 or within 0 and " + maxTimeout;
-
+
+ private static final BlockFace[] DIRECTIONS = { BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST };
+
+ private static final int[][] LEVER_ATTACHED_BLOCKS = new int[][] { { 0, 7, 8, 15 }, { 5, 6, 13, 14 }, { 4, 12 }, { 3, 11 }, { 2, 10 }, { 1, 9 } };
+ private static final int[][] BUTTON_ATTACHED_BLOCKS = new int[][] { { 0, 8 }, { 5, 6, 7, 13, 14, 15 }, { 4, 12 }, { 3, 11 }, { 2, 10 }, { 1, 9 } };
+
+ // @formatter:off
+ private static final Material[] BUTTONS = {
+ Material.ACACIA_BUTTON,
+ Material.BIRCH_BUTTON,
+ Material.DARK_OAK_BUTTON,
+ Material.JUNGLE_BUTTON,
+ Material.OAK_BUTTON,
+ Material.SPRUCE_BUTTON,
+ Material.STONE_BUTTON
+ };
+ // @formatter:on
+
@Override
- public boolean onEnable()
- {
+ public boolean onEnable() {
loadInputs();
+
acceptedInputs = new ArrayList<Material>();
- Collections.addAll(acceptedInputs, Material.WOOD_BUTTON, Material.STONE_BUTTON, Material.LEVER);
+ acceptedInputs.add(Material.LEVER);
+
+ Collections.addAll(acceptedInputs, BUTTONS);
+
attachedBlocks = new HashMap<Material, int[][]>();
- attachedBlocks.put(Material.LEVER,
- new int[][] {{0, 7, 8, 15}, {5, 6, 13, 14}, {4, 12}, {3, 11}, {2, 10}, {1, 9}});
- attachedBlocks.put(Material.STONE_BUTTON,
- new int[][] {{0, 8}, {5, 6, 7, 13, 14, 15}, {4, 12}, {3, 11}, {2, 10}, {1, 9}});
- attachedBlocks.put(Material.WOOD_BUTTON,
- new int[][] {{0, 8}, {5, 6, 7, 13, 14, 15}, {4, 12}, {3, 11}, {2, 10}, {1, 9}});
+ attachedBlocks.put(Material.LEVER, LEVER_ATTACHED_BLOCKS);
+
+ for (Material button : BUTTONS) {
+ attachedBlocks.put(button, BUTTON_ATTACHED_BLOCKS);
+ }
+
players = new HashMap<Player, SpamInput>();
return true;
}
-
- public void loadInputs()
- {
+
+ public void loadInputs() {
inputs = new HashMap<String, SpamInput>();
- try
- {
+
+ try {
FileReader reader = new FileReader(configFile);
JSONObject json = (JSONObject) new JSONParser().parse(reader);
- for (Object key : json.keySet())
- {
+
+ for (Object key : json.keySet()) {
JSONObject inputData = (JSONObject) json.get(key);
String uuid = (String) inputData.get("creator");
Double timeoutOn = (Double) inputData.get("timeout_on");
Double timeoutOff = (Double) inputData.get("timeout_off");
Double lastTime = (Double) inputData.get("last_time");
+
inputs.put((String) key, new SpamInput(uuid, timeoutOff, timeoutOn, lastTime));
}
- }
- catch (IOException | ParseException e)
- {
+ } catch (IOException | ParseException e) {
e.printStackTrace();
}
}
-
+
@SuppressWarnings("unchecked")
- public void saveInputs()
- {
+ public void saveInputs() {
JSONObject json = new JSONObject();
- for (String key : inputs.keySet())
- {
+
+ for (String key : inputs.keySet()) {
JSONObject jsonInput = new JSONObject();
SpamInput input = inputs.get(key);
+
jsonInput.put("creator", input.player);
jsonInput.put("timeout_on", input.timeoutOn);
jsonInput.put("timeout_off", input.timeoutOff);
jsonInput.put("last_time", input.lastTime);
+
json.put(key, jsonInput);
}
- try
- {
+ try {
PrintWriter writer = new PrintWriter(configFile);
writer.write(json.toJSONString());
writer.close();
- }
- catch (FileNotFoundException e)
- {
+ } catch (FileNotFoundException e) {
e.printStackTrace();
}
}
-
- public String locationString(Location loc)
- {
+
+ public String locationString(Location loc) {
return loc.getWorld().getName() + ";" + loc.getBlockX() + ";" + loc.getBlockY() + ";" + loc.getBlockZ();
}
-
- public boolean isAcceptableTimeout(double timeout)
- {
+
+ public boolean isAcceptableTimeout(double timeout) {
return (timeout > 0 && timeout <= maxTimeout) || timeout == -1;
}
-
- public boolean canBuild(Player player, Block block)
- {
+
+ public boolean canBuild(Player player, Block block) {
BlockBreakEvent event = new BlockBreakEvent(block, player);
Bukkit.getPluginManager().callEvent(event);
+
return !event.isCancelled();
}
-
+
@Command(hook = "damnspamSingle")
- public void damnspam(CommandSender sender, double seconds)
- {
+ public void damnspam(CommandSender sender, double seconds) {
boolean destroyingInput = false;
+
seconds = (double) Math.round(seconds * 100) / 100;
- if (seconds == 0)
- destroyingInput = true;
- else if (!isAcceptableTimeout(seconds))
- {
+
+ if (seconds == 0) destroyingInput = true;
+ else if (!isAcceptableTimeout(seconds)) {
getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout);
return;
}
+
getLogger().message(sender, "Please click the input you would like to set.");
setPlayer((Player) sender, destroyingInput, seconds, seconds);
}
-
+
@Command(hook = "damnspamDouble")
- public void damnspam(CommandSender sender, double secondsOff, double secondsOn)
- {
+ public void damnspam(CommandSender sender, double secondsOff, double secondsOn) {
boolean destroyingInput = false;
+
secondsOn = (double) Math.round(secondsOn * 100) / 100;
secondsOff = (double) Math.round(secondsOff * 100) / 100;
- if (secondsOn == 0 && secondsOff == 0)
- {
+
+ if (secondsOn == 0 && secondsOff == 0) {
destroyingInput = true;
- }
- else if (!(isAcceptableTimeout(secondsOn) && isAcceptableTimeout(secondsOff)))
- {
+ } else if (!(isAcceptableTimeout(secondsOn) && isAcceptableTimeout(secondsOff))) {
getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout);
return;
}
+
getLogger().message(sender, "Please click the input you would like to set.");
setPlayer((Player) sender, destroyingInput, secondsOff, secondsOn);
}
-
- public void setPlayer(Player player, boolean destroying, double timeoutOff, double timeoutOn)
- {
+
+ public void setPlayer(Player player, boolean destroying, double timeoutOff, double timeoutOn) {
SpamInput input = null;
- if (!destroying)
- {
+
+ if (!destroying) {
input = new SpamInput(player.getUniqueId().toString(), timeoutOff, timeoutOn, 0);
}
+
players.put(player, input);
}
-
- public boolean attemptInputRegister(Player player, Block block, Cancellable event)
- {
- if (players.containsKey(player))
- {
- if (!acceptedInputs.contains(block.getType()))
- {
+
+ public boolean attemptInputRegister(Player player, Block block, Cancellable event) {
+ if (players.containsKey(player)) {
+ if (!acceptedInputs.contains(block.getType())) {
getLogger().message(player, true, "That block is not an acceptable input!");
return true;
}
+
String typeStr = block.getType().toString().toLowerCase().replace("_", " ");
String locationStr = locationString(block.getLocation());
+
changingInput = true;
boolean buildCheck = canBuild(player, block);
changingInput = false;
- if (!buildCheck)
- {
- getLogger().message(player, true,
- "Something went wrong trying to change the timeout on this " + typeStr + "!");
+
+ if (!buildCheck) {
+ getLogger().message(player, true, "Something went wrong trying to change the timeout on this " + typeStr + "!");
event.setCancelled(true);
return true;
}
+
SpamInput input = players.get(player);
- if (input == null)
- {
- if (!inputs.containsKey(locationStr))
- {
- getLogger().message(player, true,
- "Something went wrong trying to change the timeout on this " + typeStr + "!");
+
+ if (input == null) {
+ if (!inputs.containsKey(locationStr)) {
+ getLogger().message(player, true, "Something went wrong trying to change the timeout on this " + typeStr + "!");
event.setCancelled(true);
return true;
}
+
inputs.remove(locationStr);
getLogger().message(player, "Successfully removed the timeout for this " + typeStr);
- }
- else
- {
+ } else {
inputs.put(locationStr, players.get(player));
getLogger().message(player, "Successfully set a timeout for this " + typeStr);
}
+
event.setCancelled(true);
players.remove(player);
saveInputs();
+
return true;
}
return false;
}
-
- public void checkBlockBreak(BlockBreakEvent event, Block block)
- {
- if (!acceptedInputs.contains(block.getType()))
- return;
+
+ public void checkBlockBreak(BlockBreakEvent event, Block block) {
+ if (!acceptedInputs.contains(block.getType())) return;
String posStr = locationString(block.getLocation());
- if (!inputs.containsKey(posStr))
- return;
+ if (!inputs.containsKey(posStr)) return;
+
SpamInput input = inputs.get(posStr);
Player sender = event.getPlayer();
+
String typeStr = block.getType().toString().toLowerCase().replace("_", " ");
- String inputStr = (block.getLocation().equals(event.getBlock()) ? "this " + typeStr
- : "the " + typeStr + " attached to that block");
- if (!sender.isSneaking())
- {
+ String inputStr = (block.getLocation().equals(event.getBlock()) ? "this " + typeStr : "the " + typeStr + " attached to that block");
+
+ if (!sender.isSneaking()) {
getLogger().message(sender, true, "You cannot destroy " + inputStr);
getLogger().message(sender, true, "Sneak and break or set the timeout to 0 if you want to remove it.");
+
event.setCancelled(true);
return;
}
- if (sender.hasPermission("damnspam.admin") || sender.getUniqueId().toString().equals(input.player))
- {
+
+ if (sender.hasPermission("damnspam.admin") || sender.getUniqueId().toString().equals(input.player)) {
inputs.remove(posStr);
saveInputs();
getLogger().message(sender, "Succesfully removed " + inputStr);
- }
- else
- {
+ } else {
getLogger().message(sender, true, "You are not allowed to remove " + inputStr);
event.setCancelled(true);
}
}
-
+
@SuppressWarnings("deprecation")
- public List<Block> getAttachedBlocks(Block block)
- {
+ public List<Block> getAttachedBlocks(Block block) {
List<Block> blocks = new ArrayList<Block>();
- BlockFace[] directions = {BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST,
- BlockFace.EAST};
- for (int i = 0; i < directions.length; i++)
- {
- Block side = block.getRelative(directions[i]);
+
+ for (int i = 0; i < DIRECTIONS.length; i++) {
+ Block side = block.getRelative(DIRECTIONS[i]);
int[][] dvalues = attachedBlocks.get(side.getType());
- if (dvalues != null)
- {
+
+ if (dvalues != null) {
boolean onSide = false;
- for (int val : dvalues[i])
- {
- if (side.getData() == (byte) val)
- {
+
+ for (int val : dvalues[i]) {
+ if (side.getData() == (byte) val) {
onSide = true;
break;
}
}
- if (onSide)
- blocks.add(side);
+
+ if (onSide) blocks.add(side);
}
}
+
return blocks;
}
-
+
@EventHandler(priority = EventPriority.NORMAL)
- public void onBreak(BlockBreakEvent event)
- {
- if (changingInput || event.isCancelled())
- return;
+ public void onBreak(BlockBreakEvent event) {
+ if (changingInput || event.isCancelled()) return;
+
boolean register = attemptInputRegister(event.getPlayer(), event.getBlock(), event);
- if (!register)
- {
+
+ if (!register) {
Block block = event.getBlock();
checkBlockBreak(event, block);
- for (Block affected : getAttachedBlocks(block))
- {
+
+ for (Block affected : getAttachedBlocks(block)) {
checkBlockBreak(event, affected);
}
}
}
-
+
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGHEST)
- public void onInteract(PlayerInteractEvent event)
- {
- if (event.getClickedBlock() == null)
- return;
+ public void onInteract(PlayerInteractEvent event) {
+ if (event.getClickedBlock() == null) return;
boolean register = attemptInputRegister(event.getPlayer(), event.getClickedBlock(), event);
- if (!register && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && !event.isCancelled())
- {
+
+ if (!register && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && !event.isCancelled()) {
Player sender = event.getPlayer();
Block block = event.getClickedBlock();
String posStr = locationString(block.getLocation());
SpamInput data = inputs.get(posStr);
- if (data != null)
- {
+
+ if (data != null) {
String btype = block.getType().toString().toLowerCase().replace("_", " ");
double checktime = 0;
- if (btype.equals("lever") && block.getData() < 8)
- checktime = data.timeoutOff;
- else
- checktime = data.timeoutOn;
- double timeLeft = (data.lastTime + checktime)
- - ((double) Math.round((double) System.currentTimeMillis() / 10) / 100);
+
+ if (btype.equals("lever") && block.getData() < 8) checktime = data.timeoutOff;
+ else checktime = data.timeoutOn;
+
+ double timeLeft = (data.lastTime + checktime) - ((double) Math.round((double) System.currentTimeMillis() / 10) / 100);
timeLeft = (double) Math.round(timeLeft * 100) / 100;
- if (checktime == -1)
- {
+
+ if (checktime == -1) {
event.setCancelled(true);
getLogger().message(sender, "This " + btype + " is locked permanently by /damnspam.");
- }
- else if (timeLeft > 0)
- {
+ } else if (timeLeft > 0) {
event.setCancelled(true);
- getLogger().message(sender, "This " + btype + " has a damnspam timeout of " + checktime + ", with "
- + timeLeft + " left.");
- }
- else
- {
+ getLogger().message(sender, "This " + btype + " has a damnspam timeout of " + checktime + ", with " + timeLeft + " left.");
+ } else {
data.lastTime = (double) Math.round((double) System.currentTimeMillis() / 10) / 100;
}
+
inputs.put(posStr, data);
}
}
diff --git a/src/com/redstoner/modules/damnspam/SpamInput.java b/src/main/java/com/redstoner/modules/damnspam/SpamInput.java
index 9735dd9..59a7017 100644
--- a/src/com/redstoner/modules/damnspam/SpamInput.java
+++ b/src/main/java/com/redstoner/modules/damnspam/SpamInput.java
@@ -1,17 +1,17 @@
package com.redstoner.modules.damnspam;
public class SpamInput {
-
- protected String player;
- protected double timeoutOn;
- protected double timeoutOff;
- protected double lastTime;
-
+
+ protected String player;
+ protected double timeoutOn;
+ protected double timeoutOff;
+ protected double lastTime;
+
protected SpamInput(String player, double timeoutOff, double timeoutOn, double lastTime) {
this.player = player;
this.timeoutOff = timeoutOff;
this.timeoutOn = timeoutOn;
this.lastTime = lastTime;
}
-
+
}
diff --git a/src/main/java/com/redstoner/modules/damnspam/module.info b/src/main/java/com/redstoner/modules/damnspam/module.info
new file mode 100644
index 0000000..4736784
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/damnspam/module.info
@@ -0,0 +1,3 @@
+displayName: Damnspam
+category: Other
+description: Protects levers and buttons from being spammed by providing a configurable timeout for inputs \ No newline at end of file
diff --git a/src/com/redstoner/modules/datamanager/DataManager.cmd b/src/main/java/com/redstoner/modules/datamanager/DataManager.cmd
index f7d480a..792e9d5 100644
--- a/src/com/redstoner/modules/datamanager/DataManager.cmd
+++ b/src/main/java/com/redstoner/modules/datamanager/DataManager.cmd
@@ -9,7 +9,7 @@ command config {
alias configs;
alias setting;
alias settings;
- perm datamanager.admin;
+ perm utils.datamanager.admin;
list {
run config_list;
help Lists all modules that have at least one config setting.;
diff --git a/src/com/redstoner/modules/datamanager/DataManager.java b/src/main/java/com/redstoner/modules/datamanager/DataManager.java
index 63ce1ce..197bc7a 100644
--- a/src/com/redstoner/modules/datamanager/DataManager.java
+++ b/src/main/java/com/redstoner/modules/datamanager/DataManager.java
@@ -2,7 +2,6 @@ package com.redstoner.modules.datamanager;
import java.io.File;
import java.io.FilenameFilter;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
@@ -36,59 +35,60 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.Stream)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 10, compatible = 4)
-public final class DataManager implements CoreModule, Listener
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public final class DataManager implements CoreModule, Listener {
protected final File dataFolder = new File(Main.plugin.getDataFolder(), "data");
+
protected JSONObject data = new JSONObject();
protected JSONObject config_data;
+
protected ArrayList<String> module_index;
- int old_hash = 0;
- protected HashMap<String, HashMap<String, Boolean>> states = new HashMap<>();
- private static DataManager previous_instance = null;
protected ArrayList<String> subcommands;
+
protected List<String> scheduled_saves = new ArrayList<>();
+
+ protected HashMap<String, HashMap<String, Boolean>> states = new HashMap<>();
+
+ private static DataManager previous_instance = null;
+
+ int old_hash = 0;
int task_id;
-
+
@Override
- public void postEnable()
- {
- if (!dataFolder.exists())
- dataFolder.mkdirs();
- for (Player p : Bukkit.getOnlinePlayers())
- {
+ public void postEnable() {
+ if (!dataFolder.exists()) dataFolder.mkdirs();
+
+ for (Player p : Bukkit.getOnlinePlayers()) {
loadData_(p.getUniqueId().toString());
}
+
subcommands = new ArrayList<>();
subcommands.add("list");
subcommands.add("get");
subcommands.add("set");
subcommands.add("remove");
- if (previous_instance == null)
- states.put(getID(Bukkit.getConsoleSender()), new HashMap<String, Boolean>());
- else
- {
+
+ if (previous_instance == null) states.put(getID(Bukkit.getConsoleSender()), new HashMap<String, Boolean>());
+ else {
this.states = previous_instance.states;
previous_instance = null;
}
+
config_data = JsonManager.getObject(new File(dataFolder, "configs.json"));
- if (config_data == null)
- config_data = new JSONObject();
+ if (config_data == null) config_data = new JSONObject();
+
fixJson();
updateIndex();
+
CommandManager.registerCommand(getClass().getResourceAsStream("DataManager.cmd"), this, Main.plugin);
-
+
// Schedule save every ten seconds
- task_id = Bukkit.getScheduler().runTaskTimerAsynchronously(Main.plugin, new Runnable()
- {
+ task_id = Bukkit.getScheduler().runTaskTimerAsynchronously(Main.plugin, new Runnable() {
@Override
- public void run()
- {
- for (String id : scheduled_saves)
- {
+ public void run() {
+ for (String id : scheduled_saves) {
Object raw = data.get(id);
- if (raw == null || ((JSONObject) raw).size() == 0)
- continue;
+ if (raw == null || ((JSONObject) raw).size() == 0) continue;
JSONObject json = (JSONObject) raw;
JsonManager.save(json, new File(dataFolder, id + ".json"));
}
@@ -96,934 +96,793 @@ public final class DataManager implements CoreModule, Listener
}
}, 0, 20).getTaskId();
}
-
+
@Override
- public void onDisable()
- {
+ public void onDisable() {
previous_instance = this;
- for (Player p : Bukkit.getOnlinePlayers())
- {
+
+ for (Player p : Bukkit.getOnlinePlayers()) {
saveAndUnload(p);
}
+
JsonManager.save(config_data, new File(dataFolder, "configs.json"));
Bukkit.getScheduler().cancelTask(task_id);
}
-
+
@Command(hook = "import_file")
- public boolean importFile(CommandSender sender, String file, String module)
- {
- try
- {
+ public boolean importFile(CommandSender sender, String file, String module) {
+ try {
JSONObject object = JsonManager.getObject(new File(file));
importObject_(module, object);
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
getLogger().error("Could not import data!");
}
+
return true;
}
-
+
@EventHandler
- public void onPlayerJoin(PlayerJoinEvent event)
- {
+ public void onPlayerJoin(PlayerJoinEvent event) {
loadData_(event.getPlayer().getUniqueId().toString());
}
-
+
@EventHandler
- public void onPlayerQuit(PlayerQuitEvent event)
- {
+ public void onPlayerQuit(PlayerQuitEvent event) {
saveAndUnload(event.getPlayer());
}
-
- public static void loadData(CommandSender sender)
- {
+
+ public static void loadData(CommandSender sender) {
loadData(getID(sender));
}
-
- public static void loadData(String id)
- {
- try
- {
+
+ public static void loadData(String id) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
Method m = mod.getClass().getDeclaredMethod("loadData_", String.class);
+
m.setAccessible(true);
m.invoke(mod, id);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
+
@SuppressWarnings("unchecked")
- protected synchronized void loadData_(String id)
- {
+ protected synchronized void loadData_(String id) {
JSONObject playerData = JsonManager.getObject(new File(dataFolder, id + ".json"));
- if (playerData == null)
- playerData = new JSONObject();
+ if (playerData == null) playerData = new JSONObject();
+
data.put(id.toString(), playerData);
states.put(id.toString(), new HashMap<String, Boolean>());
}
-
- public static Object getOrDefault(CommandSender sender, String key, Object fallback)
- {
+
+ public static Object getOrDefault(CommandSender sender, String key, Object fallback) {
return getOrDefault(getID(sender), Utils.getCaller("DataManager"), key, fallback);
}
-
- public static Object getOrDefault(String id, String key, Object fallback)
- {
+
+ public static Object getOrDefault(String id, String key, Object fallback) {
return getOrDefault(id, Utils.getCaller("DataManager"), key, fallback);
}
-
- public static Object getOrDefault(String id, String module, String key, Object fallback)
- {
- try
- {
+
+ public static Object getOrDefault(String id, String module, String key, Object fallback) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
- Method m = mod.getClass().getDeclaredMethod("getOrDefault_", String.class, String.class, String.class,
- Object.class);
+
+ Method m = mod.getClass().getDeclaredMethod("getOrDefault_", String.class, String.class, String.class, Object.class);
m.setAccessible(true);
+
return m.invoke(mod, id, module, key, fallback);
+ } catch (Exception e) {
+ return fallback;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return fallback;
- }
-
- protected Object getOrDefault_(String id, String module, String key, Object fallback)
- {
+ }
+
+ protected Object getOrDefault_(String id, String module, String key, Object fallback) {
Object o = getData_(id, module, key);
return o == null ? fallback : o;
}
-
- public static Object getData(CommandSender sender, String key)
- {
+
+ public static Object getData(CommandSender sender, String key) {
return getData(getID(sender), Utils.getCaller("DataManager"), key);
}
-
- public static Object getData(String id, String key)
- {
+
+ public static Object getData(String id, String key) {
return getData(id, Utils.getCaller("DataManager"), key);
}
-
- public static Object getData(String id, String module, String key)
- {
- try
- {
+
+ public static Object getData(String id, String module, String key) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("getData_", String.class, String.class, String.class);
m.setAccessible(true);
+
return m.invoke(mod, id, module, key);
+ } catch (Exception e) {
+ return null;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return null;
- }
-
- protected Object getData_(String id, String module, String key)
- {
- if (data.containsKey(id))
- {
+ }
+
+ protected Object getData_(String id, String module, String key) {
+ if (data.containsKey(id)) {
JSONObject moduleData = ((JSONObject) ((JSONObject) data.get(id)).get(module));
- if (moduleData == null)
- return null;
- if (key == null)
- return moduleData;
- else
- return moduleData.get(key);
- }
- else
+
+ if (moduleData == null) return null;
+ if (key == null) return moduleData;
+ else return moduleData.get(key);
+ } else {
return loadAndGet(id, module, key);
+ }
}
-
- protected synchronized Object loadAndGet(String id, String module, String key)
- {
+
+ protected synchronized Object loadAndGet(String id, String module, String key) {
JSONObject playerData = JsonManager.getObject(new File(dataFolder, id + ".json"));
- if (playerData == null)
- return null;
- if (key == null)
- return playerData.get(module);
- else
- return ((JSONObject) playerData.get(module)).get(key);
- }
-
- public static void setData(CommandSender sender, String key, Object value)
- {
+
+ if (playerData == null) return null;
+ if (key == null) return playerData.get(module);
+ else return ((JSONObject) playerData.get(module)).get(key);
+ }
+
+ public static void setData(CommandSender sender, String key, Object value) {
setData(getID(sender), Utils.getCaller("DataManager"), key, value);
}
-
- public static void setData(String id, String key, Object value)
- {
+
+ public static void setData(String id, String key, Object value) {
setData(id, Utils.getCaller("DataManager"), key, value);
}
-
- public static void setData(String id, String module, String key, Object value)
- {
- try
- {
+
+ public static void setData(String id, String module, String key, Object value) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
- Method m = mod.getClass().getDeclaredMethod("setData_", String.class, String.class, String.class,
- Object.class);
+
+ Method m = mod.getClass().getDeclaredMethod("setData_", String.class, String.class, String.class, Object.class);
m.setAccessible(true);
+
m.invoke(mod, id, module, key, value);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
+
@SuppressWarnings("unchecked")
- protected void setData_(String id, String module, String key, Object value)
- {
- if (data.containsKey(id))
- {
+ protected void setData_(String id, String module, String key, Object value) {
+ if (data.containsKey(id)) {
JSONObject moduleData = ((JSONObject) ((JSONObject) data.get(id)).get(module));
- if (moduleData == null)
- {
+
+ if (moduleData == null) {
moduleData = new JSONObject();
((JSONObject) data.get(id)).put(module, moduleData);
}
- if (key == null)
- setDirectly_(id, module, value);
- else
- moduleData.put(key, value);
+
+ if (key == null) setDirectly_(id, module, value);
+ else moduleData.put(key, value);
+
save_(id);
- }
- else
+ } else {
loadAndSet(id, module, key, value);
+ }
}
-
- public static void setDirectly(CommandSender sender, Object value)
- {
+
+ public static void setDirectly(CommandSender sender, Object value) {
setDirectly(getID(sender), Utils.getCaller("DataManager"), value);
}
-
- public static void setDirectly(String id, Object value)
- {
+
+ public static void setDirectly(String id, Object value) {
setDirectly(id, Utils.getCaller("DataManager"), value);
}
-
- public static void setDirectly(String id, String module, Object value)
- {
- try
- {
+
+ public static void setDirectly(String id, String module, Object value) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("setDirectly_", String.class, String.class, Object.class);
m.setAccessible(true);
+
m.invoke(mod, id, module, value);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
+
@SuppressWarnings("unchecked")
- protected void setDirectly_(String id, String module, Object value)
- {
- if (data.containsKey(id))
- {
+ protected void setDirectly_(String id, String module, Object value) {
+ if (data.containsKey(id)) {
JSONObject playerdata = (JSONObject) data.get(id);
playerdata.put(module, value);
+
save_(id);
- }
- else
+ } else {
loadAndSetDirectly(id, module, value);
+ }
}
-
+
@SuppressWarnings("unchecked")
- protected synchronized void loadAndSet(String id, String module, String key, Object value)
- {
+ protected synchronized void loadAndSet(String id, String module, String key, Object value) {
File dataFile = new File(dataFolder, id + ".json");
+
JSONObject playerData = JsonManager.getObject(dataFile);
- if (playerData == null)
- playerData = new JSONObject();
+ if (playerData == null) playerData = new JSONObject();
+
JSONObject moduleData = ((JSONObject) playerData.get(module));
- if (moduleData == null)
- {
+ if (moduleData == null) {
moduleData = new JSONObject();
playerData.put(module, moduleData);
}
+
moduleData.put(key, value);
+
JsonManager.save(playerData, dataFile);
}
-
+
@SuppressWarnings("unchecked")
- protected void loadAndSetDirectly(String id, String module, Object value)
- {
+ protected void loadAndSetDirectly(String id, String module, Object value) {
File dataFile = new File(dataFolder, id + ".json");
+
JSONObject playerData = JsonManager.getObject(dataFile);
- if (playerData == null)
- playerData = new JSONObject();
+ if (playerData == null) playerData = new JSONObject();
+
playerData.put(module, value);
+
JsonManager.save(playerData, dataFile);
}
-
- public static void removeData(CommandSender sender, String key)
- {
+
+ public static void removeData(CommandSender sender, String key) {
removeData(getID(sender), Utils.getCaller("DataManager"), key);
}
-
- public static void removeData(String id, String key)
- {
+
+ public static void removeData(String id, String key) {
removeData(id, Utils.getCaller("DataManager"), key);
}
-
- public static void removeData(String id, String module, String key)
- {
- try
- {
+
+ public static void removeData(String id, String module, String key) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("removeData_", String.class, String.class, String.class);
m.setAccessible(true);
+
m.invoke(mod, id, module, key);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
+
@SuppressWarnings("unchecked")
- protected void removeData_(String id, String module, String key)
- {
- if (data.containsKey(id))
- {
+ protected void removeData_(String id, String module, String key) {
+ if (data.containsKey(id)) {
JSONObject moduleData = ((JSONObject) ((JSONObject) data.get(id)).get(module));
- if (moduleData == null)
- return;
+ if (moduleData == null) return;
+
moduleData.remove(key);
data.put(module, data);
+
save_(id);
- }
- else
+ } else {
loadAndRemove(id, module, key);
+ }
}
-
- protected synchronized void loadAndRemove(String id, String module, String key)
- {
+
+ protected synchronized void loadAndRemove(String id, String module, String key) {
File dataFile = new File(dataFolder, id + ".json");
+
JSONObject playerData = JsonManager.getObject(dataFile);
- if (playerData == null)
- return;
+ if (playerData == null) return;
+
JSONObject moduleData = ((JSONObject) playerData.get(module));
- if (moduleData == null)
- return;
+ if (moduleData == null) return;
+
moduleData.remove(key);
+
JsonManager.save(playerData, dataFile);
}
-
- public static void importObject(JSONObject object)
- {
+
+ public static void importObject(JSONObject object) {
importObject(object, Utils.getCaller("DataManager"));
}
-
- public static void importObject(JSONObject object, String module)
- {
- try
- {
+
+ public static void importObject(JSONObject object, String module) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("importObject_", String.class, String.class, String.class);
m.setAccessible(true);
+
m.invoke(mod, module, object);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- }
-
- protected void importObject_(String module, JSONObject object)
- {
- for (Object o : object.keySet())
- {
+ } catch (Exception e) {}
+ }
+
+ protected void importObject_(String module, JSONObject object) {
+ for (Object o : object.keySet()) {
String uid = null;
- if (o instanceof String)
- uid = (String) o;
- else if (o instanceof UUID)
- uid = ((UUID) o).toString();
- if (uid == null)
- continue;
+ if (o instanceof String) uid = (String) o;
+ else if (o instanceof UUID) uid = ((UUID) o).toString();
+
+ if (uid == null) continue;
+
setDirectly_(uid, module, object.get(o));
}
}
-
- public static void migrateAll(String oldName)
- {
+
+ public static void migrateAll(String oldName) {
migrateAll(oldName, Utils.getCaller("DataManager"));
}
-
- public static void migrateAll(String oldName, String newName)
- {
- try
- {
+
+ public static void migrateAll(String oldName, String newName) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("migrateAll_", String.class, String.class);
m.setAccessible(true);
+
m.invoke(mod, oldName, newName);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- }
-
- protected void migrateAll_(String oldName, String newName)
- {
- for (String s : dataFolder.list(new FilenameFilter()
- {
+ } catch (Exception e) {}
+ }
+
+ protected void migrateAll_(String oldName, String newName) {
+ for (String s : dataFolder.list(new FilenameFilter() {
@Override
- public boolean accept(File dir, String name)
- {
+ public boolean accept(File dir, String name) {
return name.endsWith(".json");
}
- }))
- {
+ })) {
migrate_(s.replace(".json", ""), oldName, newName);
}
}
-
- public static void migrate(String id, String oldName)
- {
+
+ public static void migrate(String id, String oldName) {
migrate(id, oldName, Utils.getCaller("DataManager"));
}
-
- public static void migrate(String id, String oldName, String newName)
- {
- try
- {
+
+ public static void migrate(String id, String oldName, String newName) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("migrate_", String.class, String.class, String.class);
m.setAccessible(true);
+
m.invoke(mod, id, oldName, newName);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
+
@SuppressWarnings("unchecked")
- protected void migrate_(String id, String oldName, String newName)
- {
- if (data.containsKey(id))
- {
+ protected void migrate_(String id, String oldName, String newName) {
+ if (data.containsKey(id)) {
data.put(newName, data.get(oldName));
data.remove(oldName);
+
save_(id);
- }
- else
+ } else {
loadAndMigrate(id, oldName, newName);
+ }
}
-
+
@SuppressWarnings("unchecked")
- protected void loadAndMigrate(String id, String oldName, String newName)
- {
+ protected void loadAndMigrate(String id, String oldName, String newName) {
File dataFile = new File(dataFolder, id + ".json");
JSONObject data = JsonManager.getObject(dataFile);
+
data.put(newName, data.get(oldName));
data.remove(oldName);
+
JsonManager.save(data, dataFile);
}
-
- public static void save(CommandSender sender)
- {
- try
- {
+
+ public static void save(CommandSender sender) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("save_", CommandSender.class);
m.setAccessible(true);
+
m.invoke(mod, sender);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
- protected void save_(CommandSender sender)
- {
+
+ protected void save_(CommandSender sender) {
save_(getID(sender));
}
-
- public static void save(String id)
- {
- try
- {
+
+ public static void save(String id) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("save_", String.class);
m.setAccessible(true);
+
m.invoke(mod, id);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
- protected void save_(String id)
- {
+
+ protected void save_(String id) {
scheduled_saves.add(id);
}
-
- protected void saveAndUnload(CommandSender sender)
- {
+
+ protected void saveAndUnload(CommandSender sender) {
saveAndUnload(getID(sender));
states.remove(getID(sender));
}
-
- protected void saveAndUnload(String id)
- {
+
+ protected void saveAndUnload(String id) {
save_(id);
data.remove(id);
}
-
- private static String getID(CommandSender sender)
- {
- String id;
- if (sender instanceof Player)
- id = ((Player) sender).getUniqueId().toString();
- else
- id = "CONSOLE";
- return id;
- }
-
- public static void setState(CommandSender sender, String key, boolean value)
- {
- try
- {
+
+ private static String getID(CommandSender sender) {
+ if (sender instanceof Player) return ((Player) sender).getUniqueId().toString();
+ else return "CONSOLE";
+ }
+
+ public static void setState(CommandSender sender, String key, boolean value) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("setState_", CommandSender.class, String.class, boolean.class);
m.setAccessible(true);
+
m.invoke(mod, sender, key, value);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
- protected void setState_(CommandSender sender, String key, boolean value)
- {
+
+ protected void setState_(CommandSender sender, String key, boolean value) {
String id = getID(sender);
+
HashMap<String, Boolean> lstates = states.get(id);
lstates.put(key, value);
+
states.put(id, lstates);
}
-
- public static boolean getState(CommandSender sender, String key)
- {
- try
- {
+
+ public static boolean getState(CommandSender sender, String key) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("getState_", CommandSender.class, String.class);
m.setAccessible(true);
+
return (boolean) m.invoke(mod, sender, key);
+ } catch (Exception e) {
+ return false;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return false;
- }
-
- protected boolean getState_(CommandSender sender, String key)
- {
+ }
+
+ protected boolean getState_(CommandSender sender, String key) {
String id = getID(sender);
+
HashMap<String, Boolean> lstates = states.get(id);
- if (lstates == null)
- return false;
+ if (lstates == null) return false;
+
return lstates.containsKey(key) ? lstates.get(key) : false;
}
-
- protected boolean hasConfigChanged()
- {
+
+ protected boolean hasConfigChanged() {
return old_hash != config_data.hashCode();
}
-
- protected void updateIndex()
- {
- if (!hasConfigChanged())
- return;
+
+ protected void updateIndex() {
+ if (!hasConfigChanged()) return;
+
old_hash = config_data.hashCode();
module_index = new ArrayList<>();
- if (config_data.size() > 0)
- {
- for (Object key : config_data.keySet())
+
+ if (config_data.size() > 0) {
+ for (Object key : config_data.keySet()) {
module_index.add(key.toString());
+ }
}
}
-
+
@SuppressWarnings("unchecked")
- protected void fixJson()
- {
- for (Object key : config_data.keySet())
- {
+ protected void fixJson() {
+ for (Object key : config_data.keySet()) {
JSONObject json = (JSONObject) config_data.get(key);
- for (Object key2 : json.keySet())
- {
+
+ for (Object key2 : json.keySet()) {
Object o = json.get(key2);
- if (!(o instanceof ConfigEntry))
- json.put(key2, new ConfigEntry((JSONObject) o));
+
+ if (!(o instanceof ConfigEntry)) json.put(key2, new ConfigEntry((JSONObject) o));
}
+
config_data.put(key, json);
}
}
-
- private List<String> subsetWhereStartsWith(List<String> list, String prefix)
- {
+
+ private List<String> subsetWhereStartsWith(List<String> list, String prefix) {
ArrayList<String> subset = new ArrayList<>();
- if (prefix == null || prefix.equals(""))
- return list;
- for (String s : list)
- if (s.toLowerCase().startsWith(prefix.toLowerCase()))
+
+ if (prefix == null || prefix.equals("")) return list;
+
+ for (String s : list) {
+ if (s.toLowerCase().startsWith(prefix.toLowerCase())) {
subset.add(s);
+ }
+ }
+
return subset;
}
-
+
@SuppressWarnings("unchecked")
@EventHandler
- public void onTabComplete(TabCompleteEvent event)
- {
- if (event.getBuffer().toLowerCase().matches("^/?settings? .*")
- || event.getBuffer().toLowerCase().matches("^/?configs? .*"))
- {
+ public void onTabComplete(TabCompleteEvent event) {
+ if (event.getBuffer().toLowerCase().matches("^/?settings? .*") || event.getBuffer().toLowerCase().matches("^/?configs? .*")) {
boolean argument_complete = event.getBuffer().endsWith(" ");
String[] arguments = event.getBuffer().split(" ");
+
event.setCompletions(new ArrayList<String>());
- if (arguments.length == 1 || (arguments.length == 2 && !argument_complete))
+
+ if (arguments.length == 1 || (arguments.length == 2 && !argument_complete)) {
event.setCompletions(subsetWhereStartsWith(subcommands, arguments.length >= 2 ? arguments[1] : ""));
- else if (arguments.length == 2 || (arguments.length == 3 && !argument_complete))
- {
- switch (arguments[1].toLowerCase())
- {
+ } else if (arguments.length == 2 || (arguments.length == 3 && !argument_complete)) {
+ switch (arguments[1].toLowerCase()) {
case "list":
case "get":
- case "set":
- {
- event.setCompletions(
- subsetWhereStartsWith(module_index, arguments.length == 3 ? arguments[2] : ""));
+ case "set": {
+ event.setCompletions(subsetWhereStartsWith(module_index, arguments.length == 3 ? arguments[2] : ""));
break;
}
}
- }
- else if ((arguments.length == 3 && argument_complete) || (arguments.length == 4 && !argument_complete))
- {
- switch (arguments[1].toLowerCase())
- {
+ } else if ((arguments.length == 3 && argument_complete) || (arguments.length == 4 && !argument_complete)) {
+ switch (arguments[1].toLowerCase()) {
case "get":
- case "set":
- {
+ case "set": {
Object o = config_data.get(arguments[2]);
- if (o == null)
- break;
- event.setCompletions(subsetWhereStartsWith(new ArrayList<String>(((JSONObject) o).keySet()),
- arguments.length == 4 ? arguments[3] : ""));
+ if (o == null) break;
+ event.setCompletions(
+ subsetWhereStartsWith(new ArrayList<String>(((JSONObject) o).keySet()), arguments.length == 4 ? arguments[3] : ""));
break;
}
}
- }
- else
- {
- if (arguments[1].toLowerCase().equals("set"))
- {
+ } else {
+ if (arguments[1].toLowerCase().equals("set")) {
Object o = config_data.get(arguments[2]);
- if (o == null)
- return;
+ if (o == null) return;
+
Object o2 = ((JSONObject) o).get(arguments[3]);
- if (o2 == null)
- return;
+ if (o2 == null) return;
+
event.setCompletions(subsetWhereStartsWith(Arrays.asList(((ConfigEntry) o2).getCompleteOptions()),
- arguments.length > 4 ? String.join(" ", Arrays.copyOfRange(arguments, 4, arguments.length))
- : ""));
+ arguments.length > 4 ? String.join(" ", Arrays.copyOfRange(arguments, 4, arguments.length)) : ""));
}
}
}
}
-
+
@Command(hook = "config_list")
- public boolean list(CommandSender sender)
- {
+ public boolean list(CommandSender sender) {
getLogger().message(sender, Arrays.toString(module_index.toArray(new String[] {})));
return true;
}
-
+
@Command(hook = "config_list2")
- public boolean list(CommandSender sender, String module)
- {
+ public boolean list(CommandSender sender, String module) {
Object o = config_data.get(module);
- if (o == null)
- {
+
+ if (o == null) {
getLogger().message(sender, "This module has not registered any settings.");
- }
- else
- {
+ } else {
ArrayList<String> entries = new ArrayList<>();
JSONObject json = (JSONObject) o;
- for (Object key : json.keySet())
- {
+
+ for (Object key : json.keySet()) {
String entry = key.toString();
entries.add("ยงe" + entry + "ยง7");
}
- getLogger().message(sender, "The module ยงe" + module + "ยง7 has the following config settings: ",
- Arrays.toString(entries.toArray(new String[] {})));
+
+ getLogger().message(sender, "The module ยงe" + module + "ยง7 has the following config settings: ", Arrays.toString(entries.toArray(new String[] {})));
}
+
return true;
}
-
+
@Command(hook = "config_get")
- public boolean get(CommandSender sender, String module, String key)
- {
- getLogger().message(sender, new String[] {"ยงe" + module + "." + key + "ยง7 currently holds the value:",
- getConfigOrDefault_(module, key, "<empty>").toString()});
+ public boolean get(CommandSender sender, String module, String key) {
+ getLogger().message(sender,
+ new String[] { "ยงe" + module + "." + key + "ยง7 currently holds the value:", getConfigOrDefault_(module, key, "<empty>").toString() });
return true;
}
-
+
@Command(hook = "config_set")
- public boolean set(CommandSender sender, String module, String key, String value)
- {
- if (setConfig_(module, key, value))
- {
+ public boolean set(CommandSender sender, String module, String key, String value) {
+ if (setConfig_(module, key, value)) {
getLogger().message(sender, "Successfully changed the value for ยงe" + module + "." + key);
+ } else {
+ getLogger().message(sender, true, "ยง7\"ยงe" + value + "ยง7\" is not a valid value for setting ยงe" + module + "." + key);
}
- else
- {
- getLogger().message(sender, true,
- "ยง7\"ยงe" + value + "ยง7\" is not a valid value for setting ยงe" + module + "." + key);
- }
+
return true;
}
-
+
@Command(hook = "config_remove_all")
- public boolean remove_all(CommandSender sender, String module)
- {
- if (removeAllConfig_(module))
- getLogger().message(sender, "Successfully deleted all config entries for module ยงe" + module + "ยง7!");
- else
- getLogger().message(sender, true, "Could not delete all config entries for module ยงe" + module + "ยง7!");
+ public boolean remove_all(CommandSender sender, String module) {
+ if (removeAllConfig_(module)) getLogger().message(sender, "Successfully deleted all config entries for module ยงe" + module + "ยง7!");
+ else getLogger().message(sender, true, "Could not delete all config entries for module ยงe" + module + "ยง7!");
+
return true;
}
-
- public static Object getConfigOrDefault(String key, Object fallback)
- {
+
+ public static Object getConfigOrDefault(String key, Object fallback) {
return getConfigOrDefault(Utils.getCaller("DataManager"), key, fallback);
}
-
- public static Object getConfigOrDefault(String module, String key, Object fallback)
- {
- try
- {
+
+ public static Object getConfigOrDefault(String module, String key, Object fallback) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
- Method m = mod.getClass().getDeclaredMethod("getConfigOrDefault_", String.class, String.class,
- Object.class);
+
+ Method m = mod.getClass().getDeclaredMethod("getConfigOrDefault_", String.class, String.class, Object.class);
m.setAccessible(true);
+
return m.invoke(mod, module, key, fallback);
+ } catch (Exception e) {
+ return fallback;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return fallback;
- }
-
- protected Object getConfigOrDefault_(String module, String key, Object fallback)
- {
+ }
+
+ protected Object getConfigOrDefault_(String module, String key, Object fallback) {
Object o = getConfigData_(module, key);
return o == null ? fallback : o;
}
-
- protected Object getConfigData_(String module, String key)
- {
+
+ protected Object getConfigData_(String module, String key) {
module = module.toLowerCase();
Object o = config_data.get(module);
- if (o == null)
- return null;
- else
- {
- JSONObject json = (JSONObject) o;
- Object o2 = json.get(key);
- if (o2 == null)
- return null;
- return ((ConfigEntry) o2).getValue();
- }
+
+ if (o == null) return null;
+
+ JSONObject json = (JSONObject) o;
+ Object o2 = json.get(key);
+
+ if (o2 == null) return null;
+
+ return ((ConfigEntry) o2).getValue();
}
-
- protected ConfigEntry getConfigEntry_(String module, String key)
- {
+
+ protected ConfigEntry getConfigEntry_(String module, String key) {
module = module.toLowerCase();
Object o = config_data.get(module);
- if (o == null)
- return null;
- else
- {
- JSONObject json = (JSONObject) o;
- return (ConfigEntry) json.get(key);
- }
+
+ if (o == null) return null;
+
+ JSONObject json = (JSONObject) o;
+ return (ConfigEntry) json.get(key);
}
-
- public static void setConfig(String key, String value)
- {
+
+ public static void setConfig(String key, String value) {
setConfig(Utils.getCaller("DataManager"), key, value, null);
}
-
- public static void setConfig(String key, String value, String[] complete_options)
- {
+
+ public static void setConfig(String key, String value, String[] complete_options) {
setConfig(Utils.getCaller("DataManager"), key, value, complete_options);
}
-
- public static void setConfig(String module, String key, String value, String[] complete_options)
- {
- try
- {
+
+ public static void setConfig(String module, String key, String value, String[] complete_options) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
- Method m = mod.getClass().getDeclaredMethod("setConfig_", String.class, String.class, String.class,
- String[].class);
+
+ Method m = mod.getClass().getDeclaredMethod("setConfig_", String.class, String.class, String.class, String[].class);
m.setAccessible(true);
+
m.invoke(mod, module, key, value, complete_options);
- }
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
+ } catch (Exception e) {}
}
-
+
@SuppressWarnings("unchecked")
- protected boolean setConfig_(String module, String key, String value)
- {
+ protected boolean setConfig_(String module, String key, String value) {
module = module.toLowerCase();
ConfigEntry entry = getConfigEntry_(module, key);
- if (entry == null)
- entry = new ConfigEntry(value, null);
- if (entry.attemptSet(value))
- {
- Object o = config_data.get(module);
- JSONObject json;
- if (o == null)
- json = new JSONObject();
- else
- json = (JSONObject) o;
- json.put(key, entry);
- config_data.put(module, json);
- updateIndex();
- return true;
- }
- else
- return false;
+
+ if (entry == null) entry = new ConfigEntry(value, null);
+ if (!entry.attemptSet(value)) return false;
+
+ Object o = config_data.get(module);
+ JSONObject json;
+
+ if (o == null) json = new JSONObject();
+ else json = (JSONObject) o;
+
+ json.put(key, entry);
+ config_data.put(module, json);
+
+ updateIndex();
+ return true;
}
-
+
@SuppressWarnings("unchecked")
- protected void setConfig_(String module, String key, String value, String[] complete_options)
- {
+ protected void setConfig_(String module, String key, String value, String[] complete_options) {
module = module.toLowerCase();
ConfigEntry entry = new ConfigEntry(value, complete_options);
+
Object o = config_data.get(module);
JSONObject json;
- if (o == null)
- json = new JSONObject();
- else
- json = (JSONObject) o;
+
+ if (o == null) json = new JSONObject();
+ else json = (JSONObject) o;
+
json.put(key, entry);
config_data.put(module, json);
+
updateIndex();
}
-
- public static boolean removeConfig(String key)
- {
+
+ public static boolean removeConfig(String key) {
return removeConfig(Utils.getCaller("DataManager"), key);
}
-
- public static boolean removeConfig(String module, String key)
- {
- try
- {
+
+ public static boolean removeConfig(String module, String key) {
+ try {
Module mod = ModuleLoader.getModule("DataManager");
+
Method m = mod.getClass().getDeclaredMethod("removeConfig_", String.class, String.class);
m.setAccessible(true);
+
return (boolean) m.invoke(mod, module, key);
+ } catch (Exception e) {
+ return false;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return false;
}
-
+
@SuppressWarnings("unchecked")
- protected boolean removeConfig_(String module, String key)
- {
+ protected boolean removeConfig_(String module, String key) {
module = module.toLowerCase();
- if (key == null)
- return removeAllConfig_(module);
+
+ if (key == null) return removeAllConfig_(module);
+
Object o = config_data.get(module);
JSONObject json;
- if (o == null)
- return false;
- else
- json = (JSONObject) o;
+
+ if (o == null) return false;
+ else json = (JSONObject) o;
+
json.remove(key);
- if (json.size() == 0)
- config_data.remove(module);
- else
- config_data.put(module, json);
+
+ if (json.size() == 0) config_data.remove(module);
+ else config_data.put(module, json);
+
updateIndex();
return true;
}
-
- protected boolean removeAllConfig_(String module)
- {
+
+ protected boolean removeAllConfig_(String module) {
module = module.toLowerCase();
- if (config_data.remove(module) == null)
- return false;
+
+ if (config_data.remove(module) == null) return false;
+
updateIndex();
return true;
}
}
-class ConfigEntry
-{
+class ConfigEntry {
private String value;
private String[] complete_options;
-
- public ConfigEntry(String value, String[] complete_options)
- {
+
+ public ConfigEntry(String value, String[] complete_options) {
this.value = value;
this.complete_options = complete_options;
}
-
+
@SuppressWarnings("unchecked")
- public ConfigEntry(JSONObject json)
- {
- this(json.get("value").toString(),
- (String[]) ((JSONArray) json.get("complete_options")).toArray(new String[] {}));
- }
-
- protected boolean attemptSet(String value)
- {
- if (complete_options == null || complete_options.length == 0)
- {
+ public ConfigEntry(JSONObject json) {
+ this(json.get("value").toString(), (String[]) ((JSONArray) json.get("complete_options")).toArray(new String[] {}));
+ }
+
+ protected boolean attemptSet(String value) {
+ if (complete_options == null || complete_options.length == 0) {
this.value = value;
return true;
- }
- else
- {
- for (String s : complete_options)
- {
- if (s.equals(value))
- {
+ } else {
+ for (String s : complete_options) {
+ if (s.equals(value)) {
this.value = value;
return true;
}
}
+
return false;
}
}
-
- protected String[] getCompleteOptions()
- {
+
+ protected String[] getCompleteOptions() {
return complete_options;
}
-
- protected String getValue()
- {
+
+ protected String getValue() {
return value;
}
-
+
@Override
- public String toString()
- {
+ public String toString() {
return "{\"value\":\"" + value + "\",\"complete_options\":"
- + (complete_options == null || complete_options.length == 0 ? "[]"
- : "[\"" + String.join("\",\"", complete_options) + "\"]")
- + "}";
+ + (complete_options == null || complete_options.length == 0 ? "[]" : "[\"" + String.join("\",\"", complete_options) + "\"]") + "}";
}
}
diff --git a/src/main/java/com/redstoner/modules/datamanager/module.info b/src/main/java/com/redstoner/modules/datamanager/module.info
new file mode 100644
index 0000000..713107d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/datamanager/module.info
@@ -0,0 +1,3 @@
+displayName: Datamanager
+category: Other
+description: Adds easy module and player based data management \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/discord/Discord.cmd b/src/main/java/com/redstoner/modules/discord/Discord.cmd
new file mode 100644
index 0000000..848d483
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/discord/Discord.cmd
@@ -0,0 +1,8 @@
+command discord {
+ perm utils.discord;
+ [empty] {
+ help Info, Register Instructions, and Token for the Discord;
+ run discord;
+ type player;
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/discord/Discord.java b/src/main/java/com/redstoner/modules/discord/Discord.java
new file mode 100644
index 0000000..22999ec
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/discord/Discord.java
@@ -0,0 +1,126 @@
+package com.redstoner.modules.discord;
+
+import java.io.IOException;
+import java.security.SecureRandom;
+
+import com.redstoner.exceptions.NonSaveableConfigException;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import com.nemez.cmdmgr.Command;
+import com.redstoner.annotations.Commands;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.CommandHolderType;
+import com.redstoner.misc.mysql.Config;
+import com.redstoner.misc.mysql.MysqlHandler;
+import com.redstoner.misc.mysql.elements.ConstraintOperator;
+import com.redstoner.misc.mysql.elements.MysqlConstraint;
+import com.redstoner.misc.mysql.elements.MysqlDatabase;
+import com.redstoner.misc.mysql.elements.MysqlField;
+import com.redstoner.misc.mysql.elements.MysqlTable;
+import com.redstoner.misc.mysql.types.number.TinyInt;
+import com.redstoner.misc.mysql.types.text.VarChar;
+import com.redstoner.modules.Module;
+
+import net.nemez.chatapi.click.Message;
+
+@Commands(CommandHolderType.File)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Discord implements Module {
+ private MysqlTable table;
+
+ private String inviteLink;
+
+ private final String tokenCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ private SecureRandom rnd = new SecureRandom();
+
+ @Override
+ public boolean onEnable() {
+ Config config;
+
+ try {
+ config = Config.getConfig("Discord.json");
+ } catch (IOException | org.json.simple.parser.ParseException e1) {
+ e1.printStackTrace();
+ return false;
+ }
+
+ if (config == null || !config.containsKey("database") || !config.containsKey("table") || !config.containsKey("inviteLink")) {
+ getLogger().error("Could not load the Discord config file, disabling!");
+
+ config.put("database", "redstoner");
+ config.put("table", "discord");
+ config.put("inviteLink", "https://discord.gg/example");
+
+ try {
+ config.save();
+ } catch (IOException | NonSaveableConfigException e) {}
+
+ return false;
+ }
+
+ inviteLink = config.get("inviteLink");
+
+ try {
+ MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase(config.get("database") + "?autoReconnect=true");
+
+ MysqlField token = new MysqlField("token", new VarChar(8), false);
+ MysqlField uuid = new MysqlField("uuid", new VarChar(36), false);
+ MysqlField used = new MysqlField("used", new TinyInt(1), false);
+
+ database.createTableIfNotExists((String) config.get("table"), token, uuid, used);
+
+ table = database.getTable(config.get("table"));
+ } catch (NullPointerException e) {
+ getLogger().error("Could not use the Discord config, aborting!");
+ return false;
+ }
+
+ return true;
+ }
+
+ @Command(hook = "discord")
+ public void discord(CommandSender sender) {
+ Player p = (Player) sender;
+ String pUUID = p.getUniqueId().toString().replaceAll("-", "");
+
+ String token = null;
+ int tries = 0;
+
+ 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 (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 you rank, copy ")
+ .appendSuggestHover("&e" + token, token, "&aClick to Copy").appendText("&7 into &3#rank-sync&7.\n").send();
+ }
+
+ private String randomToken(int length) {
+ StringBuilder sb = new StringBuilder(length);
+
+ for (int i = 0; i < length; i++) {
+ sb.append(tokenCharacters.charAt(rnd.nextInt(tokenCharacters.length())));
+ }
+
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/discord/module.info b/src/main/java/com/redstoner/modules/discord/module.info
new file mode 100644
index 0000000..5a75ac8
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/discord/module.info
@@ -0,0 +1,3 @@
+displayName: Discord
+category: External
+description: Links your minecraft account to your discord account to sync your rank. \ No newline at end of file
diff --git a/src/com/redstoner/modules/friends/Friends.cmd b/src/main/java/com/redstoner/modules/friends/Friends.cmd
index ea205c9..ea205c9 100644
--- a/src/com/redstoner/modules/friends/Friends.cmd
+++ b/src/main/java/com/redstoner/modules/friends/Friends.cmd
diff --git a/src/com/redstoner/modules/friends/Friends.java b/src/main/java/com/redstoner/modules/friends/Friends.java
index 2eb9728..9e06a3f 100644
--- a/src/com/redstoner/modules/friends/Friends.java
+++ b/src/main/java/com/redstoner/modules/friends/Friends.java
@@ -1,6 +1,5 @@
package com.redstoner.modules.friends;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.UUID;
@@ -30,331 +29,323 @@ import com.redstoner.modules.datamanager.DataManager;
@AutoRegisterListener
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 0, compatible = 4)
-public class Friends implements CoreModule
-{
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Friends implements CoreModule {
@EventHandler(priority = EventPriority.MONITOR)
- public void onPlayerJoin(PlayerJoinEvent e)
- {
+ public void onPlayerJoin(PlayerJoinEvent e) {
JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray());
- for (Object obj : friended_by)
- {
+
+ for (Object obj : friended_by) {
UUID uuid = UUID.fromString((String) obj);
Player p = Bukkit.getPlayer(uuid);
- if (p != null && p.canSee(e.getPlayer()))
- {
+
+ if (p != null && p.canSee(e.getPlayer())) {
getLogger().message(p, "Your friend &e" + e.getPlayer().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)
+
+ JSONArray notifications = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "scheduled_notifications", new JSONArray());
+
+ for (Object obj : notifications) {
getLogger().message(e.getPlayer(), (String) obj);
+ }
}
-
+
@EventHandler(priority = EventPriority.MONITOR)
- public void onPlayerLeave(PlayerQuitEvent e)
- {
+ public void onPlayerLeave(PlayerQuitEvent e) {
JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray());
- for (Object obj : friended_by)
- {
+
+ for (Object obj : friended_by) {
UUID uuid = UUID.fromString((String) obj);
Player p = Bukkit.getPlayer(uuid);
- if (p != null && p.canSee(e.getPlayer()))
- {
+
+ if (p != null && p.canSee(e.getPlayer())) {
getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just left!");
p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1);
}
}
}
-
- @SuppressWarnings({"unchecked", "deprecation"})
+
+ @SuppressWarnings({ "unchecked", "deprecation" })
@Command(hook = "add")
- public boolean add(CommandSender sender, String target)
- {
- if (target.equalsIgnoreCase("CONSOLE"))
- {
+ public boolean add(CommandSender sender, String target) {
+ if (target.equalsIgnoreCase("CONSOLE")) {
getLogger().message(sender, true, "You can't add console to your friends!");
return true;
}
+
OfflinePlayer p = Bukkit.getPlayer(target);
- if (p == null)
- p = Bukkit.getOfflinePlayer(target);
- if (p == null)
- {
+
+ if (p == null) p = Bukkit.getOfflinePlayer(target);
+ if (p == null) {
getLogger().message(sender, true, "That player couldn't be found!");
return true;
}
+
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()));
- if (friends.contains(p.getUniqueId().toString()))
- {
+
+ if (friends.contains(p.getUniqueId().toString())) {
getLogger().message(sender, true, "You are already friends with this person!");
return true;
}
+
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()));
+
+ 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.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
- {
- JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
- "scheduled_notifications", new JSONArray());
+ } 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);
}
+
return true;
}
-
- @SuppressWarnings({"deprecation", "unchecked"})
+
+ @SuppressWarnings({ "deprecation", "unchecked" })
@Command(hook = "add_grouped")
- public boolean add_grouped(CommandSender sender, String target, String group)
- {
- if (target.equalsIgnoreCase("CONSOLE"))
- {
+ public boolean add_grouped(CommandSender sender, String target, String group) {
+ if (target.equalsIgnoreCase("CONSOLE")) {
getLogger().message(sender, true, "You can't add console to your friends!");
return true;
}
+
OfflinePlayer p = Bukkit.getPlayer(target);
- if (p == null)
- p = Bukkit.getOfflinePlayer(target);
- if (p == null)
- {
+
+ if (p == null) p = Bukkit.getOfflinePlayer(target);
+ if (p == null) {
getLogger().message(sender, true, "That player couldn't be found!");
return true;
}
+
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray()));
- if (friends.contains(p.getUniqueId().toString()))
- {
+
+ if (friends.contains(p.getUniqueId().toString())) {
getLogger().message(sender, true, "This person already is part of that friendsgroup!");
return true;
}
+
friends.add(p.getUniqueId().toString());
+ DataManager.setData(sender, "groups." + 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
- {
- JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
- "scheduled_notifications", new JSONArray());
+
+ if (p instanceof Player) {
+ getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7added you to their friendsgroup &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.remove("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!");
+
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
}
+
return true;
}
-
- @SuppressWarnings({"deprecation", "unchecked"})
+
+ @SuppressWarnings({ "deprecation", "unchecked" })
@Command(hook = "del")
- public boolean del(CommandSender sender, String target)
- {
- if (target.equalsIgnoreCase("CONSOLE"))
- {
+ public boolean del(CommandSender sender, String target) {
+ if (target.equalsIgnoreCase("CONSOLE")) {
getLogger().message(sender, true, "You can't add console to your friends!");
return true;
}
+
OfflinePlayer p = Bukkit.getPlayer(target);
- if (p == null)
- p = Bukkit.getOfflinePlayer(target);
- if (p == null)
- {
+
+ if (p == null) p = Bukkit.getOfflinePlayer(target);
+ if (p == null) {
getLogger().message(sender, true, "That player couldn't be found!");
return true;
}
+
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()));
- if (friends.contains(p.getUniqueId().toString()))
- {
- getLogger().message(sender, true, "You are already friends with this person!");
+
+ if (!friends.contains(p.getUniqueId().toString())) {
+ getLogger().message(sender, true, "You are not friends with that player!");
return true;
}
+
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()));
+
+ 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.save(p.getUniqueId().toString());
- getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!");
- if (p instanceof Player)
- {
- getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!");
- }
- else
- {
- JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
- "scheduled_notifications", new JSONArray());
+
+ getLogger().message(sender, "You are no longer friends with &e" + p.getName() + "&7!");
+
+ if (p instanceof Player) {
+ getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 removed you as a friend!");
+ } 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);
}
+
return true;
}
-
- @SuppressWarnings({"deprecation", "unchecked"})
+
+ @SuppressWarnings({ "deprecation", "unchecked" })
@Command(hook = "del_grouped")
- public boolean del_grouped(CommandSender sender, String target, String group)
- {
- if (target.equalsIgnoreCase("CONSOLE"))
- {
+ public boolean del_grouped(CommandSender sender, String target, String group) {
+ if (target.equalsIgnoreCase("CONSOLE")) {
getLogger().message(sender, true, "You can't add console to your friends!");
return true;
}
+
OfflinePlayer p = Bukkit.getPlayer(target);
- if (p == null)
- p = Bukkit.getOfflinePlayer(target);
- if (p == null)
- {
+
+ if (p == null) p = Bukkit.getOfflinePlayer(target);
+ if (p == null) {
getLogger().message(sender, true, "That player couldn't be found!");
return true;
}
+
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray()));
- if (friends.contains(p.getUniqueId().toString()))
- {
- getLogger().message(sender, true, "This person already is part of that friendsgroup!");
+
+ if (!friends.contains(p.getUniqueId().toString())) {
+ getLogger().message(sender, true, "This person isn't a part of that friendsgroup!");
return true;
}
+
friends.add(p.getUniqueId().toString());
+ DataManager.setData(sender, "groups." + 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
- {
- 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!");
+
+ 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 {
+ 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!");
+
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
}
+
return true;
}
-
+
@Command(hook = "list")
- public boolean list(CommandSender sender)
- {
+ public boolean list(CommandSender sender) {
JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray());
- if (friends.size() == 0)
- {
- getLogger().message(sender, true, "You didn't add anyone to your friendslist yet.");
- }
- else
- {
+
+ 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())
- {
+
+ 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, ");
+
+ if (p != null) sb.append(p.getDisplayName() + "&7, ");
+ else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, ");
}
+
String out = sb.toString().replaceAll(", $", "");
getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends:", out);
}
+
return true;
}
-
+
@Command(hook = "list_group")
- public boolean list_group(CommandSender sender, String group)
- {
+ public boolean list_group(CommandSender sender, String group) {
JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "group." + group, new JSONArray());
- if (friends.size() == 0)
- {
+
+ if (friends.size() == 0) {
getLogger().message(sender, true, "You didn't add anyone to this group yet.");
- }
- else
- {
+ } else {
StringBuilder sb = new StringBuilder();
- for (Object o : friends.toArray())
- {
+
+ 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, ");
+
+ if (p != null) sb.append(p.getDisplayName() + "&7, ");
+ else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, ");
}
+
String out = sb.toString().replaceAll(", $", "");
getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends added to this group:", out);
}
+
return true;
}
-
+
@Command(hook = "list_groups")
- public boolean list_groups(CommandSender sender)
- {
+ 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))
- {
+
+ if (keys.size() == 0 || (keys.contains("friends") && keys.size() == 1)) {
getLogger().message(sender, true, "You don't have any custom groups made yet.");
return true;
- }
- else
- {
+ } else {
StringBuilder sb = new StringBuilder();
- for (Object o : keys)
- {
- sb.append("&e" + (String) o + "&7, ");
+
+ for (Object o : keys) {
+ sb.append("&e" + ((String) o).substring(6) + "&7, ");
}
+
String out = sb.toString().replaceAll(", $", "");
getLogger().message(sender, "", out);
}
+
return true;
}
-
- public static boolean isFriend(CommandSender player, CommandSender friend)
- {
+
+ public static boolean isFriend(CommandSender player, CommandSender friend) {
return isFriend(player, friend, null);
}
-
- public static boolean isFriend(CommandSender player, CommandSender friend, String condition)
- {
- try
- {
+
+ public static boolean isFriend(CommandSender player, CommandSender friend, String condition) {
+ try {
Module mod = ModuleLoader.getModule("Friends");
Method m = mod.getClass().getDeclaredMethod("isFriend_", String.class);
+
return (boolean) m.invoke(mod, player, friend, condition);
+ } catch (Exception e) {
+ return false;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return false;
}
-
- protected boolean isFriend_(CommandSender player, CommandSender friend, String group)
- {
- if (group == null)
- group = "friends";
- else if (!group.startsWith("group."))
- group = "group." + group;
+
+ protected boolean isFriend_(CommandSender player, CommandSender friend, String group) {
+ if (group == null) group = "friends";
+ else if (!group.startsWith("group.")) group = "group." + group;
+
JSONArray array = (JSONArray) DataManager.getOrDefault(player, group, new JSONArray());
return array.contains(getID(friend));
}
-
- private final String getID(CommandSender sender)
- {
- if (sender instanceof Player)
- return ((Player) sender).getUniqueId().toString();
- else
- return sender.getName();
+
+ private final String getID(CommandSender sender) {
+ if (sender instanceof Player) return ((Player) sender).getUniqueId().toString();
+ else return sender.getName();
}
}
diff --git a/src/main/java/com/redstoner/modules/friends/module.info b/src/main/java/com/redstoner/modules/friends/module.info
new file mode 100644
index 0000000..41062ba
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/friends/module.info
@@ -0,0 +1,3 @@
+displayName: Friends
+category: Other
+description: Notifies players when a friend comes online. Also used by other modules for various features \ No newline at end of file
diff --git a/src/com/redstoner/modules/ignore/Ignore.cmd b/src/main/java/com/redstoner/modules/ignore/Ignore.cmd
index 382846b..d8360d0 100644
--- a/src/com/redstoner/modules/ignore/Ignore.cmd
+++ b/src/main/java/com/redstoner/modules/ignore/Ignore.cmd
@@ -1,20 +1,19 @@
command ignore {
+ perm utils.ignore;
[string:player] {
- perm utils.ignore;
run ignore player;
type player;
help Ignores or Unignores a player.;
}
[empty] {
- perm utils.ignore;
run list;
type player;
help Lists everyone you ignore.;
}
}
command unignore {
+ perm utils.ignore;
[string:player] {
- perm utils.ignore;
run unignore player;
type player;
help Unignore a player.;
diff --git a/src/com/redstoner/modules/ignore/Ignore.java b/src/main/java/com/redstoner/modules/ignore/Ignore.java
index c830700..0596bb9 100644
--- a/src/com/redstoner/modules/ignore/Ignore.java
+++ b/src/main/java/com/redstoner/modules/ignore/Ignore.java
@@ -1,6 +1,5 @@
package com.redstoner.modules.ignore;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;
@@ -26,134 +25,112 @@ import net.nemez.chatapi.click.Message;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 0, revision = 0, compatible = 4)
-public class Ignore implements Module
-{
-
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class Ignore implements Module {
@Command(hook = "unignore", async = AsyncType.ALWAYS)
- public boolean unignore(CommandSender sender, String player)
- {
+ public boolean unignore(CommandSender sender, String player) {
return ignore(sender, player, false);
}
-
+
@Command(hook = "ignore", async = AsyncType.ALWAYS)
- public boolean ignore(CommandSender sender, String player)
- {
+ public boolean ignore(CommandSender sender, String player) {
return ignore(sender, player, true);
}
-
+
@Command(hook = "list", async = AsyncType.ALWAYS)
- public boolean list(CommandSender sender)
- {
+ public boolean list(CommandSender sender) {
getLogger().message(sender, "ยง7You are currently ignoring:");
-
+
JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray());
-
- if (ignores.isEmpty())
- {
+
+ if (ignores.isEmpty()) {
new Message(sender, null).appendText(" ยง7Nobody \\o/").send();
return true;
}
-
+
String players;
OfflinePlayer pi = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(0)));
players = " ยง3" + pi.getName() + "ยง7";
-
- for (int i = 1; i < ignores.size(); i++)
- {
+
+ for (int i = 1; i < ignores.size(); i++) {
OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(i)));
players += ", ยง3" + p.getName() + "ยง7";
}
-
+
Message m = new Message(sender, null);
m.appendText(players);
m.send();
+
return true;
}
-
- @SuppressWarnings({"unchecked", "deprecation"})
- public boolean ignore(CommandSender sender, String player, boolean allowIgnore)
- {
+
+ @SuppressWarnings({ "unchecked", "deprecation" })
+ public boolean ignore(CommandSender sender, String player, boolean allowIgnore) {
JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray());
-
+
Player p = Utils.isUUID(player) ? Bukkit.getPlayer(UUID.fromString(player)) : Bukkit.getPlayer(player);
-
- OfflinePlayer op = Utils.isUUID(player) ? Bukkit.getOfflinePlayer(UUID.fromString(player))
- : Bukkit.getOfflinePlayer(player);
-
+
+ OfflinePlayer op = Utils.isUUID(player) ? Bukkit.getOfflinePlayer(UUID.fromString(player)) : Bukkit.getOfflinePlayer(player);
+
String pName = p != null ? p.getDisplayName() : op.getName();
String pUUID = p != null ? p.getUniqueId().toString() : op.getUniqueId().toString();
String sUUID = ((Player) sender).getUniqueId().toString();
-
- if (pUUID.equals(sUUID))
- {
+
+ if (pUUID.equals(sUUID)) {
getLogger().message(sender, true, "ยง7You can't ignore yourself :P");
return true;
}
-
- if (ignores.contains(pUUID))
- {
+
+ if (ignores.contains(pUUID)) {
ignores.remove(pUUID);
getLogger().message(sender, "ยง7You are no longer ignoring ยง3" + pName + "ยง7.");
- }
- else if (!allowIgnore)
- {
+ } else if (!allowIgnore) {
getLogger().message(sender, "ยง7You weren't ignoring ยง3" + pName + "ยง7.");
- }
- else
- {
+ } else {
ignores.add(pUUID);
getLogger().message(sender, "ยง7You are now ignoring ยง3" + pName + "ยง7.");
}
+
DataManager.setData(sender, "ignores", ignores);
+
return true;
-
+
}
-
- public static BroadcastFilter getIgnoredBy(CommandSender sender)
- {
- try
- {
+
+ public static BroadcastFilter getIgnoredBy(CommandSender sender) {
+ try {
Module mod = ModuleLoader.getModule("Ignore");
+
Method m = mod.getClass().getDeclaredMethod("_getIgnoredBy", CommandSender.class);
m.setAccessible(true);
+
return (BroadcastFilter) m.invoke(mod, sender);
+ } catch (Exception e) {
+ return null;
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e)
- {}
- return null;
}
-
+
@SuppressWarnings("unused")
- private BroadcastFilter _getIgnoredBy(CommandSender sender)
- {
- return new BroadcastFilter()
- {
-
- private final String sUUID = sender instanceof Player ? ((Player) sender).getUniqueId().toString()
- : "CONSOLE";
-
+ private BroadcastFilter _getIgnoredBy(CommandSender sender) {
+ return new BroadcastFilter() {
+ private final String sUUID = sender instanceof Player ? ((Player) sender).getUniqueId().toString() : "CONSOLE";
+
@Override
- public boolean sendTo(CommandSender recipient)
- {
- if (sUUID.equals("CONSOLE"))
- return true;
-
- if (recipient instanceof Player)
- {
+ public boolean sendTo(CommandSender recipient) {
+ if (sUUID.equals("CONSOLE")) return true;
+
+ if ((recipient instanceof Player)) {
+
Player player = (Player) recipient;
-
- if (sender.hasPermission("utils.ignore.override"))
- return true;
-
+
+ if (sender.hasPermission("utils.ignore.override")) return true;
+
JSONArray ignores = (JSONArray) DataManager.getOrDefault(recipient, "ignores", new JSONArray());
return !ignores.contains(sUUID);
}
- else
- return true;
+ return true;
+
}
};
}
-
}
diff --git a/src/main/java/com/redstoner/modules/ignore/module.info b/src/main/java/com/redstoner/modules/ignore/module.info
new file mode 100644
index 0000000..79bb1fb
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/ignore/module.info
@@ -0,0 +1,3 @@
+displayName: Ignore
+category: Chat
+description: Allows someone to ignore players' chat messages and integrates with other modules \ No newline at end of file
diff --git a/src/com/redstoner/modules/lagchunks/LagChunks.cmd b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd
index 142a437..0426952 100644
--- a/src/com/redstoner/modules/lagchunks/LagChunks.cmd
+++ b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd
@@ -1,4 +1,5 @@
command lc {
+ alias lagchunks;
perm utils.lagchunks;
list {
diff --git a/src/com/redstoner/modules/lagchunks/LagChunks.java b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.java
index 1debf12..542f032 100644
--- a/src/com/redstoner/modules/lagchunks/LagChunks.java
+++ b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.java
@@ -1,8 +1,11 @@
package com.redstoner.modules.lagchunks;
-import java.util.ArrayList;
-import java.util.List;
-
+import com.nemez.cmdmgr.Command;
+import com.nemez.cmdmgr.Command.AsyncType;
+import com.redstoner.annotations.Commands;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.CommandHolderType;
+import com.redstoner.modules.Module;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
@@ -10,72 +13,56 @@ import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import com.nemez.cmdmgr.Command;
-import com.nemez.cmdmgr.Command.AsyncType;
-import com.redstoner.annotations.Commands;
-import com.redstoner.annotations.Version;
-import com.redstoner.misc.CommandHolderType;
-import com.redstoner.modules.Module;
+import java.util.ArrayList;
+import java.util.List;
+
+@Commands (CommandHolderType.File)
+@Version (major = 5, minor = 0, revision = 0, compatible = 4)
+public class LagChunks implements Module {
+ private List<LaggyChunk> laggyChunks = new ArrayList<>();
-@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class LagChunks implements Module
-{
- private List<LaggyChunk> laggyChunks = new ArrayList<LaggyChunk>();
-
- private void scan(int amount)
- {
+ private void scan(int amount) {
laggyChunks.clear();
- for (World world : Bukkit.getServer().getWorlds())
- {
- for (Chunk chunk : world.getLoadedChunks())
- {
- if (chunk.getEntities().length > amount)
- {
+
+ for (World world : Bukkit.getServer().getWorlds()) {
+ for (Chunk chunk : world.getLoadedChunks()) {
+ if (chunk.getEntities().length > amount) {
Location entLoc = chunk.getEntities()[0].getLocation();
laggyChunks.add(new LaggyChunk(entLoc.getBlockX(), entLoc.getBlockY(), entLoc.getBlockZ(), world,
- chunk.getEntities().length));
+ chunk.getEntities().length
+ ));
}
}
}
}
-
- @Command(hook = "list_cmd")
- public void list(CommandSender sender)
- {
- if (laggyChunks.size() > 0)
- {
- ArrayList<String> message = new ArrayList<String>();
- for (LaggyChunk lc : laggyChunks)
- {
+
+ @Command (hook = "list_cmd")
+ public void list(CommandSender sender) {
+ if (laggyChunks.size() > 0) {
+ ArrayList<String> message = new ArrayList<>();
+ for (LaggyChunk lc : laggyChunks) {
message.add("ยงb[ยงa" + laggyChunks.indexOf(lc) + "ยงb]: ยงa" + lc.x + "ยง7, ยงa" + lc.y + "ยง7, ยงa" + lc.z
- + " ยง7(" + lc.world.getName() + ") ยงa- ยงb" + lc.amount + " entities");
+ + " ยง7(" + lc.world.getName() + ") ยงa- ยงb" + lc.amount + " entities");
}
message.add("ยง2-------------------");
getLogger().message(sender, message.toArray(new String[] {}));
- }
- else
+ } else
getLogger().message(sender, true, "Couldn't find any chunks with that many entities.");
}
-
- @Command(hook = "scan_cmd", async = AsyncType.ALWAYS)
- public void scan_cmd(CommandSender sender, int amount)
- {
+
+ @Command (hook = "scan_cmd", async = AsyncType.ALWAYS)
+ public void scan_cmd(CommandSender sender, int amount) {
scan(amount);
list(sender);
}
-
- @Command(hook = "tp")
- public void tp(CommandSender sender, int number)
- {
+
+ @Command (hook = "tp")
+ public void tp(CommandSender sender, int number) {
Player player = (Player) sender;
- if (number < laggyChunks.size())
- {
+ if (number < laggyChunks.size()) {
player.teleport(laggyChunks.get(number).getLocation());
getLogger().message(player, "ยงaTeleported to chunk " + number + "!");
- }
- else
- {
+ } else {
getLogger().message(sender, true, "ยง4Invalid chunk number! Use ยงe/lc list ยง4to show laggy chunks!");
}
}
diff --git a/src/com/redstoner/modules/lagchunks/LaggyChunk.java b/src/main/java/com/redstoner/modules/lagchunks/LaggyChunk.java
index 3ff4d6f..3ff4d6f 100644
--- a/src/com/redstoner/modules/lagchunks/LaggyChunk.java
+++ b/src/main/java/com/redstoner/modules/lagchunks/LaggyChunk.java
diff --git a/src/main/java/com/redstoner/modules/lagchunks/module.info b/src/main/java/com/redstoner/modules/lagchunks/module.info
new file mode 100644
index 0000000..c39824f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/lagchunks/module.info
@@ -0,0 +1,3 @@
+displayName: LagChunks
+category: Staff
+description: Collects information about entities across the map and displays chunk info \ No newline at end of file
diff --git a/src/com/redstoner/modules/list/List.cmd b/src/main/java/com/redstoner/modules/list/List.cmd
index f4caf02..9b4fb78 100644
--- a/src/com/redstoner/modules/list/List.cmd
+++ b/src/main/java/com/redstoner/modules/list/List.cmd
@@ -9,6 +9,7 @@ command list {
alias eplist;
alias who;
alias ewho;
+ perm utils.list;
[empty] {
run list;
help Shows all online players sorted by rank.;
@@ -19,6 +20,7 @@ command list {
}
}
command staff {
+ perm utils.list;
[empty] {
help Shows all online staff.;
run staff;
diff --git a/src/com/redstoner/modules/list/List.java b/src/main/java/com/redstoner/modules/list/List.java
index d5a0016..6fa0a64 100644
--- a/src/com/redstoner/modules/list/List.java
+++ b/src/main/java/com/redstoner/modules/list/List.java
@@ -18,7 +18,7 @@ import com.redstoner.modules.datamanager.DataManager;
import net.nemez.chatapi.click.Message;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 5, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class List implements Module
{
private HashMap<String, Integer> onConsole;
diff --git a/src/main/java/com/redstoner/modules/list/module.info b/src/main/java/com/redstoner/modules/list/module.info
new file mode 100644
index 0000000..8a05ed3
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/list/module.info
@@ -0,0 +1,3 @@
+displayName: List
+category: Other
+description: Lists the players online separated by rank and subrank. \ No newline at end of file
diff --git a/src/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java b/src/main/java/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java
index e39d781..91dae9a 100644
--- a/src/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java
+++ b/src/main/java/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java
@@ -15,6 +15,7 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupArrowEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
+@SuppressWarnings("deprecation")
public class CancelledEventsHandler implements Listener {
private LoginSecurity mainClass;
diff --git a/src/com/redstoner/modules/loginsecurity/CryptographyHandler.java b/src/main/java/com/redstoner/modules/loginsecurity/CryptographyHandler.java
index 48e81a9..48e81a9 100644
--- a/src/com/redstoner/modules/loginsecurity/CryptographyHandler.java
+++ b/src/main/java/com/redstoner/modules/loginsecurity/CryptographyHandler.java
diff --git a/src/com/redstoner/modules/loginsecurity/LoginSecurity.cmd b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.cmd
index 952b3ed..952b3ed 100644
--- a/src/com/redstoner/modules/loginsecurity/LoginSecurity.cmd
+++ b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.cmd
diff --git a/src/com/redstoner/modules/loginsecurity/LoginSecurity.java b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java
index 7bcb89a..d32e29c 100644
--- a/src/com/redstoner/modules/loginsecurity/LoginSecurity.java
+++ b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java
@@ -36,7 +36,7 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class LoginSecurity implements Module, Listener
{
protected static Map<UUID, Location> loggingIn;
diff --git a/src/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java b/src/main/java/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java
index 4e8db6d..4e8db6d 100644
--- a/src/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java
+++ b/src/main/java/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java
diff --git a/src/main/java/com/redstoner/modules/loginsecurity/module.info b/src/main/java/com/redstoner/modules/loginsecurity/module.info
new file mode 100644
index 0000000..7f04aa7
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/loginsecurity/module.info
@@ -0,0 +1,3 @@
+displayName: LoginSecurity
+category: Other
+description: Secure your account with an additional password required when you join the server \ No newline at end of file
diff --git a/src/com/redstoner/modules/logs/LogEntry.java b/src/main/java/com/redstoner/modules/logs/LogEntry.java
index 3ccc844..3ccc844 100644
--- a/src/com/redstoner/modules/logs/LogEntry.java
+++ b/src/main/java/com/redstoner/modules/logs/LogEntry.java
diff --git a/src/com/redstoner/modules/logs/LogHandler.java b/src/main/java/com/redstoner/modules/logs/LogHandler.java
index 76f3849..624a7b5 100644
--- a/src/com/redstoner/modules/logs/LogHandler.java
+++ b/src/main/java/com/redstoner/modules/logs/LogHandler.java
@@ -7,7 +7,8 @@ import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.util.ArrayList;
+import java.util.Map;
+import java.util.TreeMap;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.zip.GZIPInputStream;
@@ -22,11 +23,12 @@ public class LogHandler extends Thread
{
private CommandSender sender;
private String regex, fileName;
- private static ArrayList<CommandSender> stillSearching = new ArrayList<>();
+ private static Map<String, LogHandler> activeSearches = new TreeMap<>();
public int totalFiles = 0;
public int filesSearched = 0;
public int totalLines = 0;
public int currentLine = 0;
+ private boolean isCanceled = false;
protected LogHandler(CommandSender sender, String regex, String fileName)
{
@@ -37,15 +39,24 @@ public class LogHandler extends Thread
public void doSearch()
{
- if (stillSearching.contains(sender))
+ String id = Utils.getID(sender);
+ if (activeSearches.containsKey(id))
{
Logs.logger.message(sender, true, "ยง4 DO NOT EVER TRY TO QUERY TWO SEARCHES AT ONCE. Go die...!");
return;
}
- stillSearching.add(sender);
+ activeSearches.put(Utils.getID(sender), this);
this.start();
}
+ public static void cancel(CommandSender sender) {
+ LogHandler handler = activeSearches.remove(Utils.getID(sender));
+ if (handler == null)
+ Logs.logger.message(sender, true, "You aren't running a search.");
+ else
+ handler.isCanceled = true;
+ }
+
/** Searches the logs for a certain regex and forwards any matches to the sender.
*
* @param sender the issuer of the search
@@ -55,8 +66,10 @@ public class LogHandler extends Thread
{
long starttime = System.currentTimeMillis();
int matches = 0;
+ String id = Utils.getID(sender);
Logs.logger.message(sender, "Starting log search for &e" + regex + "&7 in &e" + fileName
- + " &7now. &cPlease do not query any other searches until this one completes.");
+ + " &7now.");
+ Logs.logger.message(sender, "&cDon't run another query until this one is done!");
try
{
if (!regex.startsWith("^"))
@@ -72,9 +85,11 @@ public class LogHandler extends Thread
catch (PatternSyntaxException e)
{
Logs.logger.message(sender, true, "An error occured trying to compile the filename pattern!");
- stillSearching.remove(sender);
+ Logs.logger.message(sender, true, "&2Reason: &7" + e.getDescription());
+ activeSearches.remove(id);
return;
}
+
File[] files = logFolder.listFiles(new FilenameFilter()
{
@Override
@@ -83,11 +98,11 @@ public class LogHandler extends Thread
return fileNamePattern.matcher(name).matches();
}
});
- totalFiles = files.length;
+ totalFiles = files == null? 0 : files.length;
if (totalFiles == 0)
{
Logs.logger.message(sender, true, "No files found!");
- stillSearching.remove(sender);
+ activeSearches.remove(id);
return;
}
else
@@ -102,7 +117,8 @@ public class LogHandler extends Thread
catch (PatternSyntaxException e)
{
Logs.logger.message(sender, true, "An error occured trying to compile the search pattern!");
- stillSearching.remove(sender);
+ Logs.logger.message(sender, true, "&2Reason: " + e.getDescription());
+ activeSearches.remove(id);
return;
}
for (File file : files)
@@ -114,12 +130,16 @@ public class LogHandler extends Thread
new InputStreamReader(new GZIPInputStream(new FileInputStream(file))));
matches += searchStream(inputReader, searchPattern, sender, file.getName());
inputReader.close();
+ if (isCanceled)
+ break;
}
else
{
BufferedReader inputReader = new BufferedReader(new FileReader(file));
matches += searchStream(inputReader, searchPattern, sender, file.getName());
inputReader.close();
+ if (isCanceled)
+ break;
}
filesSearched++;
if (progress)
@@ -133,14 +153,15 @@ public class LogHandler extends Thread
{
Logs.logger.message(sender, true,
"An unexpected error occured, please check your search parameters and try again!");
- stillSearching.remove(sender);
+ activeSearches.remove(id);
return;
}
- stillSearching.remove(sender);
+ activeSearches.remove(id);
+
if ((boolean) DataManager.getOrDefault(Utils.getID(sender), "Logs", "summary", true))
{
String[] message = new String[2];
- message[0] = "ยงaYour search completed after " + (System.currentTimeMillis() - starttime) + "ms!";
+ message[0] = (isCanceled? "ยงaYou search was ยงcterminatedยงa after " : "ยงaYour search completed after ") + (System.currentTimeMillis() - starttime) + "ms!";
message[1] = "ยง7In total: ยงe" + filesSearched + "ยง7 File(s) and ยงe" + totalLines
+ "ยง7 Line(s) were searched, ยงa" + matches + "ยง7 Match(es) were found!";
Logs.logger.message(sender, message);
@@ -170,13 +191,15 @@ public class LogHandler extends Thread
currentLine = 0;
while ((line = inputReader.readLine()) != null)
{
+ if (isCanceled)
+ break;
totalLines++;
currentLine++;
if (searchPattern.matcher(line).matches())
{
if (((p != null) && (!p.isOnline())))
{
- stillSearching.remove(sender);
+ activeSearches.remove(Utils.getID(sender));
throw new IOException("The player has left during the search. Aborting now.");
}
LogEntry entry = new LogEntry(filename, line, currentLine, totalLines);
diff --git a/src/com/redstoner/modules/logs/Logs.cmd b/src/main/java/com/redstoner/modules/logs/Logs.cmd
index c5283fe..c64c1a2 100644
--- a/src/com/redstoner/modules/logs/Logs.cmd
+++ b/src/main/java/com/redstoner/modules/logs/Logs.cmd
@@ -1,34 +1,34 @@
command log {
perm utils.logs;
alias logs;
+ type player;
+
search [string:file(s)] [string:search...] {
run search_logs file(s) search;
help Performs the specified search operation on the logs. Wildcards are supported in filenames. Search string is a regex.;
- type player;
+ }
+ terminate {
+ run terminate_search;
+ help Stops the search.;
}
format {
run show_format;
help Displays your current log output format with an example result.;
- type player;
}
format_help {
run show_format_help;
help Displays all available placeholders for the formatting;
- type player;
}
option_help {
run show_option_help;
help Displays all available options.;
- type player;
}
set format [string:format] {
run set_format format;
help Sets a new log output format;
- type player;
}
set [string:option] [boolean:state] {
run set_option option state;
help Allows you to enable or disable various features such as sumamries, live progress updates, etc...;
- type player;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/logs/Logs.java b/src/main/java/com/redstoner/modules/logs/Logs.java
index b54bfc9..054befd 100644
--- a/src/com/redstoner/modules/logs/Logs.java
+++ b/src/main/java/com/redstoner/modules/logs/Logs.java
@@ -15,7 +15,7 @@ import com.redstoner.modules.ModuleLogger;
import com.redstoner.modules.datamanager.DataManager;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 4, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Logs implements Module
{
public static final String defaultFormat = "ยง7 > %f: %r";
@@ -26,13 +26,6 @@ public class Logs implements Module
protected static ModuleLogger logger;
@Override
- public void firstLoad()
- {
- Module.super.firstLoad();
- DataManager.setConfig("logs.root", "/etc/minecraft/redstoner/logs");
- }
-
- @Override
public boolean onEnable()
{
Module.super.onEnable();
@@ -42,7 +35,7 @@ public class Logs implements Module
public static File getLogsDir()
{
- return new File((String) DataManager.getConfigOrDefault("logs.root", "../logs"));
+ return new File((String) DataManager.getConfigOrDefault("logs.root", "logs"));
}
@Command(hook = "search_logs")
@@ -53,6 +46,13 @@ public class Logs implements Module
return true;
}
+ @Command(hook = "terminate_search")
+ public boolean terminate_search(CommandSender sender)
+ {
+ LogHandler.cancel(sender);
+ return true;
+ }
+
// FORMATTING
@Command(hook = "show_format")
public boolean show_format(CommandSender sender)
diff --git a/src/main/java/com/redstoner/modules/logs/module.info b/src/main/java/com/redstoner/modules/logs/module.info
new file mode 100644
index 0000000..922bf57
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/logs/module.info
@@ -0,0 +1,3 @@
+displayName: Logs
+category: Staff
+description: Allows staff to Search server logs in-game \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/mail/Mail.cmd b/src/main/java/com/redstoner/modules/mail/Mail.cmd
new file mode 100644
index 0000000..705dafe
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/mail/Mail.cmd
@@ -0,0 +1,81 @@
+command mail {
+ perm utils.mail;
+ type player;
+
+ [empty] {
+ run read;
+ help Shows your inbox of mails.;
+ }
+ read [empty] {
+ run read;
+ help Shows your inbox of messages.;
+ }
+ delete [int:id] {
+ run delete id;
+ help Deletes the given message.;
+ }
+ clear [empty] {
+ run clear;
+ help Clears your inbox.;
+ }
+ send [string:player] [string:message...] {
+ run send player message;
+ help Send a message to the given player.;
+ }
+ reply [int:id] [string:message...] {
+ run reply id message;
+ help Reply to a players message.;
+ }
+ retract [int:id] {
+ run retract_id id;
+ help Retract the given message, if the player has not read it yet.;
+ }
+ retract [empty] {
+ run retract;
+ help Retract the last message you sent, if the player has not read it yet.;
+ }
+ archive [empty] {
+ run archive_read;
+ help Shoes are archived messages.;
+ }
+ archive read [empty]{
+ run archive_read;
+ help Shoes are archived messages.;
+ }
+ archive [int:id] {
+ run archive id;
+ help Archives a message.;
+ }
+ unarchive [int:id] {
+ run unarchive id;
+ help Unarchives a message.;
+ }
+ settings theme {
+ [string:s_theme] {
+ run settings_theme_set s_theme;
+ help Sets the theme for your inbox. Available themes are: Light, Dark, and Gold.;
+ }
+ run settings_theme;
+ help Shows your current theme setting.;
+ }
+ settings actions {
+ [string:s_actions] {
+ run settings_actions_set s_actions;
+ help Sets the action set for your inbox. Available options are: \nMinimal: No click actions,\nSimple: Delete, and \nStandard: Delete, and Reply. \nAll actions are still available as commands.;
+ }
+ run settings_actions;
+ help Shows your current action set setting.;
+ }
+ settings names {
+ [string:s_names] {
+ run settings_names_set s_names;
+ help Sets if you want to see player's username or display name. Available options are: username or displayname;
+ }
+ run settings_names;
+ help Shows your current names setting.;
+ }
+ [string:player] [string:message...] {
+ run send player message;
+ help Send a message to the given player.;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/mail/Mail.java b/src/main/java/com/redstoner/modules/mail/Mail.java
new file mode 100644
index 0000000..ee26842
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/mail/Mail.java
@@ -0,0 +1,620 @@
+package com.redstoner.modules.mail;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+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.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+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)
+public class Mail implements Module, Listener
+{
+
+ private Map<String, List<Msg>> playerToMsg = new HashMap<>();
+ private Map<Integer, Msg> idToMsg = new HashMap<>();
+ private Map<String, Integer> lastSent = new HashMap<>();
+ private Map<String, Map<Integer, Msg>> archives = new HashMap<>();
+ private int lastID = 1;
+
+ @Command(hook = "read")
+ public void read(CommandSender sender) {
+
+ String uuid = ((Player)sender).getUniqueId().toString();
+
+ List<Msg> list = playerToMsg.get(uuid);
+ if (list == null) {
+ getLogger().message(sender, true, "You have no new messages.");
+ return;
+ }
+
+ boolean shownTut = (boolean) DataManager.getOrDefault(sender, "showntut", false);
+
+ if (!shownTut) {
+ ChatAPI.createMessage(sender)
+ .appendText(getLogger().getHeader() + "\n&7Looks like you've never read your"
+ + " messages before, here is a quick overview of it.\n\n&9There are 3 themes: ")
+ .appendSendChatHover("&eLight", "/mail settings theme light",
+ "&7[&cX&7][&9I&7][&8Reply&7] &afriend22&7: &fTest message!")
+ .appendText("&7, ")
+ .appendSendChatHover("&eDark", "/mail settings theme dark",
+ "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!")
+ .appendText("&7, and ")
+ .appendSendChatHover("&eGold", "/mail settings theme gold",
+ "&6[&fX&6][&fI&6][&fReply&6] &afriend22&6: &fTest message!")
+ .appendText("\n&7&o Hover to preview, click to select. Default is Dark.")
+
+ .appendText("\n&9There are also 4 action sets: ")
+ .appendSendChatHover("&eMinimal", "/mail settings actions minimal",
+ "&8[&9I&8] &afriend22&7: &fTest message!")
+ .appendText("&7, ")
+ .appendSendChatHover("&eSimple", "/mail settings actions simple",
+ "&8[&cX&8][&9I&8] &afriend22&7: &fTest message!")
+ .appendText("&7, ")
+ .appendSendChatHover("&eNormal", "/mail settings actions normal",
+ "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!")
+ .appendText("&7, and ")
+ .appendSendChatHover("&eFull", "/mail settings actions full",
+ "&8[&cX&8][&9I&8][&7Reply&8][&6Archive&8] &afriend22&7: &fTest message!")
+ .appendText("\n&7&o Hover to preview, click to select. Default is Normal")
+
+ .appendText("\n&9You can see names in 2 ways: ")
+ .appendSendChatHover("&eUsernames", "/mail settings names username",
+ "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!")
+ .appendText("&7 or ")
+ .appendSendChatHover("&eDisplayName", "/mail settings names displayname",
+ "&8[&cX&8][&9I&8][&7Reply&8] &a&ofriendinator&r&7: &fTest message!")
+ .appendText("\n&7&o Hover to preview, click to select. Default is Username")
+
+ .appendText("\n\n&9What the things on the left mean:\n"
+ + " &8[&cX&8]&7 - Deletes the message\n"
+ + " &8[&9I&8]&7 - Shows some basic info when hovered over.\n"
+ + " &8[&7Reply&8]&7 - Replys to the message; forms a message chain.\n"
+ + " &8[&6Archive&8]&7 - Archives the message.\n\n"
+ + "For command help run ")
+ .appendSendChatHover("&e/mail help", "/mail help", "Click to run")
+ .appendText("&7 to get a list of commands.\n&2Now do ")
+ .appendSendChatHover("&e/mail read","/mail","Click to run")
+ .appendText("&2 again to start reading.")
+ .send();
+ DataManager.setData(sender, "showntut", true);
+ DataManager.setData(sender, "theme", "DARK");
+ DataManager.setData(sender, "actions", "NORMAL");
+ DataManager.setData(sender, "names", "username");
+ return;
+ }
+
+ String themeStr = (String) DataManager.getData(sender, "theme");
+ String actions = (String) DataManager.getData(sender, "actions");
+ String names = (String) DataManager.getData(sender, "names");
+ Theme theme;
+
+ if (!isValidTheme(themeStr)) {
+ theme = Theme.DARK;
+ DataManager.setData(sender, "theme", theme);
+ getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset.");
+ }
+ else
+ theme = Theme.valueOf(themeStr);
+ if (!isValidActions(actions)) {
+ actions = "NORMAL";
+ DataManager.setData(sender, "actions", actions);
+ getLogger().message(sender, true, "Something went wrong with your action set setting. The setting has been reset.");
+ }
+ if (!isValidNames(names)) {
+ names = "username";
+ DataManager.setData(sender, "names", names);
+ getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset.");
+ }
+
+ boolean useDisplayName = names.equals("displayname");
+
+ ChatAPI.send(sender, "\n" + getLogger().getHeader());
+ ChatAPI.send(sender, "");
+ switch (actions) {
+ case "MINIMAL":
+ for (Msg m : list) {
+ m.showMinimal(sender, theme, useDisplayName);
+ m.read();
+ }
+ break;
+ case "SIMPLE":
+ for (Msg m : list) {
+ m.showSimple(sender, theme, useDisplayName);
+ m.read();
+ }
+ break;
+ case "NORMAL":
+ for (Msg m : list) {
+ m.showNormal(sender, theme, useDisplayName);
+ m.read();
+ }
+ break;
+ case "FULL":
+ for (Msg m : list) {
+ m.showFull(sender, theme, useDisplayName);
+ m.read();
+ }
+ break;
+ }
+
+ ChatAPI.createMessage(sender).appendText("\n" + theme.getClearColor() + "Do ")
+ .appendSendChatHover(theme.getClearAccentColor() + "/mail clear","/mail clear","&cClick to Clear")
+ .appendText(theme.getClearColor() + " to clear all of your messages.")
+ .send();
+
+ savePlayerMsgs(uuid);
+
+ }
+
+ @Command(hook = "delete")
+ public void delete(CommandSender sender, int id) {
+ Msg msg = idToMsg.get(id);
+ String uuid = ((Player)sender).getUniqueId().toString();
+
+ if (msg == null || !msg.getReciever().equals(uuid)) {
+ getLogger().message(sender, true, "You have no messages with that ID[" + id + "].");
+ return;
+ }
+
+ idToMsg.remove(id);
+
+ List<Msg> list = playerToMsg.get(uuid);
+ list.remove(msg);
+ if (list.isEmpty())
+ playerToMsg.remove(uuid);
+ else
+ playerToMsg.put(uuid, list);
+
+ getLogger().message(sender, "Message Deleted. [ID=" + id + "]");
+ savePlayerMsgs(uuid);
+ }
+
+ @Command(hook = "clear")
+ public void clear(CommandSender sender) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+
+ List<Msg> list = playerToMsg.get(uuid);
+
+ if (list == null) {
+ getLogger().message(sender, "Messages Cleared.");
+ return;
+ }
+
+ playerToMsg.remove(uuid);
+ for (Msg m : list)
+ idToMsg.remove(m.getID());
+
+ getLogger().message(sender, "Messages Cleared.");
+ savePlayerMsgs(uuid);
+ }
+
+ @Command(hook = "send")
+ @SuppressWarnings("deprecation")
+ public void send(CommandSender sender, String player, String message) {
+ OfflinePlayer op = Bukkit.getOfflinePlayer(player);
+ if (!op.hasPlayedBefore())
+ getLogger().message(sender, true, "&e" + player + "&7 has never joined the server.");
+ else
+ sendMessage(sender, op.getPlayer().getUniqueId().toString(), message, null);
+ }
+
+ @Command(hook = "reply")
+ public void reply(CommandSender sender, int id, String message) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+
+ Msg msg = idToMsg.get(id);
+
+ if (msg == null || !msg.getReciever().equals(uuid)) {
+ getLogger().message(sender, true, "You have no messages with that ID[" + id + "].");
+ return;
+ }
+
+ sendMessage(sender, msg.getSender(), message, msg.getChain());
+
+ }
+
+
+ public void sendMessage(CommandSender sender, String r_uuid, String message, String chain) {
+
+ Player r = Bukkit.getOfflinePlayer(UUID.fromString(r_uuid)).getPlayer();
+
+ 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();
+
+ Date date = new Date();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
+ dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ int id = getNextID();
+
+ Msg msg = new Msg(id, s_uuid, r_uuid, dateFormat.format(date), message, chain, false);
+
+ idToMsg.put(id, msg);
+ List<Msg> list = playerToMsg.getOrDefault(r_uuid, new ArrayList<>());
+ list.add(msg);
+ playerToMsg.put(r_uuid, list);
+ lastSent.put(s_uuid, id);
+
+ getLogger().message(sender, "Message Sent! [ID=" + id + "]");
+ ChatAPI.createMessage(sender)
+ .appendText(getLogger().getPrefix() + "Click ")
+ .appendSendChatHover("&ehere", "/mail retract " + id, "&cClick to Retract")
+ .appendText("&7 or do ")
+ .appendSuggestHover("&e/mail retract [id]", "/mail retract", "Click to Copy")
+ .appendText("&7 to retract it.")
+ .send();
+
+
+ if (r.isOnline()) {
+ int num = playerToMsg.get(r_uuid).size();
+ ChatAPI.createMessage(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.")
+ .send();
+ }
+
+ savePlayerMsgs(r_uuid);
+ }
+
+ @Command(hook = "retract")
+ public void retract(CommandSender sender) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+ int id = lastSent.get(uuid);
+ if (id == 0)
+ getLogger().message(sender, true, "You haven't sent a message this session.");
+ else
+ retract_id(sender, id);
+ }
+
+ @Command(hook = "retract_id")
+ public void retract_id(CommandSender sender, int id) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+ Msg msg = idToMsg.get(id);
+
+ if (msg == null || !msg.getSender().equals(uuid))
+ getLogger().message(sender, true, "Unable to retract, that message doesn't exist. You either put in the wrong id, or it was deleted by the reciever.");
+ else if (msg.isRead())
+ getLogger().message(sender, true, "Unable to retract, message has already been read.");
+ else {
+ idToMsg.remove(id);
+
+ String r_uuid = msg.getReciever();
+ List<Msg> list = playerToMsg.get(r_uuid);
+ list.remove(msg);
+ if (list.isEmpty())
+ playerToMsg.remove(r_uuid);
+ else
+ playerToMsg.put(r_uuid, list);
+ getLogger().message(sender, "Message Retracted.");
+ savePlayerMsgs(r_uuid);
+ }
+ }
+
+ @Command(hook = "archive_read")
+ public void archive_read(CommandSender sender) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+ Map<Integer, Msg> list = archives.get(uuid);
+
+ if (list == null) {
+ getLogger().message(sender, true, "You have no archived messages.");
+ return;
+ }
+
+ ChatAPI.send(sender, "&2--=[ Archived ]=--");
+ ChatAPI.send(sender, "");
+
+ String themeStr = (String) DataManager.getData(sender, "theme");
+ String names = (String) DataManager.getData(sender, "names");
+ Theme theme;
+
+ if (!isValidTheme(themeStr)) {
+ theme = Theme.DARK;
+ DataManager.setData(sender, "theme", theme);
+ getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset.");
+ }
+ else
+ theme = Theme.valueOf(themeStr);
+ if (!isValidNames(names)) {
+ names = "username";
+ DataManager.setData(sender, "names", names);
+ getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset.");
+ }
+
+ for (Msg m : list.values()) {
+ m.showArchived(sender, theme, names.equals("displayname"));
+ }
+
+ ChatAPI.send(sender, "\n&2These messages don't count towards your mail count.");
+ }
+
+ @Command(hook = "archive")
+ public void archive(CommandSender sender, int id) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+ Msg msg = idToMsg.get(id);
+
+ if (msg == null || !msg.getReciever().equals(uuid)) {
+ getLogger().message(sender, true, "You have no messages with that ID[" + id + "].");
+ return;
+ }
+
+ msg.read();
+
+ List<Msg> list = playerToMsg.get(uuid);
+ list.remove(msg);
+ if (list.isEmpty())
+ playerToMsg.remove(uuid);
+ else
+ playerToMsg.put(uuid, list);
+ idToMsg.remove(id);
+
+ Map<Integer,Msg> list2 = archives.getOrDefault(uuid, new HashMap<>());
+ int lastAID = list2.size();
+ list2.put(lastAID, msg);
+ archives.put(uuid, list2);
+
+ msg.setID(list2.size() -1);
+ getLogger().message(sender, "Message Archived. [ID=" + id + "] [ArchiveID=" + lastAID + "]");
+ savePlayerMsgs(uuid);
+ savePlayerArchive(uuid);
+ }
+
+ @Command(hook = "unarchive")
+ public void unarchive(CommandSender sender, int id) {
+ String uuid = ((Player)sender).getUniqueId().toString();
+ Map<Integer,Msg> list = archives.get(uuid);
+
+ if (id < 0 || id >= list.size()) {
+ getLogger().message(sender, true, "You have no archived messages with that ID.");
+ return;
+ }
+
+ Msg msg = list.get(id);
+ msg.setID(getNextID());
+
+ list.remove(id);
+ if (list.isEmpty())
+ archives.remove(uuid);
+ else
+ archives.put(uuid, list);
+ List<Msg> list2 = playerToMsg.getOrDefault(uuid, new ArrayList<>());
+ list2.add(msg);
+ playerToMsg.put(uuid, list2);
+ idToMsg.put(msg.getID(), msg);
+
+ getLogger().message(sender, "Message Unarchived. [ArchiveID=" + id + "] [ID=" + msg.getID() + "]");
+ savePlayerMsgs(uuid);
+ savePlayerArchive(uuid);
+ }
+
+ @Command(hook = "settings_theme")
+ public void settings_theme(CommandSender sender) {
+ String theme = (String) DataManager.getData(sender, "theme");
+ if (!isValidTheme(theme)) {
+ theme = Theme.DARK.toString();
+ DataManager.setData(sender, "theme", theme);
+ }
+ getLogger().message(sender, "Your current theme is &e" + theme + "&7.");
+
+ }
+ @Command(hook = "settings_theme_set")
+ public void settings_theme_set(CommandSender sender, String theme) {
+ if (!isValidTheme(theme)) {
+ ChatAPI.createMessage(sender)
+ .appendText(getLogger().getPrefix(true) + "Invalid theme. Available themes are: ")
+ .appendSendChatHover("&eLight", "/mail settings theme light", "Click to switch to &eLight")
+ .appendText("&7, ")
+ .appendSendChatHover("&eDark", "/mail settings theme dark", "Click to switch to &eDark")
+ .appendText("&7, ")
+ .appendSendChatHover("&eGold", "/mail settings theme gold", "Click to switch to &eGold")
+ .send();
+
+ return;
+ }
+ DataManager.setData(sender, "theme", theme.toUpperCase());
+ getLogger().message(sender, "Theme set to &e" + theme + "&7.");
+ }
+ @Command(hook = "settings_actions")
+ public void settings_actions(CommandSender sender) {
+ String actions = (String) DataManager.getData(sender, "actions");
+ if (!isValidActions(actions)) {
+ actions = "NORMAL";
+ DataManager.setData(sender, "actions", actions);
+ }
+ getLogger().message(sender, "Your current action set is &e" + actions.toLowerCase() + ".");
+ }
+ @Command(hook = "settings_actions_set")
+ public void settings_actions_set(CommandSender sender, String actions) {
+ if (!isValidActions(actions)) {
+
+ ChatAPI.createMessage(sender)
+ .appendText(getLogger().getPrefix(true) + "Invalid action set. Available options are:")
+ .appendSendChatHover("\n &eMinimal", "/mail settings actions minimal", "Click to switch to &eMinimal")
+ .appendText("&7: No click actions, ")
+ .appendSendChatHover("\n &eSimple", "/mail settings actions simple", "Click to switch to &eSimple")
+ .appendText("&7: Delete, ")
+ .appendSendChatHover("\n &eNormal", "/mail settings actions normal", "Click to switch to &eNormal")
+ .appendText("&7: : Delete and Reply.")
+ .appendSendChatHover("\n &eFull", "/mail settings actions full", "Click to switch to &eFull")
+ .appendText("&7: : Delete, Reply, and Archive.\nAll actions are still available with commands.")
+ .send();
+
+ return;
+ }
+ DataManager.setData(sender, "actions", actions.toUpperCase());
+ getLogger().message(sender, "Action Set set to &e" + actions.toLowerCase() + "&7.");
+ }
+ @Command(hook = "settings_names")
+ public void settings_names(CommandSender sender) {
+ String names = (String) DataManager.getData(sender, "names");
+ if (!isValidNames(names)) {
+ names = "username";
+ DataManager.setData(sender, "names", names);
+ }
+ getLogger().message(sender, "Your current names setting is &e" + names.toLowerCase() + ".");
+ }
+ @Command(hook = "settings_names_set")
+ public void settings_names_set(CommandSender sender, String names) {
+ if (!isValidNames(names)) {
+ ChatAPI.createMessage(sender)
+ .appendText(getLogger().getPrefix(true) + "Invalid name setting. Available options are: ")
+ .appendSendChatHover("&eusername", "/mail settings names username", "Click to switch to &eusernames")
+ .appendText(" &7or ")
+ .appendSendChatHover("&edisplaynames", "/mail settings names displaynames", "Click to switch to &edisplaynames")
+ .send();
+
+ return;
+ }
+ DataManager.setData(sender, "names", names.toLowerCase());
+ getLogger().message(sender, "Names setting set to &e" + names.toLowerCase() + "&7.");
+ }
+
+ private boolean isValidTheme(String theme) {
+ return theme != null && (theme.equalsIgnoreCase("light")
+ || theme.equalsIgnoreCase("dark")
+ || theme.equalsIgnoreCase("gold"));
+ }
+
+ private boolean isValidActions(String actions) {
+ return actions != null && (actions.equalsIgnoreCase("minimal")
+ || actions.equalsIgnoreCase("simple")
+ || actions.equalsIgnoreCase("normal")
+ || actions.equalsIgnoreCase("full"));
+ }
+ private boolean isValidNames(String names) {
+ return names != null && (names.equalsIgnoreCase("username")
+ || names.equalsIgnoreCase("displayname"));
+ }
+
+ private int getNextID() {
+ if (lastID > 99999999)
+ getLogger().warn("IDs have exceeded 8 digits, reload suggested.");
+ return lastID++;
+ }
+
+ public void postEnable() {
+ File dir = new File(Main.plugin.getDataFolder(), "/mail");
+ File[] filesInDir = dir.listFiles();
+ if (filesInDir == null)
+ return;
+ for (File file : filesInDir) {
+ if (file.isFile()) {
+ JSONArray msgs = JsonManager.getArray(file);
+ String uuid = file.getName().substring(0, file.getName().indexOf(".json"));
+
+ List<Msg> list = new ArrayList<>();
+ for (Object o : msgs) {
+ Msg m = Msg.fromJSONObject((JSONObject)o, getNextID());
+ list.add(m);
+ idToMsg.put(m.getID(), m);
+ }
+ if (!list.isEmpty())
+ playerToMsg.put(uuid, list);
+ }
+ }
+
+ Bukkit.getOnlinePlayers().forEach((Player p) -> loadPlayer(p));
+ }
+
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent event)
+ {
+ loadPlayer(event.getPlayer());
+
+ }
+
+ public void loadPlayer(Player p) {
+ String uuid = p.getUniqueId().toString();
+
+ File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json");
+ JSONArray fromArchive = JsonManager.getArray(jsonfile);
+ Map<Integer,Msg> archives = new HashMap<>();
+
+ if (fromArchive != null) {
+ int i = 0;
+ for (Object o : fromArchive) {
+ Msg m = Msg.fromJSONObject(((JSONObject)o), i);
+ archives.put(i, m);
+ i++;
+ }
+ if (!archives.isEmpty())
+ this.archives.put(uuid, archives);
+ }
+
+
+ List<Msg> list = playerToMsg.get(uuid);
+ if (list != null && !list.isEmpty())
+ ChatAPI.createMessage(p)
+ .appendText(getLogger().getPrefix() + "&7You got &e" + list.size() +
+ "&7 message" + (list.size() == 1? "" : "s") + "! Do ")
+ .appendSendChatHover("&e/mail", "/mail", "Click to read your messages")
+ .appendText("&7 to read them.")
+ .send();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void savePlayerMsgs(String uuid) {
+
+ File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/" + uuid + ".json");
+
+ List<Msg> messages = playerToMsg.getOrDefault(uuid, new ArrayList<>());
+
+ JSONArray m_array = new JSONArray();
+
+ for (Msg m : messages)
+ m_array.add(m.toJSONObject());
+
+ JsonManager.save(m_array, jsonfile);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void savePlayerArchive(String uuid) {
+
+ File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json");
+
+ Map<Integer,Msg> arch = archives.getOrDefault(uuid, new HashMap<>());
+
+ JSONArray a_array = new JSONArray();
+
+ for (Msg m : arch.values())
+ a_array.add(m.toJSONObject());
+
+ JsonManager.save(a_array, jsonfile);
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/mail/Msg.java b/src/main/java/com/redstoner/modules/mail/Msg.java
new file mode 100644
index 0000000..8bb666f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/mail/Msg.java
@@ -0,0 +1,206 @@
+package com.redstoner.modules.mail;
+
+import java.util.UUID;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.json.simple.JSONObject;
+
+import net.nemez.chatapi.ChatAPI;
+import net.nemez.chatapi.click.Message;
+
+public class Msg {
+
+ private int id;
+ private String sender;
+ private String reciever;
+ private String timeSent;
+ private String message;
+ private String chain;
+ private boolean read;
+
+ public Msg(int id, String sender, String reciever, String timeSent, String message, String chain, boolean read) {
+ this.id = id;
+ this.sender = sender;
+ this.reciever = reciever;
+ this.timeSent = timeSent;
+ this.message = message;
+ this.chain = chain;
+ this.read = read;
+ }
+
+ public String getSender() {
+ return sender;
+ }
+
+ public String getReciever() {
+ return reciever;
+ }
+
+
+ public void read() {
+ read = true;
+ }
+
+ public boolean isRead() {
+ return read;
+ }
+
+ public void setID(int id) {
+ this.id = id;
+ }
+
+ public int getID() {
+ return id;
+ }
+
+ public String getChain() {
+ Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
+
+ String line = getPrefix(p) + p.getName() + "&7:&f " + message;
+
+ if (chain == null)
+ return line;
+ else
+ return chain + "\n" + line;
+ }
+
+ public void showMinimal(CommandSender viewer, Theme theme, boolean showDisplayName) {
+ Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
+ String name = getPrefix(p) + 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(theme.getColonColor() + ": ");
+ if (chain == null)
+ msg.appendText(message).send();
+ else
+ msg.appendTextHover(message, chain).send();
+ }
+
+ public void showSimple(CommandSender viewer, Theme theme, boolean showDisplayName) {
+ Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
+ String name = getPrefix(p) + p.getName();
+
+ Message msg = ChatAPI.createMessage(viewer)
+ .appendText(theme.getBracketColor() + "[")
+ .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete")
+ .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(theme.getColonColor() + ": ");
+ if (chain == null)
+ msg.appendText(message).send();
+ else
+ msg.appendTextHover(message, chain).send();
+ }
+
+ public void showNormal(CommandSender viewer, Theme theme, boolean showDisplayName) {
+ Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
+ String name = getPrefix(p) + p.getName();
+
+ Message msg = ChatAPI.createMessage(viewer)
+ .appendText(theme.getBracketColor() + "[")
+ .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete")
+ .appendText(theme.getBracketColor() + "][")
+ .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
+ .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(theme.getColonColor() + ": ");
+ if (chain == null)
+ msg.appendText(message).send();
+ else
+ msg.appendTextHover(message, chain).send();
+ }
+
+ public void showFull(CommandSender viewer, Theme theme, boolean showDisplayName) {
+ Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
+ String name = getPrefix(p) + p.getName();
+
+ Message msg = ChatAPI.createMessage(viewer)
+ .appendText(theme.getBracketColor() + "[")
+ .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete")
+ .appendText(theme.getBracketColor() + "][")
+ .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
+ .appendText(theme.getBracketColor() + "][")
+ .appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply")
+ .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(theme.getColonColor() + ": ");
+ if (chain == null)
+ msg.appendText(message).send();
+ else
+ msg.appendTextHover(message, chain).send();
+ }
+
+ public void showArchived(CommandSender viewer, Theme theme, boolean showDisplayName) {
+ Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
+ String name = getPrefix(p) + p.getName();
+
+ Message msg = ChatAPI.createMessage(viewer)
+ .appendText(theme.getBracketColor() + "[")
+ .appendSendChatHover(theme.getArchiveColor() + "Unarchive", "/mail unarchive " + id, "&6Unarchive")
+ .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(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";
+
+ }
+
+ @SuppressWarnings("unchecked")
+ public JSONObject toJSONObject() {
+ JSONObject j = new JSONObject();
+ j.put("sender", sender);
+ j.put("reciever", reciever);
+ j.put("timeSent", timeSent);
+ j.put("message", message);
+ j.put("chain", chain);
+ j.put("read", read);
+ return j;
+ }
+
+ public static Msg fromJSONObject(JSONObject j, int id) {
+ return new Msg(id, (String) j.get("sender"), (String) j.get("reciever"), (String) j.get("timeSent"),
+ (String) j.get("message"), (String) j.get("chain"), (boolean)j.get("read"));
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/mail/Theme.java b/src/main/java/com/redstoner/modules/mail/Theme.java
new file mode 100644
index 0000000..575e0a5
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/mail/Theme.java
@@ -0,0 +1,53 @@
+package com.redstoner.modules.mail;
+
+public enum Theme {
+ LIGHT("&7","&c","&9","&8","&e","&7","&2", "&e"),
+ DARK("&8","&c","&9","&7","&6","&7","&2", "&e"),
+ GOLD("&6","&f","&f","&f","&f","&6","&6", "&6");
+
+ private String bracketColor;
+ private String deleteColor;
+ private String infoColor;
+ private String replyColor;
+ private String archiveColor;
+ private String colonColor;
+ private String clearColor;
+ private String clearAccentColor;
+
+ private Theme(String bracketColor, String deleteColor, String infoColor, String replyColor,
+ String archiveColor, String colonColor, String clearColor, String clearAccentColor) {
+ this.bracketColor = bracketColor;
+ this.deleteColor = deleteColor;
+ this.infoColor = infoColor;
+ this.replyColor = replyColor;
+ this.archiveColor = archiveColor;
+ this.colonColor = colonColor;
+ this.clearColor = clearColor;
+ this.clearAccentColor = clearAccentColor;
+ }
+
+ public String getBracketColor() {
+ return bracketColor;
+ }
+ public String getDeleteColor() {
+ return deleteColor;
+ }
+ public String getInfoColor() {
+ return infoColor;
+ }
+ public String getReplyColor() {
+ return replyColor;
+ }
+ public String getArchiveColor() {
+ return archiveColor;
+ }
+ public String getColonColor() {
+ return colonColor;
+ }
+ public String getClearColor() {
+ return clearColor;
+ }
+ public String getClearAccentColor() {
+ return clearAccentColor;
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/mail/module.info b/src/main/java/com/redstoner/modules/mail/module.info
new file mode 100644
index 0000000..2740d76
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/mail/module.info
@@ -0,0 +1,3 @@
+displayName: Mail
+category: Chat
+description: A better version of essentials's mail feature. \ No newline at end of file
diff --git a/src/com/redstoner/modules/mentio/Mentio.cmd b/src/main/java/com/redstoner/modules/mentio/Mentio.cmd
index 230adf8..c70e3e0 100644
--- a/src/com/redstoner/modules/mentio/Mentio.cmd
+++ b/src/main/java/com/redstoner/modules/mentio/Mentio.cmd
@@ -1,4 +1,5 @@
command mentio {
+ perm utils.mentio;
add [string:trigger] {
help Triggers you when the trigger gets said.;
run addmentio trigger;
@@ -11,6 +12,5 @@ command mentio {
help Lists your mentios.;
run listmentios;
}
- perm utils.mentio;
type player;
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/mentio/Mentio.java b/src/main/java/com/redstoner/modules/mentio/Mentio.java
index 3db8edf..0f2169e 100644
--- a/src/com/redstoner/modules/mentio/Mentio.java
+++ b/src/main/java/com/redstoner/modules/mentio/Mentio.java
@@ -30,7 +30,7 @@ import net.nemez.chatapi.click.Message;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Mentio implements Module, Listener
{
private File mentioLocation = new File(Main.plugin.getDataFolder(), "mentio.json");
@@ -56,12 +56,7 @@ public class Mentio implements Module, Listener
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString());
- if (playerMentios == null)
- {
- playerMentios = new JSONArray();
- playerMentios.add(player.getName());
- playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-o]", ""));
- }
+ playerMentios = defaultMentio(playerMentios, player);
if (playerMentios.contains(trigger))
getLogger().message(sender, true, "You already had that as a mentio!");
else
@@ -81,12 +76,7 @@ public class Mentio implements Module, Listener
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString());
- if (playerMentios == null)
- {
- playerMentios = new JSONArray();
- playerMentios.add(player.getName());
- playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-o]", ""));
- }
+ playerMentios = defaultMentio(playerMentios, player);
if (!playerMentios.remove(trigger))
getLogger().message(sender, true, "You didn't have that as a mentio!");
else
@@ -98,7 +88,6 @@ public class Mentio implements Module, Listener
return true;
}
- @SuppressWarnings("unchecked")
@Command(hook = "listmentios")
public boolean listMentios(CommandSender sender)
{
@@ -106,12 +95,7 @@ public class Mentio implements Module, Listener
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString());
- if (playerMentios == null)
- {
- playerMentios = new JSONArray();
- playerMentios.add(player.getName());
- playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-or]", ""));
- }
+ playerMentios = defaultMentio(playerMentios, player);
for (Object raw : playerMentios)
{
String mentio = (String) raw;
@@ -122,6 +106,19 @@ public class Mentio implements Module, Listener
}
@SuppressWarnings("unchecked")
+ private JSONArray defaultMentio(JSONArray mentios, Player player) {
+ if (mentios == null)
+ {
+ mentios = new JSONArray();
+ mentios.add(player.getName());
+
+ String displayName = player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-or]", "");
+ if (!player.getName().equals(displayName))
+ mentios.add(displayName);
+ }
+ return mentios;
+ }
+
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerChat(AsyncPlayerChatEvent event)
{
@@ -133,12 +130,7 @@ public class Mentio implements Module, Listener
return;
UUID uuid = player.getUniqueId();
JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString());
- if (playerMentios == null)
- {
- playerMentios = new JSONArray();
- playerMentios.add(player.getName());
- playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-o]", ""));
- }
+ playerMentios = defaultMentio(playerMentios, player);
for (Object raw : playerMentios)
{
String mentio = (String) raw;
diff --git a/src/main/java/com/redstoner/modules/mentio/module.info b/src/main/java/com/redstoner/modules/mentio/module.info
new file mode 100644
index 0000000..6c4c5b7
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/mentio/module.info
@@ -0,0 +1,3 @@
+displayName: Mentio
+category: Chat
+description: Plays a sound and highlights keywords from a player defined list \ No newline at end of file
diff --git a/src/com/redstoner/modules/message/Message.cmd b/src/main/java/com/redstoner/modules/message/Message.cmd
index 382e52e..f6e7608 100644
--- a/src/com/redstoner/modules/message/Message.cmd
+++ b/src/main/java/com/redstoner/modules/message/Message.cmd
@@ -11,10 +11,10 @@ command message {
alias ew;
alias whisper;
alias ewhisper;
+ perm utils.message;
[string:player] [string:message...] {
run message player message;
help Sends a direct message to a player.;
- perm utils.message;
}
}
@@ -22,14 +22,15 @@ command reply {
alias r;
alias er;
alias ereply;
+ perm utils.message;
[string:message...] {
run reply message;
help Sends a direct message to the last person you talked to.;
- perm utils.message;
}
}
command pmtoggle {
+ perm utils.message.toggle;
[empty] {
help Turns off your toggle.;
type player;
diff --git a/src/com/redstoner/modules/message/Message.java b/src/main/java/com/redstoner/modules/message/Message.java
index 8c9f95d..0faf882 100644
--- a/src/com/redstoner/modules/message/Message.java
+++ b/src/main/java/com/redstoner/modules/message/Message.java
@@ -27,7 +27,7 @@ import com.redstoner.modules.socialspy.Socialspy;
import net.nemez.chatapi.ChatAPI;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 4, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Message implements Module
{
HashMap<CommandSender, CommandSender> replyTargets = new HashMap<>();
diff --git a/src/main/java/com/redstoner/modules/message/module.info b/src/main/java/com/redstoner/modules/message/module.info
new file mode 100644
index 0000000..6be8066
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/message/module.info
@@ -0,0 +1,3 @@
+displayName: Message
+category: Chat
+description: A better version of minecraft's &e/msg&7 command \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/misc/Misc.cmd b/src/main/java/com/redstoner/modules/misc/Misc.cmd
new file mode 100644
index 0000000..545030d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/misc/Misc.cmd
@@ -0,0 +1,91 @@
+command tempadd {
+ perm pex;
+
+ [string:user] [string:group] {
+ help Adds a user to a group for 1w.;
+ run tempadddef user group;
+ }
+
+ [string:user] [string:group] [string:duration] {
+ help Adds a user to a group for a specified duration.;
+ run tempadd user group duration;
+ }
+}
+
+command echo {
+ perm utils.misc.echo;
+
+ [string:text...] {
+ help Echoes back to you.;
+ run echo text;
+ }
+}
+
+command ping {
+ perm utils.misc.ping;
+
+ [empty] {
+ help Pongs :D;
+ run ping;
+ }
+
+ [string:player] {
+ help Gets the specified player's ping.;
+ run ping_player player;
+ }
+}
+
+command sudo {
+ perm utils.misc.sudo;
+
+ [string:name] [string:command...] {
+ help Sudo'es another user (or console);
+ run sudo name command;
+ }
+}
+
+command hasperm {
+ perm utils.misc.hasperm;
+
+ [flag:-f] [string:name] [string:node] {
+ help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.;
+ run hasperm -f name node;
+ }
+}
+
+command nightvision {
+ alias nv;
+ alias illuminate;
+
+ perm utils.misc.nightvision;
+
+ type player;
+
+ [empty] {
+ help Gives the player infinte night vision;
+ run illuminate;
+ }
+}
+
+command minecart {
+ alias cart;
+
+ perm utils.misc.spawncart;
+
+ type player;
+
+ default [string:variation] {
+ help Sets a default minecart variation.;
+ run minecart_default variation;
+ }
+
+ [string:variation] {
+ help Spawns a certain minecart;
+ run minecart_variation variation;
+ }
+
+ [empty] {
+ help Spawns a minecart;
+ run minecart;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/misc/Misc.java b/src/main/java/com/redstoner/modules/misc/Misc.java
new file mode 100644
index 0000000..c773e6b
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/misc/Misc.java
@@ -0,0 +1,337 @@
+package com.redstoner.modules.misc;
+
+import com.nemez.cmdmgr.Command;
+import com.redstoner.annotations.AutoRegisterListener;
+import com.redstoner.annotations.Commands;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.CommandHolderType;
+import com.redstoner.misc.Utils;
+import com.redstoner.modules.Module;
+import com.redstoner.modules.datamanager.DataManager;
+import net.nemez.chatapi.ChatAPI;
+import net.nemez.chatapi.click.Message;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+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.PlayerTeleportEvent;
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+
+import java.util.UUID;
+
+@Commands (CommandHolderType.File)
+@AutoRegisterListener
+@Version (major = 5, minor = 0, revision = 0, compatible = 4)
+public class Misc implements Module, Listener {
+ private static final String[] SUDO_BLACKLIST = new String[] {
+ "(.*:)?e?sudo",
+ "(.*:)?script.*",
+ "(.*:)?stop",
+ "(.*:)?modules",
+ "(.*:)?sayn",
+ "(.*:)?pex",
+ "(.*:)?console_.*",
+ "(.*:)?op",
+ "(.*:)?login",
+ "(.*:)?register",
+ "(.*:)?.*pass"
+ };
+
+ private static final String[] WELCOME_MSG = new String[] {
+ "&4 Welcome to the Redstoner Server!\n",
+ "&6 Before you ask us things, take a quick look at &a&nredstoner.com/info\n",
+ "&6 Thank you and happy playing!)\n\n"
+ };
+
+ private static final PotionEffect NIGHT_VISION = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false);
+
+ @EventHandler
+ public void onFirstJoin(PlayerJoinEvent event) {
+ Player player = event.getPlayer();
+
+ if (!player.hasPlayedBefore()) {
+ Utils.broadcast("", "\nยงaยงlPlease welcome ยงf" + player.getDisplayName() + " ยงaยงlto Redstoner!\n", recipient -> !recipient.equals(player));
+
+ getLogger().message(player, WELCOME_MSG);
+ }
+
+ Material spawnBlock = player.getLocation().getBlock().getType();
+
+ if (spawnBlock == Material.END_PORTAL || spawnBlock == Material.NETHER_PORTAL) {
+ getLogger().message(player, "&4Looks like you spawned in a portal... Let me help you out");
+ getLogger().message(player, "&6You can use /back if you &nreally&6 want to go back");
+
+ player.teleport(player.getWorld().getSpawnLocation());
+ }
+ }
+
+ // Disables spectator teleportation
+ @EventHandler (priority = EventPriority.LOWEST)
+ public void onTeleport(PlayerTeleportEvent event) {
+ Player player = event.getPlayer();
+
+ if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp")) {
+ getLogger().message(event.getPlayer(), true, "Spectator teleportation is disabled!");
+
+ event.setCancelled(true);
+ }
+ }
+
+ // 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);
+ }
+ }
+ }
+
+ @Command (hook = "tempadddef")
+ public boolean tempAddDef(CommandSender sender, String user, String group) {
+ return tempAdd(sender, user, group, "7d");
+ }
+
+ @Command (hook = "tempadd")
+ public boolean tempAdd(CommandSender sender, String user, String group, String duration) {
+ int parsed = MiscUtil.parseDuration(duration);
+
+ if (parsed == -1) {
+ getLogger().message(sender, true, "That is not a valid duration! (format: 1y2m3d4h5m6s)");
+ return true;
+ }
+
+ Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + parsed);
+ getLogger().message(sender, "User " + user + " added to group " + group + " for " + duration);
+
+ return true;
+ }
+
+ @Command (hook = "echo")
+ public boolean echo(CommandSender sender, String text) {
+ sender.sendMessage(ChatAPI.colorify(null, text));
+
+ return true;
+ }
+
+ @Command (hook = "ping")
+ public boolean ping(CommandSender sender) {
+ if (sender instanceof Player) {
+ int ping = MiscUtil.getPing((Player) sender);
+
+ if (ping == -1) {
+ getLogger().message(sender, "An error occured while getting your ping! Please message a staff member.");
+ } else {
+ getLogger().message(sender, "Your ping is " + ping + "ms.");
+ }
+ } else {
+ sender.sendMessage("That's not how this works... <insert facepalm emoji here>");
+ }
+
+ return true;
+ }
+
+ @Command (hook = "ping_player")
+ public boolean ping(CommandSender sender, String player) {
+ Player playerObj = Bukkit.getPlayer(player);
+
+ if (playerObj == null) {
+ getLogger().message(sender, "That player is not online!");
+ return true;
+ }
+
+ int ping = MiscUtil.getPing(playerObj);
+
+ if (ping == -1) {
+ getLogger().message(sender, "An error occured while getting that player's ping! Please message a staff member.");
+ } else {
+ getLogger().message(sender, ChatColor.GRAY + playerObj.getDisplayName() + ChatColor.GRAY + "'s ping is " + ping + "ms.");
+ }
+
+ return true;
+ }
+
+ @Command (hook = "sudo")
+ public boolean sudo(CommandSender sender, String name, String command) {
+ CommandSender target;
+
+ if (name.equalsIgnoreCase("console")) {
+ target = Bukkit.getConsoleSender();
+ } else {
+ target = Bukkit.getPlayer(name);
+ }
+
+ if (target == null) {
+ getLogger().message(sender, false, "That player couldn't be found!");
+ return true;
+ }
+
+ if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender())) {
+ String[] args = command.split(" ");
+
+ for (String regex : SUDO_BLACKLIST) {
+ if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex)) {
+ getLogger().message(sender, true, "You can't sudo anyone into using that command!");
+ return true;
+ }
+ }
+
+ Bukkit.dispatchCommand(target, command.replaceFirst("/", ""));
+ getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into running " + command);
+ } else {
+ ((Player) target).chat(command);
+ getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into saying " + command);
+ }
+
+ return true;
+ }
+
+ @Command (hook = "hasperm")
+ public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node) {
+ Player p;
+
+ if (name.contains("-")) {
+ try {
+ p = Bukkit.getPlayer(UUID.fromString(name));
+ } catch (Exception e) {
+ if (noformat) {
+ sender.sendMessage("ERR: Invalid UUID");
+ } else {
+ getLogger().message(sender, "That UUID is not valid!");
+ }
+
+ return true;
+ }
+ } else {
+ p = Bukkit.getPlayer(name);
+ }
+
+ if (p == null) {
+ if (noformat) {
+ Message m = new Message(sender, null);
+ m.appendText("ERR: Invalid player");
+ m.send();
+ } else {
+ getLogger().message(sender, "That player couldn't be found!");
+ }
+
+ return true;
+ }
+
+ if (noformat) {
+ Message m = new Message(sender, null);
+ m.appendText("" + p.hasPermission(node));
+ m.send();
+ } else {
+ getLogger().message(sender, ChatColor.GRAY + p.getDisplayName() + ChatColor.GRAY + (
+ p.hasPermission(node)
+ ? " has that permission."
+ : " does not have that permission."
+ ));
+ }
+
+ return true;
+ }
+
+ @Command (hook = "illuminate")
+ public void illuminate(CommandSender sender) {
+ Player player = (Player) sender;
+ if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) {
+ player.removePotionEffect(PotionEffectType.NIGHT_VISION);
+ getLogger().message(sender, "Night Vision Disabled.");
+ } else {
+ player.addPotionEffect(NIGHT_VISION, true);
+ getLogger().message(sender, "Night Vision Enabled.");
+ }
+ }
+
+ @Command (hook = "minecart")
+ public void minecart(CommandSender sender) {
+ String type = (String) DataManager.getOrDefault(sender, "minecart_default", "normal");
+ minecartType(sender, type);
+ }
+
+ @Command (hook = "minecart_variation")
+ public boolean minecartType(CommandSender sender, String type) {
+ if (type.equals("help") || type.equals("h") || type.equals("?")) return false;
+
+ Player p = (Player) sender;
+
+ if (!MiscUtil.canBuild(p, p.getLocation())) {
+ getLogger().message(sender, true, "You do not have permission to build here!");
+ return true;
+ }
+
+ EntityType typeE = convertMinecartTypeString(type.toLowerCase());
+
+ if (typeE != null) {
+ p.getWorld().spawnEntity(p.getLocation(), typeE);
+ getLogger().message(sender, "Minecart Spawned!");
+ } else {
+ getLogger().message(sender, true, "The type of Minecart you've requested does not exist.");
+ }
+
+ return false;
+ }
+
+ @Command (hook = "minecart_default")
+ public boolean minecartDefault(CommandSender sender, String type) {
+ EntityType typeE = convertMinecartTypeString(type.toLowerCase());
+
+ if (type.equals("help") || type.equals("h") || type.equals("?")) return false;
+
+ if (typeE != null) {
+ DataManager.setData(sender, "minecart_default", type);
+ getLogger().message(sender, "Set your default minecart to: " + type.toLowerCase());
+ } else {
+ getLogger().message(sender, true, "The type of Minecart you've requested does not exist.");
+ }
+
+ return true;
+ }
+
+ public EntityType convertMinecartTypeString(String type) {
+ EntityType typeE = null;
+
+ switch (type) {
+ case "normal":
+ typeE = EntityType.MINECART;
+ break;
+ case "chest":
+ typeE = EntityType.MINECART_CHEST;
+ break;
+ case "furnace":
+ typeE = EntityType.MINECART_FURNACE;
+ break;
+ case "hopper":
+ typeE = EntityType.MINECART_HOPPER;
+ break;
+ case "tnt":
+ typeE = EntityType.MINECART_TNT;
+ break;
+ case "command":
+ typeE = EntityType.MINECART_COMMAND;
+ break;
+ case "spawner":
+ typeE = EntityType.MINECART_MOB_SPAWNER;
+ break;
+ }
+
+ return typeE;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/misc/MiscUtil.java b/src/main/java/com/redstoner/modules/misc/MiscUtil.java
new file mode 100644
index 0000000..f2fde6f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/misc/MiscUtil.java
@@ -0,0 +1,55 @@
+package com.redstoner.modules.misc;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.block.BlockBreakEvent;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class MiscUtil {
+ private static final Pattern durationPattern = Pattern.compile("^(?:(?:(\\d*)y)?(?:(\\d*)m)?(?:(\\d*)d)?(?:(\\d*)h)?(?:(\\d*)m)?(?:(\\d*)s)?){1}$");
+
+ private static int getIntGroup(Matcher matcher, int group) {
+ String strGroup = matcher.group(group);
+ return Integer.parseInt(strGroup == null ? "0" : strGroup);
+ }
+
+ protected static int parseDuration(String duration) {
+ Matcher m = durationPattern.matcher(duration);
+
+ if (m.matches()) {
+ int years = getIntGroup(m, 1);
+ int months = getIntGroup(m, 2);
+ int days = getIntGroup(m, 3);
+ int hours = getIntGroup(m, 4);
+ int minutes = getIntGroup(m, 5);
+ int seconds = getIntGroup(m, 6);
+
+ return (years * 31557600) + (months * 2629800) + (days * 86400) + (hours * 3600) + (minutes * 60) + seconds;
+ } else {
+ return -1;
+ }
+ }
+
+ protected static int getPing(Player player) {
+ try {
+ Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player);
+
+ int ping = (int) entityPlayer.getClass().getField("ping").get(entityPlayer);
+ return ping;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException e) {
+ e.printStackTrace();
+ }
+
+ return -1;
+ }
+
+ protected static boolean canBuild(Player player, Location location) {
+ BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player);
+ Bukkit.getPluginManager().callEvent(event);
+ return !event.isCancelled();
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/misc/module.info b/src/main/java/com/redstoner/modules/misc/module.info
new file mode 100644
index 0000000..37d7aec
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/misc/module.info
@@ -0,0 +1,3 @@
+displayName: Miscellaneous
+category: Other
+description: A collection of useful things \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/motd/Motd.cmd b/src/main/java/com/redstoner/modules/motd/Motd.cmd
new file mode 100644
index 0000000..52107ef
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/motd/Motd.cmd
@@ -0,0 +1,17 @@
+command motd {
+ get {
+ help Returns the motd;
+ run getmotd;
+ perm utils.motd.get;
+ }
+ set [string:motd...] {
+ help Sets the motd. Use --reset to reset to default;
+ run setmotd motd;
+ perm utils.motd.set;
+ }
+ [empty] {
+ help Returns the motd;
+ run getmotd;
+ perm utils.motd.get;
+ }
+} \ No newline at end of file
diff --git a/src/com/redstoner/modules/motd/Motd.java b/src/main/java/com/redstoner/modules/motd/Motd.java
index 1334e1a..9495b61 100644
--- a/src/com/redstoner/modules/motd/Motd.java
+++ b/src/main/java/com/redstoner/modules/motd/Motd.java
@@ -16,7 +16,7 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Motd implements Module, Listener
{
private String default_motd, motd;
diff --git a/src/main/java/com/redstoner/modules/motd/module.info b/src/main/java/com/redstoner/modules/motd/module.info
new file mode 100644
index 0000000..7c56304
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/motd/module.info
@@ -0,0 +1,3 @@
+displayName: MOTD
+category: Staff
+description: Changes the MOTD in-game \ No newline at end of file
diff --git a/src/com/redstoner/modules/nametags/Nametags.cmd b/src/main/java/com/redstoner/modules/nametags/Nametags.cmd
index 4095b42..7164add 100644
--- a/src/com/redstoner/modules/nametags/Nametags.cmd
+++ b/src/main/java/com/redstoner/modules/nametags/Nametags.cmd
@@ -1,4 +1,5 @@
command tab {
+ perm utils.nametags;
sort {
help Resorts the entirety of tab.;
run sort;
@@ -7,5 +8,4 @@ command tab {
help Resorts one player.;
run sortspecific player;
}
- perm utils.tab.admin;
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/nametags/Nametags.java b/src/main/java/com/redstoner/modules/nametags/Nametags.java
index 3a66b18..2ec8f97 100644
--- a/src/com/redstoner/modules/nametags/Nametags.java
+++ b/src/main/java/com/redstoner/modules/nametags/Nametags.java
@@ -21,7 +21,7 @@ import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 2, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Nametags implements Module, Listener
{
@EventHandler
@@ -109,7 +109,7 @@ public class Nametags implements Module, Listener
public void sortSpecific(Player player)
{
Bukkit.dispatchCommand(Bukkit.getConsoleSender(),
- "scoreboard teams join " + getTeam(player) + " " + player.getName());
+ "minecraft:team join " + getTeam(player) + " " + player.getName());
}
private String getTeam(Player player)
diff --git a/src/main/java/com/redstoner/modules/nametags/module.info b/src/main/java/com/redstoner/modules/nametags/module.info
new file mode 100644
index 0000000..de53d65
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/nametags/module.info
@@ -0,0 +1,3 @@
+displayName: Nametags
+category: Other
+description: Sorts tab by rank and colors players' nametags \ No newline at end of file
diff --git a/src/com/redstoner/modules/naming/Naming.cmd b/src/main/java/com/redstoner/modules/naming/Naming.cmd
index 1b9bc1a..f21f15a 100644
--- a/src/com/redstoner/modules/naming/Naming.cmd
+++ b/src/main/java/com/redstoner/modules/naming/Naming.cmd
@@ -1,24 +1,24 @@
command anvil {
+ perm utils.naming;
[empty] {
run anvil;
type player;
help Opens anvil GUI.;
- perm utils.anvil;
}
}
command name {
+ perm utils.naming;
[string:name...] {
run name name;
type player;
help Names item in hand.;
- perm utils.name;
}
}
command lore {
+ perm utils.naming;
[optional:-a] [string:lore...] {
run lore -a lore;
type player;
help Adds lore to item in hand.;
- perm utils.lore;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/naming/Naming.java b/src/main/java/com/redstoner/modules/naming/Naming.java
index 9564966..f445336 100644
--- a/src/com/redstoner/modules/naming/Naming.java
+++ b/src/main/java/com/redstoner/modules/naming/Naming.java
@@ -20,7 +20,7 @@ import com.redstoner.modules.Module;
import net.md_5.bungee.api.ChatColor;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Naming implements Module
{
@Command(hook = "anvil")
diff --git a/src/main/java/com/redstoner/modules/naming/module.info b/src/main/java/com/redstoner/modules/naming/module.info
new file mode 100644
index 0000000..b3b1f24
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/naming/module.info
@@ -0,0 +1,3 @@
+displayName: Naming
+category: Other
+description: Lets you change an item name and lore \ No newline at end of file
diff --git a/src/com/redstoner/modules/onlineplayers/OnlinePlayers.java b/src/main/java/com/redstoner/modules/onlineplayers/OnlinePlayers.java
index f09d100..626da9d 100644
--- a/src/com/redstoner/modules/onlineplayers/OnlinePlayers.java
+++ b/src/main/java/com/redstoner/modules/onlineplayers/OnlinePlayers.java
@@ -20,7 +20,7 @@ import com.redstoner.modules.Module;
import com.redstoner.modules.datamanager.DataManager;
@AutoRegisterListener
-@Version(major = 4, minor = 0, revision = 3, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
@SuppressWarnings("unchecked")
public class OnlinePlayers implements Module, Listener
{
diff --git a/src/main/java/com/redstoner/modules/onlineplayers/module.info b/src/main/java/com/redstoner/modules/onlineplayers/module.info
new file mode 100644
index 0000000..65c1254
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/onlineplayers/module.info
@@ -0,0 +1,3 @@
+displayName: OnlinePlayers
+category: External
+description: Provides a list of all players online with data in a .json file used for Redstoner's "Who's online feature" \ No newline at end of file
diff --git a/src/com/redstoner/modules/reports/Reports.cmd b/src/main/java/com/redstoner/modules/reports/Reports.cmd
index 336c418..8f594d5 100644
--- a/src/com/redstoner/modules/reports/Reports.cmd
+++ b/src/main/java/com/redstoner/modules/reports/Reports.cmd
@@ -1,14 +1,23 @@
command report {
+ perm utils.report;
[string:message...] {
- type player;
- help Report a player or incident;
run report message;
+ help Report a player or incident;
+ type player;
}
}
+command undoreport {
+ alias retractreport;
+ perm utils.report;
+ [empty] {
+ run report_retract;
+ help Retracts the last report you sent.;
+ }
+}
command rp {
- perm utils.report;
+ perm utils.report.admin;
- open {
+ list {
help List all open reports;
run report_open;
}
diff --git a/src/com/redstoner/modules/reports/Reports.java b/src/main/java/com/redstoner/modules/reports/Reports.java
index 0e55ccc..cad76ee 100644
--- a/src/com/redstoner/modules/reports/Reports.java
+++ b/src/main/java/com/redstoner/modules/reports/Reports.java
@@ -20,13 +20,13 @@ import com.redstoner.misc.JsonManager;
import com.redstoner.misc.Main;
import com.redstoner.modules.Module;
-import net.md_5.bungee.api.ChatColor;
+import net.nemez.chatapi.click.Message;
/** Report module. Allows reports to be created and handled by staff
*
* @author Redempt */
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Reports implements Module
{
private int task = 0;
@@ -109,28 +109,25 @@ public class Reports implements Module
JSONObject report = (JSONObject) reports.get(id);
reports.remove(id);
archived.add(report);
- sender.sendMessage(ChatColor.GREEN + "Report #" + id + " closed!");
+ getLogger().message(sender, "Report #" + id + " closed!");
}
@Command(hook = "report_open")
public void listOpen(CommandSender sender)
{
int i = 0;
+
+ Message msg = new Message(sender, null).appendText("\n" + getLogger().getHeader());
for (Object object : reports)
{
JSONObject report = (JSONObject) object;
- String message = "";
- message += ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + i + ChatColor.DARK_GRAY + "]";
- message += "[" + ChatColor.YELLOW + report.get("time") + ChatColor.DARK_GRAY + "] ";
- message += ChatColor.DARK_AQUA + "" + report.get("name");
- message += ChatColor.WHITE + ": " + ChatColor.YELLOW + report.get("message");
- sender.sendMessage(message);
+ msg.appendText("\n&8[&e" + i + "&8][&e" + report.get("time") + "&8]&3"
+ + report.get("name") + "&f: &e" + report.get("message"));
i++;
}
if (i == 0)
- {
- sender.sendMessage(ChatColor.GREEN + "There are no open reports.");
- }
+ msg.appendText("\n&cThere are no open reports.");
+ msg.send();
}
@SuppressWarnings("unchecked")
@@ -143,12 +140,35 @@ public class Reports implements Module
report.put("name", player.getName());
report.put("time", dateFormat.format(new Date()));
report.put("message", message);
- String loc = "";
- // Location to string
- loc += player.getLocation().getBlockX() + ";" + player.getLocation().getBlockY() + ";"
- + player.getLocation().getBlockZ() + ";" + player.getLocation().getWorld().getName();
+ String loc = player.getLocation().getBlockX() + ";" + player.getLocation().getBlockY() + ";"
+ + player.getLocation().getBlockZ() + ";" + player.getLocation().getWorld().getName();
report.put("location", loc);
reports.add(report);
- sender.sendMessage(ChatColor.GREEN + "Report created!");
+ getLogger().message(sender, "Report created! Use &e/undoreport&7 to retract the report.");
+ }
+
+
+ @Command(hook = "report_retract")
+ public void retractReport(CommandSender sender)
+ {
+ String p_name = ((Player) sender).getName();
+
+ JSONObject lastReport = null;
+
+ for (Object o_report : reports) {
+ JSONObject report = (JSONObject) o_report;
+
+ String r_name = (String) report.get("name");
+ if (r_name.equals(p_name))
+ lastReport = report;
+ }
+
+ if (lastReport == null) {
+ getLogger().message(sender, true, "You haven't submitted a report.");
+ return;
+ }
+
+ reports.remove(lastReport);
+ getLogger().message(sender, "Successfully retracted your last report.");
}
}
diff --git a/src/main/java/com/redstoner/modules/reports/module.info b/src/main/java/com/redstoner/modules/reports/module.info
new file mode 100644
index 0000000..8d24e3a
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/reports/module.info
@@ -0,0 +1,3 @@
+displayName: Reports
+category: Staff
+description: Adds a /report command for people to use when no staff is on \ No newline at end of file
diff --git a/src/com/redstoner/modules/saylol/Saylol.cmd b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd
index 8cc4d44..b81605a 100644
--- a/src/com/redstoner/modules/saylol/Saylol.cmd
+++ b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd
@@ -1,4 +1,6 @@
command lol {
+ alias kek;
+
add [string:text...] {
help Lols a text.;
run addlol text;
diff --git a/src/com/redstoner/modules/saylol/Saylol.java b/src/main/java/com/redstoner/modules/saylol/Saylol.java
index 7081aec..a523615 100644
--- a/src/com/redstoner/modules/saylol/Saylol.java
+++ b/src/main/java/com/redstoner/modules/saylol/Saylol.java
@@ -25,7 +25,7 @@ import net.nemez.chatapi.click.ClickCallback;
import net.nemez.chatapi.click.Message;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Saylol implements Module
{
private long lastLol = 0;
diff --git a/src/main/java/com/redstoner/modules/saylol/module.info b/src/main/java/com/redstoner/modules/saylol/module.info
new file mode 100644
index 0000000..8af4c08
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/saylol/module.info
@@ -0,0 +1,3 @@
+displayName: Saylol
+category: Chat
+description: Adds the famous saylol plugin as a module \ No newline at end of file
diff --git a/src/com/redstoner/modules/scriptutils/Scriptutils.cmd b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.cmd
index c8498b2..e4e7ac1 100644
--- a/src/com/redstoner/modules/scriptutils/Scriptutils.cmd
+++ b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.cmd
@@ -47,20 +47,6 @@ command script_backup_error {
run script_backup_error;
}
}
-command script_trim {
- [empty] {
- help Prints the world trimming started message and starts trimming;
- type console;
- run script_trim;
- }
-}
-command script_trim_result {
- [string:size] [string:data...] {
- help Prints the trimming finished message;
- type console;
- run script_trim_result size data;
- }
-}
command script_backup_database_begin {
[empty] {
help Prints the database backup started message and admin-chat warning;
@@ -96,20 +82,6 @@ command script_backup_database_abort {
run script_backup_database_abort;
}
}
-command script_spigot_update {
- [empty] {
- help Prints the spigot update message;
- type console;
- run script_spigot_update;
- }
-}
-command script_disk_filled {
- [string:percentage] {
- help Prints the admin-chat warning for disk is filled;
- type console;
- run script_disk_filled percentage;
- }
-}
command script_shutdown {
[string:reason] {
help Saves all worlds, kicks players and shuts down the server;
diff --git a/src/com/redstoner/modules/scriptutils/Scriptutils.java b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.java
index 1d634c0..75521db 100644
--- a/src/com/redstoner/modules/scriptutils/Scriptutils.java
+++ b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.java
@@ -11,7 +11,7 @@ import com.redstoner.misc.Utils;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Scriptutils implements Module
{
/** Prints Bukkit restart message
@@ -89,24 +89,6 @@ public class Scriptutils implements Module
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "save-on");
}
- /** Prints the world trimming started message and starts trimming */
- @Command(hook = "script_trim")
- public void print_backup_trim(CommandSender sender)
- {
- Utils.broadcast("", "ยง4 =ยง3 Deleting all chunks beyond border now.", null);
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "wb Creative trim 1000000 15");
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "wb trim confirm");
- }
-
- /** Prints the trimming finished message
- * arg 0 size difference of world
- * arg 1: world border trim data */
- @Command(hook = "script_trim_result")
- public void print_backup_trim_res(CommandSender sender, String size, String data)
- {
- Utils.broadcast("", "ยง4 =ยง3 Chunk deletion saved " + data + " (ยงa" + size + "MBยง3)", null);
- }
-
/** Prints the database backup started message and admin-chat warning */
@Command(hook = "script_backup_database_begin")
public void print_backup_db_begin(CommandSender sender)
@@ -146,25 +128,6 @@ public class Scriptutils implements Module
Utils.broadcast("", "ยง6 =ยง2 Database backup aborted.", null);
}
- /** Prints the spigot update message */
- @Command(hook = "script_spigot_update")
- public void print_update(CommandSender sender)
- {
- Utils.broadcast("", "ยง9 =ยง2 A new Spigot version has been downloaded!", null);
- Utils.broadcast("", "ยง9 =ยง2 Update will be applied after the next reboot.", null);
- }
-
- /** Prints the admin-chat warning for disk is filled
- * arg 0 fill percentage */
- @Command(hook = "script_disk_filled")
- public void print_disk_filled(CommandSender sender, String percentage)
- {
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(),
- "ac ยง4ยงlWARNING:ยง6 Disk is filled > 96% (" + percentage + "%);");
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ac ยง4 Server will shut down at 98%!");
- Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ac ยง4 Contact an admin ยงnimmediatelyยง4!");
- }
-
/** Saves all worlds, kicks players and shuts down the server
* arg 0: reason */
@Command(hook = "script_shutdown")
diff --git a/src/main/java/com/redstoner/modules/scriptutils/module.info b/src/main/java/com/redstoner/modules/scriptutils/module.info
new file mode 100644
index 0000000..ce7f01c
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/scriptutils/module.info
@@ -0,0 +1,3 @@
+displayName: ScriptUtils
+category: External
+description: Provides commands to external scripts for sending predefined messages in chat \ No newline at end of file
diff --git a/src/com/redstoner/modules/seen/Seen.cmd b/src/main/java/com/redstoner/modules/seen/Seen.cmd
index d17e655..213aa34 100644
--- a/src/com/redstoner/modules/seen/Seen.cmd
+++ b/src/main/java/com/redstoner/modules/seen/Seen.cmd
@@ -1,39 +1,36 @@
command seen {
- [string:player] {
+ perm utils.seen;
+ [string:player] {
help Displays information about a player.;
- perm utils.seen;
run seen player;
}
[string:player] [flag:ips] {
help Displays information about a player.;
- perm utils.seen;
run seen2 player ips;
}
}
command firstseen {
- [empty] {
- run firstseen;
- type player;
- help Gives the date and time they first joined;
- perm utils.firstseen;
- }
- [string:person] {
- run firstseenP person;
- help Gives the date and time when a player first joined;
- perm utils.firstseen.other;
- }
+ perm utils.seen.firstseen;
+ [empty] {
+ run firstseen;
+ type player;
+ help Gives the date and time they first joined;
+ }
+ [string:person] {
+ run firstseenP person;
+ help Gives the date and time when a player first joined;
+ }
}
command playtime {
+ perm utils.playtime;
[empty] {
type player;
run playtimeDef;
- perm utils.playtime;
help Displays your total playtime!;
}
[string:name] {
run playtime name;
- perm utils.playtime.others;
help Displays the playtime of another player. The player must be online!;
}
}
@@ -42,12 +39,12 @@ command uuid {
[empty] {
type player;
run uuidDef;
- perm utils.uuid;
+ perm utils.seen.uuid;
help Displays your UUID (click to copy);
}
[string:name] {
run uuid name;
- perm utils.uuid.other;
+ perm utils.seen.uuid.other;
help Displays someone elses UUID (click to copy);
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/seen/Seen.java b/src/main/java/com/redstoner/modules/seen/Seen.java
index 0948152..e6d0e3d 100644
--- a/src/com/redstoner/modules/seen/Seen.java
+++ b/src/main/java/com/redstoner/modules/seen/Seen.java
@@ -36,7 +36,7 @@ import net.nemez.chatapi.click.Message;
@AutoRegisterListener
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 9, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Seen implements Module, Listener
{
HashMap<UUID, JSONArray> names = new HashMap<>();
@@ -101,8 +101,11 @@ public class Seen implements Module, Listener
{
message.add("They're currently &eAFK&7:");
String reason = (String) DataManager.getOrDefault(p.getUniqueId().toString(), "AFK", "afk_reason", "");
+ Long timeAFK = (Long) DataManager.getOrDefault(p.getUniqueId().toString(), "AFK", "afk_time", 0L);
+
+ message.add(" &7Duration: &e" + DateUtil.formatDateDiff(timeAFK));
if (reason.length() >= 1)
- message.add(" &3- " + reason);
+ message.add(" &7Reason: &e" + reason);
}
if (DataManager.getState((Player) p, "vanished"))
message.add("They're currently &evanished&7!");
@@ -128,8 +131,8 @@ public class Seen implements Module, Listener
message.add("They've joined with the following IPs: &e"
+ _ips.toJSONString().replaceAll("[\"\\[\\]]", "").replace(",", "&7, &e"));
}
- message.add(
- "Their current IP is: &a" + DataManager.getOrDefault(p.getUniqueId().toString(), "ip", "unknown"));
+ String ipStr = online? "Their current IP is: &a" : "Their last known IP is: &a";
+ message.add(ipStr + DataManager.getOrDefault(p.getUniqueId().toString(), "ip", "unknown"));
}
getLogger().message(sender, message.toArray(new String[] {}));
return true;
@@ -255,28 +258,29 @@ public class Seen implements Module, Listener
+ "ยง7 couldn't be found! Hint: Currently, you can only check statistics of players that are online!");
return true;
}
- int ticks_lived = player.getStatistic(Statistic.PLAY_ONE_TICK);
+
+ int ticks_lived = player.getStatistic(Statistic.PLAY_ONE_MINUTE);
int days = ticks_lived / 1728000;
int hours = (ticks_lived % 1728000) / 72000;
int minutes = (ticks_lived % 72000) / 1200;
+
if (sender.getName().equals(name))
{
- getLogger().message(sender,
- "You have played for &b"
- + (days == 0 && hours == 0 && minutes == 0 ? "less than a minute."
- : ("a total of: &e" + (days != 0 ? (days + "d ") : "")
- + ((hours != 0 || days != 0) ? (hours + "h ") : "")
- + ((minutes != 0 || hours != 0 || days != 0) ? (minutes + "m") : "")))
- + "&7.");
+ getLogger().message(sender, "You have played for a total of: &e"
+ + (days == 0 && hours == 0 && minutes == 0 ? "< 1m"
+ : (days != 0 ? days + "d " : "")
+ + (hours != 0 || days != 0 ? hours + "h " : "")
+ + (minutes != 0 || hours != 0 || days != 0 ? minutes + "m" : ""))
+ + "&7.");
}
else
{
- getLogger().message(sender, "&3" + name + " &7has played for "
- + (days == 0 && hours == 0 && minutes == 0 ? "less than a minute."
- : ("a total of: &e" + (days != 0 ? (days + "d ") : "")
- + ((hours != 0 || days != 0) ? (hours + "h ") : "")
- + ((minutes != 0 || hours != 0 || days != 0) ? (minutes + "m") : "")))
- + "&7.");
+ getLogger().message(sender, "&3" + Utils.getName(player) + " &7has played for a total of: &e"
+ + (days == 0 && hours == 0 && minutes == 0 ? "< 1m"
+ : (days != 0 ? days + "d " : "")
+ + (hours != 0 || days != 0 ? hours + "h " : "")
+ + (minutes != 0 || hours != 0 || days != 0 ? minutes + "m" : ""))
+ + "&7.");
}
return true;
}
diff --git a/src/main/java/com/redstoner/modules/seen/module.info b/src/main/java/com/redstoner/modules/seen/module.info
new file mode 100644
index 0000000..3a89651
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/seen/module.info
@@ -0,0 +1,3 @@
+displayName: Seen
+category: Other
+description: Allows players to see how long someone has been online/offline, previous names, when they first joined, and much time they've logged \ No newline at end of file
diff --git a/src/com/redstoner/modules/signalstrength/SignalStrength.cmd b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.cmd
index 1cfb0fd..1cfb0fd 100644
--- a/src/com/redstoner/modules/signalstrength/SignalStrength.cmd
+++ b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.cmd
diff --git a/src/com/redstoner/modules/signalstrength/SignalStrength.java b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.java
index b613b09..2480bfc 100644
--- a/src/com/redstoner/modules/signalstrength/SignalStrength.java
+++ b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.java
@@ -28,12 +28,11 @@ import com.redstoner.misc.CommandHolderType;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 2, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class SignalStrength implements Module
{
- private static final String namePrefix = ChatColor.GREEN.toString() + ChatColor.RESET + ChatColor.DARK_PURPLE
- + "Signal Strength: " + ChatColor.RED + ChatColor.BOLD;
+ private static final String namePrefix = ChatColor.DARK_PURPLE + "Signal Strength: " + ChatColor.RED + ChatColor.BOLD;
private static String nameForSignalStrength(int strength)
{
diff --git a/src/main/java/com/redstoner/modules/signalstrength/module.info b/src/main/java/com/redstoner/modules/signalstrength/module.info
new file mode 100644
index 0000000..2a8549d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/signalstrength/module.info
@@ -0,0 +1,3 @@
+displayName: SignalStrength
+category: Other
+description: Sets the amount of items in a container to achieve the given signal strength \ No newline at end of file
diff --git a/src/com/redstoner/modules/skullclick/SkullClick.java b/src/main/java/com/redstoner/modules/skullclick/SkullClick.java
index d581d19..3f08a89 100644
--- a/src/com/redstoner/modules/skullclick/SkullClick.java
+++ b/src/main/java/com/redstoner/modules/skullclick/SkullClick.java
@@ -14,7 +14,7 @@ import com.redstoner.misc.CommandHolderType;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.None)
-@Version(major = 4, minor = 0, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
@AutoRegisterListener
public class SkullClick implements Module, Listener
{
diff --git a/src/main/java/com/redstoner/modules/skullclick/module.info b/src/main/java/com/redstoner/modules/skullclick/module.info
new file mode 100644
index 0000000..535ef3d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/skullclick/module.info
@@ -0,0 +1,3 @@
+displayName: SkullClick
+category: Other
+description: Click a skull and find out who it was, before they were beheaded. You cruel monster \ No newline at end of file
diff --git a/src/com/redstoner/modules/socialspy/Socialspy.cmd b/src/main/java/com/redstoner/modules/socialspy/Socialspy.cmd
index 32159b9..c1e372c 100644
--- a/src/com/redstoner/modules/socialspy/Socialspy.cmd
+++ b/src/main/java/com/redstoner/modules/socialspy/Socialspy.cmd
@@ -1,4 +1,5 @@
command socialspy {
+ perm utils.socialspy;
format {
run config_format_show;
help Displays your current format;
@@ -59,14 +60,12 @@ command socialspy {
run off;
type player;
}
- [empty] {
- run toggle;
- type player;
- }
- perm utils.socialspy;
migrate {
run migrate;
type console;
}
- type all;
+ [empty] {
+ run toggle;
+ type player;
+ }
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/socialspy/Socialspy.java b/src/main/java/com/redstoner/modules/socialspy/Socialspy.java
index e1caac9..26d27fd 100644
--- a/src/com/redstoner/modules/socialspy/Socialspy.java
+++ b/src/main/java/com/redstoner/modules/socialspy/Socialspy.java
@@ -25,7 +25,7 @@ import com.redstoner.modules.datamanager.DataManager;
import net.nemez.chatapi.click.Message;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 3, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Socialspy implements CoreModule
{
@Command(hook = "config_prefix_default")
diff --git a/src/main/java/com/redstoner/modules/socialspy/module.info b/src/main/java/com/redstoner/modules/socialspy/module.info
new file mode 100644
index 0000000..f894598
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/socialspy/module.info
@@ -0,0 +1,3 @@
+displayName: Socialspy
+category: Staff
+description: Allows staff to see DMs, Chatgroups and other stuff that offers socialspy integration \ No newline at end of file
diff --git a/src/com/redstoner/modules/tag/Tag.cmd b/src/main/java/com/redstoner/modules/tag/Tag.cmd
index caa95ab..94bff60 100644
--- a/src/com/redstoner/modules/tag/Tag.cmd
+++ b/src/main/java/com/redstoner/modules/tag/Tag.cmd
@@ -1,22 +1,19 @@
command tag {
+ perm utils.tag;
add [string:player] [string:tag...] {
help Tags a player.;
run addtag player tag;
- perm utils.tag;
}
del [string:player] [int:id] {
help Removes a tag.;
run deltag player id;
- perm utils.tag;
}
check [string:player] {
help Lists all tags of a player.;\
run checktag player;
- perm utils.tag;
}
[string:player] [string:tag...] {
help Tags a player.;
run addtag player tag;
- perm utils.tag;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/tag/Tag.java b/src/main/java/com/redstoner/modules/tag/Tag.java
index ae3302d..ce11fea 100644
--- a/src/com/redstoner/modules/tag/Tag.java
+++ b/src/main/java/com/redstoner/modules/tag/Tag.java
@@ -20,7 +20,7 @@ import com.redstoner.misc.Main;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 1, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Tag implements Module
{
private File tagLocation = new File(Main.plugin.getDataFolder(), "tag.json");
diff --git a/src/main/java/com/redstoner/modules/tag/module.info b/src/main/java/com/redstoner/modules/tag/module.info
new file mode 100644
index 0000000..5448df8
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/tag/module.info
@@ -0,0 +1,3 @@
+displayName: Tag
+category: Staff
+description: Add comments to players for easier communication (e.g. "Has spammed before") \ No newline at end of file
diff --git a/src/com/redstoner/modules/teleport/Teleport.cmd b/src/main/java/com/redstoner/modules/teleport/Teleport.cmd
index 4e5930e..86ce18e 100644
--- a/src/com/redstoner/modules/teleport/Teleport.cmd
+++ b/src/main/java/com/redstoner/modules/teleport/Teleport.cmd
@@ -8,11 +8,13 @@ command teleport {
alias etpo;
alias tp2p;
alias etp2p;
- [player:string] {
+ [string:player] {
run tp player;
+ perm utils.teleport.tp;
}
- [player:string] [player2:string] {
+ [string:player] [string:player2] {
run tp2 player player2;
+ perm utils.teleport.tp.other;
}
}
@@ -22,8 +24,10 @@ command teleporthere {
alias etphere;
alias tpohere;
alias etpohere;
- [player:string] {
- run tph player;
+ perm utils.teleport.tp;
+ [string:player] {
+ run tphere player;
+ perm utils.teleport.tp.here;
}
}
@@ -35,7 +39,8 @@ command teleportask {
alias etpr;
alias tpask;
alias etpask;
- [player:string] {
+ perm utils.teleport.tpa;
+ [string:player] {
run tpa player;
}
}
@@ -48,60 +53,60 @@ command teleportaskhere {
alias etrphere;
alias tpaskhere;
alias etpaskhere;
- [player:string] {
- run tpah player;
+ perm utils.teleport.tpa;
+ [string:player] {
+ run tpahere player;
help ask another player to teleport to you.;
}
}
command tpall {
alias etpall;
+ perm utils.teleport.tpall;
[empty] {
run tpall;
help Teleports everyone to you.;
}
- [player] {
+ [string:player] {
run tpall2 player;
help Teleports everyone to the specified player.;
}
- perm utils.admin.teleport;
}
command tpaall {
alias etpall;
+ perm utils.teleport.tpaall;
[empty] {
run tpaall;
help Sends a tpa request to every player.;
- perm utils.admin.teleport;
}
- [player:string] {
+ [string:player] {
run tpaall2 player;
help Sends a tpa request to every player.;
}
- perm utils.admin.teleport;
}
command tpaccept {
alias etpaccept;
alias tpyes;
alias etpyes;
+ perm utils.teleport.request;
[empty] {
run tpaccept;
help Accepts the latest pending tpa request.;
}
- [index:int] {
+ [int:index] {
run tpaccept2 index;
help Accepts the specified pending tpa request.;
}
- perm utils.teleport.request;
}
command tpacancel {
alias etpacencel;
+ perm utils.teleport.request;
[empty] {
run tpacancel;
help Cancels an outgoing pending tpa request.;
- perm utils.teleport.request;
}
}
@@ -113,7 +118,7 @@ command tpdeny {
[empty] {
run tpdeny;
}
- [index:int] {
+ [int:index] {
run tpdeny2 index;
}
}
@@ -122,21 +127,21 @@ command tplist {
alias etplist;
alias tpl;
alias etpl;
+ perm utils.teleport.request;
[empty] {
- run tpl;
+ run tplist;
}
}
command tptoggle {
alias etptoggle;
- [status:string] {
+ perm utils.teleport.toggle;
+ [string:status] {
run tptoggle status;
help sets your tpa status;
- perm utils.teleport.toggle;
}
- [command:string] [status:string] {
+ [string:command] [string:status] {
run tptoggle2 command status;
help sets your tpa status for only one command (e.g. tpa/tpahere).;
- perm utils.teleport.toggle;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/teleport/Teleport.java b/src/main/java/com/redstoner/modules/teleport/Teleport.java
index 7680852..3ad9f63 100644
--- a/src/com/redstoner/modules/teleport/Teleport.java
+++ b/src/main/java/com/redstoner/modules/teleport/Teleport.java
@@ -16,7 +16,7 @@ import com.redstoner.modules.datamanager.DataManager;
import net.nemez.chatapi.click.Message;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 0, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Teleport implements Module
{
public static final String PERMISSION_TELEPORT = "utils.admin.teleport";
@@ -63,6 +63,12 @@ public class Teleport implements Module
return true;
}
+ @Command(hook = "tphere")
+ public boolean tphere(CommandSender sender, String player)
+ {
+ return true;
+ }
+
@Command(hook = "tpa")
public boolean tpa(CommandSender sender, String player)
{
@@ -75,10 +81,81 @@ public class Teleport implements Module
return true;
}
+ @Command(hook = "tpall")
+ public boolean tpall(CommandSender sender)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpall2")
+ public boolean tpall2(CommandSender sender, String player)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpaall")
+ public boolean tpaall(CommandSender sender)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpaall2")
+ public boolean tpaall2(CommandSender sender, String player)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpaccept")
+ public boolean tpaccept(CommandSender sender)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpaccept2")
+ public boolean tpaccept2(CommandSender sender, int index)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpdeny")
+ public boolean tpdeny(CommandSender sender)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpdeny2")
+ public boolean tpdeny2(CommandSender sender, int index)
+ {
+ return true;
+ }
+
+ @Command(hook = "tpacancel")
+ public boolean tpacancel(CommandSender sender)
+ {
+ return true;
+ }
+
+ @Command(hook = "tplist")
+ public boolean tplist(CommandSender sender)
+ {
+ return true;
+ }
+
+ @Command(hook = "tptoggle")
+ public boolean tptoggle(CommandSender sender, String status)
+ {
+ return true;
+ }
+
+ @Command(hook = "tptoggle2")
+ public boolean tptoggle2(CommandSender sender, String command, String status)
+ {
+ return true;
+ }
+
@Command(hook = "tpmenu")
public boolean tpinventory(CommandSender sender)
{
-
return true;
}
diff --git a/src/main/java/com/redstoner/modules/teleport/module.info b/src/main/java/com/redstoner/modules/teleport/module.info
new file mode 100644
index 0000000..ec4e600
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/teleport/module.info
@@ -0,0 +1,3 @@
+displayName: Teleport
+category: Other
+description: Allows players to teleport to each other, with permission of course \ No newline at end of file
diff --git a/src/com/redstoner/modules/tilechunks/LaggyTileChunk.java b/src/main/java/com/redstoner/modules/tilechunks/LaggyTileChunk.java
index e2456d3..e2456d3 100644
--- a/src/com/redstoner/modules/tilechunks/LaggyTileChunk.java
+++ b/src/main/java/com/redstoner/modules/tilechunks/LaggyTileChunk.java
diff --git a/src/com/redstoner/modules/tilechunks/TileChunks.cmd b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.cmd
index c0e0773..29f1d68 100644
--- a/src/com/redstoner/modules/tilechunks/TileChunks.cmd
+++ b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.cmd
@@ -1,4 +1,5 @@
command lct {
+ alias tilechunks;
perm utils.tilechunks;
list {
diff --git a/src/com/redstoner/modules/tilechunks/TileChunks.java b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.java
index 75a3fd2..a32f05e 100644
--- a/src/com/redstoner/modules/tilechunks/TileChunks.java
+++ b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.java
@@ -18,7 +18,7 @@ import com.redstoner.misc.CommandHolderType;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class TileChunks implements Module
{
private List<LaggyTileChunk> laggyChunks = new ArrayList<>();
diff --git a/src/main/java/com/redstoner/modules/tilechunks/module.info b/src/main/java/com/redstoner/modules/tilechunks/module.info
new file mode 100644
index 0000000..ae9c56d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/tilechunks/module.info
@@ -0,0 +1,3 @@
+displayName: TileChunk
+category: Staff
+description: Collects information about tile entities across the map and displays chunk info \ No newline at end of file
diff --git a/src/com/redstoner/modules/vanish/Vanish.cmd b/src/main/java/com/redstoner/modules/vanish/Vanish.cmd
index 618a4c1..efbc755 100644
--- a/src/com/redstoner/modules/vanish/Vanish.cmd
+++ b/src/main/java/com/redstoner/modules/vanish/Vanish.cmd
@@ -20,14 +20,15 @@ command vanish {
[string:name] {
help Toggles someone elses vanish;
run vanish_other name;
- perm utils.vanishother;
+ perm utils.vanish.other;
}
}
command imout {
+ alias imin;
+ perm utils.vanish.imout;
[empty] {
help Makes you magically disappear;
type player;
- perm utils.imout;
run imout;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/vanish/Vanish.java b/src/main/java/com/redstoner/modules/vanish/Vanish.java
index d4e57e8..107f40d 100644
--- a/src/com/redstoner/modules/vanish/Vanish.java
+++ b/src/main/java/com/redstoner/modules/vanish/Vanish.java
@@ -26,7 +26,7 @@ import com.redstoner.modules.datamanager.DataManager;
@Commands(CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Vanish implements Module, Listener
{
private ArrayList<UUID> vanished = new ArrayList<>();
diff --git a/src/main/java/com/redstoner/modules/vanish/module.info b/src/main/java/com/redstoner/modules/vanish/module.info
new file mode 100644
index 0000000..ccd82fc
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/vanish/module.info
@@ -0,0 +1,3 @@
+displayName: Vanish
+category: Staff
+description: Allows staff to hide from the public entirely. &iPoof \ No newline at end of file
diff --git a/src/com/redstoner/modules/warn/Warn.cmd b/src/main/java/com/redstoner/modules/warn/Warn.cmd
index 5021e0f..fcd4a8d 100644
--- a/src/com/redstoner/modules/warn/Warn.cmd
+++ b/src/main/java/com/redstoner/modules/warn/Warn.cmd
@@ -1,15 +1,15 @@
command warn {
+ perm utils.warn;
[empty] {
run warn;
help Warns other players about definite lag;
- perm utils.warn;
}
}
command warnp {
+ perm utils.warn;
[empty] {
run warnp;
help Warns other players about possible lag;
- perm utils.warn;
}
} \ No newline at end of file
diff --git a/src/com/redstoner/modules/warn/Warn.java b/src/main/java/com/redstoner/modules/warn/Warn.java
index c272c67..657c8e5 100644
--- a/src/com/redstoner/modules/warn/Warn.java
+++ b/src/main/java/com/redstoner/modules/warn/Warn.java
@@ -10,7 +10,7 @@ import com.redstoner.misc.Utils;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class Warn implements Module
{
@Command(hook = "warn")
diff --git a/src/main/java/com/redstoner/modules/warn/module.info b/src/main/java/com/redstoner/modules/warn/module.info
new file mode 100644
index 0000000..5ecd46e
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/warn/module.info
@@ -0,0 +1,3 @@
+displayName: Warn
+category: Chat
+description: Warns other players when someone is about to do something laggy \ No newline at end of file
diff --git a/src/com/redstoner/modules/webtoken/WebToken.cmd b/src/main/java/com/redstoner/modules/webtoken/WebToken.cmd
index 898d212..898d212 100644
--- a/src/com/redstoner/modules/webtoken/WebToken.cmd
+++ b/src/main/java/com/redstoner/modules/webtoken/WebToken.cmd
diff --git a/src/com/redstoner/modules/webtoken/WebToken.java b/src/main/java/com/redstoner/modules/webtoken/WebToken.java
index 6a4a8b0..3a521bf 100644
--- a/src/com/redstoner/modules/webtoken/WebToken.java
+++ b/src/main/java/com/redstoner/modules/webtoken/WebToken.java
@@ -24,7 +24,7 @@ import com.redstoner.misc.mysql.elements.MysqlTable;
import com.redstoner.modules.Module;
@Commands(CommandHolderType.File)
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
public class WebToken implements Module
{
private static final int TOKEN_LENGTH = 6;
diff --git a/src/main/java/com/redstoner/modules/webtoken/module.info b/src/main/java/com/redstoner/modules/webtoken/module.info
new file mode 100644
index 0000000..765a274
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/webtoken/module.info
@@ -0,0 +1,3 @@
+displayName: WebToken
+category: External
+description: Provides a way to generate the token for website signup \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd
new file mode 100644
index 0000000..f8f981d
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd
@@ -0,0 +1,16 @@
+command worldborder {
+ alias wb;
+ perm utils.worldborder;
+ get [string:world] {
+ run getwb world;
+ help Gets the current info about the given world's worder.;
+ }
+ set [string:world] [int:cx] [int:cz] [int:r] {
+ run setwb world cx cz r;
+ help Sets the world border with the given center (cx,cz) and a given radius (r).;
+ }
+ remove [string:world] {
+ run remwb world;
+ help Removes the World Border from the given world.;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java
new file mode 100644
index 0000000..c8da4c3
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java
@@ -0,0 +1,193 @@
+package com.redstoner.modules.worldborder;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+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.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerPortalEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.vehicle.VehicleMoveEvent;
+import org.json.simple.JSONObject;
+
+import com.nemez.cmdmgr.Command;
+import com.redstoner.annotations.AutoRegisterListener;
+import com.redstoner.annotations.Commands;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.CommandHolderType;
+import com.redstoner.misc.JsonManager;
+import com.redstoner.misc.Main;
+import com.redstoner.modules.Module;
+
+import net.nemez.chatapi.ChatAPI;
+
+@AutoRegisterListener
+@Commands(CommandHolderType.File)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
+public class WorldBorder implements Module, Listener {
+
+ Map<String, WorldBorderInfo> borderInfos = new HashMap<>();
+
+ @Command(hook = "getwb")
+ public void getWorldBorder(CommandSender sender, String world) {
+ if (Bukkit.getWorld(world) == null) {
+ getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
+ return;
+ }
+
+ WorldBorderInfo info = borderInfos.get(world);
+ if (info == null)
+ getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet.");
+ else
+ getLogger().message(sender, "&e" + world + "&7's World Border is " + info.getMessage());
+ }
+
+ @Command(hook = "setwb")
+ public void setWorldBorder(CommandSender sender, String world, int cx, int cz, int r) {
+ if (Bukkit.getWorld(world) == null) {
+ getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
+ return;
+ }
+
+ WorldBorderInfo info = new WorldBorderInfo(cx, cz, r);
+ borderInfos.put(world, info);
+ save();
+ getLogger().message(sender, "World Border for &e" + world + "&7 is now " + info.getMessage());
+ }
+
+ @Command(hook = "remwb")
+ public void removeWorldBorder(CommandSender sender, String world) {
+ if (Bukkit.getWorld(world) == null) {
+ getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist.");
+ return;
+ }
+
+ WorldBorderInfo info = borderInfos.remove(world);
+ if (info == null) {
+ getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet.");
+ return;
+ }
+ save();
+ getLogger().message(sender, "World Border for &e" + world + "&7 has been removed.");
+ }
+
+ @SuppressWarnings("unchecked")
+ private void save() {
+ File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json");
+ JSONObject j = new JSONObject();
+
+ for(String world : borderInfos.keySet())
+ j.put(world, borderInfos.get(world).toJSONObject());
+ JsonManager.save(j, file);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void postEnable() {
+ File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json");
+
+ if (!file.exists()) {
+ JSONObject j = new JSONObject();
+ j.put("placeholder", new WorldBorderInfo(0, 0, 0).toJSONObject());
+ JsonManager.save(j, file);
+ return;
+ }
+
+ JSONObject j = JsonManager.getObject(file);
+
+ if (j.get("placeholder") != null) {
+ j.remove("placeholder");
+ getLogger().warn("Detected placeholder in config, ignoring!");
+ }
+
+ for (Object o : j.keySet()) {
+ String world = (String) o;
+ WorldBorderInfo info = WorldBorderInfo.fromJSONObject((JSONObject) j.get(world));
+ borderInfos.put(world, info);
+ getLogger().info("Loaded world, &e" + world + "&7, with the boarder " + info.getMessage());
+ }
+ }
+
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent event) {
+
+ Location loc = event.getBlockPlaced().getLocation();
+ if (loc == null)
+ return;
+
+ World world = loc.getWorld();
+ if (world == null)
+ return;
+ WorldBorderInfo info = borderInfos.get(world.getName());
+ if (info == null)
+ return;
+
+ if (!info.isCordanateWithinBounds(loc.getBlockX(), loc.getBlockZ()))
+ event.setCancelled(true);
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onVehicleMove(VehicleMoveEvent event) {
+ Location to = event.getTo();
+ WorldBorderInfo info = borderInfos.get(to.getWorld().getName());
+ if (!info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ()))
+ event.getVehicle().remove();
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onPlayerMove(PlayerMoveEvent event) {
+
+ Player p = event.getPlayer();
+
+ Location loc = getFinalLocation(p, event.getFrom(),
+ event.getTo(), "&cYou've Reached the WorldBorder!");
+ if (loc == null)
+ event.setCancelled(true);
+ else
+ event.setTo(loc);
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onPlayerTeleport(PlayerTeleportEvent event) {
+ Location loc = getFinalLocation(event.getPlayer(), event.getFrom(),
+ event.getTo(), "&cYou've Teleported to an Invalid Location, returning!");
+ if (loc == null)
+ event.setCancelled(true);
+ else
+ event.setTo(loc);
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
+ public void onPlayerPortal(PlayerPortalEvent event) {
+ Location loc = getFinalLocation(event.getPlayer(), event.getFrom(),
+ event.getTo(), "&cYou've Reached an Invalid Location, returning!");
+ if (loc == null)
+ event.setCancelled(true);
+ else
+ event.setTo(loc);
+ }
+
+
+ private Location getFinalLocation(Player p, Location from, Location to, String message) {
+ WorldBorderInfo info = borderInfos.get(to.getWorld().getName());
+
+ if (info == null || info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ()))
+ return to;
+ else {
+ System.out.println(p.isInsideVehicle());
+ if (p.isInsideVehicle())
+ p.getVehicle().remove();
+ ChatAPI.sendActionBar(p, message);
+ return from;
+ }
+ }
+}
diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java b/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java
new file mode 100644
index 0000000..7ff4430
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java
@@ -0,0 +1,46 @@
+package com.redstoner.modules.worldborder;
+
+import org.json.simple.JSONObject;
+
+public class WorldBorderInfo {
+
+ private final String message;
+ private final int cx, cz, r;
+ private final int maxX, minX, maxZ, minZ;
+
+ public WorldBorderInfo(int cx, int cz, int r) {
+ this.cx = cx;
+ this.cz = cz;
+ this.r = r;
+ this.maxX = cx + r;
+ this.minX = cx - r;
+ this.maxZ = cz + r;
+ this.minZ = cz - r;
+ this.message = "&7centered at &e(" + cx + "," + cz + ")&7 with a radius of &e" + r + "&7.";
+ }
+
+ public boolean isCordanateWithinBounds(int x, int z) {
+ return x > minX && x < maxX && z > minZ && z < maxZ;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ @SuppressWarnings("unchecked")
+ public JSONObject toJSONObject() {
+ JSONObject j = new JSONObject();
+
+ j.put("cx", cx);
+ j.put("cz", cz);
+ j.put("r", r);
+
+ return j;
+ }
+
+ public static WorldBorderInfo fromJSONObject(JSONObject j) {
+ return new WorldBorderInfo(((Long)j.get("cx")).intValue(),
+ ((Long)j.get("cz")).intValue(), ((Long)j.get("r")).intValue());
+ }
+
+}
diff --git a/src/main/java/com/redstoner/modules/worldborder/module.info b/src/main/java/com/redstoner/modules/worldborder/module.info
new file mode 100644
index 0000000..707e522
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/worldborder/module.info
@@ -0,0 +1,3 @@
+displayName: WorldBorder
+category: Other
+description: prevents player from going too far, and prevents blocks from being placed there \ No newline at end of file
diff --git a/src/com/redstoner/utils/CommandException.java b/src/main/java/com/redstoner/utils/CommandException.java
index 0b12125..0b12125 100644
--- a/src/com/redstoner/utils/CommandException.java
+++ b/src/main/java/com/redstoner/utils/CommandException.java
diff --git a/src/com/redstoner/utils/CommandMap.java b/src/main/java/com/redstoner/utils/CommandMap.java
index 4003b01..4003b01 100644
--- a/src/com/redstoner/utils/CommandMap.java
+++ b/src/main/java/com/redstoner/utils/CommandMap.java
diff --git a/src/com/redstoner/utils/ItemProperties.java b/src/main/java/com/redstoner/utils/ItemProperties.java
index cddd0a4..13dc620 100644
--- a/src/com/redstoner/utils/ItemProperties.java
+++ b/src/main/java/com/redstoner/utils/ItemProperties.java
@@ -6,6 +6,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.function.BiConsumer;
+import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
@@ -19,6 +20,7 @@ import org.json.simple.parser.ParseException;
public class ItemProperties
{
private int id = 0;
+ private Material type;
private byte data = 0;
private int amount = 1;
private Map<Enchantment, Integer> enchantments;
@@ -34,7 +36,8 @@ public class ItemProperties
{
if (item == null)
return;
- id = item.getTypeId();
+ id = item.getType().getId();
+ type = item.getType();
data = item.getData().getData();
amount = item.getAmount();
enchantments = new HashMap<>();
@@ -59,7 +62,7 @@ public class ItemProperties
@SuppressWarnings("deprecation")
public ItemStack toItemStack()
{
- ItemStack result = new ItemStack(id, amount, data);
+ ItemStack result = new ItemStack(type, amount, data);
ItemMeta meta = result.getItemMeta();
if (meta == null)
return result;
@@ -87,7 +90,7 @@ public class ItemProperties
return result;
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "deprecation" })
public JSONObject toJSONObject()
{
JSONObject object = new JSONObject();
@@ -125,7 +128,7 @@ public class ItemProperties
return toJSONObject().toString();
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings({ "unchecked", "deprecation" })
public ItemProperties loadFrom(JSONObject object)
{
for (Object obj : object.entrySet())
diff --git a/src/com/redstoner/utils/ThrowingSupplier.java b/src/main/java/com/redstoner/utils/ThrowingSupplier.java
index 986746b..986746b 100644
--- a/src/com/redstoner/utils/ThrowingSupplier.java
+++ b/src/main/java/com/redstoner/utils/ThrowingSupplier.java