MMOExperienceBarManager.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package com.gmail.nossr50.util.experience;
  2. import com.gmail.nossr50.config.experience.ExperienceConfig;
  3. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  4. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  5. import com.gmail.nossr50.mcMMO;
  6. import com.gmail.nossr50.runnables.skills.ExperienceBarHideTask;
  7. import com.gmail.nossr50.util.player.NotificationManager;
  8. import org.bukkit.plugin.Plugin;
  9. import org.jetbrains.annotations.NotNull;
  10. import org.jetbrains.annotations.Nullable;
  11. import java.util.EnumMap;
  12. import java.util.Map;
  13. /**
  14. * ExperienceBarManager handles displaying and updating mcMMO experience bars for players
  15. * Each ExperienceBarManager only manages a single player
  16. */
  17. public class MMOExperienceBarManager {
  18. private final McMMOPlayer mmoPlayer;
  19. int delaySeconds = 3;
  20. private @NotNull final Map<PrimarySkillType, BarState> barStateMapRef;
  21. private @NotNull final EnumMap<PrimarySkillType, ExperienceBarWrapper> experienceBars;
  22. private @NotNull final EnumMap<PrimarySkillType, ExperienceBarHideTask> experienceBarHideTaskHashMap;
  23. public MMOExperienceBarManager(@NotNull McMMOPlayer mmoPlayer, @NotNull Map<PrimarySkillType, BarState> barStateMapRef)
  24. {
  25. this.mmoPlayer = mmoPlayer;
  26. this.barStateMapRef = barStateMapRef;
  27. //Init maps
  28. experienceBars = new EnumMap<>(PrimarySkillType.class);
  29. experienceBarHideTaskHashMap = new EnumMap<>(PrimarySkillType.class);
  30. init();
  31. }
  32. private void init() {
  33. syncBarStates();
  34. }
  35. private void syncBarStates() {
  36. for(Map.Entry<PrimarySkillType, BarState> entry : barStateMapRef.entrySet()) {
  37. PrimarySkillType key = entry.getKey();
  38. BarState barState = entry.getValue();
  39. switch(barState) {
  40. case NORMAL:
  41. break;
  42. case ALWAYS_ON:
  43. xpBarSettingToggle(XPBarSettingTarget.SHOW, key);
  44. case DISABLED:
  45. xpBarSettingToggle(XPBarSettingTarget.HIDE, key);
  46. }
  47. }
  48. }
  49. private void resetBarStateMap() {
  50. barStateMapRef.putAll(generateDefaultBarStateMap());
  51. }
  52. public void updateExperienceBar(PrimarySkillType primarySkillType, Plugin plugin)
  53. {
  54. if(isBarDisabled(primarySkillType))
  55. return;
  56. //Init Bar
  57. if(experienceBars.get(primarySkillType) == null)
  58. experienceBars.put(primarySkillType, new ExperienceBarWrapper(primarySkillType, mmoPlayer.getPersistentPlayerData()));
  59. //Get Bar
  60. ExperienceBarWrapper experienceBarWrapper = experienceBars.get(primarySkillType);
  61. //Update Progress
  62. experienceBarWrapper.setProgress(mmoPlayer.getExperienceManager().getProgressInCurrentSkillLevel(primarySkillType));
  63. //Show Bar
  64. experienceBarWrapper.showExperienceBar();
  65. //Setup Hide Bar Task
  66. if(experienceBarHideTaskHashMap.get(primarySkillType) != null)
  67. {
  68. experienceBarHideTaskHashMap.get(primarySkillType).cancel();
  69. }
  70. scheduleHideTask(primarySkillType, plugin);
  71. }
  72. private boolean isBarDisabled(PrimarySkillType primarySkillType) {
  73. return barStateMapRef.get(primarySkillType) == BarState.DISABLED
  74. //Config checks
  75. || !ExperienceConfig.getInstance().isExperienceBarsEnabled()
  76. || !ExperienceConfig.getInstance().isExperienceBarEnabled(primarySkillType);
  77. }
  78. private boolean isBarAlwaysVisible(PrimarySkillType primarySkillType) {
  79. return barStateMapRef.get(primarySkillType) == BarState.ALWAYS_ON;
  80. }
  81. private void scheduleHideTask(PrimarySkillType primarySkillType, Plugin plugin) {
  82. if(isBarAlwaysVisible(primarySkillType))
  83. return;
  84. ExperienceBarHideTask experienceBarHideTask = new ExperienceBarHideTask(this, mmoPlayer, primarySkillType);
  85. experienceBarHideTask.runTaskLater(plugin, 20* delaySeconds);
  86. experienceBarHideTaskHashMap.put(primarySkillType, experienceBarHideTask);
  87. }
  88. public void hideExperienceBar(PrimarySkillType primarySkillType)
  89. {
  90. if(experienceBars.containsKey(primarySkillType))
  91. experienceBars.get(primarySkillType).hideExperienceBar();
  92. }
  93. public void clearTask(PrimarySkillType primarySkillType)
  94. {
  95. experienceBarHideTaskHashMap.remove(primarySkillType);
  96. }
  97. public void disableAllBars() {
  98. for(PrimarySkillType primarySkillType : PrimarySkillType.values()) {
  99. xpBarSettingToggle(XPBarSettingTarget.HIDE, primarySkillType);
  100. }
  101. NotificationManager.sendPlayerInformationChatOnlyPrefixed(mmoPlayer.getPlayer(), "Commands.XPBar.DisableAll");
  102. }
  103. public void xpBarSettingToggle(@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) {
  104. switch(settingTarget) {
  105. case SHOW:
  106. barStateMapRef.put(skillType, BarState.ALWAYS_ON);
  107. //Remove lingering tasks
  108. if(experienceBarHideTaskHashMap.containsKey(skillType)) {
  109. experienceBarHideTaskHashMap.get(skillType).cancel();
  110. }
  111. updateExperienceBar(skillType, mcMMO.p);
  112. break;
  113. case HIDE:
  114. barStateMapRef.put(skillType, BarState.DISABLED);
  115. //Remove lingering tasks
  116. if(experienceBarHideTaskHashMap.containsKey(skillType)) {
  117. experienceBarHideTaskHashMap.get(skillType).cancel();
  118. }
  119. hideExperienceBar(skillType);
  120. break;
  121. case RESET:
  122. resetBarSettings();
  123. break;
  124. }
  125. informPlayer(settingTarget, skillType);
  126. }
  127. private void resetBarSettings() {
  128. barStateMapRef.putAll(generateDefaultBarStateMap());
  129. }
  130. private void informPlayer(@NotNull MMOExperienceBarManager.@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) {
  131. //Inform player of setting change
  132. if(settingTarget != XPBarSettingTarget.RESET) {
  133. NotificationManager.sendPlayerInformationChatOnlyPrefixed(mmoPlayer.getPlayer(), "Commands.XPBar.SettingChanged", skillType.getName(), settingTarget.toString());
  134. } else {
  135. NotificationManager.sendPlayerInformationChatOnlyPrefixed(mmoPlayer.getPlayer(), "Commands.XPBar.Reset");
  136. }
  137. }
  138. public enum XPBarSettingTarget { SHOW, HIDE, RESET, DISABLE }
  139. public enum BarState { NORMAL, ALWAYS_ON, DISABLED }
  140. /*
  141. * Utility Methods
  142. */
  143. public static EnumMap<PrimarySkillType, BarState> generateDefaultBarStateMap() {
  144. EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> barStateMap = new EnumMap<>(PrimarySkillType.class);
  145. setBarStateDefaults(barStateMap);
  146. return barStateMap;
  147. }
  148. public static void setBarStateDefaults(EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> barStateHashMap) {
  149. for(PrimarySkillType skillType : PrimarySkillType.values()) {
  150. if(skillType.isChildSkill()) {
  151. barStateHashMap.put(skillType, MMOExperienceBarManager.BarState.DISABLED);
  152. } else {
  153. barStateHashMap.put(skillType, MMOExperienceBarManager.BarState.NORMAL);
  154. }
  155. }
  156. }
  157. }