FlatFileDataUtil.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package com.gmail.nossr50.database.flatfile;
  2. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_ARCHERY;
  3. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_BERSERK;
  4. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_BLAST_MINING;
  5. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_CHIMAERA_WING;
  6. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_GIGA_DRILL_BREAKER;
  7. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_GREEN_TERRA;
  8. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_MACES;
  9. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_SERRATED_STRIKES;
  10. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_SKULL_SPLITTER;
  11. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_SPEARS;
  12. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_SUPER_BREAKER;
  13. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_SUPER_SHOTGUN;
  14. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_TREE_FELLER;
  15. import static com.gmail.nossr50.database.FlatFileDatabaseManager.COOLDOWN_TRIDENTS;
  16. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_ACROBATICS;
  17. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_ALCHEMY;
  18. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_ARCHERY;
  19. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_AXES;
  20. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_CROSSBOWS;
  21. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_EXCAVATION;
  22. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_FISHING;
  23. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_HERBALISM;
  24. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_MACES;
  25. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_MINING;
  26. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_REPAIR;
  27. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_SPEARS;
  28. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_SWORDS;
  29. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_TAMING;
  30. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_TRIDENTS;
  31. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_UNARMED;
  32. import static com.gmail.nossr50.database.FlatFileDatabaseManager.EXP_WOODCUTTING;
  33. import static com.gmail.nossr50.database.FlatFileDatabaseManager.HEALTHBAR;
  34. import static com.gmail.nossr50.database.FlatFileDatabaseManager.LEGACY_INVALID_OLD_USERNAME;
  35. import static com.gmail.nossr50.database.FlatFileDatabaseManager.LEGACY_LAST_LOGIN;
  36. import static com.gmail.nossr50.database.FlatFileDatabaseManager.OVERHAUL_LAST_LOGIN;
  37. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SCOREBOARD_TIPS;
  38. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_ACROBATICS;
  39. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_ALCHEMY;
  40. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_ARCHERY;
  41. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_AXES;
  42. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_CROSSBOWS;
  43. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_EXCAVATION;
  44. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_FISHING;
  45. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_HERBALISM;
  46. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_MACES;
  47. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_MINING;
  48. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_REPAIR;
  49. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_SPEARS;
  50. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_SWORDS;
  51. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_TAMING;
  52. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_TRIDENTS;
  53. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_UNARMED;
  54. import static com.gmail.nossr50.database.FlatFileDatabaseManager.SKILLS_WOODCUTTING;
  55. import static com.gmail.nossr50.database.FlatFileDatabaseManager.USERNAME_INDEX;
  56. import static com.gmail.nossr50.database.FlatFileDatabaseManager.UUID_INDEX;
  57. import com.gmail.nossr50.database.FlatFileDataFlag;
  58. import com.gmail.nossr50.database.FlatFileDatabaseManager;
  59. import org.jetbrains.annotations.NotNull;
  60. import org.jetbrains.annotations.Nullable;
  61. public class FlatFileDataUtil {
  62. public static @Nullable String[] getPreparedSaveDataLine(
  63. @NotNull FlatFileDataContainer dataContainer) {
  64. if (dataContainer.getDataFlags() == null) {
  65. return dataContainer.getSplitData();
  66. }
  67. //Data of this type is not salvageable
  68. //TODO: Test that we ignore the things we are supposed to ignore
  69. //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
  70. if (dataContainer.getDataFlags().contains(FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE)
  71. || dataContainer.getDataFlags().contains(FlatFileDataFlag.DUPLICATE_UUID)
  72. //For now we will not try to fix any issues with UUIDs
  73. || dataContainer.getDataFlags().contains(FlatFileDataFlag.BAD_UUID_DATA)
  74. //For now we will not try to fix any issues with UUIDs
  75. || dataContainer.getDataFlags().contains(FlatFileDataFlag.TOO_INCOMPLETE)) {
  76. return null;
  77. }
  78. String[] splitData;
  79. /*
  80. * First fix the bad data values if they exist
  81. */
  82. if (dataContainer instanceof BadCategorizedFlatFileData badData) {
  83. splitData = repairBadData(dataContainer.getSplitData(), badData.getBadDataIndexes());
  84. } else {
  85. splitData = dataContainer.getSplitData();
  86. }
  87. //Make sure we have as many values as we are supposed to
  88. assert splitData.length == FlatFileDatabaseManager.DATA_ENTRY_COUNT;
  89. return splitData;
  90. }
  91. public static @NotNull String[] repairBadData(@NotNull String[] splitData,
  92. boolean[] badDataValues) {
  93. for (int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) {
  94. if (badDataValues[i]) {
  95. //This data value was marked as bad so we zero initialize it
  96. splitData[i] = getZeroInitialisedData(i, 0);
  97. }
  98. }
  99. return splitData;
  100. }
  101. /**
  102. * @param index "zero" Initialization will depend on what the index is for
  103. * @return the "zero" initialized data corresponding to the index
  104. */
  105. public static @NotNull String getZeroInitialisedData(int index, int startingLevel)
  106. throws IndexOutOfBoundsException {
  107. //TODO: Add UUID recovery? Might not even be worth it.
  108. return switch (index) {
  109. //We'll keep using this value for legacy compatibility reasons (not sure if needed but don't care)
  110. case USERNAME_INDEX ->
  111. LEGACY_INVALID_OLD_USERNAME;
  112. //Assumption: Used to be used for something, no longer used
  113. case 2, 3, 23, 33, LEGACY_LAST_LOGIN, HEALTHBAR -> "IGNORED";
  114. case SKILLS_MINING, SKILLS_REPAIR, SKILLS_UNARMED, SKILLS_HERBALISM, SKILLS_EXCAVATION,
  115. SKILLS_ARCHERY,
  116. SKILLS_SWORDS, SKILLS_AXES, SKILLS_WOODCUTTING, SKILLS_ACROBATICS, SKILLS_TAMING,
  117. SKILLS_FISHING,
  118. SKILLS_ALCHEMY, SKILLS_CROSSBOWS, SKILLS_TRIDENTS, SKILLS_MACES, SKILLS_SPEARS ->
  119. String.valueOf(startingLevel);
  120. case OVERHAUL_LAST_LOGIN -> String.valueOf(-1L);
  121. case COOLDOWN_BERSERK, COOLDOWN_GIGA_DRILL_BREAKER, COOLDOWN_TREE_FELLER,
  122. COOLDOWN_GREEN_TERRA,
  123. COOLDOWN_SERRATED_STRIKES, COOLDOWN_SKULL_SPLITTER, COOLDOWN_SUPER_BREAKER,
  124. COOLDOWN_BLAST_MINING,
  125. COOLDOWN_SUPER_SHOTGUN, COOLDOWN_TRIDENTS, COOLDOWN_ARCHERY, COOLDOWN_MACES,
  126. COOLDOWN_SPEARS, SCOREBOARD_TIPS, COOLDOWN_CHIMAERA_WING,
  127. EXP_MINING, EXP_WOODCUTTING, EXP_REPAIR, EXP_UNARMED, EXP_HERBALISM,
  128. EXP_EXCAVATION, EXP_ARCHERY,
  129. EXP_SWORDS, EXP_AXES, EXP_ACROBATICS, EXP_TAMING, EXP_FISHING, EXP_ALCHEMY,
  130. EXP_CROSSBOWS,
  131. EXP_TRIDENTS, EXP_MACES, EXP_SPEARS -> "0";
  132. case UUID_INDEX ->
  133. throw new IndexOutOfBoundsException(); //TODO: Add UUID recovery? Might not even be worth it.
  134. default -> throw new IndexOutOfBoundsException();
  135. };
  136. }
  137. }