LevelDatToSavedDataFileFix.java
net.minecraft.util.filefix.fixes.LevelDatToSavedDataFileFix
信息
- 全限定名:net.minecraft.util.filefix.fixes.LevelDatToSavedDataFileFix
- 类型:public class
- 包:net.minecraft.util.filefix.fixes
- 源码路径:src/main/java/net/minecraft/util/filefix/fixes/LevelDatToSavedDataFileFix.java
- 起始行号:L26
- 继承:FileFix
- 职责:
TODO
字段/常量
-
FALLBACK_SINGLE_PLAYER_UUID- 类型:
UUID - 修饰符:
private static final - 源码定位:
L27 - 说明:
TODO
- 类型:
-
OVERWORLD- 类型:
String - 修饰符:
private static final - 源码定位:
L28 - 说明:
TODO
- 类型:
-
THE_NETHER- 类型:
String - 修饰符:
private static final - 源码定位:
L29 - 说明:
TODO
- 类型:
-
THE_END- 类型:
String - 修饰符:
private static final - 源码定位:
L30 - 说明:
TODO
- 类型:
-
WORLD_BORDER_KEY- 类型:
String - 修饰符:
private static final - 源码定位:
L31 - 说明:
TODO
- 类型:
-
WORLD_BORDER_FILE_NAME- 类型:
String - 修饰符:
private static final - 源码定位:
L32 - 说明:
TODO
- 类型:
内部类/嵌套类型
- 无
构造器
public LevelDatToSavedDataFileFix(Schema schema) @ L34
- 构造器名:LevelDatToSavedDataFileFix
- 源码定位:L34
- 修饰符:public
参数:
- schema: Schema
说明:
TODO
方法
下面的方法块按源码顺序生成。
public void makeFixer() @ L38
- 方法名:makeFixer
- 源码定位:L38
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
private static Dynamic<?> extractToFile(FileAccess<?extends CompressedNbt> targetFile, Dynamic<?> content, String key) @ L106
- 方法名:extractToFile
- 源码定位:L106
- 返回类型:Dynamic<?>
- 修饰符:private static
参数:
- targetFile: FileAccess<?extends CompressedNbt>
- content: Dynamic<?>
- key: String
说明:
TODO
private Dynamic<?> extractPlayerDataToFile(FileAccess<PlayerData> fallbackFile, Dynamic<?> content) @ L117
- 方法名:extractPlayerDataToFile
- 源码定位:L117
- 返回类型:Dynamic<?>
- 修饰符:private
参数:
- fallbackFile: FileAccess
- content: Dynamic<?>
说明:
TODO
private static Dynamic<?> extractWorldBorderToFiles(FileAccess<?extends CompressedNbt> worldBorderOverworld, FileAccess<?extends CompressedNbt> worldBorderNether, FileAccess<?extends CompressedNbt> worldBorderEnd, Dynamic<?> content) @ L138
- 方法名:extractWorldBorderToFiles
- 源码定位:L138
- 返回类型:Dynamic<?>
- 修饰符:private static
参数:
- worldBorderOverworld: FileAccess<?extends CompressedNbt>
- worldBorderNether: FileAccess<?extends CompressedNbt>
- worldBorderEnd: FileAccess<?extends CompressedNbt>
- content: Dynamic<?>
说明:
TODO
private static void extractWorldBorderToFile(FileAccess<?extends CompressedNbt> targetFile, Dynamic<?> content, double divider) @ L150
- 方法名:extractWorldBorderToFile
- 源码定位:L150
- 返回类型:void
- 修饰符:private static
参数:
- targetFile: FileAccess<?extends CompressedNbt>
- content: Dynamic<?>
- divider: double
说明:
TODO
private Dynamic<?> extractWorldGenSettingsToFile(FileAccess<?extends CompressedNbt> targetFile, Dynamic<?> content) @ L161
- 方法名:extractWorldGenSettingsToFile
- 源码定位:L161
- 返回类型:Dynamic<?>
- 修饰符:private
参数:
- targetFile: FileAccess<?extends CompressedNbt>
- content: Dynamic<?>
说明:
TODO
代码
public class LevelDatToSavedDataFileFix extends FileFix {
private static final UUID FALLBACK_SINGLE_PLAYER_UUID = Util.NIL_UUID;
private static final String OVERWORLD = "overworld";
private static final String THE_NETHER = "the_nether";
private static final String THE_END = "the_end";
private static final String WORLD_BORDER_KEY = "world_border";
private static final String WORLD_BORDER_FILE_NAME = "minecraft/world_border.dat";
public LevelDatToSavedDataFileFix(Schema schema) {
super(schema);
}
@Override
public void makeFixer() {
this.addFileContentFix(
files -> {
FileAccess<LevelDat> levelDat = files.getFileAccess(FileResourceTypes.LEVEL_DAT, FileRelation.ORIGIN.forFile("level.dat"));
FileAccess<SavedDataNbt> dragonFight = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_ENDER_DRAGON_FIGHT),
FileRelation.forDataFileInDimension("the_end", "minecraft/ender_dragon_fight.dat")
);
FileAccess<PlayerData> fallbackPlayerData = files.getFileAccess(
FileResourceTypes.PLAYER_DATA, FileRelation.PLAYER_DATA.forFile(FALLBACK_SINGLE_PLAYER_UUID + ".dat")
);
FileAccess<SavedDataNbt> wanderingTrader = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WANDERING_TRADER), FileRelation.DATA.forFile("minecraft/wandering_trader.dat")
);
FileAccess<SavedDataNbt> customBossEvents = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_CUSTOM_BOSS_EVENTS), FileRelation.DATA.forFile("minecraft/custom_boss_events.dat")
);
FileAccess<SavedDataNbt> weatherData = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WEATHER), FileRelation.DATA.forFile("minecraft/weather.dat")
);
FileAccess<SavedDataNbt> scheduledEvents = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_SCHEDULED_EVENTS), FileRelation.DATA.forFile("minecraft/scheduled_events.dat")
);
FileAccess<SavedDataNbt> worldBorderOverworld = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WORLD_BORDER),
FileRelation.forDataFileInDimension("overworld", "minecraft/world_border.dat")
);
FileAccess<SavedDataNbt> worldBorderNether = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WORLD_BORDER),
FileRelation.forDataFileInDimension("the_nether", "minecraft/world_border.dat")
);
FileAccess<SavedDataNbt> worldBorderEnd = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WORLD_BORDER),
FileRelation.forDataFileInDimension("the_end", "minecraft/world_border.dat")
);
FileAccess<SavedDataNbt> gameRules = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_GAME_RULES), FileRelation.DATA.forFile("minecraft/game_rules.dat")
);
FileAccess<SavedDataNbt> worldGenSettings = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WORLD_GEN_SETTINGS), FileRelation.DATA.forFile("minecraft/world_gen_settings.dat")
);
FileAccess<SavedDataNbt> worldClocks = files.getFileAccess(
FileResourceTypes.savedData(References.SAVED_DATA_WORLD_CLOCKS), FileRelation.DATA.forFile("minecraft/world_clocks.dat")
);
return upgradeProgress -> {
upgradeProgress.setType(UpgradeProgress.Type.FILES);
LevelDat levelDatFile = levelDat.getOnlyFile();
Optional<Dynamic<Tag>> readData = levelDatFile.read();
if (!readData.isEmpty()) {
Dynamic<?> content = readData.get();
content = extractToFile(dragonFight, content, "dragon_fight");
content = this.extractPlayerDataToFile(fallbackPlayerData, content);
content = extractToFile(wanderingTrader, content, "wandering_trader_migration_data");
content = extractToFile(customBossEvents, content, "CustomBossEvents");
content = extractToFile(weatherData, content, "weather_data");
content = extractToFile(scheduledEvents, content, "scheduled_events");
content = extractWorldBorderToFiles(worldBorderOverworld, worldBorderNether, worldBorderEnd, content);
content = extractToFile(gameRules, content, "game_rules");
content = this.extractWorldGenSettingsToFile(worldGenSettings, content);
content = extractToFile(worldClocks, content, "world_clocks");
levelDatFile.write(content);
}
};
}
);
}
private static Dynamic<?> extractToFile(FileAccess<? extends CompressedNbt> targetFile, Dynamic<?> content, String key) {
OptionalDynamic<?> tagOpt = content.get(key);
if (tagOpt.result().isEmpty()) {
return content;
} else {
Dynamic<?> tag = tagOpt.result().get();
targetFile.getOnlyFile().write(tag);
return content.remove(key);
}
}
private Dynamic<?> extractPlayerDataToFile(FileAccess<PlayerData> fallbackFile, Dynamic<?> content) {
OptionalDynamic<?> playerTagOpt = content.get("Player");
if (playerTagOpt.result().isEmpty()) {
return content;
} else {
Dynamic<?> playerTag = playerTagOpt.result().get();
int dataVersion = NbtUtils.getDataVersion(playerTag);
Dynamic<?> playerTagFixed = DataFixTypes.PLAYER.update(DataFixers.getDataFixer(), playerTag, dataVersion, this.getVersion());
Optional<? extends Dynamic<?>> playerUuid = playerTagFixed.get("UUID").result();
Dynamic<?> usedUuid;
if (playerUuid.isPresent()) {
usedUuid = (Dynamic<?>)playerUuid.get();
} else {
fallbackFile.getOnlyFile().write(playerTagFixed);
usedUuid = content.createIntList(Arrays.stream(UUIDUtil.uuidToIntArray(FALLBACK_SINGLE_PLAYER_UUID)));
}
return content.remove("Player").set("singleplayer_uuid", usedUuid);
}
}
private static Dynamic<?> extractWorldBorderToFiles(
FileAccess<? extends CompressedNbt> worldBorderOverworld,
FileAccess<? extends CompressedNbt> worldBorderNether,
FileAccess<? extends CompressedNbt> worldBorderEnd,
Dynamic<?> content
) {
extractWorldBorderToFile(worldBorderOverworld, content, 1.0);
extractWorldBorderToFile(worldBorderNether, content, 8.0);
extractWorldBorderToFile(worldBorderEnd, content, 1.0);
return content.remove("world_border");
}
private static void extractWorldBorderToFile(FileAccess<? extends CompressedNbt> targetFile, Dynamic<?> content, double divider) {
OptionalDynamic<?> worldBorderTagOpt = content.get("world_border");
if (!worldBorderTagOpt.result().isEmpty()) {
Dynamic<?> worldBorderTag = worldBorderTagOpt.result()
.get()
.update("center_x", x -> x.createDouble(x.asDouble(0.0) / divider))
.update("center_z", z -> z.createDouble(z.asDouble(0.0) / divider));
targetFile.getOnlyFile().write(worldBorderTag);
}
}
private Dynamic<?> extractWorldGenSettingsToFile(FileAccess<? extends CompressedNbt> targetFile, Dynamic<?> content) {
OptionalDynamic<?> worldGenSettingsTagOpt = content.get("world_gen_settings");
if (worldGenSettingsTagOpt.result().isEmpty()) {
return content;
} else {
Dynamic<?> worldGenSettingsTag = worldGenSettingsTagOpt.result().get();
int dataVersion = NbtUtils.getDataVersion(content);
Dynamic<?> worldGenSettingsTagFixed = DataFixTypes.WORLD_GEN_SETTINGS
.update(DataFixers.getDataFixer(), worldGenSettingsTag, dataVersion, this.getVersion());
targetFile.getOnlyFile().write(worldGenSettingsTagFixed);
return content.remove("world_gen_settings");
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
UUIDUtil.uuidToIntArray()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
NbtUtils.getDataVersion()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
DataFixers.getDataFixer()
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
FileRelation.forDataFileInDimension()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
FileResourceTypes.savedData()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置: