CompatibilityManager.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.gmail.nossr50.util.compat;
  2. import com.gmail.nossr50.locale.LocaleLoader;
  3. import com.gmail.nossr50.mcMMO;
  4. import com.gmail.nossr50.util.StringUtils;
  5. import com.gmail.nossr50.util.compat.layers.attackcooldown.PlayerAttackCooldownExploitPreventionLayer;
  6. import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer;
  7. import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer;
  8. import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotTemporaryDataLayer;
  9. import com.gmail.nossr50.util.nms.NMSVersion;
  10. import com.gmail.nossr50.util.platform.MinecraftGameVersion;
  11. import org.bukkit.command.CommandSender;
  12. import java.util.HashMap;
  13. /**
  14. *
  15. * These classes are a band-aid solution for adding NMS support into 2.1.XXX
  16. * In 2.2 we are switching to modules and that will clean things up significantly
  17. *
  18. */
  19. public class CompatibilityManager {
  20. private HashMap<CompatibilityType, Boolean> supportedLayers;
  21. private boolean isFullyCompatibleServerSoftware = true; //true if all compatibility layers load successfully
  22. private final MinecraftGameVersion minecraftGameVersion;
  23. private final NMSVersion nmsVersion;
  24. /* Compatibility Layers */
  25. private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer;
  26. private AbstractPersistentDataLayer persistentDataLayer;
  27. public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) {
  28. mcMMO.p.getLogger().info("Loading compatibility layers...");
  29. this.minecraftGameVersion = minecraftGameVersion;
  30. this.nmsVersion = determineNMSVersion();
  31. init();
  32. mcMMO.p.getLogger().info("Finished loading compatibility layers.");
  33. }
  34. private void init() {
  35. initSupportedLayersMap();
  36. initCompatibilityLayers();
  37. }
  38. private void initSupportedLayersMap() {
  39. supportedLayers = new HashMap<>(); //Init map
  40. for(CompatibilityType compatibilityType : CompatibilityType.values()) {
  41. //TODO: Remove later
  42. if(compatibilityType == CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION)
  43. continue;
  44. supportedLayers.put(compatibilityType, false); //All layers are set to false when initialized
  45. }
  46. }
  47. /**
  48. * Initialize all necessary compatibility layers
  49. * For any unsupported layers, load a dummy layer
  50. */
  51. private void initCompatibilityLayers() {
  52. initPersistentDataLayer();
  53. isFullyCompatibleServerSoftware = true;
  54. }
  55. private void initPersistentDataLayer() {
  56. if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) {
  57. persistentDataLayer = new SpigotPersistentDataLayer();
  58. } else {
  59. persistentDataLayer = new SpigotTemporaryDataLayer();
  60. }
  61. supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true);
  62. }
  63. //TODO: move to text manager
  64. public void reportCompatibilityStatus(CommandSender commandSender) {
  65. if(isFullyCompatibleServerSoftware) {
  66. commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix",
  67. "mcMMO is fully compatible with the currently running server software."));
  68. } else {
  69. //TODO: Better messages for each incompatible layer
  70. for(CompatibilityType compatibilityType : CompatibilityType.values()) {
  71. if(!supportedLayers.get(compatibilityType)) {
  72. commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix",
  73. LocaleLoader.getString("Compatibility.Layer.Unsupported", StringUtils.getCapitalized(compatibilityType.toString()))));
  74. }
  75. }
  76. }
  77. commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix", "NMS Status - " + nmsVersion.toString()));
  78. }
  79. public boolean isCompatibilityLayerOperational(CompatibilityType compatibilityType) {
  80. return supportedLayers.get(compatibilityType);
  81. }
  82. public boolean isFullyCompatibleServerSoftware() {
  83. return isFullyCompatibleServerSoftware;
  84. }
  85. public NMSVersion getNmsVersion() {
  86. return nmsVersion;
  87. }
  88. private NMSVersion determineNMSVersion() {
  89. if (minecraftGameVersion.getMajorVersion().asInt() == 1) {
  90. switch (minecraftGameVersion.getMinorVersion().asInt()) {
  91. case 12:
  92. return NMSVersion.NMS_1_12_2;
  93. case 13:
  94. return NMSVersion.NMS_1_13_2;
  95. case 14:
  96. return NMSVersion.NMS_1_14_4;
  97. case 15:
  98. return NMSVersion.NMS_1_15_2;
  99. case 16:
  100. if (minecraftGameVersion.getPatchVersion().asInt() == 1) {
  101. return NMSVersion.NMS_1_16_1;
  102. } else if(minecraftGameVersion.getPatchVersion().asInt() == 2) {
  103. return NMSVersion.NMS_1_16_2;
  104. }
  105. }
  106. }
  107. return NMSVersion.UNSUPPORTED;
  108. }
  109. public PlayerAttackCooldownExploitPreventionLayer getPlayerAttackCooldownExploitPreventionLayer() {
  110. return playerAttackCooldownExploitPreventionLayer;
  111. }
  112. public AbstractPersistentDataLayer getPersistentDataLayer() {
  113. return persistentDataLayer;
  114. }
  115. }