aboutsummaryrefslogtreecommitdiff
path: root/src/game/Player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Player.cpp')
-rw-r--r--src/game/Player.cpp121
1 files changed, 66 insertions, 55 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 115df736b3d..51d40ff812e 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -3209,7 +3209,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
if (!IsInWorld() || disabled) // at spells loading, no output, but allow save
addSpell(prev_spell,active,true,true,disabled);
else // at normal learning
- learnSpell(prev_spell,true);
+ learnSpell(prev_spell, true);
}
PlayerSpell *newspell = new PlayerSpell;
@@ -3325,7 +3325,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
if (skill_max_value < new_skill_max_value)
skill_max_value = new_skill_max_value;
- SetSkill(spellLearnSkill->skill,skill_value,skill_max_value);
+ SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
}
else
{
@@ -3346,13 +3346,13 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
switch(GetSkillRangeType(pSkill,_spell_idx->second->racemask != 0))
{
case SKILL_RANGE_LANGUAGE:
- SetSkill(pSkill->id, 300, 300);
+ SetSkill(pSkill->id, GetSkillStep(pSkill->id), 300, 300);
break;
case SKILL_RANGE_LEVEL:
- SetSkill(pSkill->id, 1, GetMaxSkillValueForLevel());
+ SetSkill(pSkill->id, GetSkillStep(pSkill->id), 1, GetMaxSkillValueForLevel());
break;
case SKILL_RANGE_MONO:
- SetSkill(pSkill->id, 1, 1);
+ SetSkill(pSkill->id, GetSkillStep(pSkill->id), 1, 1);
break;
default:
break;
@@ -3371,7 +3371,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
if (!IsInWorld() || !itr2->second.active) // at spells loading, no output, but allow save
addSpell(itr2->second.spell,itr2->second.active,true,true,false);
else // at normal learning
- learnSpell(itr2->second.spell,true);
+ learnSpell(itr2->second.spell, true);
}
}
@@ -3445,7 +3445,7 @@ void Player::learnSpell(uint32 spell_id, bool dependent)
{
PlayerSpellMap::iterator iter = m_spells.find(node->next);
if (iter != m_spells.end() && iter->second->disabled)
- learnSpell(node->next,false);
+ learnSpell(node->next, false);
}
}
@@ -3453,8 +3453,9 @@ void Player::learnSpell(uint32 spell_id, bool dependent)
if (!learning || !IsInWorld())
return;
- WorldPacket data(SMSG_LEARNED_SPELL, 4);
+ WorldPacket data(SMSG_LEARNED_SPELL, 6);
data << uint32(spell_id);
+ data << uint16(0);
GetSession()->SendPacket(&data);
}
@@ -3534,7 +3535,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
{
uint32 prev_spell = spellmgr.GetPrevSpellInChain(spell_id);
if (!prev_spell) // first rank, remove skill
- SetSkill(spellLearnSkill->skill,0,0);
+ SetSkill(spellLearnSkill->skill, 0, 0, 0);
else
{
// search prev. skill setting by spell ranks chain
@@ -3546,7 +3547,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
}
if (!prevSkill) // not found prev skill setting, remove skill
- SetSkill(spellLearnSkill->skill,0,0);
+ SetSkill(spellLearnSkill->skill, 0, 0, 0);
else // set to prev. skill setting values
{
uint32 skill_value = GetPureSkillValue(prevSkill->skill);
@@ -3560,7 +3561,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
if (skill_max_value > new_skill_max_value)
skill_max_value = new_skill_max_value;
- SetSkill(prevSkill->skill,skill_value,skill_max_value);
+ SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
}
}
@@ -3586,7 +3587,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
(IsProfessionSkill(pSkill->id) || _spell_idx->second->racemask != 0))
continue;
- SetSkill(pSkill->id, 0, 0);
+ SetSkill(pSkill->id, GetSkillStep(pSkill->id), 0, 0);
}
}
}
@@ -3609,7 +3610,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
{
// I cannot see why mangos has these lines.
//if (learn_low_rank)
- // learnSpell(prev_id,false);
+ // learnSpell(prev_id, false);
}
// if ranked non-stackable spell: need activate lesser rank and update dendence state
else if (cur_active && !SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0)
@@ -4224,7 +4225,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
RemovePetitionsAndSigns(playerguid, 10);
// return back all mails with COD and Item 0 1 2 3 4 5 6 7
- QueryResult_AutoPtr resultMail = CharacterDatabase.PQuery("SELECT id,messageType,mailTemplateId,sender,subject,itemTextId,money,has_items FROM mail WHERE receiver='%u' AND has_items<>0 AND cod<>0", guid);
+ QueryResult_AutoPtr resultMail = CharacterDatabase.PQuery("SELECT id,messageType,mailTemplateId,sender,subject,body,money,has_items FROM mail WHERE receiver='%u' AND has_items<>0 AND cod<>0", guid);
if (resultMail)
{
do
@@ -4236,7 +4237,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
uint16 mailTemplateId= fields[2].GetUInt16();
uint32 sender = fields[3].GetUInt32();
std::string subject = fields[4].GetCppString();
- uint32 itemTextId = fields[5].GetUInt32();
+ std::string body = fields[5].GetCppString();
uint32 money = fields[6].GetUInt32();
bool has_items = fields[7].GetBool();
@@ -4252,7 +4253,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
continue;
}
- MailDraft draft(subject, itemTextId);
+ MailDraft draft(subject, body);
if (mailTemplateId)
draft = MailDraft(mailTemplateId,false); // itesm already included
@@ -5434,7 +5435,7 @@ bool Player::UpdateCraftSkill(uint32 spellid)
if (spellEntry && spellEntry->Mechanic == MECHANIC_DISCOVERY)
{
if (uint32 discoveredSpell = GetSkillDiscoverySpell(_spell_idx->second->skillId, spellid, this))
- learnSpell(discoveredSpell,false);
+ learnSpell(discoveredSpell, false);
}
uint32 craft_skill_gain = sWorld.getConfig(CONFIG_SKILL_GAIN_CRAFTING);
@@ -5717,7 +5718,7 @@ void Player::UpdateSkillsToMaxSkillsForLevel()
// This functions sets a skill line value (and adds if doesn't exist yet)
// To "remove" a skill line, set it's values to zero
-void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
+void Player::SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
{
if (!id)
return;
@@ -5729,6 +5730,9 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
{
if (currVal)
{
+ // update step
+ SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
+ // update value
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos),MAKE_SKILL_VALUE(currVal,maxVal));
if (itr->second.uState != SKILL_NEW)
itr->second.uState = SKILL_CHANGED;
@@ -5767,14 +5771,11 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
sLog.outError("Skill not found in SkillLineStore: skill #%u", id);
return;
}
- // enable unlearn button for primary professions only
- if (pSkill->categoryId == SKILL_CATEGORY_PROFESSION)
- SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,1));
- else
- SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
- SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL,id);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL,id);
+
+ SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id, step));
+ SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal, maxVal));
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id);
// insert new entry or update if not deleted old entry yet
if (itr != mSkillStatus.end())
@@ -5816,6 +5817,18 @@ bool Player::HasSkill(uint32 skill) const
return (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED);
}
+uint16 Player::GetSkillStep(uint16 skill) const
+{
+ if (!skill)
+ return 0;
+
+ SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
+ return 0;
+
+ return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
+}
+
uint16 Player::GetSkillValue(uint32 skill) const
{
if (!skill)
@@ -13519,11 +13532,11 @@ void Player::PrepareQuestMenu(uint64 guid)
uint32 quest_id = i->second;
QuestStatus status = GetQuestStatus(quest_id);
if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(quest_id))
- qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
+ qm.AddMenuItem(quest_id, 4);
else if (status == QUEST_STATUS_INCOMPLETE)
- qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
+ qm.AddMenuItem(quest_id, 4);
//else if (status == QUEST_STATUS_AVAILABLE)
- // qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
+ // qm.AddMenuItem(quest_id, 2);
}
for (QuestRelations::const_iterator i = pObjectQR->lower_bound(pObject->GetEntry()); i != pObjectQR->upper_bound(pObject->GetEntry()); ++i)
@@ -13535,9 +13548,9 @@ void Player::PrepareQuestMenu(uint64 guid)
QuestStatus status = GetQuestStatus(quest_id);
if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false))
- qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
+ qm.AddMenuItem(quest_id, 4);
else if (status == QUEST_STATUS_NONE && CanTakeQuest(pQuest, false))
- qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
+ qm.AddMenuItem(quest_id, 2);
}
}
@@ -13549,7 +13562,7 @@ void Player::SendPreparedQuest(uint64 guid)
QuestMenuItem const& qmi0 = questMenu.GetItem(0);
- uint32 status = qmi0.m_qIcon;
+ uint32 icon = qmi0.m_qIcon;
// single element case
if (questMenu.MenuItemCount() == 1)
@@ -13560,9 +13573,9 @@ void Player::SendPreparedQuest(uint64 guid)
if (pQuest)
{
- if (status == DIALOG_STATUS_UNK2 && !GetQuestRewardStatus(quest_id))
+ if (icon == 4 && !GetQuestRewardStatus(quest_id))
PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, CanRewardQuest(pQuest, false), true);
- else if (status == DIALOG_STATUS_UNK2)
+ else if (icon == 4)
PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, CanRewardQuest(pQuest, false), true);
// Send completable on repeatable and autoCompletable quest if player don't have quest
// TODO: verify if check for !pQuest->IsDaily() is really correct (possibly not)
@@ -14106,7 +14119,7 @@ void Player::RewardQuest(Quest const *pQuest, uint32 reward, Object* questGiver,
// Send reward mail
if (uint32 mail_template_id = pQuest->GetRewMailTemplateId())
- MailDraft(mail_template_id).SendMailTo(this, questGiver, MAIL_CHECK_MASK_NONE, pQuest->GetRewMailDelaySecs());
+ MailDraft(mail_template_id).SendMailTo(MailReceiver(this), MailSender(questGiver), MAIL_CHECK_MASK_HAS_BODY, pQuest->GetRewMailDelaySecs());
if (pQuest->IsDaily())
{
@@ -16532,7 +16545,7 @@ void Player::_LoadInventory(QueryResult_AutoPtr result, uint32 timediff)
std::string subject = GetSession()->GetTrinityString(LANG_NOT_EQUIPPED_ITEM);
// fill mail
- MailDraft draft(subject);
+ MailDraft draft(subject, "There's were problems with equipping item(s).");
for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
{
@@ -16613,7 +16626,7 @@ void Player::_LoadMail()
{
m_mail.clear();
//mails are in right order 0 1 2 3 4 5 6 7 8 9 10 11 12 13
- QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT id,messageType,sender,receiver,subject,itemTextId,has_items,expire_time,deliver_time,money,cod,checked,stationery,mailTemplateId FROM mail WHERE receiver = '%u' ORDER BY id DESC",GetGUIDLow());
+ QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT id,messageType,sender,receiver,subject,body,has_items,expire_time,deliver_time,money,cod,checked,stationery,mailTemplateId FROM mail WHERE receiver = '%u' ORDER BY id DESC",GetGUIDLow());
if (result)
{
do
@@ -16625,11 +16638,11 @@ void Player::_LoadMail()
m->sender = fields[2].GetUInt32();
m->receiver = fields[3].GetUInt32();
m->subject = fields[4].GetCppString();
- m->itemTextId = fields[5].GetUInt32();
+ m->body = fields[5].GetCppString();
bool has_items = fields[6].GetBool();
- m->expire_time = (time_t)fields[7].GetUInt64();
+ m->expire_time = (time_t)fields[7].GetUInt64();
m->deliver_time = (time_t)fields[8].GetUInt64();
- m->money = fields[9].GetUInt32();
+ m->money = fields[9].GetUInt32();
m->COD = fields[10].GetUInt32();
m->checked = fields[11].GetUInt32();
m->stationery = fields[12].GetUInt8();
@@ -17643,7 +17656,7 @@ void Player::_SaveMail()
if (m->state == MAIL_STATE_CHANGED)
{
CharacterDatabase.PExecute("UPDATE mail SET itemTextId = '%u',has_items = '%u',expire_time = '" UI64FMTD "', deliver_time = '" UI64FMTD "',money = '%u',cod = '%u',checked = '%u' WHERE id = '%u'",
- m->itemTextId, m->HasItems() ? 1 : 0, (uint64)m->expire_time, (uint64)m->deliver_time, m->money, m->COD, m->checked, m->messageID);
+ m->HasItems() ? 1 : 0, (uint64)m->expire_time, (uint64)m->deliver_time, m->money, m->COD, m->checked, m->messageID);
if (m->removedItems.size())
{
for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
@@ -17657,8 +17670,6 @@ void Player::_SaveMail()
if (m->HasItems())
for (std::vector<MailItemInfo>::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
CharacterDatabase.PExecute("DELETE FROM item_instance WHERE guid = '%u'", itr2->item_guid);
- if (m->itemTextId)
- CharacterDatabase.PExecute("DELETE FROM item_text WHERE id = '%u'", m->itemTextId);
CharacterDatabase.PExecute("DELETE FROM mail WHERE id = '%u'", m->messageID);
CharacterDatabase.PExecute("DELETE FROM mail_items WHERE mail_id = '%u'", m->messageID);
}
@@ -20677,7 +20688,7 @@ void Player::learnDefaultSpells()
if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
addSpell(tspell,true,true,true,false);
else // but send in normal spell in game learn case
- learnSpell(tspell,true);
+ learnSpell(tspell, true);
}
}
@@ -20804,7 +20815,7 @@ void Player::learnSkillRewardedSpells(uint32 skill_id, uint32 skill_value)
else if (!IsInWorld())
addSpell(pAbility->spellId,true,true,true,false);
else
- learnSpell(pAbility->spellId,true);
+ learnSpell(pAbility->spellId, true);
}
}
}
@@ -21096,7 +21107,7 @@ void Player::AutoUnequipOffhandIfNeed(bool force /*= false*/)
CharacterDatabase.CommitTransaction();
std::string subject = GetSession()->GetTrinityString(LANG_NOT_EQUIPPED_ITEM);
- MailDraft(subject).AddItem(offItem).SendMailTo(this, MailSender(this, MAIL_STATIONERY_GM));
+ MailDraft(subject, "There's were problems with equipping this item.").AddItem(offItem).SendMailTo(this, MailSender(this, MAIL_STATIONERY_GM));
}
}
@@ -22198,7 +22209,7 @@ bool Player::IsKnowHowFlyIn(uint32 mapid, uint32 zone) const
void Player::learnSpellHighRank(uint32 spellid)
{
- learnSpell(spellid,false);
+ learnSpell(spellid, false);
if (uint32 next = spellmgr.GetNextSpellInChain(spellid))
learnSpellHighRank(next);
@@ -22287,21 +22298,21 @@ void Player::_LoadSkills(QueryResult_AutoPtr result)
base_skill = 1; // skill mast be known and then > 0 in any case
if (GetPureSkillValue(SKILL_FIRST_AID) < base_skill)
- SetSkill(SKILL_FIRST_AID,base_skill, base_skill);
+ SetSkill(SKILL_FIRST_AID, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_AXES) < base_skill)
- SetSkill(SKILL_AXES, base_skill,base_skill);
+ SetSkill(SKILL_AXES, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_DEFENSE) < base_skill)
- SetSkill(SKILL_DEFENSE, base_skill,base_skill);
+ SetSkill(SKILL_DEFENSE, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_POLEARMS) < base_skill)
- SetSkill(SKILL_POLEARMS, base_skill,base_skill);
+ SetSkill(SKILL_POLEARMS, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_SWORDS) < base_skill)
- SetSkill(SKILL_SWORDS, base_skill,base_skill);
+ SetSkill(SKILL_SWORDS, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_2H_AXES) < base_skill)
- SetSkill(SKILL_2H_AXES, base_skill,base_skill);
+ SetSkill(SKILL_2H_AXES, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_2H_SWORDS) < base_skill)
- SetSkill(SKILL_2H_SWORDS, base_skill,base_skill);
+ SetSkill(SKILL_2H_SWORDS, 0, base_skill, base_skill);
if (GetPureSkillValue(SKILL_UNARMED) < base_skill)
- SetSkill(SKILL_UNARMED, base_skill,base_skill);
+ SetSkill(SKILL_UNARMED, 0, base_skill, base_skill);
}
}