fix(Core/Spells): Kill credits given via spells should always be awarded to players
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user