Remise en place des marques de BG
Description
Voici un patch qui vous permettra de remettre en place les marques de BG enlevées en 3.2 par Blizzard (il me semble).
Je me suis basé sur l'ancien code de MaNGOS.

Diff
[code=diff]diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 13e0Soleil5..4e8a22e 100755
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -805,12 +805,17 @@ void Battleground::EndBattleground(uint32 winner)
plr->SetRandomWinner(true);
}

+ // Marques de BG
+ RewardMark(plr, ITEM_WINNER_COUNT);
plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT​_CRITERIA_TYPE_WIN_BG, 1);
}
else
{
if (IsRandom() || BattlegroundMgr::IsBGWeekend(GetTypeID()))
UpdatePlayerScore(plr, SCORE_BONUS_HONOR, GetBonusHonorFromKill(loser_kills));
+
+ // Marques de BG
+ RewardMark(plr, ITEM_LOSER_COUNT);
}

plr->ResetAllPowers();
@@ -1853,3 +1858,75 @@ void Battleground::RewardXPAtKill(Player* killer, Player* victim)
if (sWorld->getBoolConfig(CONFIG_BG_XP_FOR_KILL) && killer && victim)
killer->RewardPlayerAndGroupAtKill(victim, true);
}
+
+// Marques de BG
+void Battleground::RewardMark(Player *plr, uint32 count)
+{
+ // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
+ if(plr->HasAura(SPELL_AURA_PLAYER_INACTIVE))
+ return;
+
+ BattlegroundMarks mark;
+ switch (GetTypeID())
+ {
+ case BATTLEGROUND_AV:
+ mark = ITEM_AV_MARK_OF_HONOR;
+ break;
+ case BATTLEGROUND_WS:
+ mark = ITEM_WS_MARK_OF_HONOR;
+ break;
+ case BATTLEGROUND_AB:
+ mark = ITEM_AB_MARK_OF_HONOR;
+ break;
+ case BATTLEGROUND_EY:
+ mark = ITEM_EY_MARK_OF_HONOR;
+ break;
+ default:
+ return;
+ }
+
+ if (!sObjectMgr->GetItemTemplate(mark))
+ return;
+
+ if (!plr->AddItem(mark, count))
+ SendRewardMarkByMail(plr, mark, count);
+}
+
+void Battleground::SendRewardMarkByMail(Player *plr, uint32 mark, uint32 count)
+{
+ uint32 bmEntry = GetBattlemasterEntry();
+ if(!bmEntry)
+ return;
+
+ Item* markItem = Item::CreateItem(mark, count, plr);
+ if (!markItem)
+ return;
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ // save new item before send
+ markItem->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
+
+ ItemTemplate const* markProto = sObjectMgr->GetItemTemplate(mark);
+
+ // subject: item name
+ std::string subject = markProto->Name1;
+ int loc_idx = plr->GetSession()->GetSessionDbLocaleIndex();
+ if (loc_idx >= 0)
+ if (ItemLocale const* il = sObjectMgr->GetItemLocale(markProto->ItemId))
+ if (il->Name.size() > loc_idx && !il->Name[loc_idx].empty())
+ subject = il->Name[loc_idx];
+
+ // text
+ std::string textFormat = plr->GetSession()->GetTrinityString(LANG_BG_MARK_BY_MAIL);
+ char textChar;
+ sprintf(textChar, textFormat.c_str(), GetName(), GetName());
+ std::string text = textChar;
+
+ // send mail
+ MailDraft draft(subject, text);
+ draft.AddItem(markItem);
+ draft.SendMailTo(trans, MailReceiver(plr, plr->GetGUIDLow()), MailSender(plr, MAIL_STATIONERY_DEFAULT), MAIL_CHECK_MASK_NONE);
+
+ CharacterDatabase.CommitTransaction(trans);
+}
\ No newline at end of file
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 086efb0..3be5f0d 100755
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -572,6 +572,9 @@ class Battleground
void RewardXPAtKill(Player* killer, Player* victim);
bool CanAwardArenaPoints() const { return m_LevelMin >= BG_AWARD_ARENA_POINTS_MIN_LEVEL; }

+ // Marques de BG
+ void RewardMark(Player *plr, uint32 count);
+ void SendRewardMarkByMail(Player *plr, uint32 mark, uint32 count);
protected:
// this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground
void EndNow();[/code]
Pour ton
Code :
sObjectMgr->GetItemTemplate(mark)
Je n'ai rien trouvé dans les sources sur le GetItemTemplate. Par contre un
Code :
if (!ObjectMgr::GetItemPrototype(mark))

semble être plus correct. Pareil pour dans SendRewardMarkByMail. Sinon niquel, merci bien Clin

Edit : Tu commences la transaction avec la DB de char au début de SendRewardMarkByMail, mais tu ne l'envoie jamais. Pense à un petit :
Code :
CharacterDatabase.CommitTransaction(trans);

Clin
(10-06-2011 00:01)Atikae a écrit :  Pour ton
Code :
sObjectMgr->GetItemTemplate(mark)
Je n'ai rien trouvé dans les sources sur le GetItemTemplate. Par contre un
Code :
if (!ObjectMgr::GetItemPrototype(mark))

semble être plus correct. Pareil pour dans SendRewardMarkByMail. Sinon niquel, merci bien Clin

Edit : Tu commences la transaction avec la DB de char au début de SendRewardMarkByMail, mais tu ne l'envoie jamais. Pense à un petit :
Code :
CharacterDatabase.CommitTransaction(trans);

Clin

C'est un patch pour Trinity, GetItemPrototype() a été renommé en GetItemTemplate().

Pour la transaction effectivement petit oublie, merci Clin

EDIT : Pour GetItemTemplate(), https://github.com/TrinityCore/TrinityCo...ectMgr.cpp vers la ligne 2700
C'est tout tout récent alors. Au temps pour moi.
Petite question, ne serait-il pas plus simple de supprimer toutes les marques du jeu, et de recréer des nouveaux items strictement identique aux monnaies fraîchement supprimés ?
Ils seront dans l'inventaire automatiquement, le seul travail serait de changer les conditions de ventes aux vendeurs PvP afin qu'ils prennent les nouvelles marques plutôt que les anciennes, non ?
(10-06-2011 19:41)Daelian a écrit :  Petite question, ne serait-il pas plus simple de supprimer toutes les marques du jeu, et de recréer des nouveaux items strictement identique aux monnaies fraîchement supprimés ?
Ils seront dans l'inventaire automatiquement, le seul travail serait de changer les conditions de ventes aux vendeurs PvP afin qu'ils prennent les nouvelles marques plutôt que les anciennes, non ?

Le patch remet en place le fait que les marques de BG sont offertes à chaque fin de BG, je ne vois pas pourquoi on devrait les refaire ?

Entre parenthèses, pour modifier les conditions de ventes, il faut modifier les DBC et pour avoir un affichage client, déployer un fichier MPQ donc c'est pas non plus super pratique même si je ne vois pas de rapport avec le patch...
(10-06-2011 19:47)et65 a écrit :  
(10-06-2011 19:41)Daelian a écrit :  Petite question, ne serait-il pas plus simple de supprimer toutes les marques du jeu, et de recréer des nouveaux items strictement identique aux monnaies fraîchement supprimés ?
Ils seront dans l'inventaire automatiquement, le seul travail serait de changer les conditions de ventes aux vendeurs PvP afin qu'ils prennent les nouvelles marques plutôt que les anciennes, non ?

Le patch remet en place le fait que les marques de BG sont offertes à chaque fin de BG, je ne vois pas pourquoi on devrait les refaire ?

Entre parenthèses, pour modifier les conditions de ventes, il faut modifier les DBC et pour avoir un affichage client, déployer un fichier MPQ donc c'est pas non plus super pratique même si je ne vois pas de rapport avec le patch...

Alors mae culpa, il me semblait que (dans une fatigue et une lecture rapide), l'auteur voulait remettre les marques dans l'inventaires plus que de les faire apparaître dans l'onglet «Monnaie». Ma réponse prends son sens si et seulement si on prends le sujet de mon point de vue, c'est vrai.
Navré. Clin
(10-06-2011 21:26)Daelian a écrit :  Alors mae culpa, il me semblait que (dans une fatigue et une lecture rapide), l'auteur voulait remettre les marques dans l'inventaires plus que de les faire apparaître dans l'onglet «Monnaie». Ma réponse prends son sens si et seulement si on prends le sujet de mon point de vue, c'est vrai.
Navré. Clin

J'avais opté pour cette option là Langue

Retourner en haut Accueil