#include "AgSpiderBossMessage.h" #include "Entity.h" #include "GameMessages.h" #include "RenderComponent.h" Box AgSpiderBossMessage::GetBox(Entity* self) const { return self->GetVar(u"box"); } void AgSpiderBossMessage::SetBox(Entity* self, const Box& box) const { self->SetVar(u"box", box); } void AgSpiderBossMessage::MakeBox(Entity* self) const { auto box = GetBox(self); if (box.boxTarget == LWOOBJID_EMPTY || box.isDisplayed || box.boxSelf == LWOOBJID_EMPTY) return; box.isDisplayed = true; SetBox(self, box); self->AddTimer("BoxTimer", box.boxTime); const auto* const tgt = Game::entityManager->GetEntity(box.boxTarget); if (!tgt) return; GameMessages::DisplayTooltip tooltip; tooltip.target = tgt->GetObjectID(); tooltip.show = true; tooltip.text = box.boxText; tooltip.time = box.boxTime * 1000; // to ms tooltip.Send(tgt->GetSystemAddress()); } void AgSpiderBossMessage::OnCollisionPhantom(Entity* self, Entity* target) { if (!target || !target->IsPlayer()) return; auto box = GetBox(self); // knockback the target auto forward = target->GetRotation().GetForwardVector(); box.boxTarget = target->GetObjectID(); GameMessages::SendPlayFXEffect(target->GetObjectID(), 1378, u"create", "pushBack"); RenderComponent::PlayAnimation(target, "knockback-recovery"); forward.y += 15; forward.x *= 100; forward.z *= 100; GameMessages::SendKnockback(target->GetObjectID(), self->GetObjectID(), self->GetObjectID(), 0, forward); if (box.isTouch || box.isDisplayed) return; box.boxSelf = self->GetObjectID(); box.isTouch = true; box.boxText = u"%[SPIDER_CAVE_MESSAGE]"; SetBox(self, box); self->AddTimer("EventTimer", 0.1f); } void AgSpiderBossMessage::OnOffCollisionPhantom(Entity* self, Entity* target) { if (!target) return; auto box = GetBox(self); box.isTouch = false; box.Reset(); SetBox(self, box); } void AgSpiderBossMessage::OnTimerDone(Entity* self, std::string timerName) { if (timerName == "BoxTimer") { auto box = GetBox(self); box.isDisplayed = false; SetBox(self, box); ResetBox(self); } else if (timerName == "EventTimer") { auto box = GetBox(self); MakeBox(self); } } void AgSpiderBossMessage::ResetBox(Entity* self) const { auto box = GetBox(self); box.Reset(); SetBox(self, box); }