diff --git a/Source/Contents/Skills/SkillActionDruid.cpp b/Source/Contents/Skills/SkillActionDruid.cpp index 2b88f91e..f0ec3763 100644 --- a/Source/Contents/Skills/SkillActionDruid.cpp +++ b/Source/Contents/Skills/SkillActionDruid.cpp @@ -1049,15 +1049,91 @@ EfstActionMessage CEfstAction_WEREWOLF::Slot04() { } // OFFSET: 0x00620270 +// FUNCTION: fn_04466 +void CSkillAction_DR_ENRAGE_WOLF::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0x08, 0x8D, 0x37, 0xC2, 0x8A, 0xA4, 0x88, 0x46, 0x02, 0x8F, 0x23, 0xA3}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x00620530 +// FUNCTION: fn_04472 +void CSkillAction_DR_BLOOD_HOWLING::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0x0F, 0x0F, 0x5A, 0x42, 0xC1, 0x5C, 0xE7, 0xB6, 0x1A, 0x0F, 0x5C, 0x43, 0xC2, 0x03}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x006207B0 +// FUNCTION: fn_04476 +void CSkillAction_DR_NOMERCY_CLAW::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0xBF, 0x76, 0xF0, 0xEA, 0x19, 0xE8, 0x76, 0x50, 0xB2, 0x75, 0xFC, 0xF8, 0x6B}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x006210B0 +// FUNCTION: fn_04485 +void CSkillAction_DR_ENRAGE_RAPTOR::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0xD2, 0x69, 0x25, 0xAC, 0x4C, 0x82, 0x74, 0xF3, 0xD6, 0x77, 0x23, 0xA2, 0x59, 0xE7}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x00621370 +// FUNCTION: fn_04491 +void CSkillAction_DR_PREENING::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0x67, 0x8B, 0x2A, 0xDC, 0x95, 0xDC, 0x41, 0xA2, 0x17}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x00620DF0 +// FUNCTION: fn_04481 +void CSkillAction_DR_CRUEL_BITE::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!target || !this->CanUse(source)) { + return; + } + + if (CRagEffect* effect = source->LaunchEffect(2439, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) { + effect->SendMsg(nullptr, 14, 0, reinterpret_cast(&target->render.position), 0, 0, 0, 0); + } + + const std::uint8_t effectSource[] = {0xC2, 0x4F, 0xEA, 0xB2, 0x0F, 0xD0, 0x45, 0x30, 0xD5, 0x58, 0x9F}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x006215E0 +// FUNCTION: fn_04495 +void CSkillAction_DR_SHOOTING_FEATHER::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!target || !this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0xB6, 0xA5, 0xE8, 0x9A, 0xD5, 0xCA, 0x89, 0xF4, 0x9A, 0xAB, 0xE2, 0x94, 0xD5, 0xCB, 0x82, 0xE1, 0xC5}; + thread_local EncryptedName effectName(effectSource); + if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { + effect->Slot17(ScreenAngle(&source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values)); + } +} diff --git a/Source/Contents/Skills/SkillActionKarnos.cpp b/Source/Contents/Skills/SkillActionKarnos.cpp index faa3b4e8..e14d3855 100644 --- a/Source/Contents/Skills/SkillActionKarnos.cpp +++ b/Source/Contents/Skills/SkillActionKarnos.cpp @@ -990,9 +990,75 @@ void CSkillAction_KR_NASTY_SLASH::Slot11(int level, CGameActor* source, CGameAct } // OFFSET: 0x005B3EA0 +// FUNCTION: fn_03369 +void CSkillAction_KR_FEATHER_SPRINKLE::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0x89, 0x46, 0xB4, 0x9B, 0x71, 0x34, 0xE3, 0x64, 0x9C, 0x53, 0xA7, 0x86, 0x77, 0x3A, 0xFD, 0x5E, 0xEF}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); + + const std::uint8_t bottomSource[] = {0x31, 0xE6, 0x88, 0xA1, 0xE9, 0xA0, 0x3F, 0x18, 0x24, 0xF3, 0x9B, 0xBC, 0xEF, 0xAE, 0x21, 0x22, 0x08, 0xE1, 0x86, 0xA1, 0xF5, 0xAA, 0x20, 0x47}; + thread_local EncryptedName bottomName(bottomSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(bottomName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x005B42B0 +// FUNCTION: fn_03374 +void CSkillAction_KR_SHARPEN_GUST::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source) || !target) { + return; + } + + const float angle = ScreenAngle(&source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values); + const std::uint8_t effectSource[] = {0x1E, 0x37, 0x98, 0x41, 0x93, 0x1E, 0x3B, 0x60, 0x0A, 0x2A, 0x8A, 0x47, 0xE3}; + thread_local EncryptedName effectName(effectSource); + if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { + effect->Slot17(angle); + effect->Slot18(30.0f); + } + + const std::uint8_t bottomSource[] = {0x4A, 0x89, 0xC8, 0x9D, 0x91, 0xC2, 0x3D, 0x58, 0x5E, 0x94, 0xDA, 0x9B, 0xBE, 0xC5, 0x3C, 0x73, 0x4D, 0x8E, 0xC4, 0xEF}; + thread_local EncryptedName bottomName(bottomSource); + if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(bottomName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { + effect->Slot17(angle); + effect->Slot18(30.0f); + } +} // OFFSET: 0x005B4FE0 +// FUNCTION: fn_03384 +void CSkillAction_KR_IRON_HOWLING::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + const std::uint8_t effectSource[] = {0xF6, 0xB1, 0x28, 0xD3, 0xB4, 0x2F, 0x8E, 0xE6, 0xF3, 0xAA, 0x29, 0xDA, 0xEB}; + thread_local EncryptedName effectName(effectSource); + g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); +} // OFFSET: 0x005B6040 +// FUNCTION: fn_03400 +void CSkillAction_SKID_KR_CHOP_CHOP::Slot11(int level, CGameActor* source, CGameActor* target) { + if (!this->CanUse(source)) { + return; + } + + if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, 2466, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { + effect->unknown_002C = 1; + } + + const std::uint8_t effectSource[] = {0x92, 0xAB, 0x86, 0xCD, 0xF2, 0x6E, 0x1D, 0x12, 0x81, 0x9C, 0x9A, 0xC8, 0xCF, 0x0D}; + thread_local EncryptedName effectName(effectSource); + if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(effectName.Text()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { + effect->Slot17(static_cast(std::max(0, rand() % 360))); + } + + if (CRagEffect* effect = source->LaunchEffect(2444, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) { + static_cast(effect)->SetLifetime(1000); + static_cast(effect)->SetDuration(500); + } +}