New features for skill combos: new sound, key to quit casting, ability to keep casting after a combo

This commit is contained in:
Jules 2024-05-09 22:09:15 -07:00
parent 3df5676304
commit a8e5a3eaec
2 changed files with 43 additions and 8 deletions

View File

@ -4,6 +4,7 @@ import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.event.skill.PlayerCastSkillEvent; import io.lumine.mythic.lib.api.event.skill.PlayerCastSkillEvent;
import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.player.PlayerMetadata;
import io.lumine.mythic.lib.skill.result.SkillResult;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata; import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerType; import io.lumine.mythic.lib.skill.trigger.TriggerType;
import io.lumine.mythic.lib.util.SoundObject; import io.lumine.mythic.lib.util.SoundObject;
@ -32,6 +33,13 @@ public class KeyCombos extends SkillCastingHandler {
@Nullable @Nullable
private final PlayerKey initializerKey; private final PlayerKey initializerKey;
/**
* Key players can press in order to cancel the current combo
* and prematurely leave skill casting.
*/
@Nullable
private final PlayerKey quitKey;
/** /**
* Handles the display of the action bar when casting a skill. * Handles the display of the action bar when casting a skill.
* Set to null if disabled * Set to null if disabled
@ -39,22 +47,27 @@ public class KeyCombos extends SkillCastingHandler {
@Nullable @Nullable
private final ActionBarOptions actionBarOptions; private final ActionBarOptions actionBarOptions;
private final boolean stayIn;
@Nullable @Nullable
private final SoundObject beginComboSound, comboClickSound, failComboSound; private final SoundObject beginComboSound, comboClickSound, failComboSound, failSkillSound;
public KeyCombos(@NotNull ConfigurationSection config) { public KeyCombos(@NotNull ConfigurationSection config) {
super(config); super(config);
comboMap = new ComboMap(config.getConfigurationSection("combos")); comboMap = new ComboMap(config.getConfigurationSection("combos"));
actionBarOptions = config.contains("action-bar") ? new ActionBarOptions(config.getConfigurationSection("action-bar")) : null; actionBarOptions = config.contains("action-bar") ? new ActionBarOptions(config.getConfigurationSection("action-bar")) : null;
stayIn = config.getBoolean("stay-in");
// Load sounds // Load sounds
beginComboSound = config.contains("sound.begin-combo") ? new SoundObject(config.getConfigurationSection("sound.begin-combo")) : null; beginComboSound = config.contains("sound.begin-combo") ? new SoundObject(config.getConfigurationSection("sound.begin-combo")) : null;
comboClickSound = config.contains("sound.combo-key") ? new SoundObject(config.getConfigurationSection("sound.combo-key")) : null; comboClickSound = config.contains("sound.combo-key") ? new SoundObject(config.getConfigurationSection("sound.combo-key")) : null;
failComboSound = config.contains("sound.fail-combo") ? new SoundObject(config.getConfigurationSection("sound.fail-combo")) : null; failComboSound = config.contains("sound.fail-combo") ? new SoundObject(config.getConfigurationSection("sound.fail-combo")) : null;
failSkillSound = config.contains("sound.fail-skill") ? new SoundObject(config.getConfigurationSection("sound.fail-skill")) : null;
// Find initializer key // Find initializer key
initializerKey = config.contains("initializer-key") ? PlayerKey.valueOf(UtilityMethods.enumName(Objects.requireNonNull(config.getString("initializer-key"), "Could not find initializer key"))) : null; initializerKey = config.contains("initializer-key") ? PlayerKey.valueOf(UtilityMethods.enumName(config.get("initializer-key").toString())) : null;
quitKey = config.contains("quit-key") ? PlayerKey.valueOf(UtilityMethods.enumName(config.get("quit-key").toString())) : null;
} }
@Override @Override
@ -89,6 +102,17 @@ public class KeyCombos extends SkillCastingHandler {
return; return;
} }
// Cancel casting if possible
if (quitKey != null && event.getPressed() == quitKey && event.getData().isCasting()) {
// Cancel event is necessary
if (event.getPressed().shouldCancelEvent()) event.setCancelled(true);
event.getData().leaveSkillCasting(true);
if (failComboSound != null) failComboSound.playTo(player);
return;
}
// Make sure key is part of the combo map // Make sure key is part of the combo map
final ComboMap comboMap = Objects.requireNonNullElse(playerData.getProfess().getComboMap(), this.comboMap); final ComboMap comboMap = Objects.requireNonNullElse(playerData.getProfess().getComboMap(), this.comboMap);
if (!comboMap.isComboKey(event.getPressed())) return; if (!comboMap.isComboKey(event.getPressed())) return;
@ -118,19 +142,25 @@ public class KeyCombos extends SkillCastingHandler {
// Hash current combo and check // Hash current combo and check
if (casting.combos.getCombos().containsKey(casting.current)) { if (casting.combos.getCombos().containsKey(casting.current)) {
final int spellSlot = casting.combos.getCombos().get(casting.current); final int spellSlot = casting.combos.getCombos().get(casting.current);
playerData.leaveSkillCasting(true); if (stayIn) casting.resetCurrentCombo();
else playerData.leaveSkillCasting(true);
// Cast spell // Cast spell
if (playerData.hasSkillBound(spellSlot)) { if (playerData.hasSkillBound(spellSlot)) {
PlayerMetadata caster = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND); final PlayerMetadata caster = playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND);
playerData.getBoundSkill(spellSlot).toCastable(playerData).cast(new TriggerMetadata(caster, null, null)); final SkillResult result = playerData.getBoundSkill(spellSlot).toCastable(playerData).cast(new TriggerMetadata(caster, null, null));
if (!result.isSuccessful()) if (failSkillSound != null) failSkillSound.playTo(player);
} else if (stayIn) {
if (failComboSound != null) failComboSound.playTo(player);
} }
return; return;
} }
// Check if current combo is too large // Check if current combo is too large
if (casting.current.countKeys() >= casting.combos.getLongest()) { if (casting.current.countKeys() >= casting.combos.getLongest()) {
playerData.leaveSkillCasting(true); if (stayIn) casting.resetCurrentCombo();
else playerData.leaveSkillCasting(true);
if (failComboSound != null) failComboSound.playTo(player); if (failComboSound != null) failComboSound.playTo(player);
} }
} }
@ -140,15 +170,20 @@ public class KeyCombos extends SkillCastingHandler {
* (combos defined in its class or the default combos of the config.yml) * (combos defined in its class or the default combos of the config.yml)
*/ */
public class CustomSkillCastingInstance extends SkillCastingInstance { public class CustomSkillCastingInstance extends SkillCastingInstance {
private final KeyCombo current = new KeyCombo(); private KeyCombo current;
private final ComboMap combos; private final ComboMap combos;
CustomSkillCastingInstance(PlayerData caster) { CustomSkillCastingInstance(PlayerData caster) {
super(KeyCombos.this, caster); super(KeyCombos.this, caster);
resetCurrentCombo();
combos = Objects.requireNonNullElse(caster.getProfess().getComboMap(), comboMap); combos = Objects.requireNonNullElse(caster.getProfess().getComboMap(), comboMap);
} }
public void resetCurrentCombo() {
current = new KeyCombo();
}
@Override @Override
public void onTick() { public void onTick() {
if (actionBarOptions != null) if (actionBarOptions.isSubtitle) if (actionBarOptions != null) if (actionBarOptions.isSubtitle)

View File

@ -39,7 +39,7 @@ public class Ambers extends SkillHandler<SimpleSkillResult> implements Listener
LivingEntity target = (LivingEntity) skillMeta.getTargetEntityOrNull(); LivingEntity target = (LivingEntity) skillMeta.getTargetEntityOrNull();
Location loc = target.getLocation(); Location loc = target.getLocation();
double a = random.nextDouble() * 2 * Math.PI; double a = RANDOM.nextDouble() * 2 * Math.PI;
new Amber(skillMeta.getCaster().getData(), EntityLocationType.BODY.getLocation(target), loc.clone().add(4 * Math.cos(a), 0, 4 * Math.sin(a)), skillMeta.getParameter("percent")); new Amber(skillMeta.getCaster().getData(), EntityLocationType.BODY.getLocation(target), loc.clone().add(4 * Math.cos(a), 0, 4 * Math.sin(a)), skillMeta.getParameter("percent"));
} }