From 2271bd523653e5db3399c557e9d6151c85268577 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Feb 2024 16:05:53 -0800 Subject: [PATCH] wip super shotgun --- .../nossr50/datatypes/player/McMMOPlayer.java | 34 ++++++++------- .../nossr50/listeners/PlayerListener.java | 20 +++++++-- .../skills/AlternateFiringSuperSkill.java | 13 ++++++ .../skills/crossbows/CrossbowsManager.java | 41 ++++++++++++++++++- .../nossr50/util/skills/CombatUtils.java | 6 +-- 5 files changed, 92 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/skills/AlternateFiringSuperSkill.java diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index ed4b4d9b0..7abaf9de3 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -25,6 +25,7 @@ import com.gmail.nossr50.party.ShareHandler; import com.gmail.nossr50.runnables.skills.AbilityCooldownTask; import com.gmail.nossr50.runnables.skills.AbilityDisableTask; import com.gmail.nossr50.runnables.skills.ToolLowerTask; +import com.gmail.nossr50.skills.AlternateFiringSuperSkill; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.alchemy.AlchemyManager; @@ -960,20 +961,15 @@ public class McMMOPlayer implements Identified { mcMMO.p.getFoliaLib().getImpl().runAtEntityLater(player, new AbilityDisableTask(this, superAbilityType), (long) ticks * Misc.TICK_CONVERSION_FACTOR); } - /** - * Check to see if an ability can be activated. - * - * @param isCrossbow true for crossbow, false for bow - */ - public void checkAbilityActivationProjectiles(boolean isCrossbow) { - PrimarySkillType primarySkillType = isCrossbow ? PrimarySkillType.CROSSBOWS : PrimarySkillType.ARCHERY; + public void checkCrossbowAbilityActivation() { + PrimarySkillType primarySkillType = PrimarySkillType.CROSSBOWS; + ToolType tool = ToolType.CROSSBOW; + SuperAbilityType superAbilityType = SuperAbilityType.SUPER_SHOTGUN; + SubSkillType subSkillType = SubSkillType.CROSSBOWS_SUPER_SHOTGUN; + AlternateFiringSuperSkill skillManager = getCrossbowsManager(); - // TODO: Refactor this crappy logic - ToolType tool = isCrossbow ? ToolType.CROSSBOW : ToolType.BOW; - SuperAbilityType superAbilityType = isCrossbow ? SuperAbilityType.SUPER_SHOTGUN : SuperAbilityType.EXPLOSIVE_SHOT; - SubSkillType subSkillType = superAbilityType.getSubSkillTypeDefinition(); - - if (getAbilityMode(superAbilityType) || !superAbilityType.getPermissions(player)) { + // Check permission + if (!superAbilityType.getPermissions(player)) { return; } @@ -997,6 +993,11 @@ public class McMMOPlayer implements Identified { return; } + // Check if we can fire the ability + if (!skillManager.isReadyToFire()) { + return; + } + if (useChatNotifications()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, superAbilityType.getAbilityOn()); } @@ -1010,8 +1011,9 @@ public class McMMOPlayer implements Identified { // TODO: Fire the ability profile.setAbilityDATS(superAbilityType, System.currentTimeMillis()); - setAbilityMode(superAbilityType, true); setToolPreparationMode(tool, false); + skillManager.resetCharge(); + skillManager.fireSuper(); if(!mcMMO.isServerShutdownExecuted()) { mcMMO.p.getFoliaLib().getImpl().runAtEntityLater( @@ -1021,6 +1023,10 @@ public class McMMOPlayer implements Identified { } } + public void chargeCrossbowSuper() { + getCrossbowsManager().chargeSuper(); + } + public void processAbilityActivation(@NotNull PrimarySkillType primarySkillType) { if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(getPlayer(), primarySkillType)) { return; diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f27a69fcc..dc555eb21 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -788,6 +788,9 @@ public class PlayerListener implements Listener { } McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (mcMMOPlayer == null) + return; + ItemStack heldItem = player.getInventory().getItemInMainHand(); //Spam Fishing Detection @@ -825,6 +828,11 @@ public class PlayerListener implements Listener { mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM); } + // Projectile Skills + if (ItemUtils.isCrossbow(heldItem) || ItemUtils.isBow(heldItem)) { + CombatUtils.processProjectileSkillSuperAbilityActivation(mcMMOPlayer, heldItem); + } + mcMMOPlayer.processAbilityActivation(PrimarySkillType.AXES); mcMMOPlayer.processAbilityActivation(PrimarySkillType.EXCAVATION); mcMMOPlayer.processAbilityActivation(PrimarySkillType.MINING); @@ -896,6 +904,11 @@ public class PlayerListener implements Listener { mcMMOPlayer.processAbilityActivation(PrimarySkillType.SWORDS); mcMMOPlayer.processAbilityActivation(PrimarySkillType.UNARMED); mcMMOPlayer.processAbilityActivation(PrimarySkillType.WOODCUTTING); + + // Projectile Skills + if (ItemUtils.isCrossbow(heldItem) || ItemUtils.isBow(heldItem)) { + CombatUtils.processProjectileSkillSuperAbilityActivation(mcMMOPlayer, heldItem); + } } /* ITEM CHECKS */ @@ -916,10 +929,9 @@ public class PlayerListener implements Listener { break; } - // Projectile Skills - // Check if the player is holding a bow or crossbow - if (ItemUtils.isCrossbow(heldItem) || ItemUtils.isBow(heldItem)) { - CombatUtils.processProjectileSkillSuperAbilityActivation(mcMMOPlayer, heldItem); + // Check charge up supers (crossbows, etc...) + if (ItemUtils.isCrossbow(heldItem)) { + mcMMOPlayer.chargeCrossbowSuper(); } /* CALL OF THE WILD CHECKS */ diff --git a/src/main/java/com/gmail/nossr50/skills/AlternateFiringSuperSkill.java b/src/main/java/com/gmail/nossr50/skills/AlternateFiringSuperSkill.java new file mode 100644 index 000000000..f9691c353 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/AlternateFiringSuperSkill.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.skills; + +public interface AlternateFiringSuperSkill { + int chargeSuper(); + + void fireSuper(); + + void resetCharge(); + + boolean isReadyToFire(); + + long lastChargeTime(); +} diff --git a/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java b/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java index 60def74bf..09ddceadb 100644 --- a/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.skills.AlternateFiringSuperSkill; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Permissions; @@ -22,11 +23,15 @@ import org.jetbrains.annotations.NotNull; import static com.gmail.nossr50.util.skills.CombatUtils.delayArrowMetaCleanup; -public class CrossbowsManager extends SkillManager { +public class CrossbowsManager extends SkillManager implements AlternateFiringSuperSkill { public CrossbowsManager(McMMOPlayer mmoPlayer) { super(mmoPlayer, PrimarySkillType.CROSSBOWS); } + private long lastChargeTime = 0; + + private int crossbowSuperWindupState = 0; + public void handleRicochet(@NotNull Plugin pluginRef, @NotNull Arrow arrow, @NotNull Vector hitBlockNormal) { if(!arrow.isShotFromCrossbow()) return; @@ -105,4 +110,38 @@ public class CrossbowsManager extends SkillManager { return oldDamage; } } + + @Override + public int chargeSuper() { + if (lastChargeTime < System.currentTimeMillis() - 2000) { + crossbowSuperWindupState = 0; + } + + if (crossbowSuperWindupState < 3) { + crossbowSuperWindupState++; + } + + lastChargeTime = System.currentTimeMillis(); + return crossbowSuperWindupState; + } + + @Override + public void fireSuper() { + // TODO: Impl + } + + @Override + public void resetCharge() { + crossbowSuperWindupState = 0; + } + + @Override + public boolean isReadyToFire() { + return crossbowSuperWindupState == 3; + } + + @Override + public long lastChargeTime() { + return lastChargeTime; + } } diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 164ebf122..d9a42ffcd 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -51,10 +51,10 @@ public final class CombatUtils { // TODO: Unit tests public static void processProjectileSkillSuperAbilityActivation(McMMOPlayer mmoPlayer, ItemStack heldItem) { + // TODO: Support archery super as well if (heldItem != null && mmoPlayer != null) { - if (ItemUtils.isBowOrCrossbow(heldItem)) { - boolean isCrossbow = ItemUtils.isCrossbow(heldItem); - mmoPlayer.checkAbilityActivationProjectiles(isCrossbow); + if (ItemUtils.isCrossbow(heldItem)) { + mmoPlayer.checkCrossbowAbilityActivation(); } } }