improve @ and ~ commands

This commit is contained in:
Sen 2025-06-13 12:01:33 +02:00
parent 06517a0d34
commit e3edb3be8a
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
36 changed files with 159 additions and 124 deletions

View file

@ -132,6 +132,7 @@ public final class Server implements IThreadListener, Executor {
private KeyPair keyPair; private KeyPair keyPair;
private WorldServer space; private WorldServer space;
private ChannelFuture endpoint; private ChannelFuture endpoint;
private Position execPos;
private boolean running = true; private boolean running = true;
private boolean stopped; private boolean stopped;
@ -1168,19 +1169,19 @@ public final class Server implements IThreadListener, Executor {
return this.keyPair.getPrivate(); return this.keyPair.getPrivate();
} }
public void logConsole(String msg) { public void log(String msg) {
Log.CONSOLE.info(msg); Log.CONSOLE.info(msg);
} }
public Position getExecPos() { public Position getExecPos() {
return null; return this.execPos;
} }
public Entity getPointedEntity() { public void setExecPos(Position pos) {
return null; this.execPos = pos;
} }
public BlockPos getPointedPosition() { public boolean isConsole() {
return null; return true;
} }
} }

View file

@ -171,13 +171,13 @@ public class CommandEnvironment {
catch(RunException e) { catch(RunException e) {
Throwable cause = e; Throwable cause = e;
do { do {
exec.logConsole(TextColor.RED + cause.getMessage()); exec.log(TextColor.RED + cause.getMessage());
cause = cause.getCause(); cause = cause.getCause();
} }
while(cause != null); while(cause != null);
} }
catch(Throwable t) { catch(Throwable t) {
exec.logConsole(TextColor.RED + "Fehler: %s", t.getMessage()); exec.log(TextColor.RED + "Fehler: %s", t.getMessage());
Log.CONSOLE.error(t, "Fehler beim Ausführen von Befehl '%s'", cmd); Log.CONSOLE.error(t, "Fehler beim Ausführen von Befehl '%s'", cmd);
} }
finally { finally {
@ -259,6 +259,7 @@ public class CommandEnvironment {
this.registerExecutable(new CommandClear()); this.registerExecutable(new CommandClear());
this.registerExecutable(new CommandEntity()); this.registerExecutable(new CommandEntity());
this.registerExecutable(new CommandItem()); this.registerExecutable(new CommandItem());
this.registerExecutable(new CommandAt()); this.registerExecutable(new CommandRunat());
this.registerExecutable(new CommandRunas());
} }
} }

View file

@ -3,24 +3,29 @@ package server.command;
import common.entity.Entity; import common.entity.Entity;
import common.util.BlockPos; import common.util.BlockPos;
import common.util.Position; import common.util.Position;
import server.Server;
import server.network.Player;
public interface Executor { public interface Executor {
void logConsole(String msg); void log(String msg);
Position getExecPos(); Position getExecPos();
Entity getPointedEntity(); void setExecPos(Position pos);
BlockPos getPointedPosition();
default Entity getPointedEntity() {
return null;
}
default BlockPos getPointedPosition() {
return null;
}
default boolean isConsole() { default boolean isConsole() {
return this instanceof Server; return false;
} }
default boolean isPlayer() { default boolean isPlayer() {
return this instanceof Player; return false;
} }
default void logConsole(String fmt, Object ... args) { default void log(String fmt, Object ... args) {
this.logConsole(String.format(fmt, args)); this.log(String.format(fmt, args));
} }
} }

View file

@ -1,19 +0,0 @@
package server.command;
import common.entity.Entity;
import common.util.BlockPos;
import common.util.Position;
public record FixedExecutor(Executor delegate, Position getExecPos) implements Executor {
public void logConsole(String msg) {
this.delegate.logConsole(msg);
}
public Entity getPointedEntity() {
return null;
}
public BlockPos getPointedPosition() {
return null;
}
}

View file

@ -17,7 +17,7 @@ public class CommandAdmin extends Command {
public void exec(CommandEnvironment env, Executor exec, User user) { public void exec(CommandEnvironment env, Executor exec, User user) {
user.setAdmin(true); user.setAdmin(true);
if(user.isOnline()) if(user.isOnline())
((Player)user).logConsole("Du hast Administatorrechte von %s bekommen", exec.isPlayer() ? ((Player)exec).getUser() : "der Konsole"); ((Player)user).log("Du hast Administatorrechte von %s bekommen", exec.isPlayer() ? ((Player)exec).getUser() : "der Konsole");
exec.logConsole("%s ist jetzt ein Admin", user.getUser()); exec.log("%s ist jetzt ein Admin", user.getUser());
} }
} }

View file

@ -53,9 +53,9 @@ public class CommandBlock extends Command {
} }
} }
if(success) if(success)
exec.logConsole("%s bei %d, %d, %d in %s gesetzt", state.getBlock().getDisplay(), position.getX(), position.getY(), position.getZ(), world.dimension.getFormattedName(false)); exec.log("%s bei %d, %d, %d in %s gesetzt", state.getBlock().getDisplay(), position.getX(), position.getY(), position.getZ(), world.dimension.getFormattedName(false));
else else
exec.logConsole("Block wurde nicht verändert"); exec.log("Block wurde nicht verändert");
return success; return success;
} }
} }

View file

@ -29,12 +29,12 @@ public class CommandClear extends Command {
((EntityNPC)entity).setItem(z, null); ((EntityNPC)entity).setItem(z, null);
} }
} }
exec.logConsole("Inventar von %s gelöscht", entity.getCommandName()); exec.log("Inventar von %s gelöscht", entity.getCommandName());
done++; done++;
} }
} }
if(done > 1) if(done > 1)
exec.logConsole("Inventar von %d Objekten gelöscht", done); exec.log("Inventar von %d Objekten gelöscht", done);
return done; return done;
} }
} }

View file

@ -27,20 +27,20 @@ public class CommandEntity extends Command {
TagObject etag = new TagObject(); TagObject etag = new TagObject();
entity.writeTags(etag); entity.writeTags(etag);
if(tag == null) { if(tag == null) {
exec.logConsole("************************************************************"); exec.log("************************************************************");
exec.logConsole("Daten von %s bei %d, %d, %d in %s:", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false)); exec.log("Daten von %s bei %d, %d, %d in %s:", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false));
exec.logConsole(etag.format(4)); exec.log(etag.format(4));
} }
else { else {
etag.merge(tag); etag.merge(tag);
entity.readTags(etag); entity.readTags(etag);
exec.logConsole("Daten von %s bei %d, %d, %d in %s geändert", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false)); exec.log("Daten von %s bei %d, %d, %d in %s geändert", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false));
} }
done++; done++;
} }
} }
if(tag != null && done > 1) if(tag != null && done > 1)
exec.logConsole("Daten von %d Objekten geändert", done); exec.log("Daten von %d Objekten geändert", done);
return done; return done;
} }
} }

View file

@ -21,12 +21,12 @@ public class CommandFind extends Command {
for(Entity entity : entities) { for(Entity entity : entities) {
if(entity.isEntityAlive()) { if(entity.isEntityAlive()) {
BlockPos pos = entity.getPosition(); BlockPos pos = entity.getPosition();
exec.logConsole("%s bei %d, %d, %d in %s gefunden", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false)); exec.log("%s bei %d, %d, %d in %s gefunden", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), entity.worldObj.dimension.getFormattedName(false));
done++; done++;
} }
} }
if(done > 1) if(done > 1)
exec.logConsole("%d Objekte gefunden", done); exec.log("%d Objekte gefunden", done);
return done; return done;
} }
} }

View file

@ -53,7 +53,7 @@ public class CommandHelp extends Command {
} }
}, param.parsers())) + (required ? ">" : "]")); }, param.parsers())) + (required ? ">" : "]"));
} }
exec.logConsole("%s %s", cmd.name(), Util.buildLines(" ", list)); exec.log("%s %s", cmd.name(), Util.buildLines(" ", list));
} }
public void exec(CommandEnvironment env, Executor exec, String command) { public void exec(CommandEnvironment env, Executor exec, String command) {

View file

@ -52,12 +52,12 @@ public class CommandItem extends Command {
total = amount - total; total = amount - total;
if(total <= 0) if(total <= 0)
continue; continue;
exec.logConsole("%d * %s zum Inventar von %s hinzugefügt", total, stack.getDisplayName(), player.getCommandName()); exec.log("%d * %s zum Inventar von %s hinzugefügt", total, stack.getDisplayName(), player.getCommandName());
done++; done++;
given += total; given += total;
} }
if(done > 1) if(done > 1)
exec.logConsole("%d * %s an %d Spieler verteilt", given, stack.getDisplayName(), done); exec.log("%d * %s an %d Spieler verteilt", given, stack.getDisplayName(), done);
return given; return given;
} }
} }

View file

@ -17,6 +17,6 @@ public class CommandKick extends Command {
public void exec(CommandEnvironment env, Executor exec, Player player, String message) { public void exec(CommandEnvironment env, Executor exec, Player player, String message) {
player.disconnect(message); player.disconnect(message);
exec.logConsole("%s wurde vom Server geworfen", player.getUser()); exec.log("%s wurde vom Server geworfen", player.getUser());
} }
} }

View file

@ -32,17 +32,17 @@ public class CommandMilk extends Command {
if(type != null && entity.hasEffect(type)) { if(type != null && entity.hasEffect(type)) {
int amplifier = entity.getEffect(type).getAmplifier(); int amplifier = entity.getEffect(type).getAmplifier();
entity.removeEffect(type); entity.removeEffect(type);
exec.logConsole("%s von %s entfernt", type.getDisplay(amplifier), entity.getCommandName()); exec.log("%s von %s entfernt", type.getDisplay(amplifier), entity.getCommandName());
done++; done++;
} }
else if(type == null && !entity.getEffects().isEmpty()) { else if(type == null && !entity.getEffects().isEmpty()) {
entity.clearEffects(negative); entity.clearEffects(negative);
exec.logConsole("Alle Effekte von %s entfernt", entity.getCommandName()); exec.log("Alle Effekte von %s entfernt", entity.getCommandName());
done++; done++;
} }
} }
if(done > 1) if(done > 1)
exec.logConsole(type == null ? "Alle Effekte von %d Objekten entfernt" : "%d Effekte entfernt", entities.size()); exec.log(type == null ? "Alle Effekte von %d Objekten entfernt" : "%d Effekte entfernt", entities.size());
return done; return done;
} }
} }

View file

@ -34,7 +34,7 @@ public class CommandOfflinetp extends Command {
throw new RunException("Spieler '%s' konnte nicht gefunden werden", user); throw new RunException("Spieler '%s' konnte nicht gefunden werden", user);
for(Entity entity : entities) { for(Entity entity : entities) {
entity.teleport(pos); entity.teleport(pos);
exec.logConsole("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)pos.x(), (int)pos.y(), (int)pos.z(), UniverseRegistry.getDimension(pos.dim()).getFormattedName(false)); exec.log("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)pos.x(), (int)pos.y(), (int)pos.z(), UniverseRegistry.getDimension(pos.dim()).getFormattedName(false));
} }
return entities.size(); return entities.size();
} }

View file

@ -50,20 +50,20 @@ public class CommandPasswd extends Command {
protected void accept() { protected void accept() {
User plr = env.getServer().getUser(user.getUser()); User plr = env.getServer().getUser(user.getUser());
if(!((Player)exec).isAdmin() || plr == null || (plr.isAdmin() && plr != exec) || (plr.getPasswordHash() == null && plr == exec) || (plr.getPubkey() != null && plr == exec)) { if(!((Player)exec).isAdmin() || plr == null || (plr.isAdmin() && plr != exec) || (plr.getPasswordHash() == null && plr == exec) || (plr.getPubkey() != null && plr == exec)) {
exec.logConsole(TextColor.DRED + "Ein Fehler ist aufgetreten"); exec.log(TextColor.DRED + "Ein Fehler ist aufgetreten");
return; return;
} }
if(this.checkField != null && !MessageDigest.isEqual(EncryptUtil.hashPassword(this.checkField.get(), plr.getPasswordHash().second()), plr.getPasswordHash().first())) { if(this.checkField != null && !MessageDigest.isEqual(EncryptUtil.hashPassword(this.checkField.get(), plr.getPasswordHash().second()), plr.getPasswordHash().first())) {
exec.logConsole(TextColor.RED + "Falsches Passwort eingegeben"); exec.log(TextColor.RED + "Falsches Passwort eingegeben");
return; return;
} }
if(!this.passwordField.get().equals(this.confirmField.get())) { if(!this.passwordField.get().equals(this.confirmField.get())) {
exec.logConsole(TextColor.RED + "Passwörter stimmen nicht überein"); exec.log(TextColor.RED + "Passwörter stimmen nicht überein");
return; return;
} }
plr.setPasswordHash(EncryptUtil.hashPassword(this.passwordField.get())); plr.setPasswordHash(EncryptUtil.hashPassword(this.passwordField.get()));
plr.setPubkey(null); plr.setPubkey(null);
exec.logConsole(TextColor.GREEN + "Passwort" + (plr != exec ? " für %s" : "") + " gesetzt", plr.getUser()); exec.log(TextColor.GREEN + "Passwort" + (plr != exec ? " für %s" : "") + " gesetzt", plr.getUser());
} }
}); });
} }
@ -74,7 +74,7 @@ public class CommandPasswd extends Command {
throw new RunException("Das Passwort ist zu kurz, mindestens 8 Zeichen sind erforderlich"); throw new RunException("Das Passwort ist zu kurz, mindestens 8 Zeichen sind erforderlich");
user.setPasswordHash(EncryptUtil.hashPassword(password)); user.setPasswordHash(EncryptUtil.hashPassword(password));
user.setPubkey(null); user.setPubkey(null);
exec.logConsole(TextColor.GREEN + "Passwort für %s gesetzt", user.getUser()); exec.log(TextColor.GREEN + "Passwort für %s gesetzt", user.getUser());
} }
} }
} }

View file

@ -21,13 +21,13 @@ public class CommandPlayers extends Command {
public void exec(CommandEnvironment env, Executor exec, boolean coords) { public void exec(CommandEnvironment env, Executor exec, boolean coords) {
List<Player> players = env.getServer().getPlayers(); List<Player> players = env.getServer().getPlayers();
if(players.isEmpty()) { if(players.isEmpty()) {
exec.logConsole(TextColor.DGRAY + "Es sind keine Spieler online"); exec.log(TextColor.DGRAY + "Es sind keine Spieler online");
return; return;
} }
exec.logConsole(TextColor.GREEN + "Es " + (players.size() == 1 ? "ist" : "sind") + " " + TextColor.YELLOW + "%d" + TextColor.GREEN + " Spieler online", players.size()); exec.log(TextColor.GREEN + "Es " + (players.size() == 1 ? "ist" : "sind") + " " + TextColor.YELLOW + "%d" + TextColor.GREEN + " Spieler online", players.size());
for(Player player : players) { for(Player player : players) {
EntityNPC entity = player.getPresentEntity(); EntityNPC entity = player.getPresentEntity();
exec.logConsole("%s%s" + TextColor.GRAY + ": '%s" + TextColor.GRAY + "'" + (coords ? " [" + TextColor.ORANGE + "%s @ %d, %d, %d" + TextColor.GRAY + "]" : ""), player.isAdmin() ? TextColor.RED : TextColor.NEON, player.getUser(), entity == null ? TextColor.DGRAY + "<->" : TextColor.ACID + entity.getCommandName(), entity == null ? null : entity.worldObj.dimension.getFormattedName(false), entity == null ? null : ExtMath.floord(entity.posX), entity == null ? null : ExtMath.floord(entity.posY), entity == null ? null : ExtMath.floord(entity.posZ)); exec.log("%s%s" + TextColor.GRAY + ": '%s" + TextColor.GRAY + "'" + (coords ? " [" + TextColor.ORANGE + "%s @ %d, %d, %d" + TextColor.GRAY + "]" : ""), player.isAdmin() ? TextColor.RED : TextColor.NEON, player.getUser(), entity == null ? TextColor.DGRAY + "<->" : TextColor.ACID + entity.getCommandName(), entity == null ? null : entity.worldObj.dimension.getFormattedName(false), entity == null ? null : ExtMath.floord(entity.posX), entity == null ? null : ExtMath.floord(entity.posY), entity == null ? null : ExtMath.floord(entity.posZ));
} }
} }
} }

View file

@ -39,14 +39,14 @@ public class CommandPotion extends Command {
entity.addEffect(effect); entity.addEffect(effect);
} }
if(type.isInstant() || duration == 0) if(type.isInstant() || duration == 0)
exec.logConsole("%s an %s gegeben", type.getDisplay(strength - 1), entity.getCommandName()); exec.log("%s an %s gegeben", type.getDisplay(strength - 1), entity.getCommandName());
else else
exec.logConsole("%s für %d Sekunden an %s gegeben", type.getDisplay(strength - 1), duration, entity.getCommandName()); exec.log("%s für %d Sekunden an %s gegeben", type.getDisplay(strength - 1), duration, entity.getCommandName());
done++; done++;
} }
} }
if(done > 1) if(done > 1)
exec.logConsole("%d Effekte vergeben", done); exec.log("%d Effekte vergeben", done);
return done; return done;
} }
} }

View file

@ -48,11 +48,11 @@ public class CommandPubkey extends Command {
protected void accept() { protected void accept() {
User plr = env.getServer().getUser(user.getUser()); User plr = env.getServer().getUser(user.getUser());
if(!((Player)exec).isAdmin() || plr == null || (plr.isAdmin() && plr != exec)) { if(!((Player)exec).isAdmin() || plr == null || (plr.isAdmin() && plr != exec)) {
exec.logConsole(TextColor.DRED + "Ein Fehler ist aufgetreten"); exec.log(TextColor.DRED + "Ein Fehler ist aufgetreten");
return; return;
} }
if(this.checkField != null && plr.getPasswordHash() != null && !MessageDigest.isEqual(EncryptUtil.hashPassword(this.checkField.get(), plr.getPasswordHash().second()), plr.getPasswordHash().first())) { if(this.checkField != null && plr.getPasswordHash() != null && !MessageDigest.isEqual(EncryptUtil.hashPassword(this.checkField.get(), plr.getPasswordHash().second()), plr.getPasswordHash().first())) {
exec.logConsole(TextColor.RED + "Falsches Passwort eingegeben"); exec.log(TextColor.RED + "Falsches Passwort eingegeben");
return; return;
} }
Pair<PublicKey, String> key; Pair<PublicKey, String> key;
@ -60,12 +60,12 @@ public class CommandPubkey extends Command {
key = EncryptUtil.parseArmoredPubkey(this.keyField.get()); key = EncryptUtil.parseArmoredPubkey(this.keyField.get());
} }
catch(IllegalArgumentException e) { catch(IllegalArgumentException e) {
exec.logConsole(TextColor.RED + "Ungültiger Schlüssel"); exec.log(TextColor.RED + "Ungültiger Schlüssel");
return; return;
} }
plr.setPasswordHash(null); plr.setPasswordHash(null);
plr.setPubkey(key.first()); plr.setPubkey(key.first());
exec.logConsole(TextColor.GREEN + "Schlüssel" + (plr != exec ? " für %s" : "") + " gesetzt", plr.getUser()); exec.log(TextColor.GREEN + "Schlüssel" + (plr != exec ? " für %s" : "") + " gesetzt", plr.getUser());
} }
}); });
} }
@ -81,7 +81,7 @@ public class CommandPubkey extends Command {
} }
user.setPasswordHash(null); user.setPasswordHash(null);
user.setPubkey(key.first()); user.setPubkey(key.first());
exec.logConsole(TextColor.GREEN + "Schlüssel für %s gesetzt", user.getUser()); exec.log(TextColor.GREEN + "Schlüssel für %s gesetzt", user.getUser());
} }
} }
} }

View file

@ -45,18 +45,18 @@ public class CommandRegister extends Command {
protected void accept() { protected void accept() {
if(!((Player)exec).isAdmin() || env.getServer().getUser(username) != null || env.getServer().loadPlayerData(username) != null) { if(!((Player)exec).isAdmin() || env.getServer().getUser(username) != null || env.getServer().loadPlayerData(username) != null) {
exec.logConsole(TextColor.DRED + "Ein Fehler ist aufgetreten"); exec.log(TextColor.DRED + "Ein Fehler ist aufgetreten");
return; return;
} }
if(!this.passwordField.get().equals(this.confirmField.get())) { if(!this.passwordField.get().equals(this.confirmField.get())) {
exec.logConsole(TextColor.RED + "Passwörter stimmen nicht überein"); exec.log(TextColor.RED + "Passwörter stimmen nicht überein");
return; return;
} }
User user = new User(username); User user = new User(username);
user.setPasswordHash(EncryptUtil.hashPassword(this.passwordField.get())); user.setPasswordHash(EncryptUtil.hashPassword(this.passwordField.get()));
user.setAdmin(admin); user.setAdmin(admin);
env.getServer().addUser(user); env.getServer().addUser(user);
exec.logConsole(TextColor.GREEN + "Spieler %s registriert", username); exec.log(TextColor.GREEN + "Spieler %s registriert", username);
} }
}); });
} }
@ -69,7 +69,7 @@ public class CommandRegister extends Command {
user.setPasswordHash(EncryptUtil.hashPassword(password)); user.setPasswordHash(EncryptUtil.hashPassword(password));
user.setAdmin(admin); user.setAdmin(admin);
env.getServer().addUser(user); env.getServer().addUser(user);
exec.logConsole(TextColor.GREEN + "Spieler %s registriert", username); exec.log(TextColor.GREEN + "Spieler %s registriert", username);
} }
} }
} }

View file

@ -48,7 +48,7 @@ public class CommandRegkey extends Command {
protected void accept() { protected void accept() {
if(!((Player)exec).isAdmin() || env.getServer().getUser(username) != null || env.getServer().loadPlayerData(username) != null) { if(!((Player)exec).isAdmin() || env.getServer().getUser(username) != null || env.getServer().loadPlayerData(username) != null) {
exec.logConsole(TextColor.DRED + "Ein Fehler ist aufgetreten"); exec.log(TextColor.DRED + "Ein Fehler ist aufgetreten");
return; return;
} }
Pair<PublicKey, String> key; Pair<PublicKey, String> key;
@ -56,14 +56,14 @@ public class CommandRegkey extends Command {
key = EncryptUtil.parseArmoredPubkey(this.keyField.get()); key = EncryptUtil.parseArmoredPubkey(this.keyField.get());
} }
catch(IllegalArgumentException e) { catch(IllegalArgumentException e) {
exec.logConsole(TextColor.RED + "Ungültiger Schlüssel"); exec.log(TextColor.RED + "Ungültiger Schlüssel");
return; return;
} }
User user = new User(username); User user = new User(username);
user.setPubkey(key.first()); user.setPubkey(key.first());
user.setAdmin(admin); user.setAdmin(admin);
env.getServer().addUser(user); env.getServer().addUser(user);
exec.logConsole(TextColor.GREEN + "Spieler %s registriert", username); exec.log(TextColor.GREEN + "Spieler %s registriert", username);
} }
}); });
} }
@ -81,7 +81,7 @@ public class CommandRegkey extends Command {
user.setPubkey(key.first()); user.setPubkey(key.first());
user.setAdmin(admin); user.setAdmin(admin);
env.getServer().addUser(user); env.getServer().addUser(user);
exec.logConsole(TextColor.GREEN + "Spieler %s registriert", username); exec.log(TextColor.GREEN + "Spieler %s registriert", username);
} }
} }
} }

View file

@ -26,12 +26,12 @@ public class CommandRemove extends Command {
entity.kill(); entity.kill();
else else
entity.setDead(); entity.setDead();
exec.logConsole(kill ? "%s getötet" : "%s entfernt", entity.getCommandName()); exec.log(kill ? "%s getötet" : "%s entfernt", entity.getCommandName());
done++; done++;
} }
} }
if(done > 1) if(done > 1)
exec.logConsole(kill ? "%d Objekte getötet" : "%d Objekte entfernt", done); exec.log(kill ? "%d Objekte getötet" : "%d Objekte entfernt", done);
return done; return done;
} }
} }

View file

@ -20,7 +20,7 @@ public class CommandRevoke extends Command {
throw new RunException("Dieser Befehl kann nur der Konsole ausgeführt werden"); throw new RunException("Dieser Befehl kann nur der Konsole ausgeführt werden");
user.setAdmin(false); user.setAdmin(false);
if(user.isOnline()) if(user.isOnline())
((Player)user).logConsole("Der Host hat deine Administatorrechte entfernt"); ((Player)user).log("Der Host hat deine Administatorrechte entfernt");
exec.logConsole("%s ist jetzt kein Admin mehr", user.getUser()); exec.log("%s ist jetzt kein Admin mehr", user.getUser());
} }
} }

View file

@ -0,0 +1,26 @@
package server.command.commands;
import server.command.Command;
import server.command.CommandEnvironment;
import server.command.Executor;
import server.command.UserPolicy;
import server.network.Player;
public class CommandRunas extends Command {
public CommandRunas() {
super("~");
this.addPlayer("player", false, UserPolicy.NON_ADMINS_NOT_SELF);
this.addString("command", false);
}
public void exec(CommandEnvironment env, Executor exec, Player player, String command) {
try {
player.setForcedExec(exec);
env.execute(command, player);
}
finally {
player.setForcedExec(null);
}
}
}

View file

@ -6,11 +6,10 @@ import common.entity.Entity;
import server.command.Command; import server.command.Command;
import server.command.CommandEnvironment; import server.command.CommandEnvironment;
import server.command.Executor; import server.command.Executor;
import server.command.FixedExecutor;
import server.command.UserPolicy; import server.command.UserPolicy;
public class CommandAt extends Command { public class CommandRunat extends Command {
public CommandAt() { public CommandRunat() {
super("@"); super("@");
this.addEntityList("entities", false, UserPolicy.NON_ADMINS_NOT_SELF); this.addEntityList("entities", false, UserPolicy.NON_ADMINS_NOT_SELF);
@ -21,12 +20,18 @@ public class CommandAt extends Command {
int done = 0; int done = 0;
for(Entity entity : entities) { for(Entity entity : entities) {
if(entity.isEntityAlive()) { if(entity.isEntityAlive()) {
env.execute(command, new FixedExecutor(exec, entity.getPos())); try {
exec.setExecPos(entity.getPos());
env.execute(command, exec);
}
finally {
exec.setExecPos(null);
}
done++; done++;
} }
} }
if(done > 1) if(done > 1)
exec.logConsole("%d Objekte gefunden", done); exec.log("Befehl bei %d Objekten ausgeführt", done);
return done; return done;
} }
} }

View file

@ -20,16 +20,16 @@ public class CommandSave extends Command {
public void exec(CommandEnvironment env, Executor exec, boolean message, boolean flush) { public void exec(CommandEnvironment env, Executor exec, boolean message, boolean flush) {
if(message) if(message)
env.getServer().sendPacket(new SPacketMessage(TextColor.RED + "Speichere Serverdaten, der Server könnte kurz einfrieren", Type.FEED)); env.getServer().sendPacket(new SPacketMessage(TextColor.RED + "Speichere Serverdaten, der Server könnte kurz einfrieren", Type.FEED));
exec.logConsole(TextColor.ORANGE + "Speichere Spielerdaten ..."); exec.log(TextColor.ORANGE + "Speichere Spielerdaten ...");
env.getServer().saveAllPlayerData(true); env.getServer().saveAllPlayerData(true);
exec.logConsole(TextColor.ORANGE + "Speichere Weltdaten ..."); exec.log(TextColor.ORANGE + "Speichere Weltdaten ...");
env.getServer().saveAllWorlds(true); env.getServer().saveAllWorlds(true);
env.getServer().resetSaveTimer(); env.getServer().resetSaveTimer();
if(flush) { if(flush) {
exec.logConsole(TextColor.ORANGE + "Beende E/A ..."); exec.log(TextColor.ORANGE + "Beende E/A ...");
Region.finishWrite(); Region.finishWrite();
} }
exec.logConsole(TextColor.DGREEN + "Alle Serverdaten wurden gespeichert"); exec.log(TextColor.DGREEN + "Alle Serverdaten wurden gespeichert");
if(message) if(message)
env.getServer().sendPacket(new SPacketMessage(TextColor.GREEN + "Die Serverdaten wurden gespeichert", Type.FEED)); env.getServer().sendPacket(new SPacketMessage(TextColor.GREEN + "Die Serverdaten wurden gespeichert", Type.FEED));
} }

View file

@ -17,8 +17,8 @@ public class CommandSeed extends Command {
public Object exec(CommandEnvironment env, Executor exec, WorldServer world, boolean dump) { public Object exec(CommandEnvironment env, Executor exec, WorldServer world, boolean dump) {
if(dump) if(dump)
exec.logConsole("Daten: %s", world.dimension.dumpTags().format(4)); exec.log("Daten: %s", world.dimension.dumpTags().format(4));
exec.logConsole("Startwert von %s: %d", world.dimension.getFormattedName(false), world.dimension.getSeed()); exec.log("Startwert von %s: %d", world.dimension.getFormattedName(false), world.dimension.getSeed());
return world.dimension.getSeed(); return world.dimension.getSeed();
} }
} }

View file

@ -55,7 +55,7 @@ public class CommandSpawn extends Command {
tag != null && tag.hasInt("damage") ? tag.getInt("damage") : 0, tag != null && tag.hasBool("fire") && tag.getBool("fire"), tag != null && tag.hasInt("damage") ? tag.getInt("damage") : 0, tag != null && tag.hasBool("fire") && tag.getBool("fire"),
exec.isPlayer() && tag != null && tag.hasBool("summoned") && tag.getBool("summoned") ? ((Player)exec).getPresentEntity() : null); exec.isPlayer() && tag != null && tag.hasBool("summoned") && tag.getBool("summoned") ? ((Player)exec).getPresentEntity() : null);
} }
exec.logConsole("%sBlitz bei %d, %d, %d in %s erschaffen", count == 1 ? "" : (count + "x "), (int)pos.xCoord, (int)pos.yCoord, (int)pos.zCoord, world.dimension.getFormattedName(false)); exec.log("%sBlitz bei %d, %d, %d in %s erschaffen", count == 1 ? "" : (count + "x "), (int)pos.xCoord, (int)pos.yCoord, (int)pos.zCoord, world.dimension.getFormattedName(false));
return null; return null;
} }
else { else {
@ -82,7 +82,7 @@ public class CommandSpawn extends Command {
} }
spawned.add("#" + entity.getId()); spawned.add("#" + entity.getId());
} }
exec.logConsole("%s%s bei %d, %d, %d in %s erschaffen", count == 1 ? "" : (count + "x "), EntityRegistry.getEntityName(type), (int)pos.xCoord, (int)pos.yCoord, (int)pos.zCoord, world.dimension.getFormattedName(false)); exec.log("%s%s bei %d, %d, %d in %s erschaffen", count == 1 ? "" : (count + "x "), EntityRegistry.getEntityName(type), (int)pos.xCoord, (int)pos.yCoord, (int)pos.zCoord, world.dimension.getFormattedName(false));
return Util.buildLines(",", spawned); return Util.buildLines(",", spawned);
} }
} }

View file

@ -59,9 +59,9 @@ 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.logConsole(this.formatVariable(entry.getKey(), entry.getValue(), "=", true)); exec.log(this.formatVariable(entry.getKey(), entry.getValue(), "=", true));
} }
exec.logConsole(TextColor.GREEN + "SVARs insgesamt registriert: %d", env.getServer().getVariables().size()); exec.log(TextColor.GREEN + "SVARs insgesamt registriert: %d", env.getServer().getVariables().size());
return null; return null;
} }
SVar sv = env.getServer().getVariables().get(variable); SVar sv = env.getServer().getVariables().get(variable);
@ -94,7 +94,7 @@ public class CommandSv extends Command {
} }
sv.set(value, false, true); sv.set(value, false, true);
} }
exec.logConsole(this.formatVariable(variable, sv, value == null ? "=" : "->", false)); exec.log(this.formatVariable(variable, sv, 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();
} }
} }

View file

@ -27,7 +27,7 @@ public class CommandTele extends Command {
public Object exec(CommandEnvironment env, Executor exec, Vec3 position, Dimension dim, Double yaw, Double pitch, List<Entity> entities) { public Object exec(CommandEnvironment env, Executor exec, Vec3 position, Dimension dim, Double yaw, Double pitch, List<Entity> entities) {
for(Entity entity : entities) { for(Entity entity : entities) {
entity.teleport(position.xCoord, position.yCoord, position.zCoord, yaw == null ? entity.rotYaw : yaw.floatValue(), pitch == null ? entity.rotPitch : pitch.floatValue(), dim.getDimensionId()); entity.teleport(position.xCoord, position.yCoord, position.zCoord, yaw == null ? entity.rotYaw : yaw.floatValue(), pitch == null ? entity.rotPitch : pitch.floatValue(), dim.getDimensionId());
exec.logConsole("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)position.xCoord, (int)position.yCoord, (int)position.zCoord, dim.getFormattedName(false)); exec.log("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)position.xCoord, (int)position.yCoord, (int)position.zCoord, dim.getFormattedName(false));
} }
return entities.size(); return entities.size();
} }

View file

@ -90,7 +90,7 @@ public class CommandTime extends Command {
dim.setDayTime(time); dim.setDayTime(time);
dim.resetWeather(); dim.resetWeather();
} }
exec.logConsole("Zeit auf %s gesetzt", ItemSpaceNavigator.formatImperialTime(world, false)); exec.log("Zeit auf %s gesetzt", ItemSpaceNavigator.formatImperialTime(world, false));
return time; return time;
} }
} }

View file

@ -23,7 +23,7 @@ public class CommandTp extends Command {
Position pos = target.getPos(); Position pos = target.getPos();
for(Entity entity : entities) { for(Entity entity : entities) {
entity.teleport(pos); entity.teleport(pos);
exec.logConsole("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)pos.x(), (int)pos.y(), (int)pos.z(), UniverseRegistry.getDimension(pos.dim()).getFormattedName(false)); exec.log("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)pos.x(), (int)pos.y(), (int)pos.z(), UniverseRegistry.getDimension(pos.dim()).getFormattedName(false));
} }
return entities.size(); return entities.size();
} }

View file

@ -15,12 +15,12 @@ public class CommandUsers extends Command {
public void exec(CommandEnvironment env, Executor exec) { public void exec(CommandEnvironment env, Executor exec) {
Collection<User> users = env.getServer().getUsers(); Collection<User> users = env.getServer().getUsers();
if(users.isEmpty()) { if(users.isEmpty()) {
exec.logConsole(TextColor.DGRAY + "Es sind keine Spieler registriert"); exec.log(TextColor.DGRAY + "Es sind keine Spieler registriert");
return; return;
} }
exec.logConsole(TextColor.GREEN + "Es " + (users.size() == 1 ? "ist" : "sind") + " " + TextColor.YELLOW + "%d" + TextColor.GREEN + " Spieler registriert", users.size()); exec.log(TextColor.GREEN + "Es " + (users.size() == 1 ? "ist" : "sind") + " " + TextColor.YELLOW + "%d" + TextColor.GREEN + " Spieler registriert", users.size());
for(User user : users) { for(User user : users) {
exec.logConsole("%s%s" + TextColor.GRAY + ": %s" + TextColor.GRAY + ", %s", user.isAdmin() ? TextColor.RED : TextColor.NEON, user.getUser(), user.isOnline() ? TextColor.DGREEN + "Online" : TextColor.DGRAY + "Offline", user.getPubkey() != null ? TextColor.YELLOW + "Pubkey" : (user.getPasswordHash() != null ? TextColor.MAGENTA + "Passwort" : TextColor.BLACK + "Kein Login")); exec.log("%s%s" + TextColor.GRAY + ": %s" + TextColor.GRAY + ", %s", user.isAdmin() ? TextColor.RED : TextColor.NEON, user.getUser(), user.isOnline() ? TextColor.DGREEN + "Online" : TextColor.DGRAY + "Offline", user.getPubkey() != null ? TextColor.YELLOW + "Pubkey" : (user.getPasswordHash() != null ? TextColor.MAGENTA + "Passwort" : TextColor.BLACK + "Kein Login"));
} }
} }
} }

View file

@ -48,7 +48,7 @@ public class CommandWarp extends Command {
// } // }
for(Entity entity : entities) { for(Entity entity : entities) {
entity.teleport(pos); entity.teleport(pos);
exec.logConsole("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)pos.x(), (int)pos.y(), (int)pos.z(), UniverseRegistry.getDimension(pos.dim()).getFormattedName(false)); exec.log("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), (int)pos.x(), (int)pos.y(), (int)pos.z(), UniverseRegistry.getDimension(pos.dim()).getFormattedName(false));
} }
return entities.size(); return entities.size();
} }

View file

@ -26,6 +26,6 @@ public class CommandWeather extends Command {
world.setWeather(weather); world.setWeather(weather);
if(!transition) if(!transition)
world.resetWeather(); world.resetWeather();
exec.logConsole("Wetter in %s zu %s geändert", world.dimension.getFormattedName(false), weather.getDisplay()); exec.log("Wetter in %s zu %s geändert", world.dimension.getFormattedName(false), weather.getDisplay());
} }
} }

View file

@ -33,7 +33,7 @@ public class CommandWorld extends Command {
pos = pos.up(); pos = pos.up();
} }
entity.teleport(pos, world.dimension.getDimensionId()); entity.teleport(pos, world.dimension.getDimensionId());
exec.logConsole("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), world.dimension.getFormattedName(false)); exec.log("%s nach %d, %d, %d in %s teleportiert", entity.getCommandName(), pos.getX(), pos.getY(), pos.getZ(), world.dimension.getFormattedName(false));
} }
return entities.size(); return entities.size();
} }

View file

@ -204,8 +204,9 @@ public class Player extends User implements ICrafting, Executor, IPlayer
private final List<ChunkPos> loadedChunks = new LinkedList<ChunkPos>(); private final List<ChunkPos> loadedChunks = new LinkedList<ChunkPos>();
private final List<Integer> destroyedItemsNetCache = new LinkedList<Integer>(); private final List<Integer> destroyedItemsNetCache = new LinkedList<Integer>();
// private final Set<StatBase> statsQueue = Sets.<StatBase>newHashSet();
// private final Map<StatBase, Integer> stats = Maps.<StatBase, Integer>newConcurrentMap(); private Position forcedPos;
private Executor forcedExec;
public Player(Server server, NetConnection connection, String user) public Player(Server server, NetConnection connection, String user)
{ {
@ -1900,12 +1901,35 @@ public class Player extends User implements ICrafting, Executor, IPlayer
// return Lists.newArrayList(); // return Lists.newArrayList();
} }
public void logConsole(String msg) { public void setForcedExec(Executor forced) {
this.addConsole(msg); this.forcedExec = forced;
}
public void setExecPos(Position pos) {
this.forcedPos = pos;
}
public void log(String msg) {
if(this.forcedExec != null)
this.forcedExec.log(TextColor.ACID + "Als " + TextColor.GREEN + "%s" + TextColor.DGRAY + ": " + TextColor.RESET + "%s", this.getUser(), msg);
else
this.addConsole(msg);
} }
public Position getExecPos() { public Position getExecPos() {
return this.entity != null ? this.entity.getPos() : null; return this.forcedPos != null ? this.forcedPos : (this.entity != null ? this.entity.getPos() : null);
}
public Entity getPointedEntity() {
return this.pointedEntity != -1 && this.entity != null ? this.entity.worldObj.getEntityByID(this.pointedEntity) : null;
}
public BlockPos getPointedPosition() {
return this.pointedPosition;
}
public boolean isPlayer() {
return true;
} }
public void processMessage(CPacketMessage packetIn) public void processMessage(CPacketMessage packetIn)
@ -3059,14 +3083,6 @@ public class Player extends User implements ICrafting, Executor, IPlayer
this.getNextFormId(); this.getNextFormId();
this.sendPacket(new SPacketDisplayForm(this.currentFormId, form.getTitle(), form.getInputList())); this.sendPacket(new SPacketDisplayForm(this.currentFormId, form.getTitle(), form.getInputList()));
} }
public Entity getPointedEntity() {
return this.pointedEntity != -1 && this.entity != null ? this.entity.worldObj.getEntityByID(this.pointedEntity) : null;
}
public BlockPos getPointedPosition() {
return this.pointedPosition;
}
public List<ChunkPos> getLoadedChunkList() { public List<ChunkPos> getLoadedChunkList() {
return this.loadedChunks; return this.loadedChunks;