diff --git a/Source/Contents/Actors/GameActor.cpp b/Source/Contents/Actors/GameActor.cpp index e5cb4e2d..417f2b70 100644 --- a/Source/Contents/Actors/GameActor.cpp +++ b/Source/Contents/Actors/GameActor.cpp @@ -1,6 +1,10 @@ #include "Contents/Actors/GameActor.h" #include "Client/Session.h" +#include "Contents/Actors/ActorStateFlags.h" +#include "Contents/Actors/Pc.h" +#include "Contents/MapSkyMgr.h" +#include "Utility/Math/AffineMatrix.h" #include "Resource/Sprites/ActionResource.h" #include @@ -130,3 +134,383 @@ void CGameActor::UpdateMotionFrame() { const int frames = static_cast(this->render.action->FrameCount(this->render.previousAnimation)); this->render.curMotion = static_cast(this->unknown_0240 * 0.37f * 4.0f / this->render.speed) % frames; } + +// OFFSET: 0x00CACFE0 +// FUNCTION: fn_21050 +int __stdcall MountedJob(int job, std::uint32_t flags) { + if (job == 0xfd6) { + if (StateFlag19(flags)) { + return 0xff0; + } + if (StateFlag23(flags)) { + return 0xff8; + } + if (StateFlag24(flags)) { + return 0xffa; + } + if (StateFlag25(flags)) { + return 0xffc; + } + if (StateFlag26(flags)) { + return 0xffe; + } + } else if (job == 0xfdc) { + if (StateFlag19(flags)) { + return 0xff1; + } + if (StateFlag23(flags)) { + return 0xff9; + } + if (StateFlag24(flags)) { + return 0xffb; + } + if (StateFlag25(flags)) { + return 0xffd; + } + if (StateFlag26(flags)) { + return 0xfff; + } + } else if (job == 0x1000) { + if (StateFlag19(flags)) { + return 0x100d; + } + } else if (job == 0xfd8) { + if (StateFlag21(flags)) { + return 0xff4; + } + } else if (job == 0xfde) { + if (StateFlag21(flags)) { + return 0xff5; + } + } else if (job == 0x1002) { + if (StateFlag21(flags)) { + return 0x100f; + } + } else if (job == 0xfda) { + if (StateFlag22(flags)) { + return 0xff6; + } + } else if (job == 0xfe0) { + if (StateFlag22(flags)) { + return 0xff7; + } + } else if (job == 0x1004) { + if (StateFlag22(flags)) { + return 0x1010; + } + } else if (job == 0x7) { + if (StateFlag05(flags)) { + return 0xd; + } + } else if (job == 0xe) { + if (StateFlag05(flags)) { + return 0x15; + } + } else if (job == 0xfa8) { + if (StateFlag05(flags)) { + return 0xfae; + } + } else if (job == 0xfbe) { + if (StateFlag05(flags)) { + return 0xfc4; + } + } else if (job == 0xfaf) { + if (StateFlag05(flags)) { + return 0xfb6; + } + } else if (job == 0xfc5) { + if (StateFlag05(flags)) { + return 0xfcc; + } + } else if (job == 0xfe2) { + if (StateFlag05(flags)) { + return 0xff2; + } + } else if (job == 0xfe9) { + if (StateFlag05(flags)) { + return 0xff3; + } + } else if (job == 0x1006) { + if (StateFlag05(flags)) { + return 0x100e; + } + } else if (job == 0xfcf) { + if (StateFlag15(flags)) { + return 0xfd0; + } + } else if (job == 0x1082) { + if (StateFlag15(flags)) { + return 0x108e; + } + } else if (job == 0x10a1) { + if (StateFlag21(flags)) { + return 0x10b6; + } + } else if (job == 0x109d) { + if (StateFlag22(flags)) { + return 0x10b7; + } + } else if (job == 0x109c) { + if (StateFlag19(flags)) { + return 0x10b8; + } + } else if (job == 0x10a2) { + if (StateFlag05(flags)) { + return 0x10b9; + } + } else if (job == 0x10ce) { + if (StateFlag15(flags)) { + return 0x10dc; + } + } + return job; +} + +// OFFSET: 0x00CAD420 +// FUNCTION: fn_21051 +int CGameActor::GetEffectCounter(int effectId) { + switch (effectId) { + case 0x81: + case 0x17d: + case 0x14ce: + case 0x14d1: + case 0x1978: + return this->unknown_037C[0]; + case 0x8c3: + case 0x8c4: + return this->unknown_037C[1]; + default: + return 0; + } +} + +// OFFSET: 0x00CAD4B0 +// FUNCTION: fn_21053 +float CGameActor::GetNameOffset() { + float scale = 1.0f; + if ((this->render.flags & 0x10) != 0) { + const unsigned int angle = this->render.pulsePhases[0] * 4 + 90; + if (angle > 270) { + scale = 0.5f; + } else { + scale = (g_sinTable[angle] + 1.0f) * 0.25f + g_depthAverageHalf; + } + } + + switch (this->GetEffectiveJob(-1)) { + case 0xd: + case 0x15: + case 0xfae: + case 0xfb6: + case 0xff0: + case 0xff1: + case 0xff2: + case 0xff3: + case 0xff4: + case 0xff5: + case 0xff6: + case 0xff7: + case 0xff8: + case 0xff9: + case 0xffa: + case 0xffb: + case 0xffc: + case 0xffd: + case 0xffe: + case 0xfff: + case 0x10b6: + case 0x10b7: + case 0x10b8: + case 0x10b9: + return scale * 6.0f; + case 0xfc4: + case 0xfcc: + case 0x100d: + case 0x100e: + case 0x100f: + case 0x1010: + return scale * 4.0f; + default: + break; + } + + if (!g_session.IsPlayerJobId(this->GetEffectiveJob(-1)) && !g_session.IsNpcJob(this->GetEffectiveJob(-1)) && + this->render.accountId != g_session.m_aid) { + return 0.0f; + } + + if (g_session.IsBabyJob(this->GetEffectiveJob(-1))) { + return this->unknown_02CC ? 4.0f : -1.0f; + } + + if (g_session.IsDoramJob(this->GetEffectiveJob(-1))) { + return this->unknown_02CC ? scale * -3.0f : scale * -2.0f; + } + + if (!this->unknown_02CC) { + return 0.0f; + } + + CPc* pc = dynamic_cast(this); + if (!pc) { + return scale * 6.0f; + } + + switch (static_cast(pc->unknown_04D4)) { + case 0x18: + case 0x1077: + case 0x10d2: + return 0.0f; + case 0: + case 0x17: + case 0xfa1: + case 0x105e: + case 0x10d3: + case 0x10ff: + case 0x1101: + case 0x1103: + return scale + scale; + default: + return scale * 6.0f; + } +} + +// OFFSET: 0x00CAD780 +// FUNCTION: fn_21054 +float CGameActor::GetNameHeight() { + switch (this->GetEffectiveJob(-1)) { + case 0xd: + case 0x15: + case 0xfae: + case 0xfb6: + case 0xff0: + case 0xff1: + case 0xff2: + case 0xff3: + case 0xff4: + case 0xff5: + case 0xff6: + case 0xff7: + case 0xff8: + case 0xff9: + case 0xffa: + case 0xffb: + case 0xffc: + case 0xffd: + case 0xffe: + case 0xfff: + case 0x10b6: + case 0x10b7: + case 0x10b8: + case 0x10b9: + return 23.0f; + case 0xfc4: + case 0xfcc: + case 0x100d: + case 0x100e: + case 0x100f: + case 0x1010: + return 19.0f; + default: + break; + } + + if (!g_session.IsPlayerJobId(this->GetEffectiveJob(-1)) && !g_session.IsNpcJob(this->GetEffectiveJob(-1)) && + this->render.accountId != g_session.m_aid) { + return 18.0f; + } + + if (g_session.IsDoramJob(this->GetEffectiveJob(-1)) || !this->unknown_02CC) { + return 18.0f; + } + + CPc* pc = dynamic_cast(this); + if (!pc) { + return 23.0f; + } + + switch (static_cast(pc->unknown_04D4)) { + case 0x18: + case 0x1077: + case 0x10d2: + return 18.0f; + case 0: + case 0x17: + case 0xfa1: + case 0x105e: + case 0x10d3: + case 0x10ff: + case 0x1101: + case 0x1103: + return 19.0f; + default: + return 23.0f; + } +} + +// OFFSET: 0x00CAD990 +// FUNCTION: fn_21055 +CSprRes* CGameActor::GetSprite() { + return this->render.sprite; +} + +// OFFSET: 0x00CAD9A0 +// FUNCTION: fn_21056 +float CGameActor::GetElapsedFrames() { + return static_cast(static_cast(timeGetTime() - this->render.unknown_008C) / 24.0); +} + +// OFFSET: 0x00CADB30 +// FUNCTION: fn_21060 +void CGameActor::ResetUnknown03B8() { + this->unknown_03B8[0] = -1; + this->unknown_03B8[1] = -1; + this->unknown_03B8[2] = -1; + this->unknown_03C4 = -1; + this->unknown_03C8 = 0; +} + +// OFFSET: 0x00CADC90 +// FUNCTION: fn_21065 +bool CGameActor::IsMonsterClass(int job) { + return (job > 1000 && job < 3999) || static_cast(job - 20021) <= 11978; +} + +// OFFSET: 0x00CADCC0 +// FUNCTION: fn_21066 +bool CGameActor::HasPendingDamage() { + return !this->unknown_02A8.empty(); +} + +// OFFSET: 0x00CADCF0 +// FUNCTION: fn_21067 +bool CGameActor::UpdateUnknown03E8(std::int64_t value) { + const std::int64_t previous = (static_cast(this->unknown_03EC) << 32) | static_cast(this->unknown_03E8); + this->unknown_03EC = static_cast(value >> 32); + this->unknown_03E8 = static_cast(value); + return previous < value; +} + +// OFFSET: 0x00CADD30 +// FUNCTION: fn_21068 +int CGameActor::IsPlayerClass(int job) { + return g_session.IsPlayerJobId(job); +} + +// OFFSET: 0x00CAE1B0 +// FUNCTION: fn_21072 +void CGameActor::SetStackedEffect(int effectId, bool on) { + if (!on) { + this->unknown_03FC.erase(effectId); + this->ApplyEffectState(effectId, false); + return; + } + + for (const int id : this->unknown_03FC) { + this->ApplyEffectState(id, false); + } + this->unknown_03FC.insert(effectId); + for (const int id : this->unknown_03FC) { + this->ApplyEffectState(id, true); + } +} diff --git a/Source/Contents/Actors/GameActor.h b/Source/Contents/Actors/GameActor.h index 12136587..017c1715 100644 --- a/Source/Contents/Actors/GameActor.h +++ b/Source/Contents/Actors/GameActor.h @@ -242,9 +242,21 @@ public: void ResetState(); void UpdateMotionFrame(); void ProcessHitMessage(CGameObject* sender, const ActorHitInfo* info, int unused1, int unused2); + int GetEffectCounter(int effectId); + float GetNameOffset(); + float GetNameHeight(); + void SetStackedEffect(int effectId, bool on); + CSprRes* GetSprite(); + float GetElapsedFrames(); + void ResetUnknown03B8(); + bool IsMonsterClass(int job); + bool HasPendingDamage(); + bool UpdateUnknown03E8(std::int64_t value); + int IsPlayerClass(int job); }; int ShapeShiftJob(int form, int job); +int __stdcall MountedJob(int job, std::uint32_t flags); extern const int g_maxMoveSpeed; extern int g_multiHitInterval;