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
+114 -22
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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
// don't allow 0 items (it's checked during table load) // don't allow 0 items (it's checked during table load)
ASSERT(ConditionValue2); ASSERT(ConditionValue2);
bool checkBank = !!ConditionValue3; bool checkBank = !!ConditionValue3;
condMeets = player->HasItemCount(ConditionValue1, ConditionValue2, checkBank); 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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasItemOrGemWithIdEquipped(ConditionValue1, 1); condMeets = player->HasItemOrGemWithIdEquipped(ConditionValue1, 1);
}
}
break; break;
} }
case CONDITION_ZONEID: case CONDITION_ZONEID:
@@ -81,27 +89,40 @@ 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 (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1)) if (FactionEntry const* faction = sFactionStore.LookupEntry(ConditionValue1))
{
condMeets = (ConditionValue2 & (1 << player->GetReputationMgr().GetRank(faction))); 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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasAchieved(ConditionValue1); condMeets = player->HasAchieved(ConditionValue1);
}
}
break; break;
} }
case CONDITION_TEAM: case CONDITION_TEAM:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
// Xinef: DB Data compatibility... // Xinef: DB Data compatibility...
uint32 teamOld = player->GetTeamId() == TEAM_ALLIANCE ? ALLIANCE : HORDE; uint32 teamOld = player->GetTeamId() == TEAM_ALLIANCE ? ALLIANCE : HORDE;
condMeets = teamOld == ConditionValue1; condMeets = teamOld == ConditionValue1;
} }
}
break; break;
} }
case CONDITION_CLASS: case CONDITION_CLASS:
@@ -118,57 +139,84 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_GENDER: case CONDITION_GENDER:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->getGender() == ConditionValue1; condMeets = player->getGender() == ConditionValue1;
}
}
break; break;
} }
case CONDITION_SKILL: case CONDITION_SKILL:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasSkill(ConditionValue1) && player->GetBaseSkillValue(ConditionValue1) >= ConditionValue2; 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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->GetQuestRewardStatus(ConditionValue1); condMeets = player->GetQuestRewardStatus(ConditionValue1);
}
}
break; break;
} }
case CONDITION_QUESTTAKEN: case CONDITION_QUESTTAKEN:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
QuestStatus status = player->GetQuestStatus(ConditionValue1); QuestStatus status = player->GetQuestStatus(ConditionValue1);
condMeets = (status == QUEST_STATUS_INCOMPLETE); 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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
QuestStatus status = player->GetQuestStatus(ConditionValue1); QuestStatus status = player->GetQuestStatus(ConditionValue1);
condMeets = (status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
QuestStatus status = player->GetQuestStatus(ConditionValue1); QuestStatus status = player->GetQuestStatus(ConditionValue1);
condMeets = (status == QUEST_STATUS_NONE); 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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
// Xinef: cannot be null, checked at loading // Xinef: cannot be null, checked at loading
const Quest* quest = sObjectMgr->GetQuestTemplate(ConditionValue1); const Quest* quest = sObjectMgr->GetQuestTemplate(ConditionValue1);
condMeets = !player->IsQuestRewarded(ConditionValue1) && player->SatisfyQuestExclusiveGroup(quest, false); condMeets = !player->IsQuestRewarded(ConditionValue1) && player->SatisfyQuestExclusiveGroup(quest, false);
} }
}
break; break;
} }
case CONDITION_ACTIVE_EVENT: case CONDITION_ACTIVE_EVENT:
@@ -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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasSpell(ConditionValue1); 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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = (uint32)Player::GetDrunkenstateByValue(player->GetDrunkValue()) >= ConditionValue1; condMeets = (uint32)Player::GetDrunkenstateByValue(player->GetDrunkValue()) >= ConditionValue1;
}
}
break; break;
} }
case CONDITION_NEAR_CREATURE: case CONDITION_NEAR_CREATURE:
@@ -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())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->HasTitle(ConditionValue1); condMeets = player->HasTitle(ConditionValue1);
}
}
break; break;
} }
case CONDITION_SPAWNMASK: case CONDITION_SPAWNMASK:
@@ -382,36 +445,53 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
} }
case CONDITION_QUESTSTATE: case CONDITION_QUESTSTATE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
uint32 queststateConditionValue1 = player->GetQuestStatus(ConditionValue1); 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)) || 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))) ((ConditionValue2 & (1 << QUEST_STATUS_REWARDED)) && player->GetQuestRewardStatus(ConditionValue1)))
{ {
condMeets = true; condMeets = true;
} }
} }
}
break; break;
} }
case CONDITION_DAILY_QUEST_DONE: case CONDITION_DAILY_QUEST_DONE:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
condMeets = player->IsDailyQuestDone(ConditionValue1); 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())
{
Quest const* quest = ASSERT_NOTNULL(sObjectMgr->GetQuestTemplate(ConditionValue1));
uint16 log_slot = player->FindQuestSlot(quest->GetQuestId()); uint16 log_slot = player->FindQuestSlot(quest->GetQuestId());
if (log_slot >= MAX_QUEST_LOG_SIZE) if (log_slot >= MAX_QUEST_LOG_SIZE)
{
break; break;
}
if (player->GetQuestSlotCounter(log_slot, ConditionValue2) == ConditionValue3) if (player->GetQuestSlotCounter(log_slot, ConditionValue2) == ConditionValue3)
{
condMeets = true; condMeets = true;
} }
}
}
break; break;
} }
case CONDITION_HAS_AURA_TYPE: case CONDITION_HAS_AURA_TYPE:
@@ -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 (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
if (Pet* pet = player->GetPet()) if (Pet* pet = player->GetPet())
{
condMeets = (((1 << pet->getPetType()) & ConditionValue1) != 0); condMeets = (((1 << pet->getPetType()) & ConditionValue1) != 0);
}
}
}
break; break;
} }
case CONDITION_TAXI: case CONDITION_TAXI:
{ {
if (Player* player = object->ToPlayer()) if (Unit* unit = object->ToUnit())
{
if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself())
{
condMeets = player->IsInFlight(); 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;