From 35c52bd8064ddc6740a6a6028288dbb687ffa80b Mon Sep 17 00:00:00 2001 From: BlaMacfly Date: Sat, 5 Sep 2026 10:38:15 +0200 Subject: [PATCH] Scenarios : un evenement etait compte une fois par joueur present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SIGNALE EN JEU : « un petit groupe de demons m a valide les 33/33 et les 3/3 gangreseigneurs d un coup ». L exploitant a refuse mon explication -- « je ne vois pas en quoi c est une bonne nouvelle » -- et il avait raison. InstanceScript::DoSendEventScenario passait par DoUpdateCriteria, qui diffuse a CHAQUE joueur de l instance. Or Player::UpdateCriteria transmet ensuite au scenario : if (Scenario* scenario = GetScenario()) scenario->UpdateCriteria(type, ...); et ce compteur est PARTAGE par toute l instance. Chaque mort etait donc comptee autant de fois qu il y avait de joueurs presents. Avec une escorte de quatre mercenaires, sept demons suffisaient a remplir un objectif qui en demande trente-trois. Le defaut restait invisible tant qu on jouait seul : un joueur, un credit. L escorte l a mis au jour. Il touche tous les scenarios du serveur, pas seulement le Rivage brise. L evenement credite desormais le scenario une seule fois, avec un joueur de reference pour les conditions qui en dependent. HAUT FAIT JCJ HORS SUJET. « J ai attaque un petit groupe de demons et j ai recu le haut fait Courroux de l Alliance », qui demande de tuer cinq joueurs de la Horde dans chaque grande ville. KillRewarder::Reward creditait CRITERIA_TYPE_SPECIAL_PVP_KILL a chaque membre du groupe pour n importe quelle mort, creatures comprises. Meme mecanisme d apparition : ce bloc n est parcouru qu en groupe. TrinityCore ne fait pas cette mise a jour du tout, ni en 3.3.5 ni en master -- c est un ajout local, pose sans le garde-fou _isPvP que ce fichier emploie partout ailleurs. Il est ajoute. Co-Authored-By: Claude Opus 5 --- .../game/Entities/Player/KillRewarder.cpp | 25 ++++++++++++- src/server/game/Instances/InstanceScript.cpp | 35 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 203b15e..c31b159 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -243,7 +243,30 @@ void KillRewarder::_RewardGroup() if (member->IsAtGroupRewardDistance(_victim)) { _RewardPlayer(member, isDungeon); - member->UpdateCriteria(CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, 0, _victim); + + // ============================================= + // SylvaniaCore : ce credit est JcJ. + // + // SIGNALE EN JEU : « j ai attaque un petit groupe + // de demons et j ai recu le haut fait Courroux + // de l Alliance, totalement hors sujet ». Ce + // haut fait demande de tuer cinq joueurs de la + // Horde dans chaque grande ville. + // + // La ligne suivante creditait un meurtre JcJ a + // chaque membre du groupe pour N IMPORTE QUELLE + // mort, creatures comprises. Elle ne se voyait + // pas tant qu on jouait seul : ce bloc n est + // parcouru qu en groupe. L escorte de + // mercenaires l a mise au jour. + // + // TrinityCore ne fait pas cette mise a jour du + // tout, ni en 3.3.5 ni en master : c est un + // ajout local, pose sans le garde-fou _isPvP + // que ce fichier emploie partout ailleurs. + // ============================================= + if (_isPvP) + member->UpdateCriteria(CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, 0, _victim); } } } diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index b0d611f..c60f8e8 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -714,7 +714,40 @@ void InstanceScript::DoUpdateCriteria(CriteriaTypes type, uint32 miscValue1 /*= void InstanceScript::DoSendEventScenario(uint32 eventId /*= 0*/) { - DoUpdateCriteria(CRITERIA_TYPE_SEND_EVENT_SCENARIO, eventId, 0, nullptr); + // ================================================================= + // SylvaniaCore : un evenement de scenario ne compte QU UNE FOIS. + // + // SIGNALE EN JEU : « un petit groupe de demons m a valide les 33/33 + // et les 3/3 gangreseigneurs d un coup ». + // + // DoUpdateCriteria diffuse a CHAQUE joueur de l instance, et + // Player::UpdateCriteria transmet ensuite au scenario : + // if (Scenario* scenario = GetScenario()) + // scenario->UpdateCriteria(...); + // Or ce compteur est PARTAGE par toute l instance. Chaque mort etait + // donc comptee autant de fois qu il y avait de joueurs presents -- + // cinq, avec une escorte de mercenaires. Sept demons suffisaient a + // remplir un objectif qui en demande trente-trois. + // + // Le defaut restait invisible tant qu on jouait seul : un joueur, + // un credit. L escorte l a mis au jour. + // + // On credite desormais le scenario une seule fois, en lui passant + // un joueur de reference pour les conditions qui en dependent. + // ================================================================= + Scenario* scenario = instance->GetInstanceScenario(); + if (!scenario) + return; + + Map::PlayerList const& liste = instance->GetPlayers(); + for (Map::PlayerList::const_iterator i = liste.begin(); i != liste.end(); ++i) + { + if (Player* reference = i->GetSource()) + { + scenario->UpdateCriteria(CRITERIA_TYPE_SEND_EVENT_SCENARIO, eventId, 0, 0, nullptr, reference); + return; + } + } } // Start timed achievement for all players in instance