From 339a54b0ac02157ec060497cee36ec4300bf4c5d Mon Sep 17 00:00:00 2001 From: GJ Date: Mon, 29 Apr 2013 14:19:41 -0400 Subject: [PATCH] Replace SkillMonitorTask with 3 unique timers instead. This should greatly optimize our tool and ability cooldown tracking and hopefully reduce server load. --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/mcMMO.java | 4 -- .../runnables/skills/AbilityCooldownTask.java | 26 +++++++ .../runnables/skills/AbilityDisableTask.java | 59 ++++++++++++++++ .../runnables/skills/SkillMonitorTask.java | 36 ---------- .../runnables/skills/ToolLowerTask.java | 30 +++++++++ .../nossr50/skills/mining/MiningManager.java | 2 + .../gmail/nossr50/util/skills/SkillUtils.java | 67 ++----------------- 8 files changed, 123 insertions(+), 102 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java delete mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/SkillMonitorTask.java create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java diff --git a/Changelog.txt b/Changelog.txt index c2801c89f..8ffec4f87 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -35,6 +35,7 @@ Version 1.4.06-dev ! Changed default value for recently-hurt cooldown between teleports, this is also fully configurable now ! Changed the amount of info messages in the console when enabling/disabling, enable Verbose_Logging to enable them again ! Items dropped by players are now being tracked and are not being shared with party members + ! Optimized tracking of tool & ability cooldowns. Version 1.4.05 + Added option to allow refreshing of chunks after block-breaking abilities. (Disabled by default) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 9bc8305dd..0251007df 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -38,7 +38,6 @@ import com.gmail.nossr50.runnables.SaveTimerTask; import com.gmail.nossr50.runnables.database.UserPurgeTask; import com.gmail.nossr50.runnables.party.PartyAutoKickTask; import com.gmail.nossr50.runnables.skills.BleedTimerTask; -import com.gmail.nossr50.runnables.skills.SkillMonitorTask; import com.gmail.nossr50.skills.child.ChildConfig; import com.gmail.nossr50.skills.repair.Repairable; import com.gmail.nossr50.skills.repair.RepairableManager; @@ -386,9 +385,6 @@ public class mcMMO extends JavaPlugin { new SaveTimerTask().runTaskTimer(this, saveIntervalTicks, saveIntervalTicks); - // Regen & Cooldown timer (Runs every second) - new SkillMonitorTask().runTaskTimer(this, 20, 20); - // Bleed timer (Runs every two seconds) new BleedTimerTask().runTaskTimer(this, 40, 40); diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java new file mode 100644 index 000000000..4fa1763fc --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java @@ -0,0 +1,26 @@ +package com.gmail.nossr50.runnables.skills; + +import org.bukkit.scheduler.BukkitRunnable; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.AbilityType; + +public class AbilityCooldownTask extends BukkitRunnable { + private McMMOPlayer mcMMOPlayer; + private AbilityType ability; + + public AbilityCooldownTask(McMMOPlayer mcMMOPlayer, AbilityType ability) { + this.mcMMOPlayer = mcMMOPlayer; + this.ability = ability; + } + + @Override + public void run() { + if (mcMMOPlayer.getAbilityInformed(ability)) { + return; + } + + mcMMOPlayer.setAbilityInformed(ability, true); + mcMMOPlayer.getPlayer().sendMessage(ability.getAbilityRefresh()); + } +} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java new file mode 100644 index 000000000..aac9e8632 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -0,0 +1,59 @@ +package com.gmail.nossr50.runnables.skills; + +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.config.HiddenConfig; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.AbilityType; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.skills.ParticleEffectUtils; +import com.gmail.nossr50.util.skills.SkillUtils; + +public class AbilityDisableTask extends BukkitRunnable { + private McMMOPlayer mcMMOPlayer; + private AbilityType ability; + + public AbilityDisableTask(McMMOPlayer mcMMOPlayer, AbilityType ability) { + this.mcMMOPlayer = mcMMOPlayer; + this.ability = ability; + } + + @Override + public void run() { + if (!mcMMOPlayer.getAbilityMode(ability)) { + return; + } + + Player player = mcMMOPlayer.getPlayer(); + + switch (ability) { + case SUPER_BREAKER: + case GIGA_DRILL_BREAKER: + SkillUtils.handleAbilitySpeedDecrease(player); + // Fallthrough + + case BERSERK: + if (HiddenConfig.getInstance().resendChunksAfterBlockAbility()) { + Misc.resendChunkRadiusAt(player, 1); + } + // Fallthrough + + default: + break; + } + + mcMMOPlayer.setAbilityMode(ability, false); + mcMMOPlayer.setAbilityInformed(ability, false); + + ParticleEffectUtils.playAbilityDisabledEffect(player); + + if (mcMMOPlayer.useChatNotifications()) { + player.sendMessage(ability.getAbilityOff()); + } + + SkillUtils.sendSkillMessage(player, ability.getAbilityPlayerOff(player)); + new AbilityCooldownTask(mcMMOPlayer, ability).runTaskLaterAsynchronously(mcMMO.p, ability.getCooldown() * 20); + } +} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/SkillMonitorTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/SkillMonitorTask.java deleted file mode 100644 index 916499f74..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/skills/SkillMonitorTask.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gmail.nossr50.runnables.skills; - -import org.bukkit.scheduler.BukkitRunnable; - -import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.datatypes.skills.AbilityType; -import com.gmail.nossr50.datatypes.skills.SkillType; -import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.skills.SkillUtils; - -public class SkillMonitorTask extends BukkitRunnable { - @Override - public void run() { - long curTime = System.currentTimeMillis(); - - for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers().values()) { - /* - * MONITOR SKILLS - */ - for (SkillType skill : SkillType.values()) { - if (skill.getTool() != null && skill.getAbility() != null) { - SkillUtils.monitorSkill(mcMMOPlayer, curTime, skill); - } - } - - /* - * COOLDOWN MONITORING - */ - for (AbilityType ability : AbilityType.values()) { - if (ability.getCooldown() > 0) { - SkillUtils.watchCooldown(mcMMOPlayer, ability); - } - } - } - } -} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java new file mode 100644 index 000000000..6b9b1bfa0 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java @@ -0,0 +1,30 @@ +package com.gmail.nossr50.runnables.skills; + +import org.bukkit.scheduler.BukkitRunnable; + +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.ToolType; + +public class ToolLowerTask extends BukkitRunnable { + private McMMOPlayer mcMMOPlayer; + private ToolType tool; + + public ToolLowerTask(McMMOPlayer mcMMOPlayer, ToolType tool) { + this.mcMMOPlayer = mcMMOPlayer; + this.tool = tool; + } + + @Override + public void run() { + if (!mcMMOPlayer.getToolPreparationMode(tool)) { + return; + } + + mcMMOPlayer.setToolPreparationMode(tool, false); + + if (Config.getInstance().getAbilityMessagesEnabled()) { + mcMMOPlayer.getPlayer().sendMessage(tool.getLowerTool()); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java index a1c2f3e94..9d90eff8a 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -19,6 +19,7 @@ import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.AbilityType; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.runnables.skills.AbilityCooldownTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.mining.BlastMining.Tier; import com.gmail.nossr50.util.BlockUtils; @@ -108,6 +109,7 @@ public class MiningManager extends SkillManager{ getProfile().setSkillDATS(AbilityType.BLAST_MINING, System.currentTimeMillis()); mcMMOPlayer.setAbilityInformed(AbilityType.BLAST_MINING, false); + new AbilityCooldownTask(mcMMOPlayer, AbilityType.BLAST_MINING).runTaskLaterAsynchronously(mcMMO.p, AbilityType.BLAST_MINING.getCooldown()); } /** diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index 54fd46d5f..120005e2d 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -31,6 +31,8 @@ import com.gmail.nossr50.events.fake.FakeBlockBreakEvent; import com.gmail.nossr50.events.fake.FakeBlockDamageEvent; import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.runnables.skills.AbilityDisableTask; +import com.gmail.nossr50.runnables.skills.ToolLowerTask; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.ModUtils; @@ -87,21 +89,6 @@ public class SkillUtils { return (int) (((deactivatedTimeStamp + (PerksUtils.handleCooldownPerks(player, cooldown) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR); } - /** - * Sends a message to the player when the cooldown expires. - * - * @param mcMMOPlayer The player to send a message to - * @param ability The ability to watch cooldowns for - */ - public static void watchCooldown(McMMOPlayer mcMMOPlayer, AbilityType ability) { - Player player = mcMMOPlayer.getPlayer(); - - if (!mcMMOPlayer.getAbilityInformed(ability) && cooldownOver(mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) { - mcMMOPlayer.setAbilityInformed(ability, true); - player.sendMessage(ability.getAbilityRefresh()); - } - } - /** * Process activating abilities & readying the tool. * @@ -152,53 +139,7 @@ public class SkillUtils { mcMMOPlayer.setToolPreparationATS(tool, System.currentTimeMillis()); mcMMOPlayer.setToolPreparationMode(tool, true); - } - } - - /** - * Monitors various things relating to skill abilities. - * - * @param mcMMOPlayer The player using the skill - * @param profile The profile of the player - * @param curTime The current system time - * @param skill The skill being monitored - */ - public static void monitorSkill(McMMOPlayer mcMMOPlayer, long curTime, SkillType skill) { - final int FOUR_SECONDS = 4000; - ToolType tool = skill.getTool(); - - if (mcMMOPlayer.getToolPreparationMode(tool) && curTime - (mcMMOPlayer.getToolPreparationATS(tool) * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) { - mcMMOPlayer.setToolPreparationMode(tool, false); - - if (Config.getInstance().getAbilityMessagesEnabled()) { - mcMMOPlayer.getPlayer().sendMessage(tool.getLowerTool()); - } - } - - AbilityType ability = skill.getAbility(); - Player player = mcMMOPlayer.getPlayer(); - - if (ability.getPermissions(player)) { - if (mcMMOPlayer.getAbilityMode(ability) && (mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR) <= curTime) { - if (ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER) { - handleAbilitySpeedDecrease(player); - } - - if (HiddenConfig.getInstance().resendChunksAfterBlockAbility() && (ability == AbilityType.BERSERK || ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER)) { - Misc.resendChunkRadiusAt(player, 1); - } - - mcMMOPlayer.setAbilityMode(ability, false); - mcMMOPlayer.setAbilityInformed(ability, false); - - ParticleEffectUtils.playAbilityDisabledEffect(player); - - if (mcMMOPlayer.useChatNotifications()) { - player.sendMessage(ability.getAbilityOff()); - } - - sendSkillMessage(player, ability.getAbilityPlayerOff(player)); - } + new ToolLowerTask(mcMMOPlayer, tool).runTaskLaterAsynchronously(mcMMO.p, 4 * 20); } } @@ -404,6 +345,8 @@ public class SkillUtils { if (ability == AbilityType.SUPER_BREAKER || ability == AbilityType.GIGA_DRILL_BREAKER) { handleAbilitySpeedIncrease(player); } + + new AbilityDisableTask(mcMMOPlayer, ability).runTaskLater(mcMMO.p, ticks * 20); } }