aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorn0n4m3 <none@none>2009-12-17 13:07:38 +0100
committern0n4m3 <none@none>2009-12-17 13:07:38 +0100
commit89656d5749f72803edbdd5f9840ba6b4c21f3987 (patch)
treeaaa42c476367db67fc7fe72488f83e56251d1408
parent8b95981ed09b4a6edbf734c1ee1c639b6cdb9870 (diff)
Restore some commits from trinitycore2 3.1.3
--HG-- branch : trunk
-rw-r--r--src/game/AchievementMgr.cpp23
-rw-r--r--src/game/BattleGround.cpp8
-rw-r--r--src/game/BattleGroundHandler.cpp6
-rw-r--r--src/game/Level2.cpp16
-rw-r--r--src/game/Level3.cpp37
-rw-r--r--src/game/Player.cpp108
-rw-r--r--src/game/SpellAuras.cpp1
-rw-r--r--src/game/SpellEffects.cpp91
-rw-r--r--src/game/Unit.cpp2
-rw-r--r--src/game/Unit.h1
-rw-r--r--src/game/World.cpp3
-rw-r--r--src/game/WorldSession.h9
12 files changed, 149 insertions, 156 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index 8326029703d..37fc507dd89 100644
--- a/src/game/AchievementMgr.cpp
+++ b/src/game/AchievementMgr.cpp
@@ -1708,16 +1708,6 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
{
Item* item = reward->itemId ? Item::CreateItem(reward->itemId,1,GetPlayer ()) : NULL;
- MailItemsInfo mi;
- if(item)
- {
- // save new item before send
- item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
-
- // item
- mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item);
- }
-
int loc_idx = GetPlayer()->GetSession()->GetSessionDbLocaleIndex();
// subject and text
@@ -1736,7 +1726,18 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
uint32 itemTextId = objmgr.CreateItemText( text );
- WorldSession::SendMailTo(GetPlayer(), MAIL_CREATURE, MAIL_STATIONERY_NORMAL, reward->sender, GetPlayer()->GetGUIDLow(), subject, itemTextId , &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ MailDraft draft(subject, itemTextId);
+
+ if(item)
+ {
+ // save new item before send
+ item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
+
+ // item
+ draft.AddItem(item);
+ }
+
+ draft.SendMailTo(GetPlayer(), MailSender(MAIL_CREATURE, reward->sender));
}
}
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index 767d3581ef8..bdbcfc63bac 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -922,10 +922,6 @@ void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
// save new item before send
markItem->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
- // item
- MailItemsInfo mi;
- mi.AddItem(markItem->GetGUIDLow(), markItem->GetEntry(), markItem);
-
// subject: item name
std::string subject = markProto->Name1;
int loc_idx = plr->GetSession()->GetSessionDbLocaleIndex();
@@ -940,7 +936,9 @@ void BattleGround::SendRewardMarkByMail(Player *plr,uint32 mark, uint32 count)
snprintf(textBuf,300,textFormat.c_str(),GetName(),GetName());
uint32 itemTextId = objmgr.CreateItemText( textBuf );
- WorldSession::SendMailTo(plr, MAIL_CREATURE, MAIL_STATIONERY_NORMAL, bmEntry, plr->GetGUIDLow(), subject, itemTextId , &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ MailDraft(subject, itemTextId)
+ .AddItem(markItem)
+ .SendMailTo(plr, MailSender(MAIL_CREATURE, bmEntry));
}
}
diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp
index 8d24be21dee..3944d4e0bfc 100644
--- a/src/game/BattleGroundHandler.cpp
+++ b/src/game/BattleGroundHandler.cpp
@@ -36,7 +36,7 @@
#include "Opcodes.h"
// Temporal fix to wintergrasp spirit guides till 3.2
-#include "Wintergrasp.h"
+#include "OutdoorPvPWG.h"
#include "OutdoorPvPMgr.h"
// WG end
@@ -604,7 +604,7 @@ void WorldSession::HandleAreaSpiritHealerQueryOpcode( WorldPacket & recv_data )
{ // Wintergrasp Hack till 3.2 and it's implemented as BG
if (GetPlayer()->GetZoneId() == 4197)
{
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (pvpWG && pvpWG->isWarTime())
pvpWG->SendAreaSpiritHealerQueryOpcode(_player, guid);
}
@@ -635,7 +635,7 @@ void WorldSession::HandleAreaSpiritHealerQueueOpcode( WorldPacket & recv_data )
{ // Wintergrasp Hack till 3.2 and it's implemented as BG
if (GetPlayer()->GetZoneId() == 4197)
{
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (pvpWG && pvpWG->isWarTime())
pvpWG->AddPlayerToResurrectQueue(guid, _player->GetGUID());
}
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index f86553dd99b..cfdd8d2e0ff 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -40,7 +40,7 @@
#include <fstream>
#include <map>
#include "GlobalEvents.h"
-#include "Wintergrasp.h"
+#include "OutdoorPvPWG.h"
#include "OutdoorPvPMgr.h"
#include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand
@@ -4240,7 +4240,7 @@ bool ChatHandler::HandleNpcSetLinkCommand(const char* args)
bool ChatHandler::HandleWintergraspStatusCommand(const char* args)
{
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED))
{
@@ -4260,7 +4260,7 @@ bool ChatHandler::HandleWintergraspStatusCommand(const char* args)
bool ChatHandler::HandleWintergraspStartCommand(const char* args)
{
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED))
{
@@ -4275,7 +4275,7 @@ bool ChatHandler::HandleWintergraspStartCommand(const char* args)
bool ChatHandler::HandleWintergraspStopCommand(const char* args)
{
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED))
{
@@ -4293,7 +4293,7 @@ bool ChatHandler::HandleWintergraspEnableCommand(const char* args)
if(!*args)
return false;
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED))
{
@@ -4335,7 +4335,7 @@ bool ChatHandler::HandleWintergraspTimerCommand(const char* args)
if(!*args)
return false;
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (!pvpWG)
{
@@ -4368,7 +4368,7 @@ bool ChatHandler::HandleWintergraspTimerCommand(const char* args)
bool ChatHandler::HandleWintergraspSwitchTeamCommand(const char* args)
{
- OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
+ OutdoorPvPWG *pvpWG = (OutdoorPvPWG*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197);
if (!pvpWG)
{
@@ -4379,6 +4379,6 @@ bool ChatHandler::HandleWintergraspSwitchTeamCommand(const char* args)
uint32 timer = pvpWG->GetTimer();
pvpWG->forceChangeTeam();
pvpWG->setTimer(timer);
- PSendSysMessage(LANG_BG_WG_SWITCH_FACTION, GetTrinityString(pvpWG->GetTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE));
+ PSendSysMessage(LANG_BG_WG_SWITCH_FACTION, GetTrinityString(pvpWG->getDefenderTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE));
return true;
}
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 35c73617b56..e4adb4c6550 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -560,6 +560,7 @@ bool ChatHandler::HandleReloadAllCommand(const char*)
HandleReloadAllLocalesCommand("");
HandleReloadAccessRequirementCommand("");
+ HandleReloadMailLevelRewardCommand("");
HandleReloadCommandCommand("");
HandleReloadReservedNameCommand("");
HandleReloadTrinityStringCommand("");
@@ -881,12 +882,12 @@ bool ChatHandler::HandleReloadLootTemplatesProspectingCommand(const char*)
return true;
}
-bool ChatHandler::HandleReloadLootTemplatesQuestMailCommand(const char*)
+bool ChatHandler::HandleReloadLootTemplatesMailCommand(const char*)
{
- sLog.outString( "Re-Loading Loot Tables... (`quest_mail_loot_template`)" );
- LoadLootTemplates_QuestMail();
- LootTemplates_QuestMail.CheckLootRefs();
- SendGlobalGMSysMessage("DB table `quest_mail_loot_template` reloaded.");
+ sLog.outString( "Re-Loading Loot Tables... (`mail_loot_template`)" );
+ LoadLootTemplates_Mail();
+ LootTemplates_Mail.CheckLootRefs();
+ SendGlobalSysMessage("DB table `mail_loot_template` reloaded.");
return true;
}
@@ -1366,6 +1367,14 @@ bool ChatHandler::HandleReloadLocalesQuestCommand(const char* /*arg*/)
return true;
}
+bool ChatHandler::HandleReloadMailLevelRewardCommand(const char* /*arg*/)
+{
+ sLog.outString( "Re-Loading Player level dependent mail rewards..." );
+ objmgr.LoadMailLevelRewards();
+ SendGlobalSysMessage("DB table `mail_level_reward` reloaded.");
+ return true;
+}
+
bool ChatHandler::HandleLoadScriptsCommand(const char *args)
{
if(!LoadScriptingModule(args)) return true;
@@ -7100,25 +7109,23 @@ bool ChatHandler::HandleSendItemsCommand(const char *args)
}
// from console show not existed sender
- uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
+ MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
- uint32 messagetype = MAIL_NORMAL;
- uint32 stationery = MAIL_STATIONERY_GM;
uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0;
// fill mail
- MailItemsInfo mi; // item list preparing
+ MailDraft draft(subject, itemTextId);
for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
{
if(Item* item = Item::CreateItem(itr->first,itr->second,m_session ? m_session->GetPlayer() : 0))
{
item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
- mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item);
+ draft.AddItem(item);
}
}
- WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ draft.SendMailTo(MailReceiver(receiver,GUID_LOPART(receiver_guid)), sender);
std::string nameLink = playerLink(receiver_name);
PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
@@ -7162,13 +7169,13 @@ bool ChatHandler::HandleSendMoneyCommand(const char *args)
std::string text = msgText;
// from console show not existed sender
- uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
+ MailSender sender(MAIL_NORMAL,m_session ? m_session->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
- uint32 messagetype = MAIL_NORMAL;
- uint32 stationery = MAIL_STATIONERY_GM;
uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0;
- WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, money, 0, MAIL_CHECK_MASK_NONE);
+ MailDraft(subject, itemTextId)
+ .AddMoney(money)
+ .SendMailTo(MailReceiver(receiver,GUID_LOPART(receiver_guid)),sender);
std::string nameLink = playerLink(receiver_name);
PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index c38835b7237..cfc9d3c93bd 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -2572,6 +2572,9 @@ void Player::GiveLevel(uint8 level)
if (Pet* pet = GetPet())
pet->SynchronizeLevelWithOwner();
+ if (MailLevelReward const* mailReward = objmgr.GetMailLevelReward(level,getRaceMask()))
+ MailDraft(mailReward->mailTemplateId).SendMailTo(this,MailSender(MAIL_CREATURE,mailReward->senderEntry));
+
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL);
}
@@ -4152,27 +4155,38 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
// remove signs from petitions (also remove petitions if owner);
RemovePetitionsAndSigns(playerguid, 10);
- // return back all mails with COD and Item 0 1 2 3 4 5 6
- QueryResult *resultMail = CharacterDatabase.PQuery("SELECT id,mailTemplateId,sender,subject,itemTextId,money,has_items FROM mail WHERE receiver='%u' AND has_items<>0 AND cod<>0", guid);
+ // return back all mails with COD and Item 0 1 2 3 4 5 6 7
+ QueryResult *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);
if(resultMail)
{
do
{
Field *fields = resultMail->Fetch();
- uint32 mail_id = fields[0].GetUInt32();
- uint16 mailTemplateId= fields[1].GetUInt16();
- uint32 sender = fields[2].GetUInt32();
- std::string subject = fields[3].GetCppString();
- uint32 itemTextId = fields[4].GetUInt32();
- uint32 money = fields[5].GetUInt32();
- bool has_items = fields[6].GetBool();
+ uint16 mailType = fields[1].GetUInt16();
+ uint16 mailTemplateId= fields[2].GetUInt16();
+ uint32 sender = fields[3].GetUInt32();
+ std::string subject = fields[4].GetCppString();
+ uint32 itemTextId = fields[5].GetUInt32();
+ uint32 money = fields[6].GetUInt32();
+ bool has_items = fields[7].GetBool();
//we can return mail now
//so firstly delete the old one
CharacterDatabase.PExecute("DELETE FROM mail WHERE id = '%u'", mail_id);
- MailItemsInfo mi;
+ // mail not from player
+ if (mailType != MAIL_NORMAL)
+ {
+ if(has_items)
+ CharacterDatabase.PExecute("DELETE FROM mail_items WHERE mail_id = '%u'", mail_id);
+ continue;
+ }
+
+ MailDraft draft(subject, itemTextId);
+ if (mailTemplateId)
+ draft = MailDraft(mailTemplateId,false); // itesm already included
+
if(has_items)
{
// data needs to be at first place for Item::LoadFromDB
@@ -4201,7 +4215,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
continue;
}
- mi.AddItem(item_guidlow, item_template, pItem);
+ draft.AddItem(pItem);
}
while (resultItems->NextRow());
@@ -4213,7 +4227,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
uint32 pl_account = objmgr.GetPlayerAccountIdByGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
- WorldSession::SendReturnToSender(MAIL_NORMAL, pl_account, guid, sender, subject, itemTextId, &mi, money, mailTemplateId);
+ draft.AddMoney(money).SendReturnToSender(pl_account, guid, sender);
}
while (resultMail->NextRow());
@@ -7897,7 +7911,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
{
sLog.outDebug(" if(lootid)");
loot->clear();
- loot->FillLoot(lootid, LootTemplates_Gameobject, this, false, go->GetLootMode());
+ loot->FillLoot(lootid, LootTemplates_Gameobject, this, false, false, go->GetLootMode());
}
if (loot_type == LOOT_FISHING)
@@ -8026,7 +8040,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
loot->clear();
if (uint32 lootid = creature->GetCreatureInfo()->lootid)
- loot->FillLoot(lootid, LootTemplates_Creature, recipient, false, creature->GetLootMode());
+ loot->FillLoot(lootid, LootTemplates_Creature, recipient, false, false, creature->GetLootMode());
loot->generateMoneyLoot(creature->GetCreatureInfo()->mingold,creature->GetCreatureInfo()->maxgold);
@@ -13379,56 +13393,8 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
}
// Send reward mail
- if (pQuest->GetRewMailTemplateId())
- {
- MailMessageType mailType;
- uint32 senderGuidOrEntry;
- switch(questGiver->GetTypeId())
- {
- case TYPEID_UNIT:
- mailType = MAIL_CREATURE;
- senderGuidOrEntry = questGiver->GetEntry();
- break;
- case TYPEID_GAMEOBJECT:
- mailType = MAIL_GAMEOBJECT;
- senderGuidOrEntry = questGiver->GetEntry();
- break;
- case TYPEID_ITEM:
- mailType = MAIL_ITEM;
- senderGuidOrEntry = questGiver->GetEntry();
- break;
- case TYPEID_PLAYER:
- mailType = MAIL_NORMAL;
- senderGuidOrEntry = questGiver->GetGUIDLow();
- break;
- default:
- mailType = MAIL_NORMAL;
- senderGuidOrEntry = GetGUIDLow();
- break;
- }
-
- Loot questMailLoot;
-
- questMailLoot.FillLoot(pQuest->GetQuestId(), LootTemplates_QuestMail, this,true);
-
- // fill mail
- MailItemsInfo mi; // item list preparing
-
- uint32 max_slot = questMailLoot.GetMaxSlotInLootFor(this);
- for (uint32 i = 0; mi.size() < MAX_MAIL_ITEMS && i < max_slot; ++i)
- {
- if (LootItem* lootitem = questMailLoot.LootItemInSlot(i,this))
- {
- if (Item* item = Item::CreateItem(lootitem->itemid,lootitem->count,this))
- {
- item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
- mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item);
- }
- }
- }
-
- WorldSession::SendMailTo(this, mailType, MAIL_STATIONERY_NORMAL, senderGuidOrEntry, GetGUIDLow(), "", 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE,pQuest->GetRewMailDelaySecs(),pQuest->GetRewMailTemplateId());
- }
+ if (uint32 mail_template_id = pQuest->GetRewMailTemplateId())
+ MailDraft(mail_template_id).SendMailTo(this, questGiver, MAIL_CHECK_MASK_NONE, pQuest->GetRewMailDelaySecs());
if (pQuest->IsDaily())
{
@@ -15728,20 +15694,20 @@ void Player::_LoadInventory(QueryResult *result, uint32 timediff)
// send by mail problematic items
while (!problematicItems.empty())
{
+ std::string subject = GetSession()->GetMangosString(LANG_NOT_EQUIPPED_ITEM);
+
// fill mail
- MailItemsInfo mi; // item list preparing
+ MailDraft draft(subject);
for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
{
Item* item = problematicItems.front();
problematicItems.pop_front();
- mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item);
+ draft.AddItem(item);
}
- std::string subject = GetSession()->GetTrinityString(LANG_NOT_EQUIPPED_ITEM);
-
- WorldSession::SendMailTo(this, MAIL_NORMAL, MAIL_STATIONERY_GM, GetGUIDLow(), GetGUIDLow(), subject, 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ draft.SendMailTo(this, MailSender(this, MAIL_STATIONERY_GM));
}
}
//if(isAlive())
@@ -20172,8 +20138,6 @@ void Player::AutoUnequipOffhandIfNeed(bool force /*= false*/)
}
else
{
- MailItemsInfo mi;
- mi.AddItem(offItem->GetGUIDLow(), offItem->GetEntry(), offItem);
MoveItemFromInventory(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND, true);
CharacterDatabase.BeginTransaction();
offItem->DeleteFromInventoryDB(); // deletes item from character's inventory
@@ -20181,7 +20145,7 @@ void Player::AutoUnequipOffhandIfNeed(bool force /*= false*/)
CharacterDatabase.CommitTransaction();
std::string subject = GetSession()->GetMangosString(LANG_NOT_EQUIPPED_ITEM);
- WorldSession::SendMailTo(this, MAIL_NORMAL, MAIL_STATIONERY_GM, GetGUIDLow(), GetGUIDLow(), subject, 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ MailDraft(subject).AddItem(offItem).SendMailTo(this, MailSender(this, MAIL_STATIONERY_GM));
}
}
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 04ce483ad6f..7f54d5ad294 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -3609,6 +3609,7 @@ void AuraEffect::HandleAuraModShapeshift(bool apply, bool Real, bool changeAmoun
case FORM_MOONKIN:
case FORM_FLIGHT_EPIC:
case FORM_METAMORPHOSIS:
+ case FORM_MASTER_ANGLER:
case FORM_AMBIENT:
case FORM_SHADOW:
case FORM_STEALTH:
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index fb298918230..c3a633c5ffc 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -1378,6 +1378,25 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(m_caster, 54586, true);
return;
}
+ // Great Feast
+ case 57337:
+ {
+ if (!unitTarget)
+ return;
+
+ unitTarget->CastSpell(unitTarget, 58067, true);
+ break;
+ }
+ //Fish Feast
+ case 57397:
+ {
+ if (!unitTarget)
+ return;
+
+ unitTarget->CastSpell(unitTarget, 58648, true);
+ unitTarget->CastSpell(unitTarget, 57398, true);
+ break;
+ }
case 58418: // Portal to Orgrimmar
case 58420: // Portal to Stormwind
return; // implemented in EffectScript[0]
@@ -2787,6 +2806,21 @@ void Spell::SpellDamageHeal(uint32 /*i*/)
//addhealth += tickheal * tickcount;
//addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth,HEAL, unitTarget);
}
+ // Glyph of Nourish
+ else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags[1] & 0x2000000)
+ {
+ addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL);
+
+ if (AuraEffect const* aurEff = m_caster->GetAuraEffect(62971, 0))
+ {
+ Unit::AuraEffectList const& Periodic = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_HEAL);
+ for (Unit::AuraEffectList::const_iterator i = Periodic.begin(); i != Periodic.end(); ++i)
+ {
+ if (m_caster->GetGUID() == (*i)->GetCasterGUID())
+ addhealth += addhealth * (*i)->GetParentAura()->GetStackAmount() * aurEff->GetAmount() / 100;
+ }
+ }
+ }
// Riptide - increase healing done by Chain Heal
else if (m_spellInfo->SpellFamilyName==SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[0] & 0x100)
{
@@ -5463,6 +5497,26 @@ void Spell::EffectScriptEffect(uint32 effIndex)
return;
}
+ // Gigantic Feast
+ case 58466:
+ {
+ if (!unitTarget)
+ return;
+
+ unitTarget->CastSpell(unitTarget, 58648, true);
+ unitTarget->CastSpell(unitTarget, 58467, true);
+ break;
+ }
+ // Small Feast
+ case 58475:
+ {
+ if (!unitTarget)
+ return;
+
+ unitTarget->CastSpell(unitTarget, 58648, true);
+ unitTarget->CastSpell(unitTarget, 58477, true);
+ break;
+ }
case 58941: // Rock Shards
if(unitTarget && m_originalCaster)
{
@@ -5529,12 +5583,15 @@ void Spell::EffectScriptEffect(uint32 effIndex)
return;
}
case 62428: // Load into Catapult
+ {
if(Vehicle *seat = m_caster->GetVehicleKit())
if(Unit *passenger = seat->GetPassenger(0))
if(Unit *demolisher = m_caster->GetVehicleBase())
passenger->CastSpell(demolisher, damage, true);
return;
+ }
case 62482: // Grab Crate
+ {
if(unitTarget)
{
if(Vehicle *seat = m_caster->GetVehicleKit())
@@ -5547,40 +5604,6 @@ void Spell::EffectScriptEffect(uint32 effIndex)
}
}
return;
- case 57337: //Great Feast
- {
- if (!unitTarget)
- return;
-
- unitTarget->CastSpell(unitTarget,58067,true);
- break;
- }
- case 57397: //Fish Feast
- {
- if (!unitTarget)
- return;
-
- unitTarget->CastSpell(unitTarget,58648,true);
- unitTarget->CastSpell(unitTarget,57398,true);
- break;
- }
- case 58466: //Gigantic Feast
- {
- if (!unitTarget)
- return;
-
- unitTarget->CastSpell(unitTarget,58648,true);
- unitTarget->CastSpell(unitTarget,58467,true);
- break;
- }
- case 58475: //Small Feast
- {
- if (!unitTarget)
- return;
-
- unitTarget->CastSpell(unitTarget,58648,true);
- unitTarget->CastSpell(unitTarget,58477,true);
- break;
}
case 60123: // Lightwell
{
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 881457286d9..457439e3d08 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -15248,6 +15248,8 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form)
return 21244;
case FORM_METAMORPHOSIS:
return 25277;
+ case FORM_MASTER_ANGLER:
+ return 15234;
case FORM_TREE:
return 864;
case FORM_SPIRITOFREDEMPTION:
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 4c2df52c530..b439cf35dc6 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -206,6 +206,7 @@ enum ShapeshiftForm
FORM_ZOMBIE = 0x15,
FORM_METAMORPHOSIS = 0x16,
FORM_UNDEAD = 0x19,
+ FORM_MASTER_ANGLER = 0x1A,
FORM_FLIGHT_EPIC = 0x1B,
FORM_SHADOW = 0x1C,
FORM_FLIGHT = 0x1D,
diff --git a/src/game/World.cpp b/src/game/World.cpp
index e1e27f3a6a3..23e45e6ba77 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1475,6 +1475,9 @@ void World::SetInitialWorldSettings()
sLog.outString("Loading Player Corpses...");
objmgr.LoadCorpses();
+ sLog.outString( "Loading Player level dependent mail rewards..." );
+ objmgr.LoadMailLevelRewards();
+
sLog.outString("Loading Disabled Spells...");
objmgr.LoadSpellDisabledEntrys();
diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h
index 3762c4ee741..dcd5a9f86ee 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -28,7 +28,6 @@
#include "Common.h"
#include "SharedDefines.h"
-class MailItemsInfo;
struct ItemPrototype;
struct AuctionEntry;
struct DeclinedName;
@@ -42,7 +41,6 @@ class Unit;
class GameObject;
class WorldPacket;
class WorldSocket;
-class WorldSession;
class QueryResult;
class LoginQueryHolder;
class CharacterHandler;
@@ -225,13 +223,8 @@ class TRINITY_DLL_SPEC WorldSession
m_TutorialsChanged = true;
}
}
-
- //mail
- //used with item_page table
+ //used with item_page table
bool SendItemInfo( uint32 itemid, WorldPacket data );
- static void SendReturnToSender(uint8 messageType, uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid, const std::string& subject, uint32 itemTextId, MailItemsInfo *mi, uint32 money, uint16 mailTemplateId = 0);
- static void SendMailTo(Player* receiver, uint8 messageType, uint8 stationery, uint32 sender_guidlow_or_entry, uint32 received_guidlow, std::string subject, uint32 itemTextId, MailItemsInfo* mi, uint32 money, uint32 COD, uint32 checked, uint32 deliver_delay = 0, uint16 mailTemplateId = 0);
-
//auction
void SendAuctionHello( uint64 guid, Creature * unit );
void SendAuctionCommandResult( uint32 auctionId, uint32 Action, uint32 ErrorCode, uint32 bidError = 0);