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

    • 引用位置: 方法调用
    • 关联成员: UUIDUtil.uuidToIntArray()
  • NbtUtils

    • 引用位置: 方法调用
    • 关联成员: NbtUtils.getDataVersion()
  • Schema

    • 引用位置: 参数
  • DataFixers

    • 引用位置: 方法调用
    • 关联成员: DataFixers.getDataFixer()
  • FileFix

    • 引用位置: 继承
  • CompressedNbt

    • 引用位置: 参数
  • FileAccess

    • 引用位置: 参数
  • FileRelation

    • 引用位置: 方法调用
    • 关联成员: FileRelation.forDataFileInDimension()
  • FileResourceTypes

    • 引用位置: 方法调用
    • 关联成员: FileResourceTypes.savedData()
  • PlayerData

    • 引用位置: 参数
  • ResolvableProfile

    • 引用位置: 参数/返回值