rodecomp/Source/Contents/Effects/Effect.cpp
ragnarok-clanker d98cf6bf1e Decompile 5 functions in Source/Contents/Effects/Effect.cpp, Source/Contents/Effects/EffectForceRender.cpp, ...
Batch #2130 by ragnarok-clanker: 0 byte-identical, 5 confirmed by peer review.

- fn_18986 CEffect::Slot33: logic confirmed by peer review
- fn_18989 CEffect::UpdateVisibility: logic confirmed by peer review
- fn_18990 CEffect::Slot29: logic confirmed by peer review
- fn_23884 CSession::IsPartyMember: logic confirmed by peer review
- fn_24185 CSession::IsPvpMap: logic confirmed by peer review

Reviewed-by: ragnarok-clanker
Adds to the build: Source/Contents/Effects/EffectForceRender.cpp, Source/Client/SessionParty.cpp
2026-10-29 12:59:22 +00:00

121 lines
2.9 KiB
C++

#include "Contents/Effects/Effect.h"
#include "Client/Session.h"
#include "Contents/Actors/RenderObject.h"
#include "Contents/Configuration/ServiceOptions.h"
#include "Contents/Effects/EffectActor.h"
#include "Contents/Effects/EffectLists.h"
#include "Contents/World/World.h"
// OFFSET: 0x00B4DAE0
// FUNCTION: fn_18979
CEffect::CEffect(int value)
: id(value), position{}, sourcePosition{}, actor(0), sourceActor(0), frame(0), unknown_002C(60), unknown_0030(1), outsideRange(0), range(130),
unknown_00B0(-1), retained(0), forceRender(0), unknown_00C4(0), unknown_00C8(0) {
}
// OFFSET: 0x00B4DD10
// OFFSET: 0x00B4DDD0
// FUNCTION: fn_18981
CEffect::~CEffect() = default;
// OFFSET: 0x005A2150
// FUNCTION: fn_03087
void CEffect::Close() {
}
// OFFSET: 0x00B4DE40
// FUNCTION: fn_18984
void CEffect::AddEvent(int kind, const char* text, int frame, int argument) {
EffectEvent event{kind, frame, argument, text ? text : ""};
this->events.push_back(event);
}
// OFFSET: 0x00B4DF90
// FUNCTION: fn_18985
bool CEffect::RetireIfInactive() {
if (!this->Slot06()) {
g_effectMgr->Retire(this, 0);
return true;
}
return false;
}
// OFFSET: 0x00B4E0E0
// FUNCTION: fn_18986
bool CEffect::Slot33() {
EffectActor* actor = static_cast<EffectActor*>(FindRenderObject(this->actor));
if (!actor || actor->render.unknown_00A8 == 0) {
return true;
}
if (this->unknown_00C8 == 0) {
if (this->actor == g_session.m_aid) {
return true;
}
if (g_session.IsPvpMap() && g_session.IsPartyMember(actor->render.accountId, true)) {
return true;
}
}
return actor->EffectVisible();
}
// OFFSET: 0x00B4E150
// FUNCTION: fn_18987
bool CEffect::Slot06() {
if (this->actor != 0 && !FindRenderObject(this->actor)) {
return false;
}
return true;
}
// OFFSET: 0x00B4E170
// FUNCTION: fn_18988
void CEffect::SetEventFrame(int kind, int frame) {
for (EffectEvent& event : this->events) {
if (event.kind == kind) {
event.frame = frame;
return;
}
}
}
// OFFSET: 0x00B4E290
// FUNCTION: fn_18989
void CEffect::UpdateVisibility() {
if ((g_serviceOptions.Get(8) || this->forceRender) && this->Slot06() && !this->outsideRange) {
this->Slot04();
}
}
// OFFSET: 0x00B4E390
// FUNCTION: fn_18991
void CEffect::SetActor(std::uint32_t aid) {
this->actor = aid;
}
// OFFSET: 0x00B4E3A0
// FUNCTION: fn_18992
void CEffect::SetSourceActor(std::uint32_t aid) {
if (CRenderObject* source = FindRenderObject(aid)) {
this->sourceActor = aid;
this->sourcePosition[0] = source->render.position.x;
this->sourcePosition[1] = source->render.position.y;
this->sourcePosition[2] = source->render.position.z;
}
}
// OFFSET: 0x00B249A0
// FUNCTION: fn_18773
void EffectRetirement::Clear() {
for (auto effect = this->effects.begin(); effect != this->effects.end(); ++effect) {
(*effect)->Close();
delete *effect;
}
this->effects.clear();
}