Scenarios : un evenement etait compte une fois par joueur present

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 <noreply@anthropic.com>
This commit is contained in:
BlaMacfly
2026-09-05 10:38:15 +02:00
parent 24a0700853
commit 35c52bd806
2 changed files with 58 additions and 2 deletions
@@ -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);
}
}
}
+34 -1
View File
@@ -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