From c9d7879cd9ef0da911b06760ab49fbaeab478d8d Mon Sep 17 00:00:00 2001 From: schmoozerd Date: Thu, 26 Mar 2015 11:51:47 +0000 Subject: [PATCH] [DBScripts] Implement SCRIPT_COMMAND_SEND_MAIL (c2639) Attention DB-Devs: The fields quest_template.RewMailTemplateId and .RewMailDelaySecs are scheduled to be removed --- doc/RequiredPorts.mangosproof | 2 +- doc/ScriptCommands.md | 5 +++++ src/game/WorldHandlers/ScriptMgr.cpp | 32 ++++++++++++++++++++++++++++ src/game/WorldHandlers/ScriptMgr.h | 9 ++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/doc/RequiredPorts.mangosproof b/doc/RequiredPorts.mangosproof index a6e2004d..982298ad 100644 --- a/doc/RequiredPorts.mangosproof +++ b/doc/RequiredPorts.mangosproof @@ -1 +1 @@ -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 \ No newline at end of file +rUzt6Qdc4EKKtuvr7m2AqM9iQu/Ewo17ul9iktjbtIC4oSTjYtD9kk4xk+lvxAFg2soaw2cvIWw2aArt5lanaEXCgQbziGFOk+7xyiNL8L5EYI1Z1ktvsKuftuPexVFyu57ZCenLn4Yj8EDgqWTNxGe87o5bnQaBdwwqmvTQ1+/6l5TBYzSvzAUpUfIMQk9wC4E1xHA7Qn44vOx2y5rZUgMn6kusp2zNP3UAS8YB3uUXZ3Ho7Pvk8XSDxi0guUv5hUFZIMqCj70Bn6/vCixR9Gk/jwUK8JAAQIze6g0Qwwl1jcGpyy5dC21hm14+TRcDPAEcnjDzDzDXmwFYHXLEVX9iF4nPv2IMNRA5NHau8Niv4kxnOZQfb2wsDPofJXBKH0FStpSr0jsEM01mFgtYt9TKGRbM2R8ProGF+QIVR3UWqn1GtM3tj3eQvUaYwilU6djySbv3HAN0/VG3sCL46k0ToWGioHo94J1SKYBnmhiiULcz1zAZYazRrqJJ6pLeJyzEClge/s4rScmvW4czSyQzdqeLcZNo3Y+Q0CJF5S4fq6eCNB50N0vdG5vwjbc6d52wrG7GqjOi3rsPcoEgi+Z2Ya2oEFUsWqS2DTPtjRZh3KQDLlfMdslfzNYULfxpuV4aiQuJdferhif8OO8jqWO1V2dWNX2rL+CIWDIeh4o+7Wjuppk7XO2WV2jmu5Co5QXhI3jOGLKfdZjIoYTIt1/j5nfYRRyAzbh0CEMIACobsEYGoRV5/8qzzczdNwyk8dP+dk0EruY5edDDF089YVOakv49v93CqD/cs0gA41gqD+qvcLrg+IC2m2WHTx+e8vabjK/zpSOgih5WK3ySo/1vnmcATVipxLbeuTopeD7GYFDT5qe8ULwrb3QtnVd5bFR9wY/g5YLq8qtIihrMo/JzFuVR6eQm015KXiiruesUJ1i1fCvasKNlZdT21yIPuWRhtxqfrJ57h6vtBzxeiyRcP2SHzxPM+jEP9lfOZS7ChblbXW6D2+uwRVz8nm9k/zCzHUm1uvth6UH41hZJvUB+TGdu9So4Fkxfe2CpKBN= \ No newline at end of file diff --git a/doc/ScriptCommands.md b/doc/ScriptCommands.md index 6d053af1..0490ea7f 100644 --- a/doc/ScriptCommands.md +++ b/doc/ScriptCommands.md @@ -175,6 +175,11 @@ ID | Name | Parameters | orientation != 0: Obtain a random point around resultingTarget in direction of orientation | * data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL Obtain a point in direction of resTarget->GetOrientation + orientation | for resTarget == resSource and orientation == 0 this will mean resSource moving forward +38 | SCRIPT_COMMAND_SEND_MAIL | Send a mail from resSource to resTarget + | * resultingSource = Creature OR NULL, resTarget must be Player + | * datalong = mailTemplateId + | * datalong2: AlternativeSenderEntry. Use as sender-Entry of the sent mail + | * dataint1: Delay (>= 0) in Seconds TemporaryFactionFlags --------------------- diff --git a/src/game/WorldHandlers/ScriptMgr.cpp b/src/game/WorldHandlers/ScriptMgr.cpp index 21a69876..ab018896 100644 --- a/src/game/WorldHandlers/ScriptMgr.cpp +++ b/src/game/WorldHandlers/ScriptMgr.cpp @@ -37,6 +37,7 @@ #include "BattleGround/BattleGround.h" #include "OutdoorPvP/OutdoorPvP.h" #include "WaypointMovementGenerator.h" +#include "Mail.h" #include "LFGMgr.h" #ifdef ENABLE_ELUNA @@ -689,6 +690,20 @@ void ScriptMgr::LoadScripts(ScriptMapMapName& scripts, const char* tablename) } break; } + case SCRIPT_COMMAND_SEND_MAIL: // 38 + { + if (!sMailTemplateStore.LookupEntry(tmp.sendMail.mailTemplateId)) + { + sLog.outErrorDb("Table `%s` has invalid mailTemplateId (datalong = %u) in SCRIPT_COMMAND_SEND_MAIL for script id %u", tablename, tmp.sendMail.mailTemplateId, tmp.id); + continue; + } + if (tmp.sendMail.altSender && !ObjectMgr::GetCreatureTemplate(tmp.sendMail.altSender)) + { + sLog.outErrorDb("Table `%s` has invalid alternativeSender (datalong2 = %u) in SCRIPT_COMMAND_SEND_MAIL for script id %u", tablename, tmp.sendMail.altSender, tmp.id); + continue; + } + break; + } default: { sLog.outErrorDb("Table `%s` unknown command %u, skipping.", tablename, tmp.command); @@ -1875,6 +1890,23 @@ bool ScriptAction::HandleScriptStep() ((Creature*)pSource)->GetMotionMaster()->MovePoint(1, x, y, z); break; } + case SCRIPT_COMMAND_SEND_MAIL: // 38 + { + if (LogIfNotPlayer(pTarget)) + return false; + if (!m_script->sendMail.altSender && LogIfNotCreature(pSource)) + return false; + + MailSender sender; + if (m_script->sendMail.altSender) + sender = MailSender(MAIL_CREATURE, m_script->sendMail.altSender); + else + sender = MailSender(pSource); + uint32 deliverDelay = m_script->textId[0] > 0 ? (uint32)m_script->textId[0] : 0; + + MailDraft(m_script->sendMail.mailTemplateId).SendMailTo(static_cast(pTarget), sender, MAIL_CHECK_MASK_HAS_BODY, deliverDelay); + break; + } default: sLog.outErrorDb(" DB-SCRIPTS: Process table `%s` id %u, command %u unknown command used.", m_table, m_script->id, m_script->command); break; diff --git a/src/game/WorldHandlers/ScriptMgr.h b/src/game/WorldHandlers/ScriptMgr.h index 0d8ace08..2df71883 100644 --- a/src/game/WorldHandlers/ScriptMgr.h +++ b/src/game/WorldHandlers/ScriptMgr.h @@ -117,6 +117,10 @@ enum ScriptCommand // resSource, resTar // orientation != 0: Obtain a random point around resTarget in direction of orientation // data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL Obtain a random point around resTarget in direction of resTarget->GetOrientation + orientation // for resTarget == resSource and orientation == 0 this will mean resSource moving forward + SCRIPT_COMMAND_SEND_MAIL = 38, // resSource WorldObject, can be NULL, resTarget Player + // datalong: Send mailTemplateId from resSource (if provided) to player resTarget + // datalong2: AlternativeSenderEntry. Use as sender-Entry + // dataint1: Delay (>= 0) in Seconds }; #define MAX_TEXT_ID 4 // used for SCRIPT_COMMAND_TALK, SCRIPT_COMMAND_EMOTE, SCRIPT_COMMAND_CAST_SPELL, SCRIPT_COMMAND_TERMINATE_SCRIPT @@ -357,6 +361,11 @@ struct ScriptInfo uint32 minDist; // datalong2 } moveDynamic; + struct // SCRIPT_COMMAND_SEND_MAIL (38) + { + uint32 mailTemplateId; // datalong + uint32 altSender; // datalong2; + } sendMail; struct {