diff --git a/data/actions/IfritNormal.json b/data/actions/IfritNormal.json index a2a9e90c0..a85519d06 100644 --- a/data/actions/IfritNormal.json +++ b/data/actions/IfritNormal.json @@ -9,7 +9,7 @@ "curePotency": 0, "restorePercentage": 0, "nextCombo": [], - "targetFilter": 0, + "targetFilter": 1, "aggroModifier": 1.0, "statuses": { "caster": [], @@ -26,7 +26,24 @@ "curePotency": 0, "restorePercentage": 0, "nextCombo": [], - "targetFilter": 0, + "targetFilter": 1, + "aggroModifier": 1.0, + "statuses": { + "caster": [], + "target": [] + } + }, + "455": { + "name": "Eruption", + "potency": 1, + "comboPotency": 0, + "flankPotency": 0, + "frontPotency": 0, + "rearPotency": 0, + "curePotency": 0, + "restorePercentage": 0, + "nextCombo": [], + "targetFilter": 1, "aggroModifier": 1.0, "statuses": { "caster": [], @@ -42,7 +59,7 @@ "rearPotency": 0, "curePotency": 0, "restorePercentage": 0, - "targetFilter": 0, + "targetFilter": 1, "nextCombo": [], "aggroModifier": 1.0, "statuses": { @@ -59,22 +76,11 @@ "rearPotency": 0, "curePotency": 0, "restorePercentage": 0, - "targetFilter": 0, + "targetFilter": 1, "nextCombo": [], "aggroModifier": 1.0, "statuses": { - "caster": [ - { - "id": 394, - "duration": 8000, - "modifiers": [ - { - "modifier": "DamageTakenPercent", - "value": -100 - } - ] - } - ], + "caster": [], "target": [] } }, @@ -87,7 +93,7 @@ "rearPotency": 0, "curePotency": 0, "restorePercentage": 0, - "targetFilter": 0, + "targetFilter": 1, "nextCombo": [], "aggroModifier": 1.0, "statuses": { @@ -104,7 +110,7 @@ "rearPotency": 0, "curePotency": 0, "restorePercentage": 0, - "targetFilter": 0, + "targetFilter": 1, "nextCombo": [], "aggroModifier": 1.0, "statuses": { diff --git a/data/EncounterTimelines/IfritNormal.json b/data/encounterTimelines/IfritNormal.json similarity index 83% rename from data/EncounterTimelines/IfritNormal.json rename to data/encounterTimelines/IfritNormal.json index 41e1bc283..4bdf9dc73 100644 --- a/data/EncounterTimelines/IfritNormal.json +++ b/data/encounterTimelines/IfritNormal.json @@ -126,6 +126,15 @@ "startTime": 0, "type": "castAction" }, + { + "data": { + "selectorName": "Eruption", + "sourceActor": "Ifrit" + }, + "description": "Eruption snapshot", + "startTime": 8000, + "type": "snapshot" + }, { "data": { "actionId": 455, @@ -136,19 +145,10 @@ "sourceActor": "Ifrit", "targetType": "self" }, - "description": "Eruption", + "description": "Eruption precast", "startTime": 8000, "type": "castAction" }, - { - "data": { - "selectorName": "Eruption", - "sourceActor": "Ifrit" - }, - "description": "Eruption snapshot", - "startTime": 10000, - "type": "snapshot" - }, { "data": { "conditionId": 9, @@ -290,34 +290,34 @@ "startTime": 0, "type": "bNpcFlags" }, + { + "data": { + "actionTimelineId": 140, + "actorName": "Ifrit" + }, + "description": "", + "startTime": 2000, + "type": "actionTimeline" + }, { "data": { "actorName": "Ifrit", "pos": [ - 0, - 0, - 0 + 0.0, + 0.0, + 0.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", "targetType": "self" }, "description": "", - "startTime": 0, + "startTime": 2500, "type": "setPos" }, - { - "data": { - "actionTimelineId": 140, - "actorName": "Ifrit" - }, - "description": "", - "startTime": 2000, - "type": "actionTimeline" - }, { "data": { "actionTimelineId": 141, @@ -327,15 +327,6 @@ "startTime": 6000, "type": "actionTimeline" }, - { - "data": { - "flags": 16, - "targetActor": "" - }, - "description": "", - "startTime": 7000, - "type": "bNpcFlags" - }, { "data": { "actionId": 458, @@ -359,6 +350,15 @@ "description": "enable final phase", "startTime": 12000, "type": "setCondition" + }, + { + "data": { + "flags": 16, + "targetActor": "" + }, + "description": "", + "startTime": 15000, + "type": "bNpcFlags" } ] }, @@ -373,7 +373,7 @@ "opc": "set", "val": 1 }, - "description": "", + "description": "set directorvar success", "startTime": 0, "type": "directorVar" }, @@ -400,7 +400,7 @@ "opc": "set", "val": 2 }, - "description": "", + "description": "set directorvar fail", "startTime": 0, "type": "directorVar" }, @@ -431,29 +431,38 @@ "timepoints": [ { "data": { - "actionId": 455, + "actionId": 453, "selectorIndex": 0, "selectorName": "", "snapshot": false, "snapshotTime": 0, "sourceActor": "Ifrit", - "targetType": "self" + "targetType": "target" }, - "description": "", + "description": "Incinerate", "startTime": 0, "type": "castAction" }, + { + "data": { + "selectorName": "Eruption", + "sourceActor": "Ifrit" + }, + "description": "Eruption snapshot", + "startTime": 8000, + "type": "snapshot" + }, { "data": { "actionId": 455, "selectorIndex": 0, - "selectorName": "", + "selectorName": "Eruption", "snapshot": false, "snapshotTime": 0, "sourceActor": "Ifrit", - "targetType": "target" + "targetType": "self" }, - "description": "", + "description": "Eruption precast", "startTime": 8000, "type": "castAction" }, @@ -546,6 +555,25 @@ "id": 1, "name": "Eruption", "timepoints": [ + { + "data": { + "actorName": "Ifrit Control ", + "pos": [ + 0.0, + 0.0, + 0.0 + ], + "positionType": "absolute", + "rot": 0.0, + "selectorIndex": 0, + "selectorName": "Eruption", + "targetActor": "", + "targetType": "selectorPos" + }, + "description": "setPos to selector", + "startTime": 0, + "type": "setPos" + }, { "data": { "actionId": 733, @@ -554,11 +582,17 @@ "snapshot": false, "snapshotTime": 0, "sourceActor": "Ifrit Control ", - "targetType": "selector" + "targetType": "selectorPos" }, "description": "", "startTime": 100, "type": "castAction" + }, + { + "data": {}, + "description": "", + "startTime": 8000, + "type": "idle" } ] }, @@ -571,12 +605,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - -5, - 0, - 5 + -5.0, + 0.0, + 5.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -590,12 +624,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - -5, - 0, - -5 + -5.0, + 0.0, + -5.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -609,12 +643,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 5, - 0, - 5 + 5.0, + 0.0, + 5.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -628,12 +662,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 5, - 0, - -5 + 5.0, + 0.0, + -5.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -720,12 +754,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 0, - 0, - -20 + 0.0, + 0.0, + -20.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -739,12 +773,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 0, - 0, - 20 + 0.0, + 0.0, + 20.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -758,12 +792,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - -20, - 0, - 0 + -20.0, + 0.0, + 0.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -777,12 +811,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 20, - 0, - 0 + 20.0, + 0.0, + 0.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -796,12 +830,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - -15, - 0, - 15 + -15.0, + 0.0, + 15.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -815,12 +849,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - -15, - 0, - -15 + -15.0, + 0.0, + -15.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -834,12 +868,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 15, - 0, - -15 + 15.0, + 0.0, + -15.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -853,12 +887,12 @@ "data": { "actorName": "Ifrit Control ", "pos": [ - 15, - 0, - 15 + 15.0, + 0.0, + 15.0 ], "positionType": "absolute", - "rot": 0, + "rot": 0.0, "selectorIndex": 0, "selectorName": "", "targetActor": "", @@ -991,6 +1025,113 @@ "type": "setCondition" } ] + }, + { + "description": "", + "id": 4, + "name": "Interrupt Eruption", + "timepoints": [ + { + "data": { + "actionId": 733, + "sourceActor": "Ifrit Control " + }, + "description": "Interrupted Action 455 -> interrupt subactor 1 Action 733", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": {}, + "description": "", + "startTime": 8000, + "type": "idle" + } + ] + }, + { + "description": "", + "id": 5, + "name": "Interrupt Plumes", + "timepoints": [ + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "Interrupt Plumes Action 456 -> Interrupt Subactor 1 Action 734", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": { + "actionId": 734, + "sourceActor": "Ifrit Control " + }, + "description": "", + "startTime": 0, + "type": "interruptAction" + }, + { + "data": {}, + "description": "", + "startTime": 4000, + "type": "idle" + } + ] } ], "subactors": [ @@ -1024,7 +1165,7 @@ "loop": true, "paramData": { "hpMax": 100, - "hpMin": 70, + "hpMin": 69, "sourceActor": "Ifrit" }, "targetActor": "Ifrit", @@ -1038,7 +1179,7 @@ "loop": false, "paramData": { "hpMax": 71, - "hpMin": 50, + "hpMin": 49, "sourceActor": "Ifrit" }, "targetActor": "Ifrit", @@ -1051,8 +1192,8 @@ "id": 2, "loop": true, "paramData": { - "hpMax": 70, - "hpMin": 50, + "hpMax": 71, + "hpMin": 49, "sourceActor": "Ifrit" }, "targetActor": "Ifrit", @@ -1065,7 +1206,7 @@ "id": 6, "loop": false, "paramData": { - "hpMax": 50, + "hpMax": 51, "hpMin": 0, "sourceActor": "Ifrit" }, @@ -1201,6 +1342,32 @@ }, "targetActor": "Ifrit", "targetSchedule": "Reset" + }, + { + "condition": "interruptedAction", + "description": "", + "enabled": true, + "id": 15, + "loop": true, + "paramData": { + "actionId": 455, + "sourceActor": "Ifrit" + }, + "targetActor": "Ifrit Control", + "targetSchedule": "Interrupt Eruption" + }, + { + "condition": "interruptedAction", + "description": "", + "enabled": true, + "id": 16, + "loop": true, + "paramData": { + "actionId": 456, + "sourceActor": "Ifrit" + }, + "targetActor": "Ifrit Control", + "targetSchedule": "Interrupt Plumes" } ], "name": "Brand new timeline", @@ -1228,5 +1395,5 @@ "name": "Eruption" } ], - "version": 10 + "version": 12 } \ No newline at end of file diff --git a/src/common/Navi/NaviProvider.cpp b/src/common/Navi/NaviProvider.cpp index 5f769152a..121551b40 100644 --- a/src/common/Navi/NaviProvider.cpp +++ b/src/common/Navi/NaviProvider.cpp @@ -612,7 +612,7 @@ int32_t Sapphire::Common::Navi::NaviProvider::addAgent( const Common::FFXIVARR_P dtCrowdAgentParams params{}; std::memset( ¶ms, 0, sizeof( params ) ); params.height = 3.f; - params.maxAcceleration = 10.f; + params.maxAcceleration = 40.f; params.maxSpeed = speed; params.radius = radius; params.collisionQueryRange = speed * 0.5f; @@ -622,7 +622,7 @@ int32_t Sapphire::Common::Navi::NaviProvider::addAgent( const Common::FFXIVARR_P DT_CROWD_OPTIMIZE_VIS | DT_CROWD_OPTIMIZE_TOPO | DT_CROWD_OBSTACLE_AVOIDANCE; - params.separationWeight = 2.0f; + params.separationWeight = 100.0f; params.obstacleAvoidanceType = 3; @@ -637,7 +637,7 @@ void Sapphire::Common::Navi::NaviProvider::updateAgentParameters( int32_t naviAg dtCrowdAgentParams params{}; std::memset( ¶ms, 0, sizeof( params ) ); params.height = 3.f; - params.maxAcceleration = 10.f; + params.maxAcceleration = 40.f; params.maxSpeed = speed; params.radius = radius; params.collisionQueryRange = speed * 0.5f; @@ -647,7 +647,7 @@ void Sapphire::Common::Navi::NaviProvider::updateAgentParameters( int32_t naviAg DT_CROWD_OPTIMIZE_VIS | DT_CROWD_OPTIMIZE_TOPO | DT_CROWD_OBSTACLE_AVOIDANCE; - params.separationWeight = 2.0f; + params.separationWeight = 100.0f; params.obstacleAvoidanceType = 3; m_pCrowd->updateAgentParameters( naviAgentId, ¶ms ); } diff --git a/src/scripts/action/mobs/family/Ifrit/ActionHellfire.cpp b/src/scripts/action/mobs/family/Ifrit/ActionHellfire.cpp index 113d036a4..f101032a3 100644 --- a/src/scripts/action/mobs/family/Ifrit/ActionHellfire.cpp +++ b/src/scripts/action/mobs/family/Ifrit/ActionHellfire.cpp @@ -23,6 +23,22 @@ class ActionHellfire : public Sapphire::ScriptAPI::ActionScript static constexpr auto Potency = 300; + virtual void onStart( Sapphire::World::Action::Action& action ) override + { + auto pChara = action.getSourceChara(); + + // todo: should just put the modifier in the status script? + std::vector< World::Action::StatusModifier > modifiers = { + { { Common::ParamModifier::DamageTakenPercent, -100 } } + }; + + auto pEffect = std::make_shared< Sapphire::StatusEffect::StatusEffect >( + 325, pChara, pChara, 8000, modifiers, 0, 3000 + ); + + pChara->addStatusEffect( pEffect ); + } + void onExecute( Sapphire::World::Action::Action& action ) override { auto pSource = action.getSourceChara(); diff --git a/src/scripts/action/mobs/family/Ifrit/ActionVulcanBurst.cpp b/src/scripts/action/mobs/family/Ifrit/ActionVulcanBurst.cpp index a074cdd62..776098dac 100644 --- a/src/scripts/action/mobs/family/Ifrit/ActionVulcanBurst.cpp +++ b/src/scripts/action/mobs/family/Ifrit/ActionVulcanBurst.cpp @@ -30,21 +30,25 @@ class ActionVulcanBurst : public Sapphire::ScriptAPI::ActionScript if( !pActionBuilder ) return; + const auto& originPos = pSource->getPos(); for( auto& pActor : pSource->getInRangeActors() ) { if( !pActor->isPlayer() ) continue; auto pTarget = pActor->getAsChara(); - auto distance = Common::Util::distance( pSource->getPos(), pActor->getPos() ); + auto distance = Common::Util::distance( originPos, pActor->getPos() ); if( distance > 20.f ) continue; + // todo: this can probably be made generic auto dmg = action.calcDamage( Potency ); + if( dmg.first > 0 ) + { + pTarget->knockback( originPos, 20.f - distance ); + pActionBuilder->knockback( pTarget, 1, distance ); + } pActionBuilder->damage( pSource, pTarget, dmg.first, dmg.second ); - - if( dmg.first > 0 ) - pTarget->knockback( pSource->getPos(), 20.f ); } } }; diff --git a/src/scripts/statuseffect/buffs/StatusEffectInvincibility.cpp b/src/scripts/statuseffect/buffs/StatusEffectInvincibility.cpp new file mode 100644 index 000000000..d325d18ff --- /dev/null +++ b/src/scripts/statuseffect/buffs/StatusEffectInvincibility.cpp @@ -0,0 +1,31 @@ +#include