Core/Instance: implement the combat resurrection limit.

Cherry Pick from https://github.com/TrinityCore/TrinityCore/commit/948146f3ee890b85af50944176877c7d44c0c120

I change this a bit, so that this is works right for 4.3.3 Patch. (Here isn't add charges after a specific time. Groups have from begin 1 or 3 Charges for Resurrection.)
This commit is contained in:
sevi committed 2017-03-19 01:55:40 +01:00
1 parent 0ee051e6af
commit d4c703a2e2
5 files changed
+126 -11

No files matched your search

+87 -9
View File
@@ -295,16 +295,41 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state)
//TC_LOG_ERROR("misc", "Inialize boss %u state as %u.", id, (uint32)state);
return false;
}
else
{
if (bossInfo->state == state)
return false;
else
{
if (bossInfo->state == state)
return false;
if (state == DONE)
for (GuidSet::iterator i = bossInfo->minion.begin(); i != bossInfo->minion.end(); ++i)
if (Creature* minion = instance->GetCreature(*i))
if (minion->isWorldBoss() && minion->IsAlive())
return false;
if (state == DONE)
for (GuidSet::iterator i = bossInfo->minion.begin(); i != bossInfo->minion.end(); ++i)
if (Creature* minion = instance->GetCreature(*i))
if (minion->isWorldBoss() && minion->IsAlive())
return false;
switch (state)
{
case IN_PROGRESS:
{
uint32 resInterval = GetCombatResurrectionChargeInterval();
if (instance->Is25ManRaid() || (instance->Is25ManRaid() && instance->IsHeroic()))
{
InitializeCombatResurrections(3, resInterval);
}
else
{
InitializeCombatResurrections(1, resInterval);
}
break;
}
case FAIL:
case DONE:
ResetCombatResurrections();
break;
default:
break;
}
bossInfo->state = state;
SaveToDB();
@@ -690,3 +715,56 @@ void InstanceScript::UpdatePhasing()
if (Player* player = itr->GetSource())
player->SendUpdatePhasing();
}
void InstanceScript::UpdateCombatResurrection(uint32 diff)
{
if (!_combatResurrectionTimerStarted)
return;
_combatResurrectionTimer -= diff;
if (_combatResurrectionTimer <= 0)
{
AddCombatResurrectionCharge();
_combatResurrectionTimerStarted = false;
}
}
void InstanceScript::InitializeCombatResurrections(uint8 charges /*= 1*/, uint32 interval /*= 0*/)
{
_combatResurrectionCharges = charges;
if (!interval)
return;
_combatResurrectionTimer = interval;
_combatResurrectionTimerStarted = true; // true;
}
void InstanceScript::AddCombatResurrectionCharge()
{
// ++_combatResurrectionCharges;
_combatResurrectionTimer = GetCombatResurrectionChargeInterval();
_combatResurrectionTimerStarted = true;
}
void InstanceScript::UseCombatResurrection()
{
--_combatResurrectionCharges;
}
void InstanceScript::ResetCombatResurrections()
{
_combatResurrectionCharges = 0;
_combatResurrectionTimer = 0;
_combatResurrectionTimerStarted = 0;
}
uint32 InstanceScript::GetCombatResurrectionChargeInterval() const
{
// This System here is from MoP and not Cataclysm.
// In Cataclysm have 10 Man Raids 1 Resurrection and 25 Man Raids 3 Resurrection free.
uint32 interval = 0;
if (uint32 playerCount = instance->GetPlayers().getSize())
interval = 90 * MINUTE * IN_MILLISECONDS / playerCount;
return interval;
}