mcMMO.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. package com.gmail.nossr50;
  2. import com.gmail.nossr50.config.*;
  3. import com.gmail.nossr50.config.experience.ExperienceConfig;
  4. import com.gmail.nossr50.config.mods.ArmorConfigManager;
  5. import com.gmail.nossr50.config.mods.BlockConfigManager;
  6. import com.gmail.nossr50.config.mods.EntityConfigManager;
  7. import com.gmail.nossr50.config.mods.ToolConfigManager;
  8. import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
  9. import com.gmail.nossr50.config.skills.repair.RepairConfigManager;
  10. import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager;
  11. import com.gmail.nossr50.config.treasure.TreasureConfig;
  12. import com.gmail.nossr50.database.DatabaseManager;
  13. import com.gmail.nossr50.database.DatabaseManagerFactory;
  14. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  15. import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll;
  16. import com.gmail.nossr50.listeners.*;
  17. import com.gmail.nossr50.party.PartyManager;
  18. import com.gmail.nossr50.runnables.CheckDateTask;
  19. import com.gmail.nossr50.runnables.SaveTimerTask;
  20. import com.gmail.nossr50.runnables.backups.CleanBackupsTask;
  21. import com.gmail.nossr50.runnables.database.UserPurgeTask;
  22. import com.gmail.nossr50.runnables.party.PartyAutoKickTask;
  23. import com.gmail.nossr50.runnables.player.ClearRegisteredXPGainTask;
  24. import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
  25. import com.gmail.nossr50.runnables.player.PowerLevelUpdatingTask;
  26. import com.gmail.nossr50.runnables.skills.BleedTimerTask;
  27. import com.gmail.nossr50.skills.alchemy.Alchemy;
  28. import com.gmail.nossr50.skills.child.ChildConfig;
  29. import com.gmail.nossr50.skills.repair.repairables.Repairable;
  30. import com.gmail.nossr50.skills.repair.repairables.RepairableManager;
  31. import com.gmail.nossr50.skills.repair.repairables.SimpleRepairableManager;
  32. import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
  33. import com.gmail.nossr50.skills.salvage.salvageables.SalvageableManager;
  34. import com.gmail.nossr50.skills.salvage.salvageables.SimpleSalvageableManager;
  35. import com.gmail.nossr50.util.*;
  36. import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManager;
  37. import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManagerFactory;
  38. import com.gmail.nossr50.util.commands.CommandRegistrationManager;
  39. import com.gmail.nossr50.util.experience.FormulaManager;
  40. import com.gmail.nossr50.util.player.UserManager;
  41. import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
  42. import com.gmail.nossr50.util.skills.RankUtils;
  43. import com.gmail.nossr50.util.upgrade.UpgradeManager;
  44. import com.gmail.nossr50.worldguard.WorldGuardManager;
  45. import com.google.common.base.Charsets;
  46. import net.shatteredlands.shatt.backup.ZipLibrary;
  47. import org.bstats.bukkit.Metrics;
  48. import org.bukkit.entity.Player;
  49. import org.bukkit.event.HandlerList;
  50. import org.bukkit.metadata.FixedMetadataValue;
  51. import org.bukkit.plugin.PluginManager;
  52. import org.bukkit.plugin.java.JavaPlugin;
  53. import java.io.File;
  54. import java.io.IOException;
  55. import java.io.InputStream;
  56. import java.io.InputStreamReader;
  57. import java.util.ArrayList;
  58. import java.util.List;
  59. public class mcMMO extends JavaPlugin {
  60. /* Managers */
  61. private static ChunkManager placeStore;
  62. private static RepairableManager repairableManager;
  63. private static SalvageableManager salvageableManager;
  64. private static ModManager modManager;
  65. private static DatabaseManager databaseManager;
  66. private static FormulaManager formulaManager;
  67. private static HolidayManager holidayManager;
  68. private static UpgradeManager upgradeManager;
  69. /* Blacklist */
  70. private static WorldBlacklist worldBlacklist;
  71. /* File Paths */
  72. private static String mainDirectory;
  73. private static String flatFileDirectory;
  74. private static String usersFile;
  75. private static String modDirectory;
  76. public static mcMMO p;
  77. // Jar Stuff
  78. public static File mcmmo;
  79. /* Plugin Checks */
  80. private static boolean healthBarPluginEnabled;
  81. // Config Validation Check
  82. public boolean noErrorsInConfigFiles = true;
  83. // XP Event Check
  84. private boolean xpEventEnabled;
  85. private static boolean isRetroModeEnabled;
  86. /* Metadata Values */
  87. public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker";
  88. public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage";
  89. public final static String entityMetadataKey = "mcMMO: Spawned Entity";
  90. public final static String blockMetadataKey = "mcMMO: Piston Tracking";
  91. public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace";
  92. public final static String tntMetadataKey = "mcMMO: Tracked TNT";
  93. public final static String funfettiMetadataKey = "mcMMO: Funfetti";
  94. public final static String tntsafeMetadataKey = "mcMMO: Safe TNT";
  95. public final static String customNameKey = "mcMMO: Custom Name";
  96. public final static String customVisibleKey = "mcMMO: Name Visibility";
  97. public final static String droppedItemKey = "mcMMO: Tracked Item";
  98. public final static String infiniteArrowKey = "mcMMO: Infinite Arrow";
  99. public final static String bowForceKey = "mcMMO: Bow Force";
  100. public final static String arrowDistanceKey = "mcMMO: Arrow Distance";
  101. //public final static String customDamageKey = "mcMMO: Custom Damage";
  102. public final static String disarmedItemKey = "mcMMO: Disarmed Item";
  103. public final static String playerDataKey = "mcMMO: Player Data";
  104. public final static String greenThumbDataKey = "mcMMO: Green Thumb";
  105. public final static String doubleDropKey = "mcMMO: Double Drop";
  106. public final static String tripleDropKey = "mcMMO: Triple Drop";
  107. public final static String databaseCommandKey = "mcMMO: Processing Database Command";
  108. public final static String bredMetadataKey = "mcMMO: Bred Animal";
  109. public static FixedMetadataValue metadataValue;
  110. /**
  111. * Things to be run when the plugin is enabled.
  112. */
  113. @Override
  114. public void onEnable() {
  115. try {
  116. p = this;
  117. getLogger().setFilter(new LogFilter(this));
  118. metadataValue = new FixedMetadataValue(this, true);
  119. PluginManager pluginManager = getServer().getPluginManager();
  120. healthBarPluginEnabled = pluginManager.getPlugin("HealthBar") != null;
  121. upgradeManager = new UpgradeManager();
  122. setupFilePaths();
  123. modManager = new ModManager();
  124. loadConfigFiles();
  125. if (!noErrorsInConfigFiles) {
  126. return;
  127. }
  128. //Store this value so other plugins can check it
  129. isRetroModeEnabled = Config.getInstance().getIsRetroMode();
  130. if (getServer().getName().equals("Cauldron") || getServer().getName().equals("MCPC+")) {
  131. checkModConfigs();
  132. }
  133. if (healthBarPluginEnabled) {
  134. getLogger().info("HealthBar plugin found, mcMMO's healthbars are automatically disabled.");
  135. }
  136. if (pluginManager.getPlugin("NoCheatPlus") != null && pluginManager.getPlugin("CompatNoCheatPlus") == null) {
  137. getLogger().warning("NoCheatPlus plugin found, but CompatNoCheatPlus was not found!");
  138. getLogger().warning("mcMMO will not work properly alongside NoCheatPlus without CompatNoCheatPlus");
  139. }
  140. databaseManager = DatabaseManagerFactory.getDatabaseManager();
  141. registerEvents();
  142. registerCoreSkills();
  143. registerCustomRecipes();
  144. PartyManager.loadParties();
  145. formulaManager = new FormulaManager();
  146. holidayManager = new HolidayManager();
  147. for (Player player : getServer().getOnlinePlayers()) {
  148. new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading
  149. }
  150. debug("Version " + getDescription().getVersion() + " is enabled!");
  151. scheduleTasks();
  152. CommandRegistrationManager.registerCommands();
  153. placeStore = ChunkManagerFactory.getChunkManager(); // Get our ChunkletManager
  154. if (Config.getInstance().getPTPCommandWorldPermissions()) {
  155. Permissions.generateWorldTeleportPermissions();
  156. }
  157. //Populate Ranked Skill Maps (DO THIS LAST)
  158. RankUtils.populateRanks();
  159. //If anonymous statistics are enabled then use them
  160. Metrics metrics;
  161. if(Config.getInstance().getIsMetricsEnabled()) {
  162. metrics = new Metrics(this);
  163. metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion()));
  164. if(Config.getInstance().getIsRetroMode())
  165. metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard"));
  166. else
  167. metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro"));
  168. }
  169. }
  170. catch (Throwable t) {
  171. getLogger().severe("There was an error while enabling mcMMO!");
  172. if (!(t instanceof ExceptionInInitializerError)) {
  173. t.printStackTrace();
  174. }
  175. else {
  176. getLogger().info("Please do not replace the mcMMO jar while the server is running.");
  177. }
  178. getServer().getPluginManager().disablePlugin(this);
  179. }
  180. //Init the blacklist
  181. worldBlacklist = new WorldBlacklist(this);
  182. }
  183. @Override
  184. public void onLoad()
  185. {
  186. if(getServer().getPluginManager().getPlugin("WorldGuard") != null)
  187. WorldGuardManager.getInstance().registerFlags();
  188. }
  189. /**
  190. * Things to be run when the plugin is disabled.
  191. */
  192. @Override
  193. public void onDisable() {
  194. try {
  195. Alchemy.finishAllBrews(); // Finish all partially complete AlchemyBrewTasks to prevent vanilla brewing continuation on restart
  196. UserManager.saveAll(); // Make sure to save player information if the server shuts down
  197. UserManager.clearAll();
  198. PartyManager.saveParties(); // Save our parties
  199. //TODO: Needed?
  200. if(Config.getInstance().getScoreboardsEnabled())
  201. ScoreboardManager.teardownAll();
  202. formulaManager.saveFormula();
  203. holidayManager.saveAnniversaryFiles();
  204. placeStore.saveAll(); // Save our metadata
  205. placeStore.cleanUp(); // Cleanup empty metadata stores
  206. }
  207. catch (NullPointerException e) { e.printStackTrace(); }
  208. debug("Canceling all tasks...");
  209. getServer().getScheduler().cancelTasks(this); // This removes our tasks
  210. debug("Unregister all events...");
  211. HandlerList.unregisterAll(this); // Cancel event registrations
  212. if (Config.getInstance().getBackupsEnabled()) {
  213. // Remove other tasks BEFORE starting the Backup, or we just cancel it straight away.
  214. try {
  215. ZipLibrary.mcMMOBackup();
  216. }
  217. catch (IOException e) {
  218. getLogger().severe(e.toString());
  219. }
  220. catch (Throwable e) {
  221. if (e instanceof NoClassDefFoundError) {
  222. getLogger().severe("Backup class not found!");
  223. getLogger().info("Please do not replace the mcMMO jar while the server is running.");
  224. }
  225. else {
  226. getLogger().severe(e.toString());
  227. }
  228. }
  229. }
  230. databaseManager.onDisable();
  231. debug("Was disabled."); // How informative!
  232. }
  233. public static String getMainDirectory() {
  234. return mainDirectory;
  235. }
  236. public static String getFlatFileDirectory() {
  237. return flatFileDirectory;
  238. }
  239. public static String getUsersFilePath() {
  240. return usersFile;
  241. }
  242. public static String getModDirectory() {
  243. return modDirectory;
  244. }
  245. public boolean isXPEventEnabled() {
  246. return xpEventEnabled;
  247. }
  248. public void setXPEventEnabled(boolean enabled) {
  249. this.xpEventEnabled = enabled;
  250. }
  251. public void toggleXpEventEnabled() {
  252. xpEventEnabled = !xpEventEnabled;
  253. }
  254. public void debug(String message) {
  255. getLogger().info("[Debug] " + message);
  256. }
  257. public static FormulaManager getFormulaManager() {
  258. return formulaManager;
  259. }
  260. public static HolidayManager getHolidayManager() {
  261. return holidayManager;
  262. }
  263. public static ChunkManager getPlaceStore() {
  264. return placeStore;
  265. }
  266. public static RepairableManager getRepairableManager() {
  267. return repairableManager;
  268. }
  269. public static SalvageableManager getSalvageableManager() {
  270. return salvageableManager;
  271. }
  272. public static DatabaseManager getDatabaseManager() {
  273. return databaseManager;
  274. }
  275. public static ModManager getModManager() {
  276. return modManager;
  277. }
  278. public static UpgradeManager getUpgradeManager() {
  279. return upgradeManager;
  280. }
  281. @Deprecated
  282. public static void setDatabaseManager(DatabaseManager databaseManager) {
  283. mcMMO.databaseManager = databaseManager;
  284. }
  285. public static boolean isHealthBarPluginEnabled() {
  286. return healthBarPluginEnabled;
  287. }
  288. /**
  289. * Setup the various storage file paths
  290. */
  291. private void setupFilePaths() {
  292. mcmmo = getFile();
  293. mainDirectory = getDataFolder().getPath() + File.separator;
  294. flatFileDirectory = mainDirectory + "flatfile" + File.separator;
  295. usersFile = flatFileDirectory + "mcmmo.users";
  296. modDirectory = mainDirectory + "mods" + File.separator;
  297. fixFilePaths();
  298. }
  299. private void fixFilePaths() {
  300. File oldFlatfilePath = new File(mainDirectory + "FlatFileStuff" + File.separator);
  301. File oldModPath = new File(mainDirectory + "ModConfigs" + File.separator);
  302. if (oldFlatfilePath.exists()) {
  303. if (!oldFlatfilePath.renameTo(new File(flatFileDirectory))) {
  304. getLogger().warning("Failed to rename FlatFileStuff to flatfile!");
  305. }
  306. }
  307. if (oldModPath.exists()) {
  308. if (!oldModPath.renameTo(new File(modDirectory))) {
  309. getLogger().warning("Failed to rename ModConfigs to mods!");
  310. }
  311. }
  312. File oldArmorFile = new File(modDirectory + "armor.yml");
  313. File oldBlocksFile = new File(modDirectory + "blocks.yml");
  314. File oldEntitiesFile = new File(modDirectory + "entities.yml");
  315. File oldToolsFile = new File(modDirectory + "tools.yml");
  316. if (oldArmorFile.exists()) {
  317. if (!oldArmorFile.renameTo(new File(modDirectory + "armor.default.yml"))) {
  318. getLogger().warning("Failed to rename armor.yml to armor.default.yml!");
  319. }
  320. }
  321. if (oldBlocksFile.exists()) {
  322. if (!oldBlocksFile.renameTo(new File(modDirectory + "blocks.default.yml"))) {
  323. getLogger().warning("Failed to rename blocks.yml to blocks.default.yml!");
  324. }
  325. }
  326. if (oldEntitiesFile.exists()) {
  327. if (!oldEntitiesFile.renameTo(new File(modDirectory + "entities.default.yml"))) {
  328. getLogger().warning("Failed to rename entities.yml to entities.default.yml!");
  329. }
  330. }
  331. if (oldToolsFile.exists()) {
  332. if (!oldToolsFile.renameTo(new File(modDirectory + "tools.default.yml"))) {
  333. getLogger().warning("Failed to rename tools.yml to tools.default.yml!");
  334. }
  335. }
  336. File currentFlatfilePath = new File(flatFileDirectory);
  337. currentFlatfilePath.mkdirs();
  338. }
  339. private void loadConfigFiles() {
  340. // Force the loading of config files
  341. TreasureConfig.getInstance();
  342. HiddenConfig.getInstance();
  343. AdvancedConfig.getInstance();
  344. PotionConfig.getInstance();
  345. CoreSkillsConfig.getInstance();
  346. SoundConfig.getInstance();
  347. RankConfig.getInstance();
  348. new ChildConfig();
  349. List<Repairable> repairables = new ArrayList<Repairable>();
  350. List<Salvageable> salvageables = new ArrayList<Salvageable>();
  351. if (Config.getInstance().getToolModsEnabled()) {
  352. new ToolConfigManager(this);
  353. }
  354. if (Config.getInstance().getArmorModsEnabled()) {
  355. new ArmorConfigManager(this);
  356. }
  357. if (Config.getInstance().getBlockModsEnabled()) {
  358. new BlockConfigManager(this);
  359. }
  360. if (Config.getInstance().getEntityModsEnabled()) {
  361. new EntityConfigManager(this);
  362. }
  363. // Load repair configs, make manager, and register them at this time
  364. repairables.addAll(new RepairConfigManager(this).getLoadedRepairables());
  365. repairables.addAll(modManager.getLoadedRepairables());
  366. repairableManager = new SimpleRepairableManager(repairables.size());
  367. repairableManager.registerRepairables(repairables);
  368. // Load salvage configs, make manager and register them at this time
  369. SalvageConfigManager sManager = new SalvageConfigManager(this);
  370. salvageables.addAll(sManager.getLoadedSalvageables());
  371. salvageableManager = new SimpleSalvageableManager(salvageables.size());
  372. salvageableManager.registerSalvageables(salvageables);
  373. }
  374. private void registerEvents() {
  375. PluginManager pluginManager = getServer().getPluginManager();
  376. // Register events
  377. pluginManager.registerEvents(new PlayerListener(this), this);
  378. pluginManager.registerEvents(new BlockListener(this), this);
  379. pluginManager.registerEvents(new EntityListener(this), this);
  380. pluginManager.registerEvents(new InventoryListener(this), this);
  381. pluginManager.registerEvents(new SelfListener(this), this);
  382. pluginManager.registerEvents(new WorldListener(this), this);
  383. }
  384. /**
  385. * Registers core skills
  386. * This enables the skills in the new skill system
  387. */
  388. private void registerCoreSkills() {
  389. /*
  390. * Acrobatics skills
  391. */
  392. if(CoreSkillsConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS))
  393. {
  394. System.out.println("[mcMMO]" + " enabling Acrobatics Skills");
  395. //TODO: Should do this differently
  396. Roll roll = new Roll();
  397. CoreSkillsConfig.getInstance().isSkillEnabled(roll);
  398. InteractionManager.registerSubSkill(new Roll());
  399. }
  400. }
  401. private void registerCustomRecipes() {
  402. getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
  403. if (Config.getInstance().getChimaeraEnabled()) {
  404. getServer().addRecipe(ChimaeraWing.getChimaeraWingRecipe());
  405. }
  406. }, 40);
  407. }
  408. private void scheduleTasks() {
  409. // Periodic save timer (Saves every 10 minutes by default)
  410. long saveIntervalTicks = Config.getInstance().getSaveInterval() * 1200;
  411. new SaveTimerTask().runTaskTimer(this, saveIntervalTicks, saveIntervalTicks);
  412. // Cleanup the backups folder
  413. new CleanBackupsTask().runTaskAsynchronously(mcMMO.p);
  414. // Bleed timer (Runs every 0.5 seconds)
  415. new BleedTimerTask().runTaskTimer(this, 1 * Misc.TICK_CONVERSION_FACTOR, 1 * (Misc.TICK_CONVERSION_FACTOR / 2));
  416. // Old & Powerless User remover
  417. long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;
  418. if (purgeIntervalTicks == 0) {
  419. new UserPurgeTask().runTaskLaterAsynchronously(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
  420. }
  421. else if (purgeIntervalTicks > 0) {
  422. new UserPurgeTask().runTaskTimerAsynchronously(this, purgeIntervalTicks, purgeIntervalTicks);
  423. }
  424. // Automatically remove old members from parties
  425. long kickIntervalTicks = Config.getInstance().getAutoPartyKickInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;
  426. if (kickIntervalTicks == 0) {
  427. new PartyAutoKickTask().runTaskLater(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
  428. }
  429. else if (kickIntervalTicks > 0) {
  430. new PartyAutoKickTask().runTaskTimer(this, kickIntervalTicks, kickIntervalTicks);
  431. }
  432. // Update power level tag scoreboards
  433. new PowerLevelUpdatingTask().runTaskTimer(this, 2 * Misc.TICK_CONVERSION_FACTOR, 2 * Misc.TICK_CONVERSION_FACTOR);
  434. if (getHolidayManager().nearingAprilFirst()) {
  435. new CheckDateTask().runTaskTimer(this, 10L * Misc.TICK_CONVERSION_FACTOR, 1L * 60L * 60L * Misc.TICK_CONVERSION_FACTOR);
  436. }
  437. // Clear the registered XP data so players can earn XP again
  438. if (ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) {
  439. new ClearRegisteredXPGainTask().runTaskTimer(this, 60, 60);
  440. }
  441. }
  442. private void checkModConfigs() {
  443. if (!Config.getInstance().getToolModsEnabled()) {
  444. getLogger().warning("Cauldron implementation found, but the custom tool config for mcMMO is disabled!");
  445. getLogger().info("To enable, set Mods.Tool_Mods_Enabled to TRUE in config.yml.");
  446. }
  447. if (!Config.getInstance().getArmorModsEnabled()) {
  448. getLogger().warning("Cauldron implementation found, but the custom armor config for mcMMO is disabled!");
  449. getLogger().info("To enable, set Mods.Armor_Mods_Enabled to TRUE in config.yml.");
  450. }
  451. if (!Config.getInstance().getBlockModsEnabled()) {
  452. getLogger().warning("Cauldron implementation found, but the custom block config for mcMMO is disabled!");
  453. getLogger().info("To enable, set Mods.Block_Mods_Enabled to TRUE in config.yml.");
  454. }
  455. if (!Config.getInstance().getEntityModsEnabled()) {
  456. getLogger().warning("Cauldron implementation found, but the custom entity config for mcMMO is disabled!");
  457. getLogger().info("To enable, set Mods.Entity_Mods_Enabled to TRUE in config.yml.");
  458. }
  459. }
  460. public InputStreamReader getResourceAsReader(String fileName) {
  461. InputStream in = getResource(fileName);
  462. return in == null ? null : new InputStreamReader(in, Charsets.UTF_8);
  463. }
  464. /**
  465. * Checks if this plugin is using retro mode
  466. * Retro mode is a 0-1000 skill system
  467. * Standard mode is scaled for 1-100
  468. * @return true if retro mode is enabled
  469. */
  470. public static boolean isRetroModeEnabled() {
  471. return isRetroModeEnabled;
  472. }
  473. public static WorldBlacklist getWorldBlacklist() {
  474. return worldBlacklist;
  475. }
  476. }