Files
DarkflameServer/dScripts/02_server/Map/FV/FvCandle.cpp
Aaron Kimbrell 8bf01a6c43 fix(scripts): the water gun blows Forbidden Valley candles out
L_ACT_CANDLE also blows a candle out on the "waterspray" skill event; the port only did it on a hit. The 169
candles in Forbidden Valley now go out (and count for missions 850, 1431, 1529, 1566 and 1603) when sprayed. Check:
spray a candle with the water gun: it goes out, smokes, relights after 5 seconds, and the candle missions count it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:15:32 -05:00

62 lines
1.9 KiB
C++

#include "FvCandle.h"
#include "MissionComponent.h"
#include "RenderComponent.h"
#include "eReplicaComponentType.h"
std::vector<int32_t> FvCandle::m_Missions = { 850, 1431, 1529, 1566, 1603 };
void FvCandle::OnStartup(Entity* self) {
auto* render = static_cast<RenderComponent*>(self->GetComponent(eReplicaComponentType::RENDER));
if (render == nullptr)
return;
render->PlayEffect(2108, u"create", "candle_light", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
self->SetI32(u"Smoke", static_cast<int32_t>(5));
self->SetBoolean(u"AmHit", false);
}
void FvCandle::OnHit(Entity* self, Entity* attacker) {
BlowOutCandle(self, attacker);
}
// The water gun blows candles out too
void FvCandle::OnSkillEventFired(Entity* self, Entity* caster, const std::string& message) {
if (message == "waterspray" && caster) BlowOutCandle(self, caster);
}
void FvCandle::BlowOutCandle(Entity* self, Entity* blower) {
if (self->GetBoolean(u"AmHit"))
return;
auto* render = static_cast<RenderComponent*>(self->GetComponent(eReplicaComponentType::RENDER));
if (render == nullptr)
return;
auto* missionComponent = blower->GetComponent<MissionComponent>();
if (missionComponent != nullptr) {
for (const auto mission : m_Missions) {
missionComponent->ForceProgressTaskType(mission, 1, 1);
}
}
//Update mission tasks here
self->SetBoolean(u"AmHit", true);
render->StopEffect("candle_light", false);
render->PlayEffect(2109, u"create", "candle_smoke", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
self->AddTimer("SmokeTime", self->GetI32(u"Smoke"));
}
void FvCandle::OnTimerDone(Entity* self, std::string timerName) {
self->SetBoolean(u"AmHit", false);
auto* render = static_cast<RenderComponent*>(self->GetComponent(eReplicaComponentType::RENDER));
if (render == nullptr)
return;
render->StopEffect("candle_smoke", false);
render->PlayEffect(2108, u"create", "candle_light", LWOOBJID_EMPTY, 1.0f, 1.0f, true);
}