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

@@ -1,5 +1,5 @@
group = 'asys'
version = '0.5.3-SNAPSHOT'
version = '0.5.4-SNAPSHOT'
repositories {
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
@@ -18,6 +18,7 @@ configurations {
compileJava {
dependsOn ':bridge-protocol:compileJava'
dependsOn ':bridge-mcserver-fake:compileJava'
}
jar {
@@ -32,6 +33,7 @@ ext {
dependencies {
include files(project(':bridge-protocol').sourceSets.main.output.classesDir)
compile files(project(':bridge-mcserver-fake').sourceSets.main.output.classesDir)
compile (group: 'org.bukkit', name: 'bukkit', version: '1.8.8-R0.1-SNAPSHOT') {
exclude group: 'junit'
exclude group: 'commons-lang'

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();
}
}
}