2025-11-24 22:52:51 +03:00

195 lines
7.0 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.jspecify.annotations.Nullable
*/
package net.minecraft.world.level;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Objects;
import net.minecraft.CrashReport;
import net.minecraft.CrashReportCategory;
import net.minecraft.ReportedException;
import net.minecraft.commands.CommandSource;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentSerialization;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.StringUtil;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.gamerules.GameRules;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import org.jspecify.annotations.Nullable;
public abstract class BaseCommandBlock {
private static final Component DEFAULT_NAME = Component.literal("@");
private static final int NO_LAST_EXECUTION = -1;
private long lastExecution = -1L;
private boolean updateLastExecution = true;
private int successCount;
private boolean trackOutput = true;
private @Nullable Component lastOutput;
private String command = "";
private @Nullable Component customName;
public int getSuccessCount() {
return this.successCount;
}
public void setSuccessCount(int successCount) {
this.successCount = successCount;
}
public Component getLastOutput() {
return this.lastOutput == null ? CommonComponents.EMPTY : this.lastOutput;
}
public void save(ValueOutput output) {
output.putString("Command", this.command);
output.putInt("SuccessCount", this.successCount);
output.storeNullable("CustomName", ComponentSerialization.CODEC, this.customName);
output.putBoolean("TrackOutput", this.trackOutput);
if (this.trackOutput) {
output.storeNullable("LastOutput", ComponentSerialization.CODEC, this.lastOutput);
}
output.putBoolean("UpdateLastExecution", this.updateLastExecution);
if (this.updateLastExecution && this.lastExecution != -1L) {
output.putLong("LastExecution", this.lastExecution);
}
}
public void load(ValueInput input) {
this.command = input.getStringOr("Command", "");
this.successCount = input.getIntOr("SuccessCount", 0);
this.setCustomName(BlockEntity.parseCustomNameSafe(input, "CustomName"));
this.trackOutput = input.getBooleanOr("TrackOutput", true);
this.lastOutput = this.trackOutput ? BlockEntity.parseCustomNameSafe(input, "LastOutput") : null;
this.updateLastExecution = input.getBooleanOr("UpdateLastExecution", true);
this.lastExecution = this.updateLastExecution ? input.getLongOr("LastExecution", -1L) : -1L;
}
public void setCommand(String command) {
this.command = command;
this.successCount = 0;
}
public String getCommand() {
return this.command;
}
public boolean performCommand(ServerLevel level) {
if (level.getGameTime() == this.lastExecution) {
return false;
}
if ("Searge".equalsIgnoreCase(this.command)) {
this.lastOutput = Component.literal("#itzlipofutzli");
this.successCount = 1;
return true;
}
this.successCount = 0;
if (level.isCommandBlockEnabled() && !StringUtil.isNullOrEmpty(this.command)) {
try {
this.lastOutput = null;
try (CloseableCommandBlockSource commandSource = this.createSource(level);){
CommandSource effectiveCommandSource = Objects.requireNonNullElse(commandSource, CommandSource.NULL);
CommandSourceStack commandSourceStack = this.createCommandSourceStack(level, effectiveCommandSource).withCallback((success, result) -> {
if (success) {
++this.successCount;
}
});
level.getServer().getCommands().performPrefixedCommand(commandSourceStack, this.command);
}
}
catch (Throwable t) {
CrashReport report = CrashReport.forThrowable(t, "Executing command block");
CrashReportCategory category = report.addCategory("Command to be executed");
category.setDetail("Command", this::getCommand);
category.setDetail("Name", () -> this.getName().getString());
throw new ReportedException(report);
}
}
this.lastExecution = this.updateLastExecution ? level.getGameTime() : -1L;
return true;
}
private @Nullable CloseableCommandBlockSource createSource(ServerLevel level) {
return this.trackOutput ? new CloseableCommandBlockSource(level) : null;
}
public Component getName() {
return this.customName != null ? this.customName : DEFAULT_NAME;
}
public @Nullable Component getCustomName() {
return this.customName;
}
public void setCustomName(@Nullable Component name) {
this.customName = name;
}
public abstract void onUpdated(ServerLevel var1);
public void setLastOutput(@Nullable Component lastOutput) {
this.lastOutput = lastOutput;
}
public void setTrackOutput(boolean trackOutput) {
this.trackOutput = trackOutput;
}
public boolean isTrackOutput() {
return this.trackOutput;
}
public abstract CommandSourceStack createCommandSourceStack(ServerLevel var1, CommandSource var2);
public abstract boolean isValid();
protected class CloseableCommandBlockSource
implements CommandSource,
AutoCloseable {
private final ServerLevel level;
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ROOT);
private boolean closed;
protected CloseableCommandBlockSource(ServerLevel level) {
this.level = level;
}
@Override
public boolean acceptsSuccess() {
return !this.closed && this.level.getGameRules().get(GameRules.SEND_COMMAND_FEEDBACK) != false;
}
@Override
public boolean acceptsFailure() {
return !this.closed;
}
@Override
public boolean shouldInformAdmins() {
return !this.closed && this.level.getGameRules().get(GameRules.COMMAND_BLOCK_OUTPUT) != false;
}
@Override
public void sendSystemMessage(Component message) {
if (!this.closed) {
BaseCommandBlock.this.lastOutput = Component.literal("[" + TIME_FORMAT.format(ZonedDateTime.now()) + "] ").append(message);
BaseCommandBlock.this.onUpdated(this.level);
}
}
@Override
public void close() throws Exception {
this.closed = true;
}
}
}