GameTestServer.java
net.minecraft.gametest.framework.GameTestServer
信息
- 全限定名:net.minecraft.gametest.framework.GameTestServer
- 类型:public class
- 包:net.minecraft.gametest.framework
- 源码路径:src/main/java/net/minecraft/gametest/framework/GameTestServer.java
- 起始行号:L76
- 继承:MinecraftServer
- 职责:
TODO
字段/常量
-
LOGGER- 类型:
Logger - 修饰符:
private static final - 源码定位:
L77 - 说明:
TODO
- 类型:
-
PROGRESS_REPORT_INTERVAL- 类型:
int - 修饰符:
private static final - 源码定位:
L78 - 说明:
TODO
- 类型:
-
TEST_POSITION_RANGE- 类型:
int - 修饰符:
private static final - 源码定位:
L79 - 说明:
TODO
- 类型:
-
NO_SERVICES- 类型:
Services - 修饰符:
private static final - 源码定位:
L80 - 说明:
TODO
- 类型:
-
ENABLED_FEATURES- 类型:
FeatureFlagSet - 修饰符:
private static final - 源码定位:
L83 - 说明:
TODO
- 类型:
-
sampleLogger- 类型:
LocalSampleLogger - 修饰符:
private final - 源码定位:
L86 - 说明:
TODO
- 类型:
-
testSelection- 类型:
Optional<String> - 修饰符:
private final - 源码定位:
L87 - 说明:
TODO
- 类型:
-
verify- 类型:
boolean - 修饰符:
private final - 源码定位:
L88 - 说明:
TODO
- 类型:
-
repeatCount- 类型:
int - 修饰符:
private final - 源码定位:
L89 - 说明:
TODO
- 类型:
-
testBatches- 类型:
List<GameTestBatch> - 修饰符:
private - 源码定位:
L90 - 说明:
TODO
- 类型:
-
stopwatch- 类型:
Stopwatch - 修饰符:
private final - 源码定位:
L91 - 说明:
TODO
- 类型:
-
WORLD_OPTIONS- 类型:
WorldOptions - 修饰符:
private static final - 源码定位:
L92 - 说明:
TODO
- 类型:
-
testTracker- 类型:
MultipleTestTracker - 修饰符:
private - 源码定位:
L93 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.gametest.framework.GameTestServer.MockProfileResolver- 类型:
class - 修饰符:
private static - 源码定位:
L398 - 说明:
TODO
- 类型:
-
net.minecraft.gametest.framework.GameTestServer.MockUserNameToIdResolver- 类型:
class - 修饰符:
private static - 源码定位:
L410 - 说明:
TODO
- 类型:
构造器
private GameTestServer(Thread serverThread, LevelStorageSource.LevelStorageAccess levelStorageSource, PackRepository packRepository, WorldStem worldStem, Optional<String> testSelection, boolean verify, int repeatCount) @ L148
- 构造器名:GameTestServer
- 源码定位:L148
- 修饰符:private
参数:
- serverThread: Thread
- levelStorageSource: LevelStorageSource.LevelStorageAccess
- packRepository: PackRepository
- worldStem: WorldStem
- testSelection: Optional
- verify: boolean
- repeatCount: int
说明:
TODO
方法
下面的方法块按源码顺序生成。
public static GameTestServer create(Thread serverThread, LevelStorageSource.LevelStorageAccess levelStorageSource, PackRepository packRepository, Optional<String> testSelection, boolean verify, int repeatCount) @ L95
- 方法名:create
- 源码定位:L95
- 返回类型:GameTestServer
- 修饰符:public static
参数:
- serverThread: Thread
- levelStorageSource: LevelStorageSource.LevelStorageAccess
- packRepository: PackRepository
- testSelection: Optional
- verify: boolean
- repeatCount: int
说明:
TODO
protected boolean initServer() @ L174
- 方法名:initServer
- 源码定位:L174
- 返回类型:boolean
- 修饰符:protected
参数:
- 无
说明:
TODO
private List<GameTestBatch> evaluateTestsToRun(ServerLevel level) @ L189
- 方法名:evaluateTestsToRun
- 源码定位:L189
- 返回类型:List
- 修饰符:private
参数:
- level: ServerLevel
说明:
TODO
private static Stream<GameTestInfo> rotateAndMultiply(Holder.Reference<GameTestInstance> test, ServerLevel level) @ L220
- 方法名:rotateAndMultiply
- 源码定位:L220
- 返回类型:Stream
- 修饰符:private static
参数:
- test: Holder.Reference
- level: ServerLevel
说明:
TODO
public static Stream<Holder.Reference<GameTestInstance>> getTestsForSelection(RegistryAccess registries, String selection) @ L232
- 方法名:getTestsForSelection
- 源码定位:L232
- 返回类型:Stream<Holder.Reference
> - 修饰符:public static
参数:
- registries: RegistryAccess
- selection: String
说明:
TODO
private Stream<GameTestInfo> multiplyTest(Holder.Reference<GameTestInstance> test, ServerLevel level) @ L236
- 方法名:multiplyTest
- 源码定位:L236
- 返回类型:Stream
- 修饰符:private
参数:
- test: Holder.Reference
- level: ServerLevel
说明:
TODO
protected void tickServer(BooleanSupplier haveTime) @ L246
- 方法名:tickServer
- 源码定位:L246
- 返回类型:void
- 修饰符:protected
参数:
- haveTime: BooleanSupplier
说明:
TODO
private static void logFailedTest(GameTestInfo testInfo) @ L279
- 方法名:logFailedTest
- 源码定位:L279
- 返回类型:void
- 修饰符:private static
参数:
- testInfo: GameTestInfo
说明:
TODO
protected SampleLogger getTickTimeLogger() @ L289
- 方法名:getTickTimeLogger
- 源码定位:L289
- 返回类型:SampleLogger
- 修饰符:protected
参数:
- 无
说明:
TODO
public boolean isTickTimeLoggingEnabled() @ L294
- 方法名:isTickTimeLoggingEnabled
- 源码定位:L294
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
protected void waitUntilNextTick() @ L299
- 方法名:waitUntilNextTick
- 源码定位:L299
- 返回类型:void
- 修饰符:protected
参数:
- 无
说明:
TODO
public SystemReport fillServerSystemReport(SystemReport systemReport) @ L304
- 方法名:fillServerSystemReport
- 源码定位:L304
- 返回类型:SystemReport
- 修饰符:public
参数:
- systemReport: SystemReport
说明:
TODO
protected void onServerExit() @ L310
- 方法名:onServerExit
- 源码定位:L310
- 返回类型:void
- 修饰符:protected
参数:
- 无
说明:
TODO
protected void onServerCrash(CrashReport report) @ L317
- 方法名:onServerCrash
- 源码定位:L317
- 返回类型:void
- 修饰符:protected
参数:
- report: CrashReport
说明:
TODO
private void startTests(ServerLevel level) @ L324
- 方法名:startTests
- 源码定位:L324
- 返回类型:void
- 修饰符:private
参数:
- level: ServerLevel
说明:
TODO
private boolean haveTestsStarted() @ L339
- 方法名:haveTestsStarted
- 源码定位:L339
- 返回类型:boolean
- 修饰符:private
参数:
- 无
说明:
TODO
public boolean isHardcore() @ L343
- 方法名:isHardcore
- 源码定位:L343
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public LevelBasedPermissionSet operatorUserPermissions() @ L348
- 方法名:operatorUserPermissions
- 源码定位:L348
- 返回类型:LevelBasedPermissionSet
- 修饰符:public
参数:
- 无
说明:
TODO
public PermissionSet getFunctionCompilationPermissions() @ L353
- 方法名:getFunctionCompilationPermissions
- 源码定位:L353
- 返回类型:PermissionSet
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean shouldRconBroadcast() @ L358
- 方法名:shouldRconBroadcast
- 源码定位:L358
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean isDedicatedServer() @ L363
- 方法名:isDedicatedServer
- 源码定位:L363
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public int getRateLimitPacketsPerSecond() @ L368
- 方法名:getRateLimitPacketsPerSecond
- 源码定位:L368
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean useNativeTransport() @ L373
- 方法名:useNativeTransport
- 源码定位:L373
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean isPublished() @ L378
- 方法名:isPublished
- 源码定位:L378
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean shouldInformAdmins() @ L383
- 方法名:shouldInformAdmins
- 源码定位:L383
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean isSingleplayerOwner(NameAndId nameAndId) @ L388
- 方法名:isSingleplayerOwner
- 源码定位:L388
- 返回类型:boolean
- 修饰符:public
参数:
- nameAndId: NameAndId
说明:
TODO
public int getMaxPlayers() @ L393
- 方法名:getMaxPlayers
- 源码定位:L393
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
代码
public class GameTestServer extends MinecraftServer {
private static final Logger LOGGER = LogUtils.getLogger();
private static final int PROGRESS_REPORT_INTERVAL = 20;
private static final int TEST_POSITION_RANGE = 14999992;
private static final Services NO_SERVICES = new Services(
null, ServicesKeySet.EMPTY, null, new GameTestServer.MockUserNameToIdResolver(), new GameTestServer.MockProfileResolver()
);
private static final FeatureFlagSet ENABLED_FEATURES = FeatureFlags.REGISTRY
.allFlags()
.subtract(FeatureFlagSet.of(FeatureFlags.REDSTONE_EXPERIMENTS, FeatureFlags.MINECART_IMPROVEMENTS));
private final LocalSampleLogger sampleLogger = new LocalSampleLogger(4);
private final Optional<String> testSelection;
private final boolean verify;
private final int repeatCount;
private List<GameTestBatch> testBatches = new ArrayList<>();
private final Stopwatch stopwatch = Stopwatch.createUnstarted();
private static final WorldOptions WORLD_OPTIONS = new WorldOptions(0L, false, false);
private @Nullable MultipleTestTracker testTracker;
public static GameTestServer create(
Thread serverThread,
LevelStorageSource.LevelStorageAccess levelStorageSource,
PackRepository packRepository,
Optional<String> testSelection,
boolean verify,
int repeatCount
) {
packRepository.reload();
ArrayList<String> enabledPacks = new ArrayList<>(packRepository.getAvailableIds());
enabledPacks.remove("vanilla");
enabledPacks.addFirst("vanilla");
WorldDataConfiguration defaultTestConfig = new WorldDataConfiguration(new DataPackConfig(enabledPacks, List.of()), ENABLED_FEATURES);
LevelSettings testSettings = new LevelSettings("Test Level", GameType.CREATIVE, LevelSettings.DifficultySettings.DEFAULT, true, defaultTestConfig);
WorldLoader.PackConfig packConfig = new WorldLoader.PackConfig(packRepository, defaultTestConfig, false, true);
WorldLoader.InitConfig initConfig = new WorldLoader.InitConfig(packConfig, Commands.CommandSelection.DEDICATED, LevelBasedPermissionSet.OWNER);
try {
LOGGER.debug("Starting resource loading");
Stopwatch stopwatch = Stopwatch.createStarted();
WorldStem worldStem = Util.<WorldStem>blockUntilDone(
executor -> WorldLoader.load(
initConfig,
context -> {
Registry<LevelStem> noDatapackDimensions = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.stable()).freeze();
WorldDimensions worldDimensions = context.datapackWorldgen()
.lookupOrThrow(Registries.WORLD_PRESET)
.getOrThrow(WorldPresets.FLAT)
.value()
.createWorldDimensions();
WorldDimensions.Complete dimensions = worldDimensions.bake(noDatapackDimensions);
PrimaryLevelData levelData = new PrimaryLevelData(testSettings, dimensions.specialWorldProperty(), dimensions.lifecycle());
return new WorldLoader.DataLoadOutput<>(
new LevelDataAndDimensions.WorldDataAndGenSettings(levelData, new WorldGenSettings(WORLD_OPTIONS, worldDimensions)),
dimensions.dimensionsRegistryAccess()
);
},
WorldStem::new,
Util.backgroundExecutor(),
executor
)
)
.get();
stopwatch.stop();
LOGGER.debug("Finished resource loading after {} ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
return new GameTestServer(serverThread, levelStorageSource, packRepository, worldStem, testSelection, verify, repeatCount);
} catch (Exception var13) {
LOGGER.warn("Failed to load vanilla datapack, bit oops", (Throwable)var13);
System.exit(-1);
throw new IllegalStateException();
}
}
private GameTestServer(
Thread serverThread,
LevelStorageSource.LevelStorageAccess levelStorageSource,
PackRepository packRepository,
WorldStem worldStem,
Optional<String> testSelection,
boolean verify,
int repeatCount
) {
super(
serverThread,
levelStorageSource,
packRepository,
worldStem,
Optional.of(new GameRules(ENABLED_FEATURES)),
Proxy.NO_PROXY,
DataFixers.getDataFixer(),
NO_SERVICES,
LoggingLevelLoadListener.forDedicatedServer(),
false
);
this.testSelection = testSelection;
this.repeatCount = repeatCount;
this.verify = verify;
}
@Override
protected boolean initServer() {
this.setPlayerList(new PlayerList(this, this.registries(), this.playerDataStorage, new EmptyNotificationService()) {
{
Objects.requireNonNull(GameTestServer.this);
}
});
Gizmos.withCollector(GizmoCollector.NOOP);
this.loadLevel();
ServerLevel level = this.overworld();
this.testBatches = this.evaluateTestsToRun(level);
LOGGER.info("Started game test server");
return true;
}
private List<GameTestBatch> evaluateTestsToRun(ServerLevel level) {
Registry<GameTestInstance> testRegistry = level.registryAccess().lookupOrThrow(Registries.TEST_INSTANCE);
Collection<Holder.Reference<GameTestInstance>> tests;
GameTestBatchFactory.TestDecorator decorator;
if (this.testSelection.isPresent()) {
tests = getTestsForSelection(level.registryAccess(), this.testSelection.get()).filter(test -> !test.value().manualOnly()).toList();
if (tests.isEmpty()) {
LOGGER.warn("Test selection matcher ({}) found no tests", this.testSelection.get());
System.exit(-1);
}
if (this.verify) {
decorator = GameTestServer::rotateAndMultiply;
LOGGER.info("Verify requested. Will run each test that matches {} {} times", this.testSelection.get(), 100 * Rotation.values().length);
} else if (this.repeatCount > 0) {
decorator = this::multiplyTest;
LOGGER.info(
"Each test that matches {} will be run {} times (total: {})", this.testSelection.get(), this.repeatCount, tests.size() * this.repeatCount
);
} else {
decorator = GameTestBatchFactory.DIRECT;
LOGGER.info("Will run tests matching {} ({} tests)", this.testSelection.get(), tests.size());
}
} else {
tests = testRegistry.listElements().filter(test -> !test.value().manualOnly()).toList();
decorator = GameTestBatchFactory.DIRECT;
}
return GameTestBatchFactory.divideIntoBatches(tests, decorator, level);
}
private static Stream<GameTestInfo> rotateAndMultiply(Holder.Reference<GameTestInstance> test, ServerLevel level) {
Builder<GameTestInfo> builder = Stream.builder();
for (Rotation rotation : Rotation.values()) {
for (int i = 0; i < 100; i++) {
builder.add(new GameTestInfo(test, rotation, level, RetryOptions.noRetries()));
}
}
return builder.build();
}
public static Stream<Holder.Reference<GameTestInstance>> getTestsForSelection(RegistryAccess registries, String selection) {
return ResourceSelectorArgument.parse(new StringReader(selection), registries.lookupOrThrow(Registries.TEST_INSTANCE)).stream();
}
private Stream<GameTestInfo> multiplyTest(Holder.Reference<GameTestInstance> test, ServerLevel level) {
Builder<GameTestInfo> builder = Stream.builder();
for (int i = 0; i < this.repeatCount; i++) {
builder.add(new GameTestInfo(test, Rotation.NONE, level, RetryOptions.noRetries()));
}
return builder.build();
}
@Override
protected void tickServer(BooleanSupplier haveTime) {
super.tickServer(haveTime);
ServerLevel level = this.overworld();
if (!this.haveTestsStarted()) {
this.startTests(level);
}
if (level.getGameTime() % 20L == 0L) {
LOGGER.info(this.testTracker.getProgressBar());
}
if (this.testTracker.isDone()) {
this.halt(false);
LOGGER.info(this.testTracker.getProgressBar());
GlobalTestReporter.finish();
LOGGER.info("========= {} GAME TESTS COMPLETE IN {} ======================", this.testTracker.getTotalCount(), this.stopwatch.stop());
if (this.testTracker.hasFailedRequired()) {
LOGGER.info("{} required tests failed :(", this.testTracker.getFailedRequiredCount());
this.testTracker.getFailedRequired().forEach(GameTestServer::logFailedTest);
} else {
LOGGER.info("All {} required tests passed :)", this.testTracker.getTotalCount());
}
if (this.testTracker.hasFailedOptional()) {
LOGGER.info("{} optional tests failed", this.testTracker.getFailedOptionalCount());
this.testTracker.getFailedOptional().forEach(GameTestServer::logFailedTest);
}
LOGGER.info("====================================================");
}
}
private static void logFailedTest(GameTestInfo testInfo) {
if (testInfo.getRotation() != Rotation.NONE) {
LOGGER.info(
" - {} with rotation {}: {}", testInfo.id(), testInfo.getRotation().getSerializedName(), testInfo.getError().getDescription().getString()
);
} else {
LOGGER.info(" - {}: {}", testInfo.id(), testInfo.getError().getDescription().getString());
}
}
@Override
protected SampleLogger getTickTimeLogger() {
return this.sampleLogger;
}
@Override
public boolean isTickTimeLoggingEnabled() {
return false;
}
@Override
protected void waitUntilNextTick() {
this.runAllTasks();
}
@Override
public SystemReport fillServerSystemReport(SystemReport systemReport) {
systemReport.setDetail("Type", "Game test server");
return systemReport;
}
@Override
protected void onServerExit() {
super.onServerExit();
LOGGER.info("Game test server shutting down");
System.exit(this.testTracker != null ? this.testTracker.getFailedRequiredCount() : -1);
}
@Override
protected void onServerCrash(CrashReport report) {
super.onServerCrash(report);
LOGGER.error("Game test server crashed\n{}", report.getFriendlyReport(ReportType.CRASH));
System.exit(1);
}
private void startTests(ServerLevel level) {
RandomSource random = level.getRandom();
BlockPos startPos = new BlockPos(random.nextIntBetweenInclusive(-14999992, 14999992), -59, random.nextIntBetweenInclusive(-14999992, 14999992));
level.setRespawnData(LevelData.RespawnData.of(level.dimension(), startPos, 0.0F, 0.0F));
GameTestRunner runner = GameTestRunner.Builder.fromBatches(this.testBatches, level)
.newStructureSpawner(new StructureGridSpawner(startPos, 8, false))
.build();
Collection<GameTestInfo> testInfos = runner.getTestInfos();
this.testTracker = new MultipleTestTracker(testInfos);
LOGGER.info("{} tests are now running at position {}!", this.testTracker.getTotalCount(), startPos.toShortString());
this.stopwatch.reset();
this.stopwatch.start();
runner.start();
}
private boolean haveTestsStarted() {
return this.testTracker != null;
}
@Override
public boolean isHardcore() {
return false;
}
@Override
public LevelBasedPermissionSet operatorUserPermissions() {
return LevelBasedPermissionSet.ALL;
}
@Override
public PermissionSet getFunctionCompilationPermissions() {
return LevelBasedPermissionSet.OWNER;
}
@Override
public boolean shouldRconBroadcast() {
return false;
}
@Override
public boolean isDedicatedServer() {
return false;
}
@Override
public int getRateLimitPacketsPerSecond() {
return 0;
}
@Override
public boolean useNativeTransport() {
return false;
}
@Override
public boolean isPublished() {
return false;
}
@Override
public boolean shouldInformAdmins() {
return false;
}
@Override
public boolean isSingleplayerOwner(NameAndId nameAndId) {
return false;
}
@Override
public int getMaxPlayers() {
return 1;
}
private static class MockProfileResolver implements ProfileResolver {
@Override
public Optional<GameProfile> fetchByName(String name) {
return Optional.empty();
}
@Override
public Optional<GameProfile> fetchById(UUID id) {
return Optional.empty();
}
}
private static class MockUserNameToIdResolver implements UserNameToIdResolver {
private final Set<NameAndId> savedIds = new HashSet<>();
@Override
public void add(NameAndId nameAndId) {
this.savedIds.add(nameAndId);
}
@Override
public Optional<NameAndId> get(String name) {
return this.savedIds.stream().filter(e -> e.name().equals(name)).findFirst().or(() -> Optional.of(NameAndId.createOffline(name)));
}
@Override
public Optional<NameAndId> get(UUID id) {
return this.savedIds.stream().filter(e -> e.id().equals(id)).findFirst();
}
@Override
public void resolveOfflineUsers(boolean value) {
}
@Override
public void save() {
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
System.exit()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ResourceSelectorArgument.parse()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
BlockPos()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
GameTestBatchFactory.divideIntoBatches()
- 引用位置:
-
- 引用位置:
参数/构造调用/返回值 - 关联成员:
GameTestInfo()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
GameTestRunner.Builder.fromBatches()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
GlobalTestReporter.finish()
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
MultipleTestTracker()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
RetryOptions.noRetries()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
StructureGridSpawner()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Gizmos.withCollector()
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
Services()
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
InitConfig(), PackConfig(), WorldLoader.InitConfig(), WorldLoader.PackConfig(), WorldLoader.load()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
LoggingLevelLoadListener.forDedicatedServer()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
EmptyNotificationService()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
参数/方法调用 - 关联成员:
NameAndId.createOffline()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
PlayerList()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.backgroundExecutor()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
DataFixers.getDataFixer()
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
LocalSampleLogger()
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
Stopwatch.createStarted(), Stopwatch.createUnstarted()
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
FeatureFlagSet.of()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
DataPackConfig()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
LevelSettings()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
WorldDataConfiguration()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Rotation.values()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
GameRules()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
WorldGenSettings()
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
WorldOptions()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
LevelData.RespawnData.of()
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
LevelDataAndDimensions.WorldDataAndGenSettings(), WorldDataAndGenSettings()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
PrimaryLevelData()
- 引用位置: