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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user