fix(Core/Spells): Kill credits given via spells should always be awarded to players

This commit is contained in:
UltraNix
2022-03-15 15:55:55 +01:00
committed by GitHub
parent b6a07d38c0
commit 6c60dc3841
2 changed files with 192 additions and 100 deletions
+190 -98
View File
@@ -61,19 +61,27 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_ITEM: case CONDITION_ITEM:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
// don't allow 0 items (it's checked during table load) if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
ASSERT(ConditionValue2); {
bool checkBank = !!ConditionValue3; // don't allow 0 items (it's checked during table load)
condMeets = player->HasItemCount(ConditionValue1, ConditionValue2, checkBank); ASSERT(ConditionValue2);
bool checkBank = !!ConditionValue3;
condMeets = player->HasItemCount(ConditionValue1, ConditionValue2, checkBank);
}
} }
break; break;
} }
case CONDITION_ITEM_EQUIPPED: case CONDITION_ITEM_EQUIPPED:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->HasItemOrGemWithIdEquipped(ConditionValue1, 1); {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasItemOrGemWithIdEquipped(ConditionValue1, 1);
}
}
break; break;
} }
case CONDITION_ZONEID: case CONDITION_ZONEID:
@@ -81,26 +89,39 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
break; break;
case CONDITION_REPUTATION_RANK: case CONDITION_REPUTATION_RANK:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1)) if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
condMeets = (ConditionValue2 & (1 << player->GetReputationMgr().GetRank(faction))); {
if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1))
{
condMeets = (ConditionValue2 & (1 << player->GetReputationMgr().GetRank(faction)));
}
}
} }
break; break;
} }
case CONDITION_ACHIEVEMENT: case CONDITION_ACHIEVEMENT:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->HasAchieved(ConditionValue1); {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasAchieved(ConditionValue1);
}
}
break; break;
} }
case CONDITION_TEAM: case CONDITION_TEAM:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
// Xinef: DB Data compatibility... if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
uint32 teamOld = player->GetTeamId() == TEAM_ALLIANCE ? ALLIANCE : HORDE; {
condMeets = teamOld == ConditionValue1; // Xinef: DB Data compatibility...
uint32 teamOld = player->GetTeamId() == TEAM_ALLIANCE ? ALLIANCE : HORDE;
condMeets = teamOld == ConditionValue1;
}
} }
break; break;
} }
@@ -118,56 +139,83 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_GENDER: case CONDITION_GENDER:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->getGender() == ConditionValue1; {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->getGender() == ConditionValue1;
}
}
break; break;
} }
case CONDITION_SKILL: case CONDITION_SKILL:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->HasSkill(ConditionValue1) && player->GetBaseSkillValue(ConditionValue1) >= ConditionValue2; {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasSkill(ConditionValue1) && player->GetBaseSkillValue(ConditionValue1) >= ConditionValue2;
}
}
break; break;
} }
case CONDITION_QUESTREWARDED: case CONDITION_QUESTREWARDED:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->GetQuestRewardStatus(ConditionValue1); {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->GetQuestRewardStatus(ConditionValue1);
}
}
break; break;
} }
case CONDITION_QUESTTAKEN: case CONDITION_QUESTTAKEN:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
QuestStatus status = player->GetQuestStatus(ConditionValue1); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
condMeets = (status == QUEST_STATUS_INCOMPLETE); {
QuestStatus status = player->GetQuestStatus(ConditionValue1);
condMeets = (status == QUEST_STATUS_INCOMPLETE);
}
} }
break; break;
} }
case CONDITION_QUEST_COMPLETE: case CONDITION_QUEST_COMPLETE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
QuestStatus status = player->GetQuestStatus(ConditionValue1); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
condMeets = (status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(ConditionValue1)); {
QuestStatus status = player->GetQuestStatus(ConditionValue1);
condMeets = (status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(ConditionValue1));
}
} }
break; break;
} }
case CONDITION_QUEST_NONE: case CONDITION_QUEST_NONE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
QuestStatus status = player->GetQuestStatus(ConditionValue1); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
condMeets = (status == QUEST_STATUS_NONE); {
QuestStatus status = player->GetQuestStatus(ConditionValue1);
condMeets = (status == QUEST_STATUS_NONE);
}
} }
break; break;
} }
case CONDITION_QUEST_SATISFY_EXCLUSIVE: case CONDITION_QUEST_SATISFY_EXCLUSIVE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
// Xinef: cannot be null, checked at loading if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
const Quest* quest = sObjectMgr->GetQuestTemplate(ConditionValue1); {
condMeets = !player->IsQuestRewarded(ConditionValue1) && player->SatisfyQuestExclusiveGroup(quest, false); // Xinef: cannot be null, checked at loading
const Quest* quest = sObjectMgr->GetQuestTemplate(ConditionValue1);
condMeets = !player->IsQuestRewarded(ConditionValue1) && player->SatisfyQuestExclusiveGroup(quest, false);
}
} }
break; break;
} }
@@ -183,18 +231,18 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
{ {
switch (ConditionValue3) switch (ConditionValue3)
{ {
case INSTANCE_INFO_DATA: case INSTANCE_INFO_DATA:
condMeets = instance->GetData(ConditionValue1) == ConditionValue2; condMeets = instance->GetData(ConditionValue1) == ConditionValue2;
break; break;
case INSTANCE_INFO_GUID_DATA: case INSTANCE_INFO_GUID_DATA:
condMeets = instance->GetGuidData(ConditionValue1) == ObjectGuid(uint64(ConditionValue2)); condMeets = instance->GetGuidData(ConditionValue1) == ObjectGuid(uint64(ConditionValue2));
break; break;
case INSTANCE_INFO_BOSS_STATE: case INSTANCE_INFO_BOSS_STATE:
condMeets = instance->GetBossState(ConditionValue1) == EncounterState(ConditionValue2); condMeets = instance->GetBossState(ConditionValue1) == EncounterState(ConditionValue2);
break; break;
case INSTANCE_INFO_DATA64: case INSTANCE_INFO_DATA64:
condMeets = instance->GetData64(ConditionValue1) == ConditionValue2; condMeets = instance->GetData64(ConditionValue1) == ConditionValue2;
break; break;
} }
} }
} }
@@ -208,8 +256,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
break; break;
case CONDITION_SPELL: case CONDITION_SPELL:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->HasSpell(ConditionValue1); {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasSpell(ConditionValue1);
}
}
break; break;
} }
case CONDITION_LEVEL: case CONDITION_LEVEL:
@@ -220,8 +273,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_DRUNKENSTATE: case CONDITION_DRUNKENSTATE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = (uint32) Player::GetDrunkenstateByValue(player->GetDrunkValue()) >= ConditionValue1; {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = (uint32)Player::GetDrunkenstateByValue(player->GetDrunkValue()) >= ConditionValue1;
}
}
break; break;
} }
case CONDITION_NEAR_CREATURE: case CONDITION_NEAR_CREATURE:
@@ -248,14 +306,14 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
{ {
switch (object->GetTypeId()) switch (object->GetTypeId())
{ {
case TYPEID_UNIT: case TYPEID_UNIT:
condMeets &= object->ToCreature()->GetSpawnId() == ConditionValue3; condMeets &= object->ToCreature()->GetSpawnId() == ConditionValue3;
break; break;
case TYPEID_GAMEOBJECT: case TYPEID_GAMEOBJECT:
condMeets &= object->ToGameObject()->GetSpawnId() == ConditionValue3; condMeets &= object->ToGameObject()->GetSpawnId() == ConditionValue3;
break; break;
default: default:
break; break;
} }
} }
} }
@@ -276,24 +334,24 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
{ {
switch (ConditionValue2) switch (ConditionValue2)
{ {
case RELATION_SELF: case RELATION_SELF:
condMeets = unit == toUnit; condMeets = unit == toUnit;
break; break;
case RELATION_IN_PARTY: case RELATION_IN_PARTY:
condMeets = unit->IsInPartyWith(toUnit); condMeets = unit->IsInPartyWith(toUnit);
break; break;
case RELATION_IN_RAID_OR_PARTY: case RELATION_IN_RAID_OR_PARTY:
condMeets = unit->IsInRaidWith(toUnit); condMeets = unit->IsInRaidWith(toUnit);
break; break;
case RELATION_OWNED_BY: case RELATION_OWNED_BY:
condMeets = unit->GetOwnerGUID() == toUnit->GetGUID(); condMeets = unit->GetOwnerGUID() == toUnit->GetGUID();
break; break;
case RELATION_PASSENGER_OF: case RELATION_PASSENGER_OF:
condMeets = unit->IsOnVehicle(toUnit); condMeets = unit->IsOnVehicle(toUnit);
break; break;
case RELATION_CREATED_BY: case RELATION_CREATED_BY:
condMeets = unit->GetCreatorGUID() == toUnit->GetGUID(); condMeets = unit->GetCreatorGUID() == toUnit->GetGUID();
break; break;
} }
} }
} }
@@ -346,8 +404,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_TITLE: case CONDITION_TITLE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->HasTitle(ConditionValue1); {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasTitle(ConditionValue1);
}
}
break; break;
} }
case CONDITION_SPAWNMASK: case CONDITION_SPAWNMASK:
@@ -382,35 +445,52 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_QUESTSTATE: case CONDITION_QUESTSTATE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
uint32 queststateConditionValue1 = player->GetQuestStatus(ConditionValue1); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
if (((ConditionValue2 & (1 << QUEST_STATUS_NONE)) && (queststateConditionValue1 == QUEST_STATUS_NONE)) || ((ConditionValue2 & (1 << QUEST_STATUS_COMPLETE)) && (queststateConditionValue1 == QUEST_STATUS_COMPLETE)) || ((ConditionValue2 & (1 << QUEST_STATUS_INCOMPLETE)) && (queststateConditionValue1 == QUEST_STATUS_INCOMPLETE)) || ((ConditionValue2 & (1 << QUEST_STATUS_FAILED)) && (queststateConditionValue1 == QUEST_STATUS_FAILED)) ||
((ConditionValue2 & (1 << QUEST_STATUS_REWARDED)) && player->GetQuestRewardStatus(ConditionValue1)))
{ {
condMeets = true; uint32 queststateConditionValue1 = player->GetQuestStatus(ConditionValue1);
if (((ConditionValue2 & (1 << QUEST_STATUS_NONE)) && (queststateConditionValue1 == QUEST_STATUS_NONE)) ||
((ConditionValue2 & (1 << QUEST_STATUS_COMPLETE)) && (queststateConditionValue1 == QUEST_STATUS_COMPLETE)) ||
((ConditionValue2 & (1 << QUEST_STATUS_INCOMPLETE)) && (queststateConditionValue1 == QUEST_STATUS_INCOMPLETE)) ||
((ConditionValue2 & (1 << QUEST_STATUS_FAILED)) && (queststateConditionValue1 == QUEST_STATUS_FAILED)) ||
((ConditionValue2 & (1 << QUEST_STATUS_REWARDED)) && player->GetQuestRewardStatus(ConditionValue1)))
{
condMeets = true;
}
} }
} }
break; break;
} }
case CONDITION_DAILY_QUEST_DONE: case CONDITION_DAILY_QUEST_DONE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
condMeets = player->IsDailyQuestDone(ConditionValue1); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->IsDailyQuestDone(ConditionValue1);
}
} }
break; break;
} }
case CONDITION_QUEST_OBJECTIVE_PROGRESS: case CONDITION_QUEST_OBJECTIVE_PROGRESS:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{ {
const Quest* quest = ASSERT_NOTNULL(sObjectMgr->GetQuestTemplate(ConditionValue1)); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
uint16 log_slot = player->FindQuestSlot(quest->GetQuestId()); {
if (log_slot >= MAX_QUEST_LOG_SIZE) Quest const* quest = ASSERT_NOTNULL(sObjectMgr->GetQuestTemplate(ConditionValue1));
break; uint16 log_slot = player->FindQuestSlot(quest->GetQuestId());
if (player->GetQuestSlotCounter(log_slot, ConditionValue2) == ConditionValue3) if (log_slot >= MAX_QUEST_LOG_SIZE)
condMeets = true; {
break;
}
if (player->GetQuestSlotCounter(log_slot, ConditionValue2) == ConditionValue3)
{
condMeets = true;
}
}
} }
break; break;
} }
@@ -427,15 +507,27 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_PET_TYPE: case CONDITION_PET_TYPE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
if (Pet* pet = player->GetPet()) {
condMeets = (((1 << pet->getPetType()) & ConditionValue1) != 0); if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
if (Pet* pet = player->GetPet())
{
condMeets = (((1 << pet->getPetType()) & ConditionValue1) != 0);
}
}
}
break; break;
} }
case CONDITION_TAXI: case CONDITION_TAXI:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
condMeets = player->IsInFlight(); {
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->IsInFlight();
}
}
break; break;
} }
case CONDITION_CHARMED: case CONDITION_CHARMED:
+2 -2
View File
@@ -5877,7 +5877,7 @@ void Spell::EffectKillCreditPersonal(SpellEffIndex effIndex)
if (!unitTarget) if (!unitTarget)
return; return;
Player* player = unitTarget->ToPlayer(); Player* player = unitTarget->GetCharmerOrOwnerPlayerOrPlayerItself();
if (!player) if (!player)
{ {
return; return;
@@ -5894,7 +5894,7 @@ void Spell::EffectKillCredit(SpellEffIndex effIndex)
if (!unitTarget) if (!unitTarget)
return; return;
Player* player = unitTarget->ToPlayer(); Player* player = unitTarget->GetCharmerOrOwnerPlayerOrPlayerItself();
if (!player) if (!player)
{ {
return; return;