Passe de warnings sur tout le core : 12 bugs reels corriges
Scan de -fsyntax-only avec les vrais flags sur les 1767 fichiers du
serveur (compile_commands.json), warnings de logique actives. 3277
warnings, tries a la main. Le bruit (Wreorder, Wswitch) est ecarte ;
voici ce qui etait un vrai defaut.
Memoire morte et comportement indefini :
- ObjectMgr::GetGarrssionMissionReward rendait l adresse d un vecteur
local ; Garrison melangeait puis parcourait cet objet detruit.
- BattlePayDataStoreMgr::GetProduct faisait "return{}" sur une fonction
qui rend une reference : huit appelants lisaient un temporaire mort.
- Garrison::RewardMission reaffectait une initializer_list, ce qui ne
prolonge pas la duree de vie du tableau sous-jacent.
- WorldSession avait un destructeur non virtuel alors que
PlayerBotSession en derive : chaque delete d une session de bot ne
detruisait que la moitie de l objet. Idem FieldActing.
- boss_levantus lisait Waypointspawn[6] dans un tableau de 6 entrees,
a chaque declenchement de l evenement.
- boss_hyrja_tov modifiait expelLightSwitch deux fois sans point de
sequence, et replanifiait son evenement toutes les 20 ms au lieu de
20 secondes (IN_MILLISECONDS manquant).
Code jamais appele :
- cinq hooks OnRemoveTarget d areatrigger (Klaxxi, Blackfuse, Siege
d Orgrimmar, Ordos) : le hook du core s appelle OnUnitExit, ces
methodes n etaient rattachees a rien et les auras restaient sur le
joueur apres sa sortie de zone. Trois d entre elles n avaient meme
pas de return.
- boss_admiral_svirax declarait un membre bool du meme nom que
SetDungeonEncounterID, qui masquait la methode de BossAI ; l appel
avait ete "repare" par une virgule et ne faisait donc rien.
- WorldSession::HasSocket comparait l adresse d un tableau a NULL,
donc rendait toujours true.
Conditions toujours vraies :
- zone_vault_of_wardens : "== QUEST_STOP_GULDAN_H || QUEST_STOP_GULDAN_A"
jouait la scene de Gul dan pour n importe quelle quete acceptee.
- boss_vizaduum : "type == POINT_MOTION_TYPE || WAYPOINT_MOTION_TYPE".
- boss_council_of_elders : parenthese fermee au mauvais endroit,
"HasAura(SPELL_DISCHARGE || HasAura(SPELL_OVERLOAD))".
Valeurs tronquees :
- InstanceScript::m_ScenarioStep etait un uint8 alors qu il recoit des
ID de ScenarioStep (3195, 3207...), tronques a 135 ou 136.
- PetBattleTrainer passait 3000000000000000 a SetRespawnTime(uint32).
Nettoyage sans effet de bord : memcpy sur PetBattleRequest remplace par
une copie, et suppression d un getThreatList()/empty() sans effet dans
boss_wise_mari.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -642,11 +642,11 @@ void Garrison::AddMission(uint32 garrMissionId)
|
||||
reward.FollowerXP = 0;
|
||||
reward.BonusAbilityID = 0;
|
||||
reward.Unknown = 1118739;
|
||||
std::vector<GarrssionMissionReward>* fRewards = sObjectMgr->GetGarrssionMissionReward(garrMissionId);
|
||||
if (fRewards)
|
||||
std::vector<GarrssionMissionReward> fRewards = sObjectMgr->GetGarrssionMissionReward(garrMissionId);
|
||||
if (!fRewards.empty())
|
||||
{
|
||||
Trinity::Containers::RandomShuffle(*fRewards);
|
||||
for (auto _reward : *fRewards)
|
||||
Trinity::Containers::RandomShuffle(fRewards);
|
||||
for (auto _reward : fRewards)
|
||||
{
|
||||
// if (_reward.RewardType == GarrisonMission::MissionRewardType::Item)
|
||||
{
|
||||
@@ -1086,13 +1086,16 @@ void Garrison::CalculateMissonBonusRoll(uint32 garrMissionId)
|
||||
|
||||
void Garrison::RewardMission(Mission* mission, bool withOvermaxReward)
|
||||
{
|
||||
auto rewardLists = { mission->Rewards };
|
||||
// SylvaniaCore : reaffecter une initializer_list ne prolonge pas la duree de
|
||||
// vie du tableau sous-jacent -- la boucle parcourait un temporaire detruit.
|
||||
std::vector<decltype(&mission->Rewards)> rewardLists;
|
||||
rewardLists.push_back(&mission->Rewards);
|
||||
if (withOvermaxReward)
|
||||
rewardLists = { mission->Rewards, mission->BonusRewards };
|
||||
rewardLists.push_back(&mission->BonusRewards);
|
||||
|
||||
for (auto rewards : rewardLists)
|
||||
for (auto const* rewards : rewardLists)
|
||||
{
|
||||
for (WorldPackets::Garrison::GarrisonMissionReward reward : rewards)
|
||||
for (WorldPackets::Garrison::GarrisonMissionReward reward : *rewards)
|
||||
{
|
||||
if (reward.ItemID)
|
||||
GetOwner()->AddItem(reward.ItemID, reward.ItemQuantity);
|
||||
|
||||
Reference in New Issue
Block a user