minecraft-source/src/net/minecraft/CrashReportCategory.java

184 lines
7.3 KiB
Java

package net.minecraft;
import javax.annotation.Nullable;
import net.minecraft.world.level.block.state.BlockState;
import java.util.Iterator;
import net.minecraft.core.BlockPos;
import java.util.Locale;
import com.google.common.collect.Lists;
import java.util.List;
public class CrashReportCategory {
private final CrashReport report;
private final String title;
private final List<Entry> entries;
private StackTraceElement[] stackTrace;
public CrashReportCategory(final CrashReport h, final String string) {
this.entries = Lists.newArrayList();
this.stackTrace = new StackTraceElement[0];
this.report = h;
this.title = string;
}
public static String formatLocation(final double double1, final double double2, final double double3) {
return String.format(Locale.ROOT, "%.2f,%.2f,%.2f - %s", double1, double2, double3, formatLocation(new BlockPos(double1, double2, double3)));
}
public static String formatLocation(final BlockPos fk) {
return formatLocation(fk.getX(), fk.getY(), fk.getZ());
}
public static String formatLocation(final int integer1, final int integer2, final int integer3) {
final StringBuilder stringBuilder4 = new StringBuilder();
try {
stringBuilder4.append(String.format("World: (%d,%d,%d)", integer1, integer2, integer3));
}
catch (Throwable throwable5) {
stringBuilder4.append("(Error finding world loc)");
}
stringBuilder4.append(", ");
try {
final int integer4 = integer1 >> 4;
final int integer5 = integer3 >> 4;
final int integer6 = integer1 & 0xF;
final int integer7 = integer2 >> 4;
final int integer8 = integer3 & 0xF;
final int integer9 = integer4 << 4;
final int integer10 = integer5 << 4;
final int integer11 = (integer4 + 1 << 4) - 1;
final int integer12 = (integer5 + 1 << 4) - 1;
stringBuilder4.append(String.format("Chunk: (at %d,%d,%d in %d,%d; contains blocks %d,0,%d to %d,255,%d)", integer6, integer7, integer8, integer4, integer5, integer9, integer10, integer11, integer12));
}
catch (Throwable throwable5) {
stringBuilder4.append("(Error finding chunk loc)");
}
stringBuilder4.append(", ");
try {
final int integer4 = integer1 >> 9;
final int integer5 = integer3 >> 9;
final int integer6 = integer4 << 5;
final int integer7 = integer5 << 5;
final int integer8 = (integer4 + 1 << 5) - 1;
final int integer9 = (integer5 + 1 << 5) - 1;
final int integer10 = integer4 << 9;
final int integer11 = integer5 << 9;
final int integer12 = (integer4 + 1 << 9) - 1;
final int integer13 = (integer5 + 1 << 9) - 1;
stringBuilder4.append(String.format("Region: (%d,%d; contains chunks %d,%d to %d,%d, blocks %d,0,%d to %d,255,%d)", integer4, integer5, integer6, integer7, integer8, integer9, integer10, integer11, integer12, integer13));
}
catch (Throwable throwable5) {
stringBuilder4.append("(Error finding world loc)");
}
return stringBuilder4.toString();
}
public CrashReportCategory setDetail(final String string, final CrashReportDetail<String> j) {
try {
this.setDetail(string, j.call());
}
catch (Throwable throwable4) {
this.setDetailError(string, throwable4);
}
return this;
}
public CrashReportCategory setDetail(final String string, final Object object) {
this.entries.add(new Entry(string, object));
return this;
}
public void setDetailError(final String string, final Throwable throwable) {
this.setDetail(string, throwable);
}
public int fillInStackTrace(final int integer) {
final StackTraceElement[] arr3 = Thread.currentThread().getStackTrace();
if (arr3.length <= 0) {
return 0;
}
System.arraycopy(arr3, 3 + integer, this.stackTrace = new StackTraceElement[arr3.length - 3 - integer], 0, this.stackTrace.length);
return this.stackTrace.length;
}
public boolean validateStackTrace(final StackTraceElement stackTraceElement1, final StackTraceElement stackTraceElement2) {
if (this.stackTrace.length == 0 || stackTraceElement1 == null) {
return false;
}
final StackTraceElement stackTraceElement3 = this.stackTrace[0];
if (stackTraceElement3.isNativeMethod() != stackTraceElement1.isNativeMethod() || !stackTraceElement3.getClassName().equals(stackTraceElement1.getClassName()) || !stackTraceElement3.getFileName().equals(stackTraceElement1.getFileName()) || !stackTraceElement3.getMethodName().equals(stackTraceElement1.getMethodName())) {
return false;
}
if (stackTraceElement2 != null != this.stackTrace.length > 1) {
return false;
}
if (stackTraceElement2 != null && !this.stackTrace[1].equals(stackTraceElement2)) {
return false;
}
this.stackTrace[0] = stackTraceElement1;
return true;
}
public void trimStacktrace(final int integer) {
final StackTraceElement[] arr3 = new StackTraceElement[this.stackTrace.length - integer];
System.arraycopy(this.stackTrace, 0, arr3, 0, arr3.length);
this.stackTrace = arr3;
}
public void getDetails(final StringBuilder stringBuilder) {
stringBuilder.append("-- ").append(this.title).append(" --\n");
stringBuilder.append("Details:");
for (final Entry a4 : this.entries) {
stringBuilder.append("\n\t");
stringBuilder.append(a4.getKey());
stringBuilder.append(": ");
stringBuilder.append(a4.getValue());
}
if (this.stackTrace != null && this.stackTrace.length > 0) {
stringBuilder.append("\nStacktrace:");
for (final StackTraceElement stackTraceElement6 : this.stackTrace) {
stringBuilder.append("\n\tat ");
stringBuilder.append(stackTraceElement6);
}
}
}
public StackTraceElement[] getStacktrace() {
return this.stackTrace;
}
public static void populateBlockDetails(final CrashReportCategory i, final BlockPos fk, @Nullable final BlockState byj) {
if (byj != null) {
i.setDetail("Block", byj::toString);
}
i.setDetail("Block location", () -> formatLocation(fk));
}
static class Entry {
private final String key;
private final String value;
public Entry(final String string, final Object object) {
this.key = string;
if (object == null) {
this.value = "~~NULL~~";
}
else if (object instanceof Throwable) {
final Throwable throwable4 = (Throwable)object;
this.value = "~~ERROR~~ " + throwable4.getClass().getSimpleName() + ": " + throwable4.getMessage();
}
else {
this.value = object.toString();
}
}
public String getKey() {
return this.key;
}
public String getValue() {
return this.value;
}
}
}