#include "AgSurvivalBuffStation.h" #include "DestroyableComponent.h" #include "EntityManager.h" #include "GameMessages.h" #include "SkillComponent.h" #include "TeamManager.h" void AgSurvivalBuffStation::OnRebuildComplete(Entity* self, Entity* target) { auto* destroyableComponent = self->GetComponent(); // We set the faction to 1 so that the buff station sees players as friendly targets to buff if (destroyableComponent != nullptr) destroyableComponent->SetFaction(1); auto* skillComponent = self->GetComponent(); if (skillComponent != nullptr) skillComponent->CalculateBehavior(skillIdForBuffStation, behaviorIdForBuffStation, self->GetObjectID()); self->AddCallbackTimer(smashTimer, [self]() { self->Smash(); }); self->AddTimer("DropArmor", dropArmorTimer); self->AddTimer("DropLife", dropLifeTimer); self->AddTimer("Dropimagination", dropImaginationTimer); // Since all survival players should be on the same team, we get the team. auto team = TeamManager::Instance()->GetTeam(target->GetObjectID()); std::vector builderTeam; // Not on a team if (team == nullptr) { builderTeam.push_back(target->GetObjectID()); self->SetVar>(u"BuilderTeam", builderTeam); return; } for (auto memberID : team->members) { builderTeam.push_back(memberID); } self->SetVar>(u"BuilderTeam", builderTeam); } void AgSurvivalBuffStation::OnTimerDone(Entity* self, std::string timerName) { uint32_t powerupToDrop = lifePowerup; if (timerName == "DropArmor") { powerupToDrop = armorPowerup; self->AddTimer("DropArmor", dropArmorTimer); } if (timerName == "DropLife") { powerupToDrop = lifePowerup; self->AddTimer("DropLife", dropLifeTimer); } if (timerName == "Dropimagination") { powerupToDrop = imaginationPowerup; self->AddTimer("Dropimagination", dropImaginationTimer); } auto team = self->GetVar>(u"BuilderTeam"); for (auto memberID : team) { auto member = EntityManager::Instance()->GetEntity(memberID); if (member != nullptr && !member->GetIsDead()) { GameMessages::SendDropClientLoot(member, self->GetObjectID(), powerupToDrop, 0, self->GetPosition()); } else { // If player left the team or left early erase them from the team variable. team.erase(std::find(team.begin(), team.end(), memberID)); self->SetVar>(u"BuilderTeam", team); } } }