rodecomp/Source/Contents/Effects/Core/EffectMaker.cpp
ragnarok-clanker 0d6efeaf09 Maintenance: C7 (replaces 18431/18498/18559). Actor SendMsg takes (CGameObject* sender, std::int64_t message, std::int64_t b..g). Aud
Batch #18562 by ragnarok-clanker: forced by an admin (31 lower score(s), 132 changed function(s)); checked with 230 compiled unit(s), including every includer of Source/Client/Mode/CGameMode.h, Source/Contents/Actors/EffectActors.h, Source/Contents/Actors/GameActor.h, Source/Contents/Actors/GameObject.h, Source/Contents/Actors/GndRiser.h, Source/Contents/Actors/GroundScope.h, Source/Contents/Actors/Item.h, Source/Contents/Actors/MousePointer.h, Source/Contents/Actors/Npc.h, Source/Contents/Actors/Pc.h, Source/Contents/Actors/RenderObject.h, Source/Contents/Actors/Skill.h, Source/Contents/Effects/Core/DummyEffectLauncher.h, Source/Contents/Effects/Core/EffectActor.h, Source/Contents/Effects/Core/EffectMaker.h, Source/Contents/Effects/Core/MsgEffect.h, Source/Contents/Effects/Skills/ArrowEffect.h, Source/Contents/Effects/Skills/MandraAttackEffect.h, Source/Contents/SignBoard/SignBoard.h, Source/Contents/Skills/GraffiSkill.h, Source/Contents/Sound/SoundMaker.h.
2026-11-12 16:09:04 +00:00

97 lines
2.9 KiB
C++

#include "Contents/Effects/Core/EffectMaker.h"
#include "Contents/Actors/ActorEnums.h"
#include "Client/Mode/CGameMode.h"
#include "Client/Mode/ModeMgr.h"
#include "Contents/Actors/Pc.h"
#include "Contents/Effects/Core/RagEffect.h"
#include "Contents/World/World.h"
#include "Resource/World/WorldResource.h"
#include <algorithm>
#include <cstdlib>
namespace {
// INLINED
inline int RandomBelow(int range) {
if (range == 0) {
return 0;
}
return std::ranges::max(rand() % range, 0);
}
}
// OFFSET: 0x00E4A2B0
// FUNCTION: fn_24251
CEffectMaker::CEffectMaker() {
this->effectId = -1;
this->spawnInterval = 360;
this->elapsedFrames = 360;
this->parameter1 = 0;
this->parameter2 = 0;
this->parameter3 = 0;
this->parameter4 = 0;
}
// OFFSET: 0x00E4BA80
// FUNCTION: fn_24278
void CEffectMaker::Reset() {
this->effectId = -1;
this->spawnInterval = 360;
this->elapsedFrames = 360;
this->parameter1 = 0;
this->parameter2 = 0;
this->parameter3 = 0;
this->parameter4 = 0;
}
// OFFSET: 0x00E4C210
// FUNCTION: fn_24282
bool CEffectMaker::OnProcess() {
CGameMode* mode = static_cast<CGameMode*>(g_modeMgr.GetGameMode());
CPlayer* player = mode->scene->player;
if (this->CalcDist(player->render.position.x, player->render.position.z) < 130.0f && this->elapsedFrames >= this->spawnInterval) {
this->elapsedFrames = 0;
CRagEffect* effect = this->LaunchEffect(this->effectId, vector3d{0.0f, 0.0f, 0.0f}, 0.0f);
if (effect != nullptr) {
effect->SendMsg(nullptr, AM_SETPARAM, 0, reinterpret_cast<int>(&this->parameter1), 0, 0, 0, 0);
}
}
++this->elapsedFrames;
return true;
}
// OFFSET: 0x00E4FD60
// FUNCTION: fn_24290
void CEffectMaker::Render(int) {
}
// OFFSET: 0x00E50BB0
// FUNCTION: fn_24297
void CEffectMaker::SendMsg(CGameObject* sender, std::int64_t message, std::int64_t b, std::int64_t c, std::int64_t d, std::int64_t e, std::int64_t f, std::int64_t g) {
if (message != 14) {
this->EffectActor::SendMsg(sender, message, b, c, d, e, 0, 0);
return;
}
const WorldEffectRecord* record = reinterpret_cast<const WorldEffectRecord*>(static_cast<std::intptr_t>(b));
this->effectId = record->id;
if (this->effectId != 45) {
this->spawnInterval = static_cast<unsigned>(record->delay);
this->elapsedFrames = static_cast<unsigned>(record->delay - static_cast<float>(RandomBelow(24)));
} else {
const int jitter = RandomBelow(static_cast<int>(record->delay / 10.0f));
this->spawnInterval = static_cast<unsigned>(static_cast<float>(jitter) + record->delay - record->delay / 20.0f);
this->elapsedFrames = RandomBelow(static_cast<int>(record->delay + 1.0f));
}
this->render.position.x = record->position[0];
this->render.position.y = record->position[1];
this->render.position.z = record->position[2];
this->parameter1 = record->parameters[0];
this->parameter2 = record->parameters[1];
this->parameter3 = record->parameters[2];
this->parameter4 = record->parameters[3];
}