Archived
0

Bridge: изменение настроек сервера в реальном времени (onlinemode)

В виду того, что задействуется рефлексия, а spigot не валяется ни на
одном репозитарии, для корректной компиляции приходится лепить фейковые
классы. Надеюсь в будующем я придумаю как избавится от такого костыля.
This commit is contained in:
2017-05-23 13:03:21 +03:00
parent c208c9f015
commit 08e17004fc
6 changed files with 77 additions and 1 deletions

View File

@@ -20,6 +20,7 @@ public class BridgePlugin extends JavaPlugin {
private int tryConnect = 0;
private BridgeLoggerAppender loggerAppender;
private boolean needReconnect = true;
private SpigotServer spigotServer;
@Override
public void onLoad() {
@@ -30,6 +31,8 @@ public class BridgePlugin extends JavaPlugin {
@Override
public void onEnable() {
if (INSTANCE == null) {
spigotServer = new SpigotServer(getServer());
INSTANCE = this;
saveDefaultConfig();
@@ -54,6 +57,9 @@ public class BridgePlugin extends JavaPlugin {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
sender.sendMessage("ASys Bridge by DmitriyMX");
sender.sendMessage("[DEBUG] Onlinemode-1: " + spigotServer.getOnlineMode());
spigotServer.setOnlineMode(!spigotServer.getOnlineMode());
sender.sendMessage("[DEBUG] Onlinemode-2: " + spigotServer.getOnlineMode());
return true;
}

View File

@@ -0,0 +1,42 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-05-23
*/
package asys.bridge.bukkit;
import org.bukkit.Server;
import org.bukkit.craftbukkit.v1_8_R3.CraftServer;
import java.lang.reflect.Field;
class SpigotServer {
private CraftServer craftServer;
private Object booleanWrapper;
private Field booleanWrapperValueField;
SpigotServer(Server server) {
craftServer = (CraftServer)server;
try {
Field onlineField = craftServer.getClass().getDeclaredField("online");
onlineField.setAccessible(true);
booleanWrapper = onlineField.get(craftServer);
booleanWrapperValueField = booleanWrapper.getClass().getDeclaredField("value");
booleanWrapperValueField.setAccessible(true);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
boolean getOnlineMode() {
return craftServer.getOnlineMode();
}
void setOnlineMode(boolean value) {
try {
booleanWrapperValueField.set(booleanWrapper, value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}