217 lines
7.2 KiB
Java
217 lines
7.2 KiB
Java
package net.minecraft.world.level;
|
|
|
|
import com.mojang.brigadier.context.CommandContext;
|
|
import net.minecraft.world.phys.Vec3;
|
|
import net.minecraft.world.entity.player.Player;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import java.util.Date;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.CrashReportCategory;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.ReportedException;
|
|
import net.minecraft.CrashReport;
|
|
import net.minecraft.commands.CommandSourceStack;
|
|
import com.mojang.brigadier.ResultConsumer;
|
|
import net.minecraft.util.StringUtil;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.network.chat.TextComponent;
|
|
import net.minecraft.network.chat.Component;
|
|
import java.text.SimpleDateFormat;
|
|
import net.minecraft.commands.CommandSource;
|
|
|
|
public abstract class BaseCommandBlock implements CommandSource {
|
|
private static final SimpleDateFormat TIME_FORMAT;
|
|
private static final Component DEFAULT_NAME;
|
|
private long lastExecution;
|
|
private boolean updateLastExecution;
|
|
private int successCount;
|
|
private boolean trackOutput;
|
|
private Component lastOutput;
|
|
private String command;
|
|
private Component name;
|
|
|
|
public BaseCommandBlock() {
|
|
this.lastExecution = -1L;
|
|
this.updateLastExecution = true;
|
|
this.trackOutput = true;
|
|
this.command = "";
|
|
this.name = BaseCommandBlock.DEFAULT_NAME;
|
|
}
|
|
|
|
public int getSuccessCount() {
|
|
return this.successCount;
|
|
}
|
|
|
|
public void setSuccessCount(final int integer) {
|
|
this.successCount = integer;
|
|
}
|
|
|
|
public Component getLastOutput() {
|
|
return (this.lastOutput == null) ? new TextComponent("") : this.lastOutput;
|
|
}
|
|
|
|
public CompoundTag save(final CompoundTag jt) {
|
|
jt.putString("Command", this.command);
|
|
jt.putInt("SuccessCount", this.successCount);
|
|
jt.putString("CustomName", Component.Serializer.toJson(this.name));
|
|
jt.putBoolean("TrackOutput", this.trackOutput);
|
|
if (this.lastOutput != null && this.trackOutput) {
|
|
jt.putString("LastOutput", Component.Serializer.toJson(this.lastOutput));
|
|
}
|
|
jt.putBoolean("UpdateLastExecution", this.updateLastExecution);
|
|
if (this.updateLastExecution && this.lastExecution > 0L) {
|
|
jt.putLong("LastExecution", this.lastExecution);
|
|
}
|
|
return jt;
|
|
}
|
|
|
|
public void load(final CompoundTag jt) {
|
|
this.command = jt.getString("Command");
|
|
this.successCount = jt.getInt("SuccessCount");
|
|
if (jt.contains("CustomName", 8)) {
|
|
this.setName(Component.Serializer.fromJson(jt.getString("CustomName")));
|
|
}
|
|
if (jt.contains("TrackOutput", 1)) {
|
|
this.trackOutput = jt.getBoolean("TrackOutput");
|
|
}
|
|
if (jt.contains("LastOutput", 8) && this.trackOutput) {
|
|
try {
|
|
this.lastOutput = Component.Serializer.fromJson(jt.getString("LastOutput"));
|
|
}
|
|
catch (Throwable throwable3) {
|
|
this.lastOutput = new TextComponent(throwable3.getMessage());
|
|
}
|
|
}
|
|
else {
|
|
this.lastOutput = null;
|
|
}
|
|
if (jt.contains("UpdateLastExecution")) {
|
|
this.updateLastExecution = jt.getBoolean("UpdateLastExecution");
|
|
}
|
|
if (this.updateLastExecution && jt.contains("LastExecution")) {
|
|
this.lastExecution = jt.getLong("LastExecution");
|
|
}
|
|
else {
|
|
this.lastExecution = -1L;
|
|
}
|
|
}
|
|
|
|
public void setCommand(final String string) {
|
|
this.command = string;
|
|
this.successCount = 0;
|
|
}
|
|
|
|
public String getCommand() {
|
|
return this.command;
|
|
}
|
|
|
|
public boolean performCommand(final Level bjt) {
|
|
if (bjt.isClientSide || bjt.getGameTime() == this.lastExecution) {
|
|
return false;
|
|
}
|
|
if ("Searge".equalsIgnoreCase(this.command)) {
|
|
this.lastOutput = new TextComponent("#itzlipofutzli");
|
|
this.successCount = 1;
|
|
return true;
|
|
}
|
|
this.successCount = 0;
|
|
final MinecraftServer minecraftServer3 = this.getLevel().getServer();
|
|
if (minecraftServer3 != null && minecraftServer3.isInitialized() && minecraftServer3.isCommandBlockEnabled() && !StringUtil.isNullOrEmpty(this.command)) {
|
|
try {
|
|
this.lastOutput = null;
|
|
final CommandSourceStack cq4 = this.createCommandSourceStack().withCallback((ResultConsumer<CommandSourceStack>)((commandContext, boolean2, integer) -> {
|
|
if (boolean2) {
|
|
++this.successCount;
|
|
}
|
|
}));
|
|
minecraftServer3.getCommands().performCommand(cq4, this.command);
|
|
}
|
|
catch (Throwable throwable4) {
|
|
final CrashReport h5 = CrashReport.forThrowable(throwable4, "Executing command block");
|
|
final CrashReportCategory i6 = h5.addCategory("Command to be executed");
|
|
i6.setDetail("Command", this::getCommand);
|
|
i6.setDetail("Name", () -> this.getName().getString());
|
|
throw new ReportedException(h5);
|
|
}
|
|
}
|
|
if (this.updateLastExecution) {
|
|
this.lastExecution = bjt.getGameTime();
|
|
}
|
|
else {
|
|
this.lastExecution = -1L;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public Component getName() {
|
|
return this.name;
|
|
}
|
|
|
|
public void setName(@Nullable final Component lf) {
|
|
if (lf != null) {
|
|
this.name = lf;
|
|
}
|
|
else {
|
|
this.name = BaseCommandBlock.DEFAULT_NAME;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void sendMessage(final Component lf) {
|
|
if (this.trackOutput) {
|
|
this.lastOutput = new TextComponent("[" + BaseCommandBlock.TIME_FORMAT.format(new Date()) + "] ").append(lf);
|
|
this.onUpdated();
|
|
}
|
|
}
|
|
|
|
public abstract ServerLevel getLevel();
|
|
|
|
public abstract void onUpdated();
|
|
|
|
public void setLastOutput(@Nullable final Component lf) {
|
|
this.lastOutput = lf;
|
|
}
|
|
|
|
public void setTrackOutput(final boolean boolean1) {
|
|
this.trackOutput = boolean1;
|
|
}
|
|
|
|
public boolean isTrackOutput() {
|
|
return this.trackOutput;
|
|
}
|
|
|
|
public boolean usedBy(final Player ayg) {
|
|
if (!ayg.canUseGameMasterBlocks()) {
|
|
return false;
|
|
}
|
|
if (ayg.getCommandSenderWorld().isClientSide) {
|
|
ayg.openMinecartCommandBlock(this);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public abstract Vec3 getPosition();
|
|
|
|
public abstract CommandSourceStack createCommandSourceStack();
|
|
|
|
@Override
|
|
public boolean acceptsSuccess() {
|
|
return this.getLevel().getGameRules().getBoolean(GameRules.RULE_SENDCOMMANDFEEDBACK) && this.trackOutput;
|
|
}
|
|
|
|
@Override
|
|
public boolean acceptsFailure() {
|
|
return this.trackOutput;
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldInformAdmins() {
|
|
return this.getLevel().getGameRules().getBoolean(GameRules.RULE_COMMANDBLOCKOUTPUT);
|
|
}
|
|
|
|
static {
|
|
TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
|
|
DEFAULT_NAME = new TextComponent("@");
|
|
}
|
|
}
|