2021-12-05 17:54:36 +00:00
|
|
|
#include "ImgBrickConsoleQB.h"
|
|
|
|
#include "RebuildComponent.h"
|
|
|
|
#include "dZoneManager.h"
|
|
|
|
#include "EntityManager.h"
|
|
|
|
#include "GameMessages.h"
|
|
|
|
#include "MissionComponent.h"
|
|
|
|
#include "eMissionState.h"
|
|
|
|
#include "InventoryComponent.h"
|
2023-05-02 22:39:21 +00:00
|
|
|
#include "eTerminateType.h"
|
2021-12-05 17:54:36 +00:00
|
|
|
|
|
|
|
int32_t ImgBrickConsoleQB::ResetBricks = 30;
|
|
|
|
int32_t ImgBrickConsoleQB::ResetConsole = 60;
|
|
|
|
int32_t ImgBrickConsoleQB::ResetInteract = 45;
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::OnStartup(Entity* self) {
|
|
|
|
self->SetNetworkVar(u"used", false);
|
|
|
|
|
|
|
|
self->AddTimer("reset", ResetBricks);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::OnUse(Entity* self, Entity* user) {
|
2023-06-07 07:23:50 +00:00
|
|
|
auto rebuildComponent = self->GetComponent<RebuildComponent>();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-05-02 22:39:21 +00:00
|
|
|
if (rebuildComponent->GetState() == eRebuildState::COMPLETED) {
|
2021-12-05 17:54:36 +00:00
|
|
|
if (!self->GetNetworkVar<bool>(u"used")) {
|
|
|
|
const auto consoles = EntityManager::Instance()->GetEntitiesInGroup("Console");
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
auto bothBuilt = false;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
for (auto* console : consoles) {
|
2023-06-07 07:23:50 +00:00
|
|
|
auto consoleRebuildComponent = console->GetComponent<RebuildComponent>();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-05-02 22:39:21 +00:00
|
|
|
if (consoleRebuildComponent->GetState() != eRebuildState::COMPLETED) {
|
2021-12-05 17:54:36 +00:00
|
|
|
continue;
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
console->CancelAllTimers();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (console->GetNetworkVar<bool>(u"used")) {
|
|
|
|
bothBuilt = true;
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (bothBuilt) {
|
|
|
|
SmashCanister(self);
|
|
|
|
} else {
|
|
|
|
SpawnBrick(self);
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
self->AddTimer("Die", ResetInteract);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
auto onFX = 0;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto location = GeneralUtils::UTF16ToWTF8(self->GetVar<std::u16string>(u"console"));
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (location == "Left") {
|
|
|
|
onFX = 2776;
|
|
|
|
} else {
|
|
|
|
onFX = 2779;
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto& facility = EntityManager::Instance()->GetEntitiesInGroup("FacilityPipes");
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (!facility.empty()) {
|
|
|
|
GameMessages::SendStopFXEffect(facility[0], true, location + "PipeEnergy");
|
|
|
|
GameMessages::SendPlayFXEffect(facility[0]->GetObjectID(), onFX, u"create", location + "PipeOn");
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
auto* player = user;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-06-07 07:23:50 +00:00
|
|
|
auto missionComponent = player->GetComponent<MissionComponent>();
|
|
|
|
auto inventoryComponent = player->GetComponent<InventoryComponent>();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (missionComponent != nullptr && inventoryComponent != nullptr) {
|
|
|
|
if (missionComponent->GetMissionState(1302) == eMissionState::ACTIVE) {
|
|
|
|
inventoryComponent->RemoveItem(13074, 1);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
missionComponent->ForceProgressTaskType(1302, 1, 1);
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (missionComponent->GetMissionState(1926) == eMissionState::ACTIVE) {
|
|
|
|
inventoryComponent->RemoveItem(14472, 1);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
missionComponent->ForceProgressTaskType(1926, 1, 1);
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
self->SetNetworkVar(u"used", true);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-05-02 22:39:21 +00:00
|
|
|
GameMessages::SendTerminateInteraction(player->GetObjectID(), eTerminateType::FROM_INTERACTION, self->GetObjectID());
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::SpawnBrick(Entity* self) {
|
|
|
|
const auto netDevil = dZoneManager::Instance()->GetSpawnersByName("MaelstromBug");
|
|
|
|
if (!netDevil.empty()) {
|
|
|
|
netDevil[0]->Reset();
|
|
|
|
netDevil[0]->Deactivate();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto brick = dZoneManager::Instance()->GetSpawnersByName("Imagination");
|
|
|
|
if (!brick.empty()) {
|
|
|
|
brick[0]->Activate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::SmashCanister(Entity* self) {
|
|
|
|
const auto brick = EntityManager::Instance()->GetEntitiesInGroup("Imagination");
|
|
|
|
if (!brick.empty()) {
|
|
|
|
GameMessages::SendPlayFXEffect(brick[0]->GetObjectID(), 122, u"create", "bluebrick");
|
|
|
|
GameMessages::SendPlayFXEffect(brick[0]->GetObjectID(), 1034, u"cast", "imaginationexplosion");
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto canisters = EntityManager::Instance()->GetEntitiesInGroup("Canister");
|
|
|
|
for (auto* canister : canisters) {
|
2023-05-02 22:39:21 +00:00
|
|
|
canister->Smash(canister->GetObjectID(), eKillType::VIOLENT);
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto canister = dZoneManager::Instance()->GetSpawnersByName("BrickCanister");
|
|
|
|
if (!canister.empty()) {
|
|
|
|
canister[0]->Reset();
|
|
|
|
canister[0]->Deactivate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::OnRebuildComplete(Entity* self, Entity* target) {
|
|
|
|
auto energyFX = 0;
|
|
|
|
|
|
|
|
const auto location = GeneralUtils::UTF16ToWTF8(self->GetVar<std::u16string>(u"console"));
|
|
|
|
|
|
|
|
if (location == "Left") {
|
|
|
|
energyFX = 2775;
|
|
|
|
} else {
|
|
|
|
energyFX = 2778;
|
|
|
|
}
|
|
|
|
|
|
|
|
const auto& facility = EntityManager::Instance()->GetEntitiesInGroup("FacilityPipes");
|
|
|
|
|
|
|
|
if (!facility.empty()) {
|
|
|
|
GameMessages::SendStopFXEffect(facility[0], true, location + "PipeOff");
|
|
|
|
GameMessages::SendPlayFXEffect(facility[0]->GetObjectID(), energyFX, u"create", location + "PipeEnergy");
|
|
|
|
}
|
|
|
|
|
|
|
|
const auto consoles = EntityManager::Instance()->GetEntitiesInGroup("Console");
|
|
|
|
|
|
|
|
for (auto* console : consoles) {
|
2023-06-07 07:23:50 +00:00
|
|
|
auto consoleRebuildComponent = console->GetComponent<RebuildComponent>();
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2023-05-02 22:39:21 +00:00
|
|
|
if (consoleRebuildComponent->GetState() != eRebuildState::COMPLETED) {
|
2021-12-05 17:54:36 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
console->CancelAllTimers();
|
|
|
|
}
|
|
|
|
|
|
|
|
self->AddTimer("Die", ResetConsole);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::OnDie(Entity* self, Entity* killer) {
|
|
|
|
if (self->GetVar<bool>(u"Died")) {
|
|
|
|
return;
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
self->CancelAllTimers();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
self->SetVar(u"Died", true);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-06-07 07:23:50 +00:00
|
|
|
auto rebuildComponent = self->GetComponent<RebuildComponent>();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-05-02 22:39:21 +00:00
|
|
|
if (rebuildComponent->GetState() == eRebuildState::COMPLETED) {
|
2021-12-05 17:54:36 +00:00
|
|
|
auto offFX = 0;
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto location = GeneralUtils::UTF16ToWTF8(self->GetVar<std::u16string>(u"console"));
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (location == "Left") {
|
|
|
|
offFX = 2774;
|
|
|
|
} else {
|
|
|
|
offFX = 2777;
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto& facility = EntityManager::Instance()->GetEntitiesInGroup("FacilityPipes");
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
if (!facility.empty()) {
|
|
|
|
GameMessages::SendStopFXEffect(facility[0], true, location + "PipeEnergy");
|
|
|
|
GameMessages::SendStopFXEffect(facility[0], true, location + "PipeOn");
|
|
|
|
GameMessages::SendPlayFXEffect(facility[0]->GetObjectID(), offFX, u"create", location + "PipeOff");
|
|
|
|
GameMessages::SendPlayFXEffect(facility[0]->GetObjectID(), 2750, u"create", location + "imagination_canister");
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto myGroup = GeneralUtils::UTF16ToWTF8(self->GetVar<std::u16string>(u"spawner_name"));
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto pipeGroup = myGroup.substr(0, 10);
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto firstPipe = pipeGroup + "1";
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto samePipeSpawner = dZoneManager::Instance()->GetSpawnersByName(myGroup);
|
|
|
|
if (!samePipeSpawner.empty()) {
|
|
|
|
samePipeSpawner[0]->Reset();
|
|
|
|
samePipeSpawner[0]->Deactivate();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto firstPipeSpawner = dZoneManager::Instance()->GetSpawnersByName(firstPipe);
|
|
|
|
if (!firstPipeSpawner.empty()) {
|
|
|
|
firstPipeSpawner[0]->Activate();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto netdevil = dZoneManager::Instance()->GetSpawnersByName("Imagination");
|
|
|
|
if (!netdevil.empty()) {
|
|
|
|
netdevil[0]->Reset();
|
|
|
|
netdevil[0]->Deactivate();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto brick = dZoneManager::Instance()->GetSpawnersByName("MaelstromBug");
|
|
|
|
if (!brick.empty()) {
|
|
|
|
brick[0]->Activate();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
const auto canister = dZoneManager::Instance()->GetSpawnersByName("BrickCanister");
|
|
|
|
if (!canister.empty()) {
|
|
|
|
canister[0]->Activate();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
self->SetNetworkVar(u"used", false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImgBrickConsoleQB::OnTimerDone(Entity* self, std::string timerName) {
|
|
|
|
if (timerName == "reset") {
|
2023-06-07 07:23:50 +00:00
|
|
|
auto rebuildComponent = self->GetComponent<RebuildComponent>();
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2023-05-02 22:39:21 +00:00
|
|
|
if (rebuildComponent->GetState() == eRebuildState::OPEN) {
|
|
|
|
self->Smash(self->GetObjectID(), eKillType::SILENT);
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
|
|
|
} else if (timerName == "Die") {
|
|
|
|
const auto consoles = EntityManager::Instance()->GetEntitiesInGroup("Console");
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
for (auto* console : consoles) {
|
2023-05-02 22:39:21 +00:00
|
|
|
console->Smash(console->GetObjectID(), eKillType::VIOLENT);
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|