script fixes (#1577)

fixes an issue where the sirens would not be destroyed correctly
fixes undefined behavior in buff station

ok for real this time

actual fix for mermaids

and for general death_behavior 0 skill stuff
This commit is contained in:
David Markowitz 2024-05-16 02:30:32 -07:00 committed by GitHub
parent 8837b110ab
commit 35321b22d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 13 deletions

View File

@ -1534,7 +1534,7 @@ void Entity::Kill(Entity* murderer, const eKillType killType) {
bool waitForDeathAnimation = false; bool waitForDeathAnimation = false;
if (destroyableComponent) { if (destroyableComponent) {
waitForDeathAnimation = destroyableComponent->GetDeathBehavior() == 0 && killType != eKillType::SILENT; waitForDeathAnimation = !destroyableComponent->GetIsSmashable() && destroyableComponent->GetDeathBehavior() == 0 && killType != eKillType::SILENT;
} }
// Live waited a hard coded 12 seconds for death animations of type 0 before networking destruction! // Live waited a hard coded 12 seconds for death animations of type 0 before networking destruction!

View File

@ -224,6 +224,16 @@ bool BehaviorContext::CalculateUpdate(const float deltaTime) {
for (auto i = 0u; i < this->syncEntries.size(); ++i) { for (auto i = 0u; i < this->syncEntries.size(); ++i) {
auto entry = this->syncEntries.at(i); auto entry = this->syncEntries.at(i);
if (entry.behavior->m_templateId == BehaviorTemplate::ATTACK_DELAY) {
auto* self = Game::entityManager->GetEntity(originator);
if (self) {
auto* destroyableComponent = self->GetComponent<DestroyableComponent>();
if (destroyableComponent && destroyableComponent->GetHealth() <= 0) {
continue;
}
}
}
if (entry.time > 0) { if (entry.time > 0) {
entry.time -= deltaTime; entry.time -= deltaTime;
@ -333,7 +343,7 @@ void BehaviorContext::FilterTargets(std::vector<Entity*>& targets, std::forward_
} }
// handle targeting the caster // handle targeting the caster
if (candidate == caster){ if (candidate == caster) {
// if we aren't targeting self, erase, otherise increment and continue // if we aren't targeting self, erase, otherise increment and continue
if (!targetSelf) index = targets.erase(index); if (!targetSelf) index = targets.erase(index);
else index++; else index++;
@ -356,24 +366,24 @@ void BehaviorContext::FilterTargets(std::vector<Entity*>& targets, std::forward_
} }
// if they are dead, then earse and continue // if they are dead, then earse and continue
if (candidateDestroyableComponent->GetIsDead()){ if (candidateDestroyableComponent->GetIsDead()) {
index = targets.erase(index); index = targets.erase(index);
continue; continue;
} }
// if their faction is explicitly included, increment and continue // if their faction is explicitly included, increment and continue
auto candidateFactions = candidateDestroyableComponent->GetFactionIDs(); auto candidateFactions = candidateDestroyableComponent->GetFactionIDs();
if (CheckFactionList(includeFactionList, candidateFactions)){ if (CheckFactionList(includeFactionList, candidateFactions)) {
index++; index++;
continue; continue;
} }
// check if they are a team member // check if they are a team member
if (targetTeam){ if (targetTeam) {
auto* team = TeamManager::Instance()->GetTeam(this->caster); auto* team = TeamManager::Instance()->GetTeam(this->caster);
if (team){ if (team) {
// if we find a team member keep it and continue to skip enemy checks // if we find a team member keep it and continue to skip enemy checks
if(std::find(team->members.begin(), team->members.end(), candidate->GetObjectID()) != team->members.end()){ if (std::find(team->members.begin(), team->members.end(), candidate->GetObjectID()) != team->members.end()) {
index++; index++;
continue; continue;
} }
@ -419,8 +429,8 @@ bool BehaviorContext::CheckTargetingRequirements(const Entity* target) const {
// returns true if any of the object factions are in the faction list // returns true if any of the object factions are in the faction list
bool BehaviorContext::CheckFactionList(std::forward_list<int32_t>& factionList, std::vector<int32_t>& objectsFactions) const { bool BehaviorContext::CheckFactionList(std::forward_list<int32_t>& factionList, std::vector<int32_t>& objectsFactions) const {
if (factionList.empty() || objectsFactions.empty()) return false; if (factionList.empty() || objectsFactions.empty()) return false;
for (auto faction : factionList){ for (auto faction : factionList) {
if(std::find(objectsFactions.begin(), objectsFactions.end(), faction) != objectsFactions.end()) return true; if (std::find(objectsFactions.begin(), objectsFactions.end(), faction) != objectsFactions.end()) return true;
} }
return false; return false;
} }

View File

@ -56,10 +56,6 @@ void AgSurvivalBuffStation::OnTimerDone(Entity* self, std::string timerName) {
auto member = Game::entityManager->GetEntity(memberID); auto member = Game::entityManager->GetEntity(memberID);
if (member != nullptr && !member->GetIsDead()) { if (member != nullptr && !member->GetIsDead()) {
GameMessages::SendDropClientLoot(member, self->GetObjectID(), powerupToDrop, 0, self->GetPosition()); 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<std::vector<LWOOBJID>>(u"BuilderTeam", team);
} }
} }
} }