CompatibilityManager.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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.compat.layers.bungee.AbstractBungeeSerializerCompatibilityLayer;
  5. import com.gmail.nossr50.util.compat.layers.bungee.BungeeLegacySerializerCompatibilityLayer;
  6. import com.gmail.nossr50.util.compat.layers.bungee.BungeeModernSerializerCompatibilityLayer;
  7. import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDataLayer;
  8. import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_13;
  9. import com.gmail.nossr50.util.compat.layers.persistentdata.SpigotPersistentDataLayer_1_14;
  10. import com.gmail.nossr50.util.compat.layers.skills.AbstractMasterAnglerCompatibility;
  11. import com.gmail.nossr50.util.compat.layers.skills.MasterAnglerCompatibilityLayer;
  12. import com.gmail.nossr50.util.nms.NMSVersion;
  13. import com.gmail.nossr50.util.platform.MinecraftGameVersion;
  14. import com.gmail.nossr50.util.text.StringUtils;
  15. import org.bukkit.command.CommandSender;
  16. import org.jetbrains.annotations.Nullable;
  17. import java.util.HashMap;
  18. /**
  19. *
  20. * These classes are a band-aid solution for adding NMS support into 2.1.XXX
  21. * In 2.2 we are switching to modules and that will clean things up significantly
  22. *
  23. */
  24. //TODO: I need to rewrite this crap
  25. public class CompatibilityManager {
  26. private HashMap<CompatibilityType, Boolean> supportedLayers;
  27. private boolean isFullyCompatibleServerSoftware = true; //true if all compatibility layers load successfully
  28. private final MinecraftGameVersion minecraftGameVersion;
  29. private final NMSVersion nmsVersion;
  30. /* Compatibility Layers */
  31. // private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer;
  32. private AbstractPersistentDataLayer persistentDataLayer;
  33. private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer;
  34. private AbstractMasterAnglerCompatibility masterAnglerCompatibility;
  35. public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) {
  36. mcMMO.p.getLogger().info("Loading compatibility layers...");
  37. this.minecraftGameVersion = minecraftGameVersion;
  38. this.nmsVersion = determineNMSVersion();
  39. init();
  40. mcMMO.p.getLogger().info("Finished loading compatibility layers.");
  41. }
  42. private void init() {
  43. initSupportedLayersMap();
  44. initCompatibilityLayers();
  45. }
  46. private void initSupportedLayersMap() {
  47. supportedLayers = new HashMap<>(); //Init map
  48. for(CompatibilityType compatibilityType : CompatibilityType.values()) {
  49. supportedLayers.put(compatibilityType, false); //All layers are set to false when initialized
  50. }
  51. }
  52. /**
  53. * Initialize all necessary compatibility layers
  54. * For any unsupported layers, load a dummy layer
  55. */
  56. private void initCompatibilityLayers() {
  57. initPersistentDataLayer();
  58. initBungeeSerializerLayer();
  59. initMasterAnglerLayer();
  60. isFullyCompatibleServerSoftware = true;
  61. }
  62. private void initMasterAnglerLayer() {
  63. if(minecraftGameVersion.getMinorVersion().asInt() >= 16 || minecraftGameVersion.getMajorVersion().asInt() >= 2) {
  64. if(hasNewFishingHookAPI()) {
  65. masterAnglerCompatibility = new MasterAnglerCompatibilityLayer();
  66. }
  67. } else {
  68. masterAnglerCompatibility = null;
  69. }
  70. }
  71. private boolean hasNewFishingHookAPI() {
  72. try {
  73. Class<?> checkForClass = Class.forName("org.bukkit.entity.FishHook");
  74. checkForClass.getMethod("getMinWaitTime");
  75. return true;
  76. } catch (ClassNotFoundException | NoSuchMethodException e) {
  77. return false;
  78. }
  79. }
  80. private void initBungeeSerializerLayer() {
  81. if(minecraftGameVersion.getMinorVersion().asInt() >= 16) {
  82. bungeeSerializerCompatibilityLayer = new BungeeModernSerializerCompatibilityLayer();
  83. } else {
  84. bungeeSerializerCompatibilityLayer = new BungeeLegacySerializerCompatibilityLayer();
  85. }
  86. supportedLayers.put(CompatibilityType.BUNGEE_SERIALIZER, true);
  87. }
  88. private void initPersistentDataLayer() {
  89. if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) {
  90. persistentDataLayer = new SpigotPersistentDataLayer_1_14();
  91. } else {
  92. persistentDataLayer = new SpigotPersistentDataLayer_1_13();
  93. }
  94. supportedLayers.put(CompatibilityType.PERSISTENT_DATA, true);
  95. }
  96. //TODO: move to text manager
  97. public void reportCompatibilityStatus(CommandSender commandSender) {
  98. if(isFullyCompatibleServerSoftware) {
  99. commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix",
  100. "mcMMO is fully compatible with the currently running server software."));
  101. } else {
  102. //TODO: Better messages for each incompatible layer
  103. for(CompatibilityType compatibilityType : CompatibilityType.values()) {
  104. if(!supportedLayers.get(compatibilityType)) {
  105. commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix",
  106. LocaleLoader.getString("Compatibility.Layer.Unsupported", StringUtils.getCapitalized(compatibilityType.toString()))));
  107. }
  108. }
  109. }
  110. commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix", "NMS Status - " + nmsVersion.toString()));
  111. }
  112. public boolean isCompatibilityLayerOperational(CompatibilityType compatibilityType) {
  113. return supportedLayers.get(compatibilityType);
  114. }
  115. public boolean isFullyCompatibleServerSoftware() {
  116. return isFullyCompatibleServerSoftware;
  117. }
  118. public NMSVersion getNmsVersion() {
  119. return nmsVersion;
  120. }
  121. private NMSVersion determineNMSVersion() {
  122. if (minecraftGameVersion.getMajorVersion().asInt() == 1) {
  123. switch (minecraftGameVersion.getMinorVersion().asInt()) {
  124. case 12:
  125. return NMSVersion.NMS_1_12_2;
  126. case 13:
  127. return NMSVersion.NMS_1_13_2;
  128. case 14:
  129. return NMSVersion.NMS_1_14_4;
  130. case 15:
  131. return NMSVersion.NMS_1_15_2;
  132. case 16:
  133. if (minecraftGameVersion.getPatchVersion().asInt() == 1) {
  134. return NMSVersion.NMS_1_16_1;
  135. } else if(minecraftGameVersion.getPatchVersion().asInt() == 2) {
  136. return NMSVersion.NMS_1_16_2;
  137. } else if(minecraftGameVersion.getPatchVersion().asInt() == 3) {
  138. return NMSVersion.NMS_1_16_3;
  139. } else if(minecraftGameVersion.getPatchVersion().asInt() >= 4) {
  140. return NMSVersion.NMS_1_16_4;
  141. }
  142. }
  143. }
  144. return NMSVersion.UNSUPPORTED;
  145. }
  146. public AbstractBungeeSerializerCompatibilityLayer getBungeeSerializerCompatibilityLayer() {
  147. return bungeeSerializerCompatibilityLayer;
  148. }
  149. public AbstractPersistentDataLayer getPersistentDataLayer() {
  150. return persistentDataLayer;
  151. }
  152. public @Nullable AbstractMasterAnglerCompatibility getMasterAnglerCompatibilityLayer() {
  153. return masterAnglerCompatibility;
  154. }
  155. }