add /tick, /freeze and variable overrides
This commit is contained in:
parent
50fec6dd56
commit
83082f4f3c
5 changed files with 153 additions and 9 deletions
|
@ -116,6 +116,7 @@ public final class Server implements IThreadListener, Executor {
|
||||||
private final Thread thread = Thread.currentThread();
|
private final Thread thread = Thread.currentThread();
|
||||||
private final NioEventLoopGroup eventGroup = new NioEventLoopGroup(0, Util.getThreadFactory("Netty Server IO"));
|
private final NioEventLoopGroup eventGroup = new NioEventLoopGroup(0, Util.getThreadFactory("Netty Server IO"));
|
||||||
private final Map<String, SVar> variables = Maps.newTreeMap();
|
private final Map<String, SVar> variables = Maps.newTreeMap();
|
||||||
|
private final Map<String, Map<String, Object>> overrides = Maps.newTreeMap();
|
||||||
private final List<NetConnection> clients = Collections.<NetConnection>synchronizedList(Lists.<NetConnection>newArrayList());
|
private final List<NetConnection> clients = Collections.<NetConnection>synchronizedList(Lists.<NetConnection>newArrayList());
|
||||||
private final List<Player> players = Lists.<Player>newArrayList();
|
private final List<Player> players = Lists.<Player>newArrayList();
|
||||||
private final Map<String, Player> online = Maps.<String, Player>newHashMap();
|
private final Map<String, Player> online = Maps.<String, Player>newHashMap();
|
||||||
|
@ -350,9 +351,10 @@ public final class Server implements IThreadListener, Executor {
|
||||||
tag.setString("Version", Util.VERSION);
|
tag.setString("Version", Util.VERSION);
|
||||||
TagObject cfg = new TagObject();
|
TagObject cfg = new TagObject();
|
||||||
for(String cvar : this.variables.keySet()) {
|
for(String cvar : this.variables.keySet()) {
|
||||||
SVar value = this.variables.get(cvar);
|
SVar sv = this.variables.get(cvar);
|
||||||
if(!value.noDef || !value.def.equals(value.get()))
|
String value = this.getVariableOverrideValue(cvar);
|
||||||
cfg.setString(cvar, value.get());
|
if(!sv.noDef || !sv.def.equals(value))
|
||||||
|
cfg.setString(cvar, value);
|
||||||
}
|
}
|
||||||
tag.setObject("Config", cfg);
|
tag.setObject("Config", cfg);
|
||||||
writeDimensions(tag);
|
writeDimensions(tag);
|
||||||
|
@ -455,6 +457,91 @@ public final class Server implements IThreadListener, Executor {
|
||||||
public Map<String, SVar> getVariables() {
|
public Map<String, SVar> getVariables() {
|
||||||
return this.variables;
|
return this.variables;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean setVariableOverride(String id, Runnable func) {
|
||||||
|
Map<String, Object> map = Maps.newHashMap();
|
||||||
|
for(Entry<String, SVar> entry : this.variables.entrySet()) {
|
||||||
|
map.put(entry.getKey(), entry.getValue().getRaw());
|
||||||
|
}
|
||||||
|
func.run();
|
||||||
|
for(Iterator<Entry<String, Object>> iter = map.entrySet().iterator(); iter.hasNext();) {
|
||||||
|
Entry<String, Object> entry = iter.next();
|
||||||
|
SVar sv = this.variables.get(entry.getKey());
|
||||||
|
if(!sv.getRaw().equals(entry.getValue())) {
|
||||||
|
for(Iterator<Entry<String, Map<String, Object>>> oiter = this.overrides.entrySet().iterator(); oiter.hasNext();) {
|
||||||
|
Entry<String, Map<String, Object>> oentry = oiter.next();
|
||||||
|
Object value = oentry.getValue().remove(entry.getKey());
|
||||||
|
if(value == null)
|
||||||
|
continue;
|
||||||
|
if(oentry.getValue().isEmpty())
|
||||||
|
oiter.remove();
|
||||||
|
if(sv.getRaw().equals(value))
|
||||||
|
iter.remove();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sv.set(sv.get(), false, true);
|
||||||
|
if(sv.sync)
|
||||||
|
this.sendPacket(new SPacketServerConfig(entry.getKey(), sv.getRaw()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!map.isEmpty())
|
||||||
|
this.overrides.put(id, map);
|
||||||
|
return !map.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean unsetVariableOverride(String id) {
|
||||||
|
Map<String, Object> map = this.overrides.remove(id);
|
||||||
|
if(map == null)
|
||||||
|
return false;
|
||||||
|
for(Entry<String, Object> entry : map.entrySet()) {
|
||||||
|
SVar sv = this.variables.get(entry.getKey());
|
||||||
|
if(!sv.getRaw().equals(entry.getValue())) {
|
||||||
|
sv.set("" + entry.getValue(), false, true);
|
||||||
|
if(sv.sync)
|
||||||
|
this.sendPacket(new SPacketServerConfig(entry.getKey(), sv.getRaw()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String removeVariableOverride(String var) {
|
||||||
|
for(Iterator<Entry<String, Map<String, Object>>> iter = this.overrides.entrySet().iterator(); iter.hasNext();) {
|
||||||
|
Entry<String, Map<String, Object>> entry = iter.next();
|
||||||
|
Object value = entry.getValue().remove(var);
|
||||||
|
if(value == null)
|
||||||
|
continue;
|
||||||
|
String id = entry.getKey();
|
||||||
|
if(entry.getValue().isEmpty())
|
||||||
|
iter.remove();
|
||||||
|
SVar sv = this.variables.get(var);
|
||||||
|
if(!sv.getRaw().equals(value)) {
|
||||||
|
sv.set("" + value, false, true);
|
||||||
|
if(sv.sync)
|
||||||
|
this.sendPacket(new SPacketServerConfig(var, sv.getRaw()));
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVariableOverride(String var) {
|
||||||
|
for(Entry<String, Map<String, Object>> entry : this.overrides.entrySet()) {
|
||||||
|
if(entry.getValue().containsKey(var))
|
||||||
|
return entry.getKey();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVariableOverrideValue(String var) {
|
||||||
|
for(Entry<String, Map<String, Object>> entry : this.overrides.entrySet()) {
|
||||||
|
if(entry.getValue().containsKey(var))
|
||||||
|
return "" + entry.getValue().get(var);
|
||||||
|
}
|
||||||
|
return this.variables.get(var).get();
|
||||||
|
}
|
||||||
|
|
||||||
private Server() {
|
private Server() {
|
||||||
for(Class<?> clazz : new Class[] {Vars.class, SVars.class}) {
|
for(Class<?> clazz : new Class[] {Vars.class, SVars.class}) {
|
||||||
|
|
|
@ -279,6 +279,8 @@ public class CommandEnvironment {
|
||||||
this.registerExecutable(new CommandEffect());
|
this.registerExecutable(new CommandEffect());
|
||||||
this.registerExecutable(new CommandExterminatus());
|
this.registerExecutable(new CommandExterminatus());
|
||||||
this.registerExecutable(new CommandReset());
|
this.registerExecutable(new CommandReset());
|
||||||
|
this.registerExecutable(new CommandTick());
|
||||||
|
this.registerExecutable(new CommandFreeze());
|
||||||
|
|
||||||
this.registerExecutable(new CommandSet());
|
this.registerExecutable(new CommandSet());
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package server.command.commands;
|
||||||
|
|
||||||
|
import common.vars.Vars;
|
||||||
|
import server.command.Command;
|
||||||
|
import server.command.CommandEnvironment;
|
||||||
|
import server.command.Executor;
|
||||||
|
import server.vars.SVars;
|
||||||
|
|
||||||
|
public class CommandFreeze extends Command {
|
||||||
|
public CommandFreeze() {
|
||||||
|
super("freeze");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void exec(CommandEnvironment env, Executor exec) {
|
||||||
|
if(env.getServer().unsetVariableOverride("freeze")) {
|
||||||
|
exec.log("Die Welt ist jetzt nicht mehr eingefroren");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
env.getServer().setVariableOverride("freeze", () -> {SVars.randomTick = 0; SVars.boltChance = 0; SVars.weatherTick = 0; SVars.weatherChance = 0; SVars.tickSpawn = false; Vars.dayCycle = false; Vars.mobTick = false; Vars.liquidPhysics = false; Vars.blockGravity = false; Vars.fire = false;});
|
||||||
|
exec.log("Welt wurde eingefroren");
|
||||||
|
}
|
||||||
|
}
|
|
@ -39,7 +39,7 @@ public class CommandSv extends Command {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String formatVariable(String name, SVar sv, String separator, boolean censor) {
|
private String formatVariable(String name, SVar sv, String override, String separator, boolean censor) {
|
||||||
String value = sv.get();
|
String value = sv.get();
|
||||||
StringBuilder sb = new StringBuilder(Color.YELLOW + name + Color.GRAY + " " + separator + " ");
|
StringBuilder sb = new StringBuilder(Color.YELLOW + name + Color.GRAY + " " + separator + " ");
|
||||||
if(sv.noDef && sv.def.equals(value))
|
if(sv.noDef && sv.def.equals(value))
|
||||||
|
@ -52,6 +52,8 @@ public class CommandSv extends Command {
|
||||||
sb.append(((sv.type == ValueType.BOOLEAN ? (value.equals("true") ? Color.GREEN : Color.RED) : Color.BLUE)) + value);
|
sb.append(((sv.type == ValueType.BOOLEAN ? (value.equals("true") ? Color.GREEN : Color.RED) : Color.BLUE)) + value);
|
||||||
if(!sv.def.equals(value))
|
if(!sv.def.equals(value))
|
||||||
sb.append(Color.GRAY + " (" + (sv.noDef ? Color.DARK_GRAY + "[ - ]" : Color.BROWN + sv.def) + Color.GRAY + ")");
|
sb.append(Color.GRAY + " (" + (sv.noDef ? Color.DARK_GRAY + "[ - ]" : Color.BROWN + sv.def) + Color.GRAY + ")");
|
||||||
|
if(override != null)
|
||||||
|
sb.append(Color.GRAY + " [" + Color.RED + override + Color.GRAY + "]");
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +62,7 @@ public class CommandSv extends Command {
|
||||||
if(value != null)
|
if(value != null)
|
||||||
throw new RunException("Kann keinen Wert ohne eine Variable angeben");
|
throw new RunException("Kann keinen Wert ohne eine Variable angeben");
|
||||||
for(Entry<String, SVar> entry : env.getServer().getVariables().entrySet()) {
|
for(Entry<String, SVar> entry : env.getServer().getVariables().entrySet()) {
|
||||||
exec.log(this.formatVariable(entry.getKey(), entry.getValue(), "=", true));
|
exec.log(this.formatVariable(entry.getKey(), entry.getValue(), env.getServer().getVariableOverride(entry.getKey()), "=", true));
|
||||||
}
|
}
|
||||||
exec.log(Color.GREEN + "SVARs insgesamt registriert: %d", env.getServer().getVariables().size());
|
exec.log(Color.GREEN + "SVARs insgesamt registriert: %d", env.getServer().getVariables().size());
|
||||||
return null;
|
return null;
|
||||||
|
@ -93,11 +95,16 @@ public class CommandSv extends Command {
|
||||||
throw new RunException(Color.DARK_RED + "'%s' ist keine gültige Zahl", value);
|
throw new RunException(Color.DARK_RED + "'%s' ist keine gültige Zahl", value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sv.set(value, false, true);
|
String override = env.getServer().removeVariableOverride(variable);
|
||||||
if(sv.sync)
|
if(override != null)
|
||||||
env.getServer().sendPacket(new SPacketServerConfig(variable, sv.getRaw()));
|
exec.log(Color.YELLOW + "Überschreibung %s für %s entfernt", override, variable);
|
||||||
|
if(override == null || !value.equals(sv.get())) {
|
||||||
|
sv.set(value, false, true);
|
||||||
|
if(sv.sync)
|
||||||
|
env.getServer().sendPacket(new SPacketServerConfig(variable, sv.getRaw()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
exec.log(this.formatVariable(variable, sv, value == null ? "=" : "->", false));
|
exec.log(this.formatVariable(variable, sv, env.getServer().getVariableOverride(variable), value == null ? "=" : "->", false));
|
||||||
return sv.noDef && sv.def.equals(sv.get()) ? null : sv.get();
|
return sv.noDef && sv.def.equals(sv.get()) ? null : sv.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package server.command.commands;
|
||||||
|
|
||||||
|
import server.command.Command;
|
||||||
|
import server.command.CommandEnvironment;
|
||||||
|
import server.command.Executor;
|
||||||
|
|
||||||
|
public class CommandTick extends Command {
|
||||||
|
public CommandTick() {
|
||||||
|
super("tick");
|
||||||
|
|
||||||
|
this.setParamsOptional();
|
||||||
|
this.addDouble("target", 2.0, 10000.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void exec(CommandEnvironment env, Executor exec, Double target) {
|
||||||
|
if(target != null) {
|
||||||
|
float last = env.getServer().getTpsTarget();
|
||||||
|
env.getServer().setTpsTarget(target.floatValue());
|
||||||
|
exec.log("Soll-Tick-Geschwindigkeit von %.1f T/s auf %.1f T/s gesetzt", last, env.getServer().getTpsTarget());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
float avg = env.getServer().getAverageTps();
|
||||||
|
exec.log("Aktuelle Soll-Tick-Geschwindigkeit beträgt %.1f T/s, es werden %.2f T/s bei durchschnittlich %.2f ms erreicht (potenziell %.2f T/s)", env.getServer().getTpsTarget(), env.getServer().getTpsRate(), avg, avg > 0.0f ? 1000.0f / avg : Float.POSITIVE_INFINITY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue