diff --git a/Source/Contents/Skills/SkillInfo.cpp b/Source/Contents/Skills/SkillInfo.cpp index 2c0dc93..a46c504 100644 --- a/Source/Contents/Skills/SkillInfo.cpp +++ b/Source/Contents/Skills/SkillInfo.cpp @@ -479,30 +479,91 @@ bool ShowsCastEffect(int skillId) { } // OFFSET: 0x007747B0 +// FUNCTION: fn_08327 +void CEfstAction_ChangeSize::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { + if (actor) { + g_effectMgr->Retire(actor->render.accountId, 2374); + } +} // OFFSET: 0x007747E0 +// FUNCTION: fn_08328 +void CEfstAction_ChangeSize::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { + this->Slot00(efstId, value, 0, 0, actor, false); +} // OFFSET: 0x00774E20 +// FUNCTION: fn_08331 +void CEfstAction_GenderChange::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { + this->Slot00(efstId, value, 0, 0, actor, false); +} // OFFSET: 0x00774F30 +// FUNCTION: fn_08334 +void CEfstAction_ShowEffect::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { + this->Slot00(efstId, value, 0, 0, actor, false); +} // OFFSET: 0x00774FB0 +// FUNCTION: fn_08335 +void CSkillAction_RA_UNLIMIT::Slot08(int level, CGameActor* source) { + g_soundMgr->PlayWave("effect\\EF_BeginSpell.wav", 0.0f, 0.0f, 0.0f, 250, 40, 1.0f, 0); +} // OFFSET: 0x007756D0 +// FUNCTION: fn_08339 +void CEfstAction_UNLIMIT::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { + this->Slot00(efstId, value, 0, 0, actor, false); +} // OFFSET: 0x007764E0 +// FUNCTION: fn_08346 +EfstActionMessage CEfstAction_SHADOW_WEAPON::Slot03() { + return {LookupMessage(3766), 0xFFFF00}; +} // OFFSET: 0x00776510 +// FUNCTION: fn_08347 +EfstActionMessage CEfstAction_SHADOW_WEAPON::Slot04() { + return {LookupMessage(3767), 0xFF}; +} // OFFSET: 0x00777910 +// FUNCTION: fn_08359 +void CEfstAction_DANCING_KNIFE::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { + this->Slot00(efstId, value, 0, 0, actor, false); +} // OFFSET: 0x00777E80 +// FUNCTION: fn_08366 +void CEfstAction_SHADOW_EXCEED::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { + if (!actor) { + return; + } + + auto* effectActor = static_cast(actor); + while (effectActor->state.Attachments().HasId(1004)) { + actor->SendObjectMessage(nullptr, 109, 0, 1004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } +} // OFFSET: 0x00777EE0 +// FUNCTION: fn_08367 +void CEfstAction_SHADOW_EXCEED::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { + this->Slot00(efstId, value, 0, 0, actor, true); +} // OFFSET: 0x00777F00 +// FUNCTION: fn_08368 +EfstActionMessage CEfstAction_SHADOW_EXCEED::Slot03() { + return {LookupMessage(3762), 0xFFFF00}; +} // OFFSET: 0x00777F30 +// FUNCTION: fn_08369 +EfstActionMessage CEfstAction_SHADOW_EXCEED::Slot04() { + return {LookupMessage(3763), 0xFF}; +} // OFFSET: 0x00778140 // FUNCTION: fn_08371 @@ -523,19 +584,95 @@ bool CSkillAction_ABC_ABYSS_FLAME_ATK::Slot03(int argument) { } // OFFSET: 0x0077ACC0 +// FUNCTION: fn_08404 +std::pair CSkillActionMgr::ActionSlot01(int skillId) { + const auto found = this->m_skillActions.find(skillId); + std::unique_ptr action(found != this->m_skillActions.end() ? found->second() : nullptr); + if (!action) { + return {false, 8}; + } + + return {true, action->Slot01()}; +} // OFFSET: 0x0077AD90 +// FUNCTION: fn_08405 +EffectVector3 CellWorldPosition(int column, int row) { + if (!g_world.ActiveGameMode() || !static_cast(g_world.ActiveGameMode())->scene || + !static_cast(g_world.ActiveGameMode())->scene->terrain) { + return EffectVector3{0.0f, 0.0f, 0.0f}; + } + + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + static_cast(g_world.ActiveGameMode())->scene->terrain->Grid().CellOrigin(column, row, x, z); + y = static_cast(g_world.ActiveGameMode())->scene->terrain->Grid().Height(x, z); + return EffectVector3{x + 2.5f, y + 0.0f, z + 2.5f}; +} // OFFSET: 0x0077AEA0 +// FUNCTION: fn_08406 +EfstActionMessage CSkillActionMgr::EfstSlot03(int efstId) { + const auto found = this->m_efstActions.find(efstId); + std::unique_ptr action(found != this->m_efstActions.end() ? found->second() : nullptr); + if (!action) { + return {nullptr, 0xFFFF00}; + } + + return action->Slot03(); +} // OFFSET: 0x0077AF80 +// FUNCTION: fn_08407 +EfstActionMessage CSkillActionMgr::EfstSlot04(int efstId) { + const auto found = this->m_efstActions.find(efstId); + std::unique_ptr action(found != this->m_efstActions.end() ? found->second() : nullptr); + if (!action) { + return {nullptr, 0xFF}; + } + + return action->Slot04(); +} // OFFSET: 0x0077B060 +// FUNCTION: fn_08408 +int CSkillActionMgr::ActionSlot14(int skillId) { + const auto found = this->m_skillActions.find(skillId); + std::unique_ptr action(found != this->m_skillActions.end() ? found->second() : nullptr); + return action ? action->Slot14() : 0; +} // OFFSET: 0x0077B210 +// FUNCTION: fn_08409 +std::pair CSkillActionMgr::ActionSlot02(int skillId) { + const auto found = this->m_skillActions.find(skillId); + std::unique_ptr action(found != this->m_skillActions.end() ? found->second() : nullptr); + if (!action) { + return {false, 7}; + } + + return {true, action->Slot02()}; +} // OFFSET: 0x0077B2E0 +// FUNCTION: fn_08410 +bool CSkillActionMgr::ActionSlot03(int skillId, int argument) { + const auto found = this->m_skillActions.find(skillId); + std::unique_ptr action(found != this->m_skillActions.end() ? found->second() : nullptr); + return action ? action->Slot03(argument) : false; +} // OFFSET: 0x0077B3A0 +// FUNCTION: fn_08411 +bool CSkillActionMgr::ActionSlot04(int skillId) { + const auto found = this->m_skillActions.find(skillId); + std::unique_ptr action(found != this->m_skillActions.end() ? found->second() : nullptr); + return action ? action->Slot04() : false; +} // OFFSET: 0x0077B460 +// FUNCTION: fn_08412 +bool CSkillActionMgr::HasEfstAction(int efstId) { + return this->m_efstActions.find(efstId) != this->m_efstActions.end(); +}