fix(Scripts/Ulduar): falling down Kologarn's pit should kill (#18945)

* add insersectboundary

* add kill bunny to kologarn's pit

* Update data/sql/updates/pending_db_world/rev_1716571588345702920.sql

Co-authored-by: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com>

* refactor: use Map DoForAllPlayers

---------

Co-authored-by: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com>
This commit is contained in:
Jelle Meeus
2024-05-26 19:38:16 +02:00
committed by GitHub
parent 8e784c1914
commit 99004116a5
4 changed files with 69 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
--
DELETE FROM `creature` WHERE `id1` = 33742;
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
(136768, 33742, 0, 0, 603, 0, 0, 3, 1, 0, 1809.8663330078125, -38.2449531555175781, 408.03680419921875, 0, 180, 0, 0, 26066, 0, 0, 0, 0, 0, '', 47720);
UPDATE `creature_template` SET `ScriptName` = 'boss_kologarn_pit_kill_bunny' WHERE `entry` = 33742;

View File

@@ -110,3 +110,21 @@ bool BoundaryUnionBoundary::IsWithinBoundaryArea(Position const* pos) const
{
return (_b1->IsWithinBoundary(pos) || _b2->IsWithinBoundary(pos));
}
// ---== INTERSECT OF 2 BOUNDARIES ==---
BoundaryIntersectBoundary::BoundaryIntersectBoundary(AreaBoundary const* b1, AreaBoundary const* b2, bool isInverted) :
AreaBoundary(isInverted), _b1(b1), _b2(b2)
{
ASSERT(b1 && b2);
}
BoundaryIntersectBoundary::~BoundaryIntersectBoundary()
{
delete _b1;
delete _b2;
}
bool BoundaryIntersectBoundary::IsWithinBoundaryArea(Position const* pos) const
{
return (_b1->IsWithinBoundary(pos) && _b2->IsWithinBoundary(pos));
}

View File

@@ -165,4 +165,18 @@ class AC_GAME_API BoundaryUnionBoundary : public AreaBoundary
AreaBoundary const* const _b2;
};
class AC_GAME_API BoundaryIntersectBoundary : public AreaBoundary
{
public:
BoundaryIntersectBoundary(AreaBoundary const* b1, AreaBoundary const* b2, bool isInverted = false);
protected:
virtual ~BoundaryIntersectBoundary();
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
AreaBoundary const* const _b1;
AreaBoundary const* const _b2;
};
#endif //ACORE_AREA_BOUNDARY_H

View File

@@ -665,6 +665,37 @@ public:
};
};
struct boss_kologarn_pit_kill_bunny : public NullCreatureAI
{
boss_kologarn_pit_kill_bunny(Creature* creature) : NullCreatureAI(creature) { }
void Reset() override
{
RectangleBoundary* _boundaryXY = new RectangleBoundary(1782.0f, 1832.0f, -56.0f, 8.0f);
ZRangeBoundary* _boundaryZ = new ZRangeBoundary(400.0f, 439.0f);
_boundaryIntersect = new BoundaryIntersectBoundary(_boundaryXY, _boundaryZ);
scheduler.Schedule(0s, [this](TaskContext context)
{
me->GetMap()->DoForAllPlayers([&](Player* player)
{
if (_boundaryIntersect->IsWithinBoundary(player->GetPosition()) && !player->IsGameMaster())
{
player->KillSelf(false);
}
});
context.Repeat(1s);
});
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
}
private:
BoundaryIntersectBoundary const* _boundaryIntersect;
};
// predicate function to select non main tank target
class StoneGripTargetSelector
{
@@ -894,6 +925,7 @@ void AddSC_boss_kologarn()
new boss_kologarn();
new boss_kologarn_arms();
new boss_kologarn_eyebeam();
RegisterUlduarCreatureAI(boss_kologarn_pit_kill_bunny);
// Spells
new spell_ulduar_stone_grip_cast_target();