FlatFileDataUtil.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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) {
  26. BadCategorizedFlatFileData badData = (BadCategorizedFlatFileData) dataContainer;
  27. splitData = repairBadData(dataContainer.getSplitData(), badData.getBadDataIndexes());
  28. } else {
  29. splitData = dataContainer.getSplitData();
  30. }
  31. //Make sure we have as many values as we are supposed to
  32. assert splitData.length == FlatFileDatabaseManager.DATA_ENTRY_COUNT;
  33. return splitData;
  34. }
  35. public static @NotNull String[] repairBadData(@NotNull String[] splitData, boolean[] badDataValues) {
  36. for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) {
  37. if(badDataValues[i]) {
  38. //This data value was marked as bad so we zero initialize it
  39. splitData[i] = getZeroInitialisedData(i, 0);
  40. }
  41. }
  42. return splitData;
  43. }
  44. /**
  45. * @param index "zero" Initialization will depend on what the index is for
  46. * @return the "zero" initialized data corresponding to the index
  47. */
  48. public static @NotNull String getZeroInitialisedData(int index, int startingLevel) throws IndexOutOfBoundsException {
  49. switch(index) {
  50. case USERNAME_INDEX:
  51. return LEGACY_INVALID_OLD_USERNAME; //We'll keep using this value for legacy compatibility reasons (not sure if needed but don't care)
  52. case 2: //Assumption: Used to be for something, no longer used
  53. case 3: //Assumption: Used to be for something, no longer used
  54. case 23: //Assumption: Used to be used for something, no longer used
  55. case 33: //Assumption: Used to be used for something, no longer used
  56. case LEGACY_LAST_LOGIN:
  57. case HEALTHBAR:
  58. return "IGNORED";
  59. case SKILLS_MINING:
  60. case SKILLS_REPAIR:
  61. case SKILLS_UNARMED:
  62. case SKILLS_HERBALISM:
  63. case SKILLS_EXCAVATION:
  64. case SKILLS_ARCHERY:
  65. case SKILLS_SWORDS:
  66. case SKILLS_AXES:
  67. case SKILLS_WOODCUTTING:
  68. case SKILLS_ACROBATICS:
  69. case SKILLS_TAMING:
  70. case SKILLS_FISHING:
  71. case SKILLS_ALCHEMY:
  72. return String.valueOf(startingLevel);
  73. case OVERHAUL_LAST_LOGIN:
  74. return String.valueOf(-1L);
  75. case COOLDOWN_BERSERK:
  76. case COOLDOWN_GIGA_DRILL_BREAKER:
  77. case COOLDOWN_TREE_FELLER:
  78. case COOLDOWN_GREEN_TERRA:
  79. case COOLDOWN_SERRATED_STRIKES:
  80. case COOLDOWN_SKULL_SPLITTER:
  81. case COOLDOWN_SUPER_BREAKER:
  82. case COOLDOWN_BLAST_MINING:
  83. case SCOREBOARD_TIPS:
  84. case COOLDOWN_CHIMAERA_WING:
  85. case EXP_MINING:
  86. case EXP_WOODCUTTING:
  87. case EXP_REPAIR:
  88. case EXP_UNARMED:
  89. case EXP_HERBALISM:
  90. case EXP_EXCAVATION:
  91. case EXP_ARCHERY:
  92. case EXP_SWORDS:
  93. case EXP_AXES:
  94. case EXP_ACROBATICS:
  95. case EXP_TAMING:
  96. case EXP_FISHING:
  97. case EXP_ALCHEMY:
  98. return "0";
  99. case UUID_INDEX:
  100. throw new IndexOutOfBoundsException(); //TODO: Add UUID recovery? Might not even be worth it.
  101. }
  102. throw new IndexOutOfBoundsException();
  103. }
  104. }