diff --git a/Source/Sonic Frontiers/Physics/Enhanced Homing Attack Rebound.hmm b/Source/Sonic Frontiers/Physics/Enhanced Homing Attack Rebound.hmm index 1d8c5a05..fd94ed85 100644 --- a/Source/Sonic Frontiers/Physics/Enhanced Homing Attack Rebound.hmm +++ b/Source/Sonic Frontiers/Physics/Enhanced Homing Attack Rebound.hmm @@ -12,6 +12,7 @@ Notes; #include "Reflection" noemit #lib "AmyParameters" + #lib "GameObject" #lib "HMM" #lib "KnucklesParameters" #lib "Lua" @@ -27,6 +28,8 @@ Notes; static bool isHomingAttack = false; static bool isInitialized = false; static bool useTrickAnim = false; + static bool isDive = false; + static bool isEnemy = false; static float homingTime = 0.3f; static float currentTime = 0; static string[] animRand = new[] { "U", "D", "L", "R" }; @@ -47,7 +50,30 @@ Notes; if (BlackboardStatus.IsSuper()) return; - if (Player.State.GetCurrentStateID() == Sonic.StateID.StateHomingFinished && Player.State.GetPreviousStateID() != Sonic.StateID.StateHomingAttackInStorm) + if (IS_STATE_FLAG(IsDiving)) + { + isDive = true; + } + else if (Player.Status.IsGroundedSpecial()) + { + isDive = false; + } + + var lockonTarget = Player.Status.GetLockOnTarget(); + + if (lockonTarget != null) + { + if (GameObject.GetGOC(lockonTarget, "GOCHealth") != null) + { + isEnemy = true; + } + else + { + isEnemy = false; + } + } + + if (Player.State.GetCurrentStateID() == Sonic.StateID.StateHomingFinished && Player.State.GetPreviousStateID() != Sonic.StateID.StateHomingAttackInStorm && !isDive) { Player.State.SetState(Sonic.StateID.StateRecoveryJump); //Temporarily disable Homing Attack to prevent no delay spamming @@ -112,20 +138,20 @@ Notes; if (SonicParametersInfo.pData != null) { - //Restoring the ability to use combo skills out of Homing Attack + //Restoring the ability to use combo skills out of Homing Attack only if the target is an enemy + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[0], (isHomingAttack && isEnemy ? SonicParameters.Action.AcceleCombo1 : SonicParameters.Action.HomingAttack)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[1], (isHomingAttack && isEnemy ? SonicParameters.Action.ChargeAttack : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[2], (isHomingAttack && isEnemy ? SonicParameters.Action.QuickCyloop : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[3], (isHomingAttack && isEnemy ? SonicParameters.Action.SpinSlash : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[4], (isHomingAttack && isEnemy ? SonicParameters.Action.Stomping : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[5], (isHomingAttack && isEnemy ? SonicParameters.Action.SonicBoom : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[0], (isHomingAttack && isEnemy ? SonicParameters.Action.AerialAcceleCombo1 : SonicParameters.Action.AerialHomingAttack)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[1], (isHomingAttack && isEnemy ? SonicParameters.Action.ChargeAttack : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[2], (isHomingAttack && isEnemy ? SonicParameters.Action.AerialQuickCyloop : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[4], (isHomingAttack && isEnemy ? SonicParameters.Action.Stomping : SonicParameters.Action.Root)); + RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[5], (isHomingAttack && isEnemy ? SonicParameters.Action.SonicBoom : SonicParameters.Action.Root)); RFL_SET_PARAM(SonicParametersInfo, common.commonPackage.attack.homingAttack.hitStopNameDead.pValue, 0); RFL_SET_PARAM(SonicParametersInfo, common.commonPackage.attack.homingAttackAir.hitStopNameDead.pValue, 0); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[0], (isHomingAttack ? SonicParameters.Action.AcceleCombo1 : SonicParameters.Action.HomingAttack)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[1], (isHomingAttack ? SonicParameters.Action.ChargeAttack : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[2], (isHomingAttack ? SonicParameters.Action.QuickCyloop : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[3], (isHomingAttack ? SonicParameters.Action.SpinSlash : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[4], (isHomingAttack ? SonicParameters.Action.Stomping : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitExistTarget[5], (isHomingAttack ? SonicParameters.Action.SonicBoom : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[0], (isHomingAttack ? SonicParameters.Action.AerialAcceleCombo1 : SonicParameters.Action.AerialHomingAttack)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[1], (isHomingAttack ? SonicParameters.Action.ChargeAttack : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[2], (isHomingAttack ? SonicParameters.Action.AerialQuickCyloop : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[4], (isHomingAttack ? SonicParameters.Action.Stomping : SonicParameters.Action.Root)); - RFL_SET_PARAM(SonicParametersInfo, common.combo.comboTable.root.transitInAir[5], (isHomingAttack ? SonicParameters.Action.SonicBoom : SonicParameters.Action.Root)); RFL_SET_PARAM(SonicParametersInfo, forwardView.modePackage.homingAttack.sonicBounce.bounceHorzSpeed, 2.5f); RFL_SET_PARAM(SonicParametersInfo, cyberspace.modePackage.homingAttack.sonicBounce.bounceHorzSpeed, 2.5f); RFL_SET_PARAM(SonicParametersInfo, cyberspaceSV.modePackage.homingAttack.sonicBounce.bounceHorzSpeed, -2.5f); @@ -136,10 +162,10 @@ Notes; if (AmyParametersInfo.pData != null) { + RFL_SET_PARAM(AmyParametersInfo, common.combo.comboTable.root.transitExistTarget[0], (isHomingAttack && isEnemy ? AmyParameters.Action.AmyTarotAttack : AmyParameters.Action.HomingAttack)); + RFL_SET_PARAM(AmyParametersInfo, common.combo.comboTable.root.transitInAir[0], (isHomingAttack && isEnemy ? AmyParameters.Action.AmyTarotAttack : AmyParameters.Action.HomingAttack)); RFL_SET_PARAM(AmyParametersInfo, common.commonPackage.attack.homingAttack.hitStopNameDead.pValue, 0); RFL_SET_PARAM(AmyParametersInfo, common.commonPackage.attack.homingAttackAir.hitStopNameDead.pValue, 0); - RFL_SET_PARAM(AmyParametersInfo, common.combo.comboTable.root.transitExistTarget[0], (isHomingAttack ? AmyParameters.Action.AmyTarotAttack : AmyParameters.Action.HomingAttack)); - RFL_SET_PARAM(AmyParametersInfo, common.combo.comboTable.root.transitInAir[0], (isHomingAttack ? AmyParameters.Action.AmyTarotAttack : AmyParameters.Action.HomingAttack)); RFL_SET_PARAM(AmyParametersInfo, forwardView.modePackage.homingAttack.sonicBounce.bounceVertSpeed, 17.0f); RFL_SET_PARAM(AmyParametersInfo, forwardView.modePackage.homingAttack.sonicBounce.bounceHorzSpeed, 2.5f); RFL_SET_PARAM(AmyParametersInfo, forwardView.modePackage.homingAttack.sonicBounceWeak.bounceVertSpeed, 12.0f); @@ -152,12 +178,12 @@ Notes; if (KnucklesParametersInfo.pData != null) { + RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitExistTarget[0], (isHomingAttack && isEnemy ? KnucklesParameters.Action.KnucklesPunch1 : KnucklesParameters.Action.HomingAttack)); + RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitExistTarget[4], (isHomingAttack && isEnemy ? KnucklesParameters.Action.Stomping : KnucklesParameters.Action.Root)); + RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitInAir[0], (isHomingAttack && isEnemy ? KnucklesParameters.Action.KnucklesPunch1 : KnucklesParameters.Action.HomingAttack)); + RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitInAir[4], (isHomingAttack && isEnemy ? KnucklesParameters.Action.Stomping : KnucklesParameters.Action.Root)); RFL_SET_PARAM(KnucklesParametersInfo, common.commonPackage.attack.homingAttack.hitStopNameDead.pValue, 0); RFL_SET_PARAM(KnucklesParametersInfo, common.commonPackage.attack.homingAttackAir.hitStopNameDead.pValue, 0); - RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitExistTarget[0], (isHomingAttack ? KnucklesParameters.Action.KnucklesPunch1 : KnucklesParameters.Action.HomingAttack)); - RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitExistTarget[4], (isHomingAttack ? KnucklesParameters.Action.Stomping : KnucklesParameters.Action.Root)); - RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitInAir[0], (isHomingAttack ? KnucklesParameters.Action.KnucklesPunch1 : KnucklesParameters.Action.HomingAttack)); - RFL_SET_PARAM(KnucklesParametersInfo, common.combo.comboTable.root.transitInAir[4], (isHomingAttack ? KnucklesParameters.Action.Stomping : KnucklesParameters.Action.Root)); RFL_SET_PARAM(KnucklesParametersInfo, forwardView.modePackage.homingAttack.sonicBounce.bounceVertSpeed, 17.0f); RFL_SET_PARAM(KnucklesParametersInfo, forwardView.modePackage.homingAttack.sonicBounce.bounceHorzSpeed, 2.5f); RFL_SET_PARAM(KnucklesParametersInfo, forwardView.modePackage.homingAttack.sonicBounceWeak.bounceVertSpeed, 12.0f);