#include "Client/Mode/CGameMode.h" #include "Client/Session.h" #include "Client/Mode/ModeMgr.h" #include "Contents/Actors/GameActor.h" #include "Contents/Actors/Pc.h" #include "Contents/Camera/Camera.h" #include "Contents/EffectResourceSwitcher.h" #include "Contents/Effects/EZ2STREffectEx.h" #include "Contents/Effects/Effect.h" #include "Contents/Effects/EffectActor.h" #include "Contents/Effects/EffectLists.h" #include "Contents/Effects/RagEffect.h" #include "Contents/MessageTable.h" #include "Contents/Skills/SkillInfo.h" #include "Utility/Cipher/XorBytes.h" #include "Utility/Math/Vector3d.h" #include #include #include #include #include #include namespace { template class EncryptedName { public: // INLINED template explicit EncryptedName(const Byte (&source)[Length]) : m_encrypted(true) { for (std::uint64_t index = 0; index < Length; ++index) { this->m_text[index] = source[index]; } } ~EncryptedName() { for (std::uint64_t index = 0; index < Length; ++index) { this->m_text[index] = 0; } } const char* Text() { if (this->m_encrypted) { utility::XorBytes(this->m_text, Length, Key); this->m_encrypted = false; } return reinterpret_cast(this->m_text); } private: std::uint8_t m_text[Length]; bool m_encrypted; }; } class CSkillAction_AnimalForm : public CSkillAction { public: bool CanUse(CGameActor* actor); virtual bool Slot17(CGameActor* actor) = 0; virtual void Slot18(CGameActor* actor) = 0; }; class CSkillAction_Direction { public: void SpawnDirectionalEffect(CGameActor* source, CGameActor* target, std::string_view name); int GetDirection(float angle); bool IsValidDirection(unsigned int direction); }; class CSkillAction_DamageWereRaptorForm : public CSkillAction_AnimalForm, public CSkillAction_Direction { public: void sub_5A4760(int sourceActor, CGameActor* target); __declspec(noinline) void sub_5A4930(int level, CGameActor* source); __declspec(noinline) void sub_5A4B00(int level, CGameActor* source); void Slot16(int level, CGameActor* source, CGameActor* target) override; bool Slot17(CGameActor* actor) override; void Slot18(CGameActor* actor) override; }; class CSkillAction_DamageWereWolfForm : public CSkillAction_AnimalForm { public: void Slot16(int level, CGameActor* source, CGameActor* target) override; bool Slot17(CGameActor* actor) override; void Slot18(CGameActor* actor) override; }; class CSkillAction_Earthing : public CSkillAction { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot16(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_Icing : public CSkillAction { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot16(int level, CGameActor* source, CGameActor* target) override; void SpawnIcing(CGameActor* target); }; class CSkillAction_Thundering : public CSkillAction { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot16(int level, CGameActor* source, CGameActor* target) override; virtual void Slot17(CGameActor* source) = 0; }; class CSkillAction_ThunderingBasic : public CSkillAction_Thundering { public: void Slot17(CGameActor* source) override; }; class CSkillAction_ThunderingExpand : public CSkillAction_Thundering { public: void Slot17(CGameActor* source) override; }; class CEfstAction_BasicAction : public CEfstAction { public: void Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) override; void Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) override; void Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) override; virtual int Slot05(int efstId, int argument4) = 0; }; class CEfstAction_AnimalForm : public CEfstAction { public: void Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) override; void ResetAnimalForm(CRenderObject* actor); void ApplyAnimalForm(CRenderObject* actor, int form); void Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) override; }; class CSkillAction_AT_ALPHA_CLAW : public CSkillAction_DamageWereWolfForm { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_PULSE_OF_MADNESS : public CSkillAction_DamageWereWolfForm { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_PULSE_OF_MADNESS : public CEfstAction { public: EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_PRIMAL_CLAW : public CSkillAction_DamageWereWolfForm { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_FERAL_CLAW : public CSkillAction_DamageWereWolfForm { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_FRENZY_FANG : public CSkillAction_DamageWereWolfForm { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_PINION_SHOT : public CSkillAction_DamageWereRaptorForm { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; void Slot15(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_QUILL_SPEAR : public CSkillAction_DamageWereRaptorForm { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_QUILL_SPEAR_S : public CSkillAction_DamageWereRaptorForm { public: void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_NATURE_HARMONY : public CSkillAction { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_NATURE_HARMONY : public CEfstAction { public: EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_GRAVITY_HOLE : public CSkillAction { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; void Slot16(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_CHILLING_BLAST : public CSkillAction_Icing { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_GLACIER_MONOLITH : public CSkillAction_Icing { public: int Slot02() override; int Slot14() override; }; class CSkillObjectAction_AT_GLACIER_MONOLITH : public CSkillObjectAction { public: void Slot00(int argument, CRenderObject* object, CGameActor* source) override; void Slot01(CRenderObject* object) override; }; class CSkillAction_AT_GLACIER_NOVA : public CSkillAction_Icing { public: int Slot02() override; void Slot12(vector3d position, int argument2, int argument3) override; }; class CSkillAction_AT_GLACIER_SHARD : public CSkillAction_Icing { public: void Slot10(int level, CGameActor* source, int argument3, int argument4, int argument5) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_GLACIER_STOMP : public CSkillAction_Icing { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_ROARING_CHARGE : public CSkillAction_ThunderingBasic { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_ROARING_CHARGE_S : public CSkillAction_ThunderingExpand { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_ROARING_PIERCER : public CSkillAction_ThunderingBasic { public: void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_ROARING_PIERCEER_S : public CSkillAction_ThunderingExpand { public: void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_FURIOS_STORM : public CSkillAction_Thundering { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; void Slot17(CGameActor* source) override; }; class CEfstAction_FURIOS_STORM : public CEfstAction { public: void Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) override; }; class CSkillAction_AT_ALPHA_PHASE : public CSkillAction { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_ALPHA_PHASE : public CEfstAction { public: EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_APEX_PHASE : public CSkillAction { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_AT_APEX_PHASE : public CEfstAction { public: EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_FLIP_FLAP : public CSkillAction { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_FLIP_FLAP : public CEfstAction { public: EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_AERO_SYNC : public CSkillAction { public: bool Slot00() override; int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_FLIP_FLAP_TARGET : public CEfstAction { public: void Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) override; EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_SAVAGE_LUNGE : public CSkillAction_DamageWereWolfForm { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_TEMPEST_FLAP : public CSkillAction_DamageWereRaptorForm { public: int Slot01() override; int Slot02() override; void Slot08(int level, CGameActor* source) override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_TERRA_HARVEST : public CSkillAction_Earthing { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CSkillAction_AT_TERRA_WAVE : public CSkillAction_Earthing { public: void Slot12(vector3d position, int argument2, int argument3) override; }; class CSkillAction_AT_SOLID_STOMP : public CSkillAction_Earthing { public: int Slot02() override; void Slot11(int level, CGameActor* source, CGameActor* target) override; }; class CEfstAction_SOLID_STOMP : public CEfstAction { public: EfstActionMessage Slot03() override; EfstActionMessage Slot04() override; }; class CSkillAction_AT_ZEPHYR_LINK : public CSkillAction { public: int Slot02() override; }; class CEfstAction_ZEPHYR_LINK : public CEfstAction { public: void Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) override; void Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) override; void Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) override; }; class CEfstAction_INSANE : public CEfstAction { public: void Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) override; void Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) override; void Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) override; }; class CEfstAction_INSANE2 : public CEfstAction_INSANE { public: void Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) override; }; class CEfstAction_INSANE3 : public CEfstAction_INSANE { public: void Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) override; }; // OFFSET: 0x005A50B0 // FUNCTION: fn_03155 void CSkillAction_DamageWereRaptorForm::Slot18(CGameActor* actor) { if (actor) { g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x7B', '\x43', '\x92', '\x8F', '\x84', '\x01', '\x32', '\x6A', '\x7A', '\x43', '\xA8', '\x95', '\x8C', '\x05', '\x19', '\x72', '\x6D', '\x31'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A52B0 // FUNCTION: fn_03156 void CSkillAction_DamageWereWolfForm::Slot18(CGameActor* actor) { if (actor) { g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x31', '\x8F', '\xEA', '\xB3', '\xAE', '\xC5', '\x2A', '\x44', '\x30', '\x8F', '\xD0', '\xAC', '\xA8', '\xDD', '\x13', '\x33'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A54B0 // FUNCTION: fn_03157 void CSkillAction_Icing::SpawnIcing(CGameActor* target) { if (target) { if (CEffect* effect = g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x18, 0x9A, 0x3C, 0xAA, 0xE9, 0x74, 0x11, 0x91}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot22(0.9f); } } } // OFFSET: 0x005A56C0 // FUNCTION: fn_03158 void CSkillAction_ThunderingBasic::Slot17(CGameActor* source) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xA3', '\x27', '\x76', '\xFB', '\xBD', '\xE0', '\xDD', '\x56', '\xB9', '\x28', '\x5C', '\xF4', '\xAD', '\xF1', '\xCE', '\x5C', '\xBC', '\x10', '\x64', '\x95'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A58C0 // FUNCTION: fn_03159 void CSkillAction_ThunderingExpand::Slot17(CGameActor* source) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xCD, 0x65, 0x5A, 0xCF, 0x27, 0x9E, 0x7D, 0x20, 0xD7, 0x6A, 0x70, 0xC0, 0x37, 0x8F, 0x6E, 0x2A, 0xD2, 0x52, 0x56, 0xA1}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A5AC0 // FUNCTION: fn_03160 void CSkillAction_Direction::SpawnDirectionalEffect(CGameActor* source, CGameActor* target, std::string_view name) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); const int direction = this->GetDirection(angle); if (!this->IsValidDirection(direction)) { return; } const bool flipped = direction == 1 || direction == 2; if (CEffect* effect = g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId(name.data()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot26(flipped); effect->Slot17(static_cast((static_cast(angle + (flipped ? -180.0f : 0.0f)) + 360) % 360)); } } // OFFSET: 0x005A5D20 // FUNCTION: fn_03161 int CSkillAction_Earthing::Slot01() { return 60; } // OFFSET: 0x005A5D30 // FUNCTION: fn_03162 int CSkillAction_Icing::Slot01() { return 61; } // OFFSET: 0x005A5D40 // FUNCTION: fn_03163 int CSkillAction_Thundering::Slot01() { return 61; } // OFFSET: 0x005A5D50 // FUNCTION: fn_03164 int CSkillAction_Direction::GetDirection(float angle) { if (angle > 60.0f && angle <= 120.0f) { return 0; } if (angle > 120.0f && angle <= 240.0f) { return 1; } if (angle > 240.0f && angle <= 300.0f) { return 2; } if ((angle > 300.0f && angle <= 360.0f) || (angle >= 0.0f && angle <= 60.0f)) { return 3; } return -1; } // OFFSET: 0x005A5DE0 // FUNCTION: fn_03165 int CSkillAction_Earthing::Slot02() { return 62; } // OFFSET: 0x005A5DF0 // FUNCTION: fn_03166 int CSkillAction_Icing::Slot02() { return 64; } // OFFSET: 0x005A5E00 // FUNCTION: fn_03167 int CSkillAction_Thundering::Slot02() { return 64; } // OFFSET: 0x005A5E10 // FUNCTION: fn_03168 bool CSkillAction_DamageWereRaptorForm::Slot17(CGameActor* actor) { return actor->GetUnknown0404() == 2; } // OFFSET: 0x005A5E30 // FUNCTION: fn_03169 bool CSkillAction_DamageWereWolfForm::Slot17(CGameActor* actor) { return actor->GetUnknown0404() == 1; } // OFFSET: 0x005A5E90 // FUNCTION: fn_03171 bool CSkillAction_Direction::IsValidDirection(unsigned int direction) { return direction <= 3; } // OFFSET: 0x005A5EA0 // FUNCTION: fn_03172 void CSkillAction_DamageWereRaptorForm::Slot16(int level, CGameActor* source, CGameActor* target) { this->Slot18(source); } // OFFSET: 0x005A5EB0 // FUNCTION: fn_03173 void CSkillAction_DamageWereWolfForm::Slot16(int level, CGameActor* source, CGameActor* target) { this->Slot18(source); } // OFFSET: 0x005A5EC0 // FUNCTION: fn_03174 void CSkillAction_Earthing::Slot16(int level, CGameActor* source, CGameActor* target) { if (!source) { return; } if (CRagEffect* effect = source->LaunchEffect(0, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) { effect->SendMsg(nullptr, 14, 0, reinterpret_cast(&source->render.position), 0, 0, 0, 0); } } // OFFSET: 0x005A5F30 // FUNCTION: fn_03175 void CSkillAction_Icing::Slot16(int level, CGameActor* source, CGameActor* target) { this->SpawnIcing(source); } // OFFSET: 0x005A5F40 // FUNCTION: fn_03176 void CSkillAction_Thundering::Slot16(int level, CGameActor* source, CGameActor* target) { this->Slot17(source); } // OFFSET: 0x005A5F50 // FUNCTION: fn_03177 void CEfstAction_BasicAction::Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) { if (actor) { const int id = this->Slot05(efstId, argument4); if (id >= 0) { g_effectMgr->Spawn(actor->render.accountId, id, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } } // OFFSET: 0x005A5FB0 // FUNCTION: fn_03178 void CSkillAction_Earthing::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(57, level / 16); } } // OFFSET: 0x005A5FE0 // FUNCTION: fn_03179 void CSkillAction_Icing::Slot08(int level, CGameActor* source) { if (source) { if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId("ice_cast"), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot14(level); } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId("ice_cast_bottom"), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot14(level); } } } // OFFSET: 0x005A6260 // FUNCTION: fn_03180 void CSkillAction_Thundering::Slot08(int level, CGameActor* source) { if (source) { if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xB1', '\xA5', '\xF2', '\x9B', '\xC5', '\xC6', '\x95', '\xFA', '\xAB', '\xAA', '\xD8', '\x96', '\xC0', '\xD0', '\x93', '\x93'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot14(level); } } } // OFFSET: 0x005A6470 // FUNCTION: fn_03181 void CEfstAction_AnimalForm::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { this->ResetAnimalForm(actor); } // OFFSET: 0x005A6480 // FUNCTION: fn_03182 void CEfstAction_BasicAction::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { if (actor) { const int id = this->Slot05(efstId, argument4); if (id >= 0) { g_effectMgr->Retire(actor->render.accountId, id); } } } // OFFSET: 0x005A64C0 // FUNCTION: fn_03183 void CEfstAction_AnimalForm::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { this->Slot00(efstId, value, 0, 0, actor, false); } // OFFSET: 0x005A64E0 // FUNCTION: fn_03184 void CEfstAction_BasicAction::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { if (actor) { this->Slot00(efstId, value, argument3, argument4, actor, false); } } // OFFSET: 0x005A6510 // FUNCTION: fn_03185 void CEfstAction_AnimalForm::ResetAnimalForm(CRenderObject* actor) { if (!actor) { return; } CGameActor* gameActor = static_cast(actor); if (g_session.m_aid == actor->render.accountId) { g_session.SetUnknown8134(0); } gameActor->SetUnknown0404(0); gameActor->Slot21(gameActor->GetUnknown0404Job()); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xC5, 0x62, 0x23, 0xB8, 0x59, 0x89, 0x2B}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); gameActor->Slot32(); } // OFFSET: 0x005A6740 // FUNCTION: fn_03186 void CEfstAction_AnimalForm::ApplyAnimalForm(CRenderObject* actor, int form) { if (actor) { CGameActor* gameActor = static_cast(actor); if (g_session.m_aid == actor->render.accountId) { g_session.SetUnknown8134(form); } gameActor->SetUnknown0404(form); gameActor->Slot21(gameActor->GetUnknown0404Job()); } } // OFFSET: 0x005A6790 // FUNCTION: fn_03187 int CSkillAction_AT_ALPHA_CLAW::Slot02() { return 76; } // OFFSET: 0x005A67A0 // FUNCTION: fn_03188 void CSkillAction_AT_ALPHA_CLAW::Slot11(int level, CGameActor* source, CGameActor* target) { if (!this->CanUse(source) || !target) { return; } g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x7E, 0x5D, 0xBD, 0x8F, 0x8C, 0x2A, 0x0E, 0x71, 0x7E, 0x46, 0xCD}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } // OFFSET: 0x005A69B0 // FUNCTION: fn_03189 int CSkillAction_AT_PULSE_OF_MADNESS::Slot01() { return 66; } // OFFSET: 0x005A69C0 // FUNCTION: fn_03190 int CSkillAction_AT_PULSE_OF_MADNESS::Slot02() { return 68; } // OFFSET: 0x005A69D0 // FUNCTION: fn_03191 void CSkillAction_AT_PULSE_OF_MADNESS::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(54, level / 16); } } // OFFSET: 0x005A6A00 // FUNCTION: fn_03192 void CSkillAction_AT_PULSE_OF_MADNESS::Slot11(int level, CGameActor* source, CGameActor* target) { if (source && source->GetUnknown0404() != 0) { this->Slot17(source); } g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x57, 0x74, 0x6B, 0x1E, 0x66, 0x9A, 0x9C, 0x49, 0x78, 0x6C, 0x66, 0x09, 0x6D, 0xA0, 0x80, 0x5C, 0x27}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } // OFFSET: 0x005A6C00 // FUNCTION: fn_03193 EfstActionMessage CEfstAction_PULSE_OF_MADNESS::Slot03() { return {LookupMessage(4668), 0xFFFF00}; } // OFFSET: 0x005A6C30 // FUNCTION: fn_03194 EfstActionMessage CEfstAction_PULSE_OF_MADNESS::Slot04() { return {LookupMessage(4669), 0xFF}; } // OFFSET: 0x005A6C60 // FUNCTION: fn_03195 int CSkillAction_AT_FRENZY_FANG::Slot02() { return 70; } // OFFSET: 0x005A6C70 // FUNCTION: fn_03196 void CSkillAction_AT_FRENZY_FANG::Slot11(int level, CGameActor* source, CGameActor* target) { if (!this->CanUse(source)) { return; } if (!target) { return; } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xD5, 0x15, 0xA6, 0x3D, 0x83, 0xE2, 0x6A, 0x71, 0xD2, 0x09, 0xA4, 0x53}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); effect->Slot26(angle < 90.0f || angle > 270.0f); } } // OFFSET: 0x005A6EE0 // FUNCTION: fn_03197 int CSkillAction_AT_PINION_SHOT::Slot01() { return 60; } // OFFSET: 0x005A6EF0 // FUNCTION: fn_03198 int CSkillAction_AT_PINION_SHOT::Slot02() { return 78; } // OFFSET: 0x005A6F00 // FUNCTION: fn_03199 void CSkillAction_AT_PINION_SHOT::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(56, level / 16); } } // OFFSET: 0x005A6F30 // FUNCTION: fn_03200 void CSkillAction_AT_PINION_SHOT::Slot11(int level, CGameActor* source, CGameActor* target) { if (!target) { return; } if (!this->CanUse(source)) { return; } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x67, 0x90, 0x21, 0xD0, 0x94, 0xDB, 0x70, 0xB6, 0x7F, 0x96, 0x3B, 0xB9}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); effect->Slot17(angle); } } // OFFSET: 0x005A7180 // FUNCTION: fn_03201 void CSkillAction_AT_PINION_SHOT::Slot15(int level, CGameActor* source, CGameActor* target) { this->sub_5A4930(level, source); } // OFFSET: 0x005A71A0 // FUNCTION: fn_03202 int CSkillAction_AT_QUILL_SPEAR::Slot01() { return 60; } // OFFSET: 0x005A71B0 // FUNCTION: fn_03203 int CSkillAction_AT_QUILL_SPEAR::Slot02() { return 79; } // OFFSET: 0x005A71C0 // FUNCTION: fn_03204 void CSkillAction_AT_QUILL_SPEAR::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(56, level / 16); } } // OFFSET: 0x005A71F0 // FUNCTION: fn_03205 void CSkillAction_AT_QUILL_SPEAR::Slot11(int level, CGameActor* source, CGameActor* target) { if (!target || !this->CanUse(source)) { return; } const int effectId = CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xB4, 0xB8, 0xEE, 0x99, 0xCD, 0xFC, 0x94, 0xE3, 0xA0, 0xAC, 0xF5, 0xAA, 0x92, 0xDB, 0xD0, 0x93}; thread_local EncryptedName name(bytes); return name.Text(); }()); if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, effectId, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); effect->Slot17(angle); if (CRagEffect* ragEffect = source->LaunchEffect(2442, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) { ragEffect->SendMsg(nullptr, 14, 0, reinterpret_cast(&target->render.position), 0, 0, 0, 0); } } } // OFFSET: 0x005A74A0 // FUNCTION: fn_03206 void CSkillAction_AT_QUILL_SPEAR_S::Slot11(int level, CGameActor* source, CGameActor* target) { if (!target || !this->CanUse(source)) { return; } const int effectId = CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xA6, 0x3A, 0x6A, 0xF9, 0xB5, 0xDA, 0xDC, 0x4F, 0xB2, 0x2E, 0x71, 0xCA, 0xEC, 0xFD, 0x98, 0x3F}; thread_local EncryptedName name(bytes); return name.Text(); }()); if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, effectId, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); effect->Slot17(angle); if (CRagEffect* ragEffect = source->LaunchEffect(2442, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) { ragEffect->SendMsg(nullptr, 14, 0, reinterpret_cast(&target->render.position), 0, 0, 0, 0); } } } // OFFSET: 0x005A7750 // FUNCTION: fn_03207 int CSkillAction_AT_NATURE_HARMONY::Slot01() { return 61; } // OFFSET: 0x005A7760 // FUNCTION: fn_03208 int CSkillAction_AT_NATURE_HARMONY::Slot02() { return 64; } // OFFSET: 0x005A7770 // FUNCTION: fn_03209 void CSkillAction_AT_NATURE_HARMONY::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(12, level / 16); } } // OFFSET: 0x005A77A0 // FUNCTION: fn_03210 void CSkillAction_AT_NATURE_HARMONY::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xD7, 0x6C, 0x5B, 0xD4, 0x31, 0x9E, 0x50, 0x21, 0xD8, 0x7F, 0x42, 0xCE, 0x2D, 0x82, 0x0F}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A79B0 // FUNCTION: fn_03211 EfstActionMessage CEfstAction_NATURE_HARMONY::Slot03() { return {LookupMessage(4684), 0xFFFF00}; } // OFFSET: 0x005A79E0 // FUNCTION: fn_03212 EfstActionMessage CEfstAction_NATURE_HARMONY::Slot04() { return {LookupMessage(4685), 0xFF}; } // OFFSET: 0x005A7A10 // FUNCTION: fn_03213 int CSkillAction_AT_GRAVITY_HOLE::Slot01() { return 61; } // OFFSET: 0x005A7A20 // FUNCTION: fn_03214 int CSkillAction_AT_GRAVITY_HOLE::Slot02() { return 64; } // OFFSET: 0x005A7A30 // FUNCTION: fn_03215 void CSkillAction_AT_GRAVITY_HOLE::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(12, level / 16); } } // OFFSET: 0x005A7A60 // FUNCTION: fn_03216 void CSkillAction_AT_GRAVITY_HOLE::Slot16(int level, CGameActor* source, CGameActor* target) { if (source) { if (CRagEffect* effect = source->LaunchEffect(0, vector3d{0.0f, 0.0f, 0.0f}, 0.0f)) { effect->SendMsg(nullptr, 14, 0, reinterpret_cast(&source->render.position), 0, 0, 0, 0); } } } // OFFSET: 0x005A7AD0 // FUNCTION: fn_03217 void CSkillAction_AT_GRAVITY_HOLE::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x16', '\x8B', '\x38', '\x83', '\xE8', '\x69', '\x1C', '\xCE', '\x19', '\x96', '\x35', '\x90', '\x81'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x6C', '\x09', '\xBE', '\x17', '\x22', '\x13', '\xA8', '\x2C', '\x63', '\x14', '\xB3', '\x04', '\x14', '\x05', '\xBE', '\x07', '\x7F', '\x14', '\xB2', '\x61'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A7E70 // FUNCTION: fn_03218 int CSkillAction_AT_CHILLING_BLAST::Slot02() { return 65; } // OFFSET: 0x005A7E80 // FUNCTION: fn_03219 void CSkillAction_AT_CHILLING_BLAST::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x0E', '\x0B', '\x5C', '\x41', '\xC9', '\x6A', '\xE1', '\xBE', '\x32', '\x01', '\x59', '\x4C', '\xD6', '\x77', '\x8F'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xB2', '\x71', '\xF4', '\xE3', '\x07', '\xE2', '\x61', '\x68', '\x8E', '\x7B', '\xF1', '\xEE', '\x18', '\xFF', '\x50', '\x6D', '\xBE', '\x6D', '\xE9', '\xE0', '\x06', '\x8B'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A8230 // FUNCTION: fn_03220 int CSkillAction_AT_GLACIER_MONOLITH::Slot14() { return 9; } // OFFSET: 0x005A8240 // FUNCTION: fn_03221 int CSkillAction_AT_GLACIER_MONOLITH::Slot02() { return 65; } // OFFSET: 0x005A8250 // FUNCTION: fn_03222 void CSkillObjectAction_AT_GLACIER_MONOLITH::Slot00(int argument, CRenderObject* object, CGameActor* source) { if (!object) { return; } g_effectMgr->Spawn(object->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x6E', '\xC5', '\x26', '\x3C', '\xB0', '\x38', '\x07', '\x8C', '\x64', '\xC6', '\x29', '\x30', '\xB5', '\x34', '\x01', '\xBB', '\x56', '\xDA', '\x33', '\x3E', '\xAB', '\x29', '\x75'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(object->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x0A', '\x8F', '\x24', '\xC0', '\x84', '\xA4', '\xA5', '\x6E', '\x00', '\x8C', '\x2B', '\xCC', '\x81', '\xA8', '\xA3', '\x59', '\x32', '\x90', '\x31', '\xC2', '\x9F', '\xB5', '\x88', '\x53', '\x02', '\x97', '\x31', '\xCC', '\x80', '\xC1'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); if (CEffect* effect = g_effectMgr->Spawn(object->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x16', '\x77', '\x92', '\x9C', '\xEE', '\x40', '\xE3', '\x98', '\x1C', '\x74', '\x9D', '\x90', '\xEB', '\x4C', '\xE5', '\xAF', '\x2E', '\x77', '\x9C', '\x90', '\xF7', '\x25'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot16(990); } if (CEffect* effect = g_effectMgr->Spawn(object->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x0A', '\x5F', '\x6E', '\xF6', '\xB2', '\x20', '\xA1', '\x36', '\x00', '\x5C', '\x61', '\xFA', '\xB7', '\x2C', '\xA7', '\x01', '\x32', '\x5F', '\x60', '\xFA', '\xAB', '\x1A', '\xB1', '\x06', '\x19', '\x47', '\x60', '\xF8', '\xDB'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot16(990); } } // OFFSET: 0x005A8960 // FUNCTION: fn_03223 void CSkillObjectAction_AT_GLACIER_MONOLITH::Slot01(CRenderObject* object) { if (!object) { return; } g_effectMgr->Retire(object->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x48', '\xF3', '\xD2', '\xB8', '\x86', '\xAC', '\x65', '\xC4', '\x42', '\xF0', '\xDD', '\xB4', '\x83', '\xA0', '\x63', '\xF3', '\x70', '\xF3', '\xDC', '\xB4', '\x9F', '\xC9'}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Retire(object->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xBA', '\xB9', '\x28', '\x22', '\x1E', '\x70', '\x49', '\x72', '\xB0', '\xBA', '\x27', '\x2E', '\x1B', '\x7C', '\x4F', '\x45', '\x82', '\xB9', '\x26', '\x2E', '\x07', '\x4A', '\x59', '\x42', '\xA9', '\xA1', '\x26', '\x2C', '\x77'}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x86', '\xF7', '\x92', '\x18', '\x84', '\xE2', '\x8D', '\x3E', '\x8C', '\xF4', '\x9D', '\x14', '\x81', '\xEE', '\x8B', '\x09', '\xBE', '\xFE', '\x9D', '\x1F', '\xED'}; thread_local EncryptedName name(bytes); return name.Text(); }()), object->render.position.x, object->render.position.y, object->render.position.z, 0, -1, 0, 0); g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x98', '\xE9', '\x46', '\x6E', '\x0C', '\x5A', '\xEB', '\x22', '\x92', '\xEA', '\x49', '\x62', '\x09', '\x56', '\xED', '\x15', '\xA0', '\xE0', '\x49', '\x69', '\x3A', '\x5D', '\xF6', '\x09', '\x8B', '\xEA', '\x4A', '\x0D'}; thread_local EncryptedName name(bytes); return name.Text(); }()), object->render.position.x, object->render.position.y, object->render.position.z, 0, -1, 0, 0); } // OFFSET: 0x005A8FC0 // FUNCTION: fn_03224 int CSkillAction_AT_GLACIER_NOVA::Slot02() { return 65; } // OFFSET: 0x005A8FD0 // FUNCTION: fn_03225 void CSkillAction_AT_GLACIER_NOVA::Slot12(vector3d position, int argument2, int argument3) { g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x54, 0x4B, 0x52, 0x6C, 0xD4, 0x28, 0x4B, 0x72, 0x5D, 0x48, 0x45, 0x6E, 0xBD}; thread_local EncryptedName name(bytes); return name.Text(); }()), position.x, position.y, position.z, 0, -1, 0, 0); } // OFFSET: 0x005A91A0 // FUNCTION: fn_03226 void CSkillAction_AT_GLACIER_SHARD::Slot10(int level, CGameActor* source, int argument3, int argument4, int argument5) { if (source) { if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x20', '\x4D', '\xDA', '\x88', '\x82', '\x12', '\x6D', '\x4A', '\x34', '\x49', '\xDA', '\x99', '\x8F', '\x28', '\x6B', '\x74', '\x35', '\x46', '\xDE', '\x9F', '\xEB'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot14(level); } } } // OFFSET: 0x005A93B0 // FUNCTION: fn_03227 void CSkillAction_AT_GLACIER_SHARD::Slot11(int level, CGameActor* source, CGameActor* target) { if (target) { g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xA6, 0xA3, 0xB2, 0x50, 0xFE, 0x78, 0x8F, 0x36, 0xB2, 0xA7, 0xB2, 0x41, 0xF3, 0x1D}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A95C0 // FUNCTION: fn_03228 int CSkillAction_AT_GLACIER_STOMP::Slot02() { return 65; } // OFFSET: 0x005A95D0 // FUNCTION: fn_03229 void CSkillAction_AT_GLACIER_STOMP::Slot11(int level, CGameActor* source, CGameActor* target) { if (target) { g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xA0, 0xA1, 0x84, 0x5E, 0x76, 0x18, 0x17, 0xAA, 0xB4, 0xB9, 0x8A, 0x50, 0x6F, 0x7D}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A97E0 // FUNCTION: fn_03230 int CSkillAction_AT_ROARING_CHARGE::Slot02() { return 65; } // OFFSET: 0x005A97F0 // FUNCTION: fn_03231 void CSkillAction_AT_ROARING_CHARGE::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x43', '\x36', '\x4A', '\x73', '\x08', '\xA3', '\x02', '\xD4', '\x52', '\x31', '\x4A', '\x73', '\x06', '\xA8', '\x65'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x97', '\xE0', '\x2C', '\x67', '\x5E', '\x6F', '\x34', '\xA8', '\x86', '\xE7', '\x2C', '\x67', '\x50', '\x64', '\x0C', '\x95', '\x8A', '\xFB', '\x39', '\x7A', '\x5A', '\x01'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A9BA0 // FUNCTION: fn_03232 int CSkillAction_AT_ROARING_CHARGE_S::Slot02() { return 65; } // OFFSET: 0x005A9BB0 // FUNCTION: fn_03233 void CSkillAction_AT_ROARING_CHARGE_S::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xB1', '\xAC', '\xB4', '\xF9', '\x32', '\x85', '\x58', '\xD4', '\xA0', '\xAB', '\xB4', '\xF9', '\x3C', '\x8E', '\x60', '\xF8', '\xC3'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xD5', '\xDC', '\x64', '\xBB', '\xCC', '\x0D', '\x8C', '\x54', '\xC4', '\xDB', '\x64', '\xBB', '\xC2', '\x06', '\xB4', '\x78', '\xF8', '\xD1', '\x6A', '\xBD', '\xD1', '\x0C', '\x86', '\x0B'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005A9F50 // FUNCTION: fn_03234 void CSkillAction_AT_ROARING_PIERCER::Slot11(int level, CGameActor* source, CGameActor* target) { if (!source) { return; } if (!target) { return; } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xBB, 0xD8, 0x44, 0xE5, 0xD2, 0x5D, 0xE4, 0x58, 0xB9, 0xDE, 0x40, 0xE5, 0xD8, 0x56, 0xF1, 0x58, 0xAE, 0xB7}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); effect->Slot17(angle); } } // OFFSET: 0x005AA180 // FUNCTION: fn_03235 void CSkillAction_AT_ROARING_PIERCEER_S::Slot11(int level, CGameActor* source, CGameActor* target) { if (!source) { return; } if (!target) { return; } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xC7, 0x1A, 0x00, 0x2D, 0x94, 0x35, 0x7C, 0xD0, 0xC5, 0x1C, 0x04, 0x2D, 0x9E, 0x3E, 0x69, 0xD0, 0xCC, 0x75}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); effect->Slot17(angle); } } // OFFSET: 0x005AA3B0 // FUNCTION: fn_03236 int CSkillAction_AT_FURIOS_STORM::Slot02() { return 65; } // OFFSET: 0x005AA3C0 // FUNCTION: fn_03237 void CSkillAction_AT_FURIOS_STORM::Slot11(int level, CGameActor* source, CGameActor* target) { if (!source) { return; } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x6F', '\x65', '\x4C', '\x67', '\xCB', '\x2C', '\xFD', '\x32', '\x75', '\x6A', '\x66', '\x6A', '\xCE', '\x3A', '\xFB', '\x04', '\x76', '\x78', '\x4D', '\x6C', '\xAF'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot14(1000); } const int stormA = CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x89', '\x56', '\xA7', '\x86', '\x76', '\x22', '\xCE', '\x48', '\x9B', '\x4C', '\xA7', '\x82', '\x46', '\x30', '\x91'}; thread_local EncryptedName name(bytes); return name.Text(); }()); const int stormABottom = CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x31', '\xF6', '\x9B', '\xBC', '\xEE', '\xB6', '\x12', '\x34', '\x23', '\xEC', '\x9B', '\xB8', '\xDE', '\xA4', '\x12', '\x25', '\x38', '\xF7', '\x9D', '\xBA', '\xEC', '\xC5'}; thread_local EncryptedName name(bytes); return name.Text(); }()); const int stormB = CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x0B', '\x2A', '\x8B', '\x5A', '\x8C', '\x08', '\x0A', '\x4C', '\x19', '\x30', '\x8B', '\x5E', '\xBC', '\x19', '\x55'}; thread_local EncryptedName name(bytes); return name.Text(); }()); const int stormBBottom = CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x5F', '\x94', '\xDB', '\x86', '\x8E', '\xD4', '\x0C', '\x74', '\x4D', '\x8E', '\xDB', '\x82', '\xBE', '\xC5', '\x0C', '\x65', '\x56', '\x95', '\xDD', '\x80', '\x8C', '\xA7'}; thread_local EncryptedName name(bytes); return name.Text(); }()); for (int delay = 0; delay < 1000; delay += 250) { const int variant = std::max(std::rand() % 2, 0); if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, variant ? stormA : stormB, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot16(delay); } if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, variant ? stormABottom : stormBBottom, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot16(delay); } } } // OFFSET: 0x005AABF0 // FUNCTION: fn_03238 void CSkillAction_AT_FURIOS_STORM::Slot17(CGameActor* source) { } // OFFSET: 0x005AAC00 // FUNCTION: fn_03239 void CEfstAction_FURIOS_STORM::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { if (actor) { g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x6D, 0x05, 0xBA, 0x91, 0x39, 0x64, 0xB3, 0x16, 0x77, 0x0A, 0x90, 0x9C, 0x3C, 0x72, 0xB5, 0x7F}; thread_local EncryptedName name(bytes); return name.Text(); }())); for (int index = 0; index < 4; ++index) { g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x45, 0xF6, 0xA9, 0xEA, 0x2E, 0xCE, 0x60, 0xB8, 0x57, 0xEC, 0xA9, 0xEE, 0x1E, 0xDC, 0x3F}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x2B, 0xA4, 0xB9, 0xAE, 0x96, 0x04, 0x92, 0x0C, 0x39, 0xBE, 0xB9, 0xAA, 0xA6, 0x16, 0x92, 0x1D, 0x22, 0xA5, 0xBF, 0xA8, 0x94, 0x77}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x67, 0x22, 0xE5, 0xB6, 0x7C, 0xF6, 0x0C, 0xA2, 0x75, 0x38, 0xE5, 0xB2, 0x4C, 0xE7, 0x53}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xF9, 0xB6, 0x35, 0xD4, 0x84, 0x34, 0xBE, 0xE2, 0xEB, 0xAC, 0x35, 0xD0, 0xB4, 0x25, 0xBE, 0xF3, 0xF0, 0xB7, 0x33, 0xD2, 0x86, 0x47}; thread_local EncryptedName name(bytes); return name.Text(); }())); } } } // OFFSET: 0x005AB5F0 // FUNCTION: fn_03240 int CSkillAction_AT_ALPHA_PHASE::Slot01() { return 66; } // OFFSET: 0x005AB600 // FUNCTION: fn_03241 int CSkillAction_AT_ALPHA_PHASE::Slot02() { return 68; } // OFFSET: 0x005AB610 // FUNCTION: fn_03242 void CSkillAction_AT_ALPHA_PHASE::Slot08(int level, CGameActor* source) { if (source) { source->LaunchEffect(54, level / 16); } } // OFFSET: 0x005AB640 // FUNCTION: fn_03243 void CSkillAction_AT_ALPHA_PHASE::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x72, 0xAB, 0x73, 0x7D, 0x9A, 0xCE, 0x67, 0x27, 0x72, 0xB4, 0x66, 0x15}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005AB840 // FUNCTION: fn_03244 EfstActionMessage CEfstAction_ALPHA_PHASE::Slot03() { return {LookupMessage(4670), 0xFFFF00}; } // OFFSET: 0x005AB870 // FUNCTION: fn_03245 EfstActionMessage CEfstAction_ALPHA_PHASE::Slot04() { return {LookupMessage(4671), 0xFF}; } // OFFSET: 0x005AB8A0 // FUNCTION: fn_03246 int CSkillAction_AT_APEX_PHASE::Slot02() { return 80; } // OFFSET: 0x005AB8B0 // FUNCTION: fn_03247 void CSkillAction_AT_APEX_PHASE::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xB2, 0x9D, 0xF2, 0x6D, 0x12, 0x2B, 0xCD, 0xC0, 0xA0, 0x88, 0x97}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005ABAB0 // FUNCTION: fn_03248 EfstActionMessage CEfstAction_AT_APEX_PHASE::Slot03() { return {LookupMessage(4682), 0xFFFF00}; } // OFFSET: 0x005ABAE0 // FUNCTION: fn_03249 EfstActionMessage CEfstAction_AT_APEX_PHASE::Slot04() { return {LookupMessage(4683), 0xFF}; } // OFFSET: 0x005ABB10 // FUNCTION: fn_03250 int CSkillAction_AT_FLIP_FLAP::Slot02() { return 80; } // OFFSET: 0x005ABB20 // FUNCTION: fn_03251 void CSkillAction_AT_FLIP_FLAP::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x9B, 0x91, 0x14, 0x83, 0xBE, 0x73, 0x95, 0x7A, 0x8D, 0xFD}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005ABD20 // FUNCTION: fn_03252 EfstActionMessage CEfstAction_FLIP_FLAP::Slot03() { return {LookupMessage(4678), 0xFFFF00}; } // OFFSET: 0x005ABD50 // FUNCTION: fn_03253 EfstActionMessage CEfstAction_FLIP_FLAP::Slot04() { return {LookupMessage(4679), 0xFF}; } // OFFSET: 0x005ABD80 // FUNCTION: fn_03254 bool CSkillAction_AT_AERO_SYNC::Slot00() { return true; } // OFFSET: 0x005ABD90 // FUNCTION: fn_03255 int CSkillAction_AT_AERO_SYNC::Slot02() { return 70; } // OFFSET: 0x005ABDA0 // FUNCTION: fn_03256 void CSkillAction_AT_AERO_SYNC::Slot11(int level, CGameActor* source, CGameActor* target) { if (source) { g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xBE', '\xBC', '\x2F', '\x06', '\x4C', '\xE0', '\x86', '\x6F', '\xBC', '\x86', '\x2E', '\x10', '\x7D', '\xF0', '\xFF'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xFA', '\xC8', '\x07', '\xA0', '\x8E', '\x4E', '\x94', '\x03', '\xF8', '\xF2', '\x18', '\xAE', '\xB8', '\x53', '\xED'}; thread_local EncryptedName name(bytes); return name.Text(); }()), source->render.position.x, source->render.position.y, source->render.position.z, 0, -1, 0, 0); g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xA0', '\xB6', '\xA9', '\x18', '\xC4', '\x06', '\xBA', '\x27', '\xA2', '\x8C', '\xB6', '\x16', '\xF2', '\x1B', '\x9C', '\x2B', '\xAE', '\xA7', '\xAF', '\x18', '\xF6', '\x75'}; thread_local EncryptedName name(bytes); return name.Text(); }()), source->render.position.x, source->render.position.y, source->render.position.z, 0, -1, 0, 0); } } // OFFSET: 0x005AC300 // FUNCTION: fn_03257 EfstActionMessage CEfstAction_FLIP_FLAP_TARGET::Slot03() { return {LookupMessage(4680), 0xFFFF00}; } // OFFSET: 0x005AC330 // FUNCTION: fn_03258 EfstActionMessage CEfstAction_FLIP_FLAP_TARGET::Slot04() { return {LookupMessage(4681), 0xFF}; } // OFFSET: 0x005AC360 // FUNCTION: fn_03259 void CEfstAction_FLIP_FLAP_TARGET::Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) { if (actor) { g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xCE, 0x2A, 0x59, 0x8C, 0x80, 0x66, 0x2A, 0x51, 0xCC, 0x10, 0x58, 0x9A, 0xB1, 0x76, 0x53}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005AC570 // FUNCTION: fn_03260 int CSkillAction_AT_SAVAGE_LUNGE::Slot02() { return 73; } // OFFSET: 0x005AC970 // FUNCTION: fn_03262 int CSkillAction_AT_TEMPEST_FLAP::Slot01() { return 66; } // OFFSET: 0x005AC980 // FUNCTION: fn_03263 int CSkillAction_AT_TEMPEST_FLAP::Slot02() { return 67; } // OFFSET: 0x005ACBA0 // FUNCTION: fn_03265 void CSkillAction_AT_TEMPEST_FLAP::Slot11(int level, CGameActor* source, CGameActor* target) { if (target) { g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x15', '\xCA', '\xE2', '\x49', '\xEE', '\xBA', '\x8B', '\x48', '\x07', '\xC3', '\xEE', '\x49', '\x8B'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x47', '\xF6', '\x20', '\xE5', '\xFE', '\xE6', '\x2F', '\xC4', '\x55', '\xFF', '\x2C', '\xE5', '\xC4', '\xF7', '\x34', '\xEF', '\x47', '\xFC', '\x20', '\x95'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005ACF40 // FUNCTION: fn_03266 int CSkillAction_AT_TERRA_HARVEST::Slot02() { return 62; } // OFFSET: 0x005ACF50 // FUNCTION: fn_03267 void CSkillAction_AT_TERRA_HARVEST::Slot11(int level, CGameActor* source, CGameActor* target) { if (!target) { return; } const int variant = std::max(std::rand() % 2, 0); const int effectId = CEZ2STREffectMgr::GetInstance()->EffectId(variant ? std::string([] { const char bytes[] = {'\xF1', '\x04', '\xF9', '\x65', '\x1E', '\x3E', '\xCD', '\xCE', '\xF7', '\x17', '\xEE', '\x64', '\x0B', '\x3E', '\xD7', '\xCA', '\xE1', '\x61'}; thread_local EncryptedName name(bytes); return name.Text(); }()) : std::string([] { const char bytes[] = {'\x39', '\x40', '\xEB', '\x3B', '\x32', '\x1C', '\xE9', '\x66', '\x3F', '\x53', '\xFC', '\x3A', '\x27', '\x1C', '\xF8', '\x62', '\x21', '\x49', '\xF6', '\x3E', '\x53'}; thread_local EncryptedName name(bytes); return name.Text(); }())); const int bottomId = CEZ2STREffectMgr::GetInstance()->EffectId(variant ? std::string([] { const char bytes[] = {'\x3B', '\x2E', '\xC1', '\xFD', '\x4C', '\x4A', '\x29', '\xE6', '\x3D', '\x3D', '\xD6', '\xFC', '\x59', '\x4A', '\x33', '\xE2', '\x2B', '\x14', '\xD1', '\xE0', '\x59', '\x61', '\x2E', '\xEA', '\x4F'}; thread_local EncryptedName name(bytes); return name.Text(); }()) : std::string([] { const char bytes[] = {'\x73', '\xDE', '\x9B', '\x3F', '\x98', '\x12', '\x35', '\xF4', '\x75', '\xCD', '\x8C', '\x3E', '\x8D', '\x12', '\x24', '\xF0', '\x6B', '\xD7', '\x86', '\x3A', '\xA6', '\x2F', '\x32', '\xE1', '\x73', '\xD4', '\x84', '\x4D'}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Spawn(target->render.accountId, effectId, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(target->render.accountId, bottomId, 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } // OFFSET: 0x005AD630 // FUNCTION: fn_03268 void CSkillAction_AT_TERRA_WAVE::Slot12(vector3d position, int argument2, int argument3) { g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x7F', '\xD0', '\xFB', '\x67', '\x68', '\xE8', '\xEE', '\xA2', '\x7D', '\xD0', '\x89'}; thread_local EncryptedName name(bytes); return name.Text(); }()), position.x, position.y, position.z, 0, -1, 0, 0); g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x1B', '\xC8', '\x53', '\x9B', '\x5E', '\x58', '\x4E', '\xD6', '\x19', '\xC8', '\x7E', '\x8B', '\x50', '\x73', '\x4D', '\xD8', '\x02', '\xAD'}; thread_local EncryptedName name(bytes); return name.Text(); }()), position.x, position.y, position.z, 0, -1, 0, 0); } // OFFSET: 0x005AD970 // FUNCTION: fn_03269 int CSkillAction_AT_SOLID_STOMP::Slot02() { return 63; } // OFFSET: 0x005AD980 // FUNCTION: fn_03270 void CSkillAction_AT_SOLID_STOMP::Slot11(int level, CGameActor* source, CGameActor* target) { if (target) { g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xAA', '\x56', '\x7F', '\x10', '\xAF', '\xDC', '\x0E', '\x8B', '\xB6', '\x54', '\x63', '\x79'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x66', '\xFC', '\xDF', '\xA8', '\x83', '\x1C', '\x22', '\x99', '\x7A', '\xFE', '\xC3', '\x9E', '\x85', '\x2C', '\x25', '\x99', '\x7A', '\xFE', '\xB3'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005ADD10 // FUNCTION: fn_03271 EfstActionMessage CEfstAction_SOLID_STOMP::Slot03() { return {LookupMessage(4686), 0xFFFF00}; } // OFFSET: 0x005ADD40 // FUNCTION: fn_03272 EfstActionMessage CEfstAction_SOLID_STOMP::Slot04() { return {LookupMessage(4687), 0xFF}; } // OFFSET: 0x005ADD70 // FUNCTION: fn_03273 int CSkillAction_AT_ZEPHYR_LINK::Slot02() { return 0; } // OFFSET: 0x005ADD80 // FUNCTION: fn_03274 void CEfstAction_ZEPHYR_LINK::Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) { if (actor) { this->Slot01(efstId, value, argument3, argument4, actor); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xEB', '\xA6', '\xCD', '\x09', '\x1C', '\xE3', '\x62', '\x55', '\xF8', '\xAD', '\xD6', '\x61'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xEF', '\x98', '\x61', '\xDB', '\x28', '\x17', '\xCA', '\x5D', '\xFC', '\x93', '\x7A', '\xEC', '\x33', '\x0A', '\xE1', '\x45', '\xFA', '\x90', '\x11'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } } // OFFSET: 0x005AE130 // FUNCTION: fn_03275 void CEfstAction_ZEPHYR_LINK::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { if (actor) { g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xF3, 0x58, 0x1D, 0x8D, 0xDE, 0x73, 0x78, 0x43, 0xE0, 0x53, 0x06, 0xE5}; thread_local EncryptedName name(bytes); return name.Text(); }())); g_effectMgr->Retire(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x5F, 0xF4, 0x77, 0xCB, 0x98, 0x73, 0x6C, 0x07, 0x4C, 0xFF, 0x6C, 0xFC, 0x83, 0x6E, 0x47, 0x1F, 0x4A, 0xFC, 0x07}; thread_local EncryptedName name(bytes); return name.Text(); }())); } } // OFFSET: 0x005AE460 // FUNCTION: fn_03276 void CEfstAction_ZEPHYR_LINK::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { if (actor) { this->Slot00(efstId, value, 0, 0, actor, false); } } // OFFSET: 0x005AE480 // FUNCTION: fn_03277 void CEfstAction_INSANE::Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) { if (actor) { this->Slot01(efstId, value, argument3, argument4, actor); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xCA', '\xC7', '\xB6', '\x43', '\x48', '\x00', '\xD9', '\x02', '\xCE', '\xCF', '\xA0', '\x68', '\x27', '\x58', '\xB7'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x06', '\x5F', '\x0E', '\xD5', '\x06', '\xDC', '\xF1', '\xB0', '\x02', '\x57', '\x18', '\xFE', '\x3B', '\xDA', '\xEB', '\xB7', '\x0C', '\x54', '\x22', '\x91', '\x68', '\xB5'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); static_cast(actor)->unknown_04F4 = static_cast(0xFFFFF200); } } // OFFSET: 0x005AE840 // FUNCTION: fn_03278 void CEfstAction_INSANE::Slot01(int efstId, int argument2, int argument3, int argument4, CRenderObject* actor) { if (actor) { static_cast(actor)->unknown_04F4 = 0; } } // OFFSET: 0x005AE860 // FUNCTION: fn_03279 void CEfstAction_INSANE::Slot02(int efstId, int value, int argument3, int argument4, CRenderObject* actor) { if (actor) { this->Slot00(efstId, value, 0, 0, actor, false); } } // OFFSET: 0x005AE880 // FUNCTION: fn_03280 void CEfstAction_INSANE2::Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) { if (actor) { this->Slot01(efstId, value, argument3, argument4, actor); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x32', '\x97', '\xC6', '\xBF', '\x5C', '\x98', '\x8D', '\x36', '\x36', '\x9F', '\xD0', '\x94', '\x33', '\xC3', '\xE3'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xCE', '\x29', '\xEC', '\xD7', '\xDA', '\x46', '\x7F', '\x74', '\xCA', '\x21', '\xFA', '\xFC', '\xE7', '\x40', '\x65', '\x73', '\xC4', '\x22', '\xC0', '\x93', '\xB7', '\x2F'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); static_cast(actor)->unknown_04F4 = static_cast(0xFFFF7F27); } } // OFFSET: 0x005AEC40 // FUNCTION: fn_03281 void CEfstAction_INSANE3::Slot00(int efstId, int value, int argument3, int argument4, CRenderObject* actor, bool argument6) { if (actor) { this->Slot01(efstId, value, argument3, argument4, actor); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xBA', '\x21', '\xDE', '\x13', '\x40', '\x10', '\x5D', '\x5E', '\xBE', '\x29', '\xC8', '\x38', '\x2F', '\x4A', '\x33'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); g_effectMgr->Spawn(actor->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x90', '\xE1', '\x8E', '\x89', '\x70', '\x54', '\x01', '\xE0', '\x94', '\xE9', '\x98', '\xA2', '\x4D', '\x52', '\x1B', '\xE7', '\x9A', '\xEA', '\xA2', '\xCD', '\x1C', '\x3D'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); static_cast(actor)->unknown_04F4 = static_cast(0xFFED1C24); } } // OFFSET: 0x005AF030 // FUNCTION: fn_03285 bool __stdcall sub_5AF030(int) { return false; } // OFFSET: 0x005A5E50 // FUNCTION: fn_03170 bool CSkillAction_AnimalForm::CanUse(CGameActor* actor) { return actor && actor->HasShapeShift() && this->Slot17(actor); } // OFFSET: 0x005AC580 // FUNCTION: fn_03261 void CSkillAction_AT_SAVAGE_LUNGE::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); } g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x9A', '\xB2', '\x4B', '\x66', '\x52', '\x4C', '\x54', '\x89', '\x9C', '\xBD', '\x5A', '\x62', '\x35'}; thread_local EncryptedName name(bytes); return name.Text(); }()), target->render.position.x, target->render.position.y, target->render.position.z, 0, -1, 0, 0); g_effectMgr->Spawn(0, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\x82', '\xA2', '\x9F', '\xDC', '\xCA', '\x68', '\x2A', '\x11', '\x84', '\xAD', '\x8E', '\xD8', '\xF2', '\x6F', '\x1A', '\x09', '\x85', '\xAC', '\x84', '\xBD'}; thread_local EncryptedName name(bytes); return name.Text(); }()), target->render.position.x, target->render.position.y, target->render.position.z, 0, -1, 0, 0); } // OFFSET: 0x005AC990 // FUNCTION: fn_03264 void CSkillAction_AT_TEMPEST_FLAP::Slot08(int level, CGameActor* source) { if (this->CanUse(source)) { if (CEffect* effect = g_effectMgr->Spawn(source->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const char bytes[] = {'\xCB', '\xD8', '\xB2', '\x4F', '\x28', '\x5E', '\xF7', '\x6C', '\xD9', '\xD1', '\xBE', '\x4F', '\x12', '\x4E', '\xE2', '\x40', '\xCB', '\xBD'}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0)) { effect->Slot14(level); } } } // OFFSET: 0x005AF000 // FUNCTION: fn_03282 bool sub_5AF000() { return false; } // OFFSET: 0x005AF010 // FUNCTION: fn_03283 int sub_5AF010() { return 8; } // OFFSET: 0x005AF020 // FUNCTION: fn_03284 int sub_5AF020() { return 7; } // OFFSET: 0x005AF040 // FUNCTION: fn_03286 bool sub_5AF040() { return false; } // OFFSET: 0x005AF050 // FUNCTION: fn_03287 bool sub_5AF050() { return false; } // OFFSET: 0x005AF060 // FUNCTION: fn_03288 bool sub_5AF060() { return false; } // OFFSET: 0x005AF070 // FUNCTION: fn_03289 bool sub_5AF070() { return false; } // OFFSET: 0x005AF080 // FUNCTION: fn_03290 void __stdcall sub_5AF080(int a, int b) { } // OFFSET: 0x005AF090 // FUNCTION: fn_03291 void __stdcall sub_5AF090(int a, int b, int c) { } // OFFSET: 0x005AF0A0 // FUNCTION: fn_03292 void __stdcall sub_5AF0A0(int a, int b, int c, int d, int e) { } // OFFSET: 0x005AF0B0 // FUNCTION: fn_03293 void __stdcall sub_5AF0B0(int a, int b, int c) { } // OFFSET: 0x005AF0C0 // FUNCTION: fn_03294 void __stdcall sub_5AF0C0(vector3d a, int b, int c) { } // OFFSET: 0x005AF0D0 // FUNCTION: fn_03295 bool sub_5AF0D0() { return false; } // OFFSET: 0x005AF0E0 // FUNCTION: fn_03296 int sub_5AF0E0() { return 0; } // OFFSET: 0x005AF0F0 // FUNCTION: fn_03297 void __stdcall sub_5AF0F0(int a, int b, int c) { } // OFFSET: 0x005AF100 // FUNCTION: fn_03298 void __stdcall sub_5AF100(int a, int b, int c) { } // OFFSET: 0x005AF110 // FUNCTION: fn_03299 void __stdcall sub_5AF110(int a, int b, int c, int d, int e, int f) { } // OFFSET: 0x005AF120 // FUNCTION: fn_03300 void __stdcall sub_5AF120(int a, int b, int c, int d, int e) { } // OFFSET: 0x005AF130 // FUNCTION: fn_03301 void __stdcall sub_5AF130(int a, int b, int c, int d, int e) { } // OFFSET: 0x005AF140 // FUNCTION: fn_03302 void __stdcall sub_5AF140(std::uint32_t* out) { out[0] = 0; out[1] = 0xFFFF00; } // OFFSET: 0x005AF160 // FUNCTION: fn_03303 void __stdcall sub_5AF160(std::uint32_t* out) { out[0] = 0; out[1] = 0xFF; } // OFFSET: 0x005AF180 // FUNCTION: fn_03304 void __stdcall sub_5AF180(int a, int b, int c) { } // OFFSET: 0x005AF190 // FUNCTION: fn_03305 void __stdcall sub_5AF190(int a) { } // OFFSET: 0x005AF4E0 // FUNCTION: fn_03326 int CSkillAction_AT_PRIMAL_CLAW::Slot02() { return 72; } // OFFSET: 0x005AF4F0 // FUNCTION: fn_03327 void CSkillAction_AT_PRIMAL_CLAW::Slot11(int level, CGameActor* source, CGameActor* target) { if (!this->CanUse(source) || !target) { return; } g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0xC7, 0x75, 0x3E, 0xA0, 0x4A, 0x8B, 0x74, 0xE2, 0xDB, 0x66, 0x20, 0xCD}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } // OFFSET: 0x005AF700 // FUNCTION: fn_03328 int CSkillAction_AT_FERAL_CLAW::Slot02() { return 71; } // OFFSET: 0x005AF710 // FUNCTION: fn_03329 void CSkillAction_AT_FERAL_CLAW::Slot11(int level, CGameActor* source, CGameActor* target) { if (!this->CanUse(source) || !target) { return; } g_effectMgr->Spawn(target->render.accountId, CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x33, 0x98, 0xC7, 0xBA, 0xAB, 0xEE, 0x16, 0x5F, 0x34, 0x8A, 0xB5}; thread_local EncryptedName name(bytes); return name.Text(); }()), 0.0f, 0.0f, 0.0f, 0, -1, 0, 0); } // GLOBAL: gl_25058 const float g_featherOffsets[3] = {0.0f, 0.1f, -0.1f}; // OFFSET: 0x005A4760 // FUNCTION: fn_03152 void CSkillAction_DamageWereRaptorForm::sub_5A4760(int sourceActor, CGameActor* target) { CGameActor* source = reinterpret_cast(sourceActor); if (source && target) { const std::uint8_t bytes[] = {0x46, 0x75, 0x73, 0x0C, 0x60, 0xAE, 0xAC, 0x1F, 0x17, 0x01}; thread_local EncryptedName name(bytes); const std::string effectName = name.Text(); this->SpawnDirectionalEffect(source, target, effectName); } } // OFFSET: 0x005A4930 // FUNCTION: fn_03153 void CSkillAction_DamageWereRaptorForm::sub_5A4930(int sourceActor, CGameActor* target) { CGameActor* source = reinterpret_cast(sourceActor); if (source && target) { const std::uint8_t bytes[] = {0xD2, 0x13, 0xB7, 0x32, 0x9A, 0xF0, 0x6A, 0x27, 0x82, 0x67}; thread_local EncryptedName name(bytes); const std::string effectName = name.Text(); this->SpawnDirectionalEffect(source, target, effectName); } } // OFFSET: 0x005A4B00 // FUNCTION: fn_03154 void CSkillAction_DamageWereRaptorForm::sub_5A4B00(int sourceActor, CGameActor* target) { CGameActor* source = reinterpret_cast(sourceActor); if (!target || !source) { return; } const float angle = ScreenAngle( &source->render.position.x, &target->render.position.x, static_cast(g_modeMgr.GetGameMode())->camera->frame.view.values ); const int direction = this->GetDirection(angle); if (!this->IsValidDirection(direction)) { return; } const int effectId = CEZ2STREffectMgr::GetInstance()->EffectId([] { const std::uint8_t bytes[] = {0x76, 0x8D, 0x3B, 0xD8, 0x98, 0xDE, 0x70, 0xF5, 0x25, 0xF9}; thread_local EncryptedName name(bytes); return name.Text(); }()); const bool flipped = direction == 1 || direction == 2; const float deltaY = target->render.position.y - source->render.position.y; const float deltaX = target->render.position.x - source->render.position.x; const float deltaZ = target->render.position.z - source->render.position.z; const float inverseLength = 1.0f / SquareRoot(deltaY * deltaY + deltaX * deltaX + deltaZ * deltaZ); const float forwardY = inverseLength * deltaY * 35.0f; const float forwardZ = inverseLength * deltaZ * 35.0f; const float forwardX = inverseLength * deltaX * 35.0f; const float sideX = forwardY * 0.0f - forwardZ; const float sideY = forwardZ * 0.0f - forwardX * 0.0f; const float sideZ = forwardX - forwardY * 0.0f; const float inverseSide = 1.0f / SquareRoot(sideY * sideY + sideX * sideX + sideZ * sideZ); const float rightX = inverseSide * sideX * 7.5f; const float rightY = inverseSide * sideY * 7.5f; const float rightZ = inverseSide * sideZ * 7.5f; int count = 1; int row = 0; for (int alpha = 150; alpha < 525; alpha += 125) { const float advance = static_cast(row + 1) / 3.0f; const float shift = static_cast(row); const float baseX = (forwardX * advance + source->render.position.x) - rightX * shift; const float baseY = (forwardY * advance + source->render.position.y) - rightY * shift; const float baseZ = (forwardZ * advance + source->render.position.z) - rightZ * shift; for (int column = 0; column < count; ++column) { if (std::max(std::rand() % 2, 0) != 0) { continue; } const float offset = g_featherOffsets[std::max(std::rand() % 3, 0)]; const float step = static_cast(column); const float x = rightX * step + baseX + offset * forwardX; const float y = rightY * step + baseY + offset * forwardY; const float z = rightZ * step + baseZ + offset * forwardZ; const int fade = std::max(std::rand() % 101, 0) + alpha; const int scale = std::max(std::rand() % 11, 7); if (CEffect* effect = g_effectMgr->Spawn(0, effectId, x, y, z, 0, -1, 0, 0)) { effect->Slot26(flipped); effect->Slot16(fade); effect->Slot22(static_cast(scale) * 0.1f); } } count += 2; ++row; } }