Decompile 11 functions in Source/Contents/Skills/SkillActionAlitea.cpp, Source/Contents/Actors/RenderObject.cpp, ...

Batch #5190 by eAthena: 0 byte-identical, 11 confirmed by peer review.

- fn_03369 CSkillAction_KR_FEATHER_SPRINKLE::Slot11: logic confirmed by peer review
- fn_03374 CSkillAction_KR_SHARPEN_GUST::Slot11: logic confirmed by peer review
- fn_03384 CSkillAction_KR_IRON_HOWLING::Slot11: logic confirmed by peer review
- fn_03400 CSkillAction_SKID_KR_CHOP_CHOP::Slot11: logic confirmed by peer review
- fn_04466 CSkillAction_DR_ENRAGE_WOLF::Slot11: logic confirmed by peer review
- fn_04472 CSkillAction_DR_BLOOD_HOWLING::Slot11: logic confirmed by peer review
- fn_04476 CSkillAction_DR_NOMERCY_CLAW::Slot11: logic confirmed by peer review
- fn_04481 CSkillAction_DR_CRUEL_BITE::Slot11: logic confirmed by peer review
- fn_04485 CSkillAction_DR_ENRAGE_RAPTOR::Slot11: logic confirmed by peer review
- fn_04491 CSkillAction_DR_PREENING::Slot11: logic confirmed by peer review
- fn_04495 CSkillAction_DR_SHOOTING_FEATHER::Slot11: logic confirmed by peer review

Peer-reviewed-by: alisonrag, OvoKore, zindokar
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
This commit is contained in:
ragnarok-clanker 2026-10-30 10:41:17 +00:00
commit 7497486fe9
2 changed files with 142 additions and 0 deletions

View file

@ -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<sizeof(effectSource), 0x31D7C1EDA345E36DULL> 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<sizeof(effectSource), 0xD98F03A52D35636DULL> 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<sizeof(effectSource), 0x0F0F8B6B8F9D19D1ULL> 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<sizeof(effectSource), 0x812BE72BCD5707B7ULL> 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<sizeof(effectSource), 0xC52FB5FBB94FF917ULL> 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<int>(&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<sizeof(effectSource), 0x59278F63D79F3DA1ULL> 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<sizeof(effectSource), 0x93E7A3A1F587CDC5ULL> 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<CGameMode*>(g_modeMgr.GetGameMode())->camera->frame.view.values));
}
}

View file

@ -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<sizeof(effectSource), 0x3B915119EFD523EFULL> 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<sizeof(bottomSource), 0x474DC581D5E98357ULL> 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<CGameMode*>(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<sizeof(effectSource), 0x3F557BE333F95F6DULL> 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<sizeof(bottomSource), 0x0753A7E1EFA9E139ULL> 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<sizeof(effectSource), 0x91E147EBBD47C39FULL> 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<sizeof(effectSource), 0x7D750DADBDE9C3F1ULL> 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<float>(std::max(0, rand() % 360)));
}
if (CRagEffect* effect = source->LaunchEffect(2444, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) {
static_cast<CWhirlwindEffect*>(effect)->SetLifetime(1000);
static_cast<CWhirlwindEffect*>(effect)->SetDuration(500);
}
}