FlatFileDataUtil.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package com.gmail.nossr50.database.flatfile;
  2. import com.gmail.nossr50.database.FlatFileDataFlag;
  3. import com.gmail.nossr50.database.FlatFileDatabaseManager;
  4. import org.jetbrains.annotations.NotNull;
  5. import org.jetbrains.annotations.Nullable;
  6. import static com.gmail.nossr50.database.FlatFileDatabaseManager.*;
  7. public class FlatFileDataUtil {
  8. public static @Nullable String[] getPreparedSaveDataLine(@NotNull FlatFileDataContainer dataContainer) {
  9. if(dataContainer.getDataFlags() == null) {
  10. return dataContainer.getSplitData();
  11. }
  12. //Data of this type is not salvageable
  13. //TODO: Test that we ignore the things we are supposed to ignore
  14. //TODO: Should we even keep track of the bad data or just not even build data containers for it? Making containers for it is only really useful for debugging.. well I suppose operations are typically async so it shouldn't matter
  15. if(dataContainer.getDataFlags().contains(FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE)
  16. || dataContainer.getDataFlags().contains(FlatFileDataFlag.DUPLICATE_UUID) //For now we will not try to fix any issues with UUIDs
  17. || dataContainer.getDataFlags().contains(FlatFileDataFlag.BAD_UUID_DATA) //For now we will not try to fix any issues with UUIDs
  18. || dataContainer.getDataFlags().contains(FlatFileDataFlag.TOO_INCOMPLETE)) {
  19. return null;
  20. }
  21. String[] splitData;
  22. /*
  23. * First fix the bad data values if they exist
  24. */
  25. if(dataContainer instanceof BadCategorizedFlatFileData badData) {
  26. splitData = repairBadData(dataContainer.getSplitData(), badData.getBadDataIndexes());
  27. } else {
  28. splitData = dataContainer.getSplitData();
  29. }
  30. //Make sure we have as many values as we are supposed to
  31. assert splitData.length == FlatFileDatabaseManager.DATA_ENTRY_COUNT;
  32. return splitData;
  33. }
  34. public static @NotNull String[] repairBadData(@NotNull String[] splitData, boolean[] badDataValues) {
  35. for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) {
  36. if(badDataValues[i]) {
  37. //This data value was marked as bad so we zero initialize it
  38. splitData[i] = getZeroInitialisedData(i, 0);
  39. }
  40. }
  41. return splitData;
  42. }
  43. /**
  44. * @param index "zero" Initialization will depend on what the index is for
  45. * @return the "zero" initialized data corresponding to the index
  46. */
  47. public static @NotNull String getZeroInitialisedData(int index, int startingLevel) throws IndexOutOfBoundsException {
  48. //TODO: Add UUID recovery? Might not even be worth it.
  49. return switch (index) {
  50. case USERNAME_INDEX ->
  51. LEGACY_INVALID_OLD_USERNAME; //We'll keep using this value for legacy compatibility reasons (not sure if needed but don't care)
  52. //Assumption: Used to be for something, no longer used
  53. //Assumption: Used to be for something, no longer used
  54. //Assumption: Used to be used for something, no longer used
  55. //Assumption: Used to be used for something, no longer used
  56. case 2, 3, 23, 33, LEGACY_LAST_LOGIN, HEALTHBAR -> "IGNORED";
  57. case SKILLS_MINING, SKILLS_REPAIR, SKILLS_UNARMED, SKILLS_HERBALISM, SKILLS_EXCAVATION, SKILLS_ARCHERY,
  58. SKILLS_SWORDS, SKILLS_AXES, SKILLS_WOODCUTTING, SKILLS_ACROBATICS, SKILLS_TAMING, SKILLS_FISHING,
  59. SKILLS_ALCHEMY, SKILLS_CROSSBOWS, SKILLS_TRIDENTS, SKILLS_MACES -> String.valueOf(startingLevel);
  60. case OVERHAUL_LAST_LOGIN -> String.valueOf(-1L);
  61. case COOLDOWN_BERSERK, COOLDOWN_GIGA_DRILL_BREAKER, COOLDOWN_TREE_FELLER, COOLDOWN_GREEN_TERRA,
  62. COOLDOWN_SERRATED_STRIKES, COOLDOWN_SKULL_SPLITTER, COOLDOWN_SUPER_BREAKER, COOLDOWN_BLAST_MINING,
  63. COOLDOWN_SUPER_SHOTGUN, COOLDOWN_TRIDENTS, COOLDOWN_ARCHERY, COOLDOWN_MACES, SCOREBOARD_TIPS, COOLDOWN_CHIMAERA_WING,
  64. EXP_MINING, EXP_WOODCUTTING, EXP_REPAIR, EXP_UNARMED, EXP_HERBALISM, EXP_EXCAVATION, EXP_ARCHERY,
  65. EXP_SWORDS, EXP_AXES, EXP_ACROBATICS, EXP_TAMING, EXP_FISHING, EXP_ALCHEMY, EXP_CROSSBOWS,
  66. EXP_TRIDENTS, EXP_MACES -> "0";
  67. case UUID_INDEX ->
  68. throw new IndexOutOfBoundsException(); //TODO: Add UUID recovery? Might not even be worth it.
  69. default -> throw new IndexOutOfBoundsException();
  70. };
  71. }
  72. }