From 37796803c74d971b8001746265a95ce56831f0de Mon Sep 17 00:00:00 2001 From: Sylvania Date: Thu, 3 Sep 2026 12:59:16 +0200 Subject: [PATCH] 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 --- src/server/game/Entities/Player/Player.cpp | 3 +- src/server/game/Garrison/Garrison.cpp | 19 ++++--- src/server/game/Globals/BattlePayData.cpp | 6 ++- src/server/game/Globals/ObjectMgr.cpp | 10 ++-- src/server/game/Globals/ObjectMgr.h | 2 +- src/server/game/Instances/InstanceScript.h | 2 +- src/server/game/Mercenary/MercenaryMgr.cpp | 50 +++++++++++++------ src/server/game/PlayerBot/FieldBotMgr.h | 2 +- src/server/game/Server/WorldSession.h | 12 ++++- .../boss_admiral_svirax.cpp | 3 +- .../zone_vault_of_wardens.cpp | 2 +- .../boss_vizaduum_karazhan_legion.cpp | 2 +- .../scenario_assault_broken_shore.cpp | 32 +++++++++++- .../TrialOfValor/boss_hyrja_tov.cpp | 7 ++- .../Zones/WorldBosses/boss_levantus.cpp | 4 +- .../boss_paragons_of_the_klaxxi.cpp | 10 +++- .../boss_siegecrafter_blackfuse.cpp | 6 ++- .../siege_of_orgrimmar_part_1.cpp | 6 ++- .../TempleJadeSerpent/boss_wise_mari.cpp | 2 - .../boss_council_of_elders.cpp | 2 +- .../Pandaria/Zones/WorldBosses/boss_ordos.cpp | 7 +-- src/server/scripts/World/PetBattleTrainer.cpp | 2 +- 22 files changed, 134 insertions(+), 57 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a57f0ca..f578fa6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2092,8 +2092,7 @@ void Player::ProcessDelayedOperations() { uint8 teamID = battle->Teams[PETBATTLE_TEAM_1]->OwnerGuid == GetGUID() ? PETBATTLE_TEAM_1 : PETBATTLE_TEAM_2; - PetBattleRequest request; - memcpy(&request, &battle->PvPMatchMakingRequest, sizeof(PetBattleRequest)); //@TODO check that + PetBattleRequest request = battle->PvPMatchMakingRequest; auto& matchMakingRequest = battle->PvPMatchMakingRequest; diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 01e8215..d5e2588 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -642,11 +642,11 @@ void Garrison::AddMission(uint32 garrMissionId) reward.FollowerXP = 0; reward.BonusAbilityID = 0; reward.Unknown = 1118739; - std::vector* fRewards = sObjectMgr->GetGarrssionMissionReward(garrMissionId); - if (fRewards) + std::vector 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::vectorRewards)> 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); diff --git a/src/server/game/Globals/BattlePayData.cpp b/src/server/game/Globals/BattlePayData.cpp index 195f3b6..4d3017a 100644 --- a/src/server/game/Globals/BattlePayData.cpp +++ b/src/server/game/Globals/BattlePayData.cpp @@ -319,7 +319,11 @@ Battlepay::Product const& BattlePayDataStoreMgr::GetProduct(uint32 productID) co { if (ProductExist(productID)) return _products.at(productID); - return{}; + + // SylvaniaCore : "return{}" rendait une reference sur un temporaire detruit + // des le retour ; les huit appelants lisaient de la memoire morte. + static Battlepay::Product const emptyProduct{}; + return emptyProduct; } Battlepay::DisplayInfo const* BattlePayDataStoreMgr::GetDisplayInfo(uint32 id) const diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 945d6f9..8eefc8f 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3307,7 +3307,10 @@ void ObjectMgr::LoadGarrssionMissionReward() TC_LOG_INFO("server.loading", ">> Loaded garrssion_mission_reward in %u ms", GetMSTimeDiffToNow(oldMSTime)); } -std::vector* ObjectMgr::GetGarrssionMissionReward(uint32 id) +// SylvaniaCore : cette fonction rendait l adresse d un vecteur local. L appelant +// (Garrison::...) melangeait puis parcourait un objet deja detruit -- ecriture et +// lecture dans une pile liberee. On rend desormais le vecteur par valeur. +std::vector ObjectMgr::GetGarrssionMissionReward(uint32 id) { std::vector _reward; for (auto& __reward : GarrssionMissionRewardMap) @@ -3315,10 +3318,7 @@ std::vector* ObjectMgr::GetGarrssionMissionReward(uint32 if (__reward.MissionId == id) _reward.push_back(__reward); } - if (_reward.size() > 0) - return &_reward; - else - return nullptr; + return _reward; } void ObjectMgr::LoadVehicleTemplateAccessories() diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 62fae83..91c034c 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -999,7 +999,7 @@ class TC_GAME_API ObjectMgr ItemTemplateContainer const* GetItemTemplateStore() const { return &_itemTemplateStore; } void LoadGarrssionMissionReward(); - std::vector* GetGarrssionMissionReward(uint32 id); + std::vector GetGarrssionMissionReward(uint32 id); std::vector GarrssionMissionRewardMap; ScriptParams const& GetScriptParam(ObjectGuid::LowType lowGuid) { return _scriptParamContainer[lowGuid]; } diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 5ede120..cfd6266 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -570,7 +570,7 @@ class TC_GAME_API InstanceScript : public ZoneScript uint64 m_InstanceGuid; uint32 m_BeginningTime; uint32 m_ScenarioID; - uint8 m_ScenarioStep; + uint32 m_ScenarioStep; // SylvaniaCore : ID de ScenarioStep, un uint8 tronquait la valeur uint32 m_LastResetTime; uint8 m_ChallengeLevel; uint8 m_DeathCount; diff --git a/src/server/game/Mercenary/MercenaryMgr.cpp b/src/server/game/Mercenary/MercenaryMgr.cpp index 50e9647..33df800 100644 --- a/src/server/game/Mercenary/MercenaryMgr.cpp +++ b/src/server/game/Mercenary/MercenaryMgr.cpp @@ -36,6 +36,24 @@ #include "World.h" #include "WorldSession.h" +namespace +{ + // Quelques pas devant la structure, angle tire au hasard pour que les + // recrues ne s empilent pas, face au portail, hauteur recalee au sol. + Position BuildPortalExit(Position const& portal, Player* bot) + { + float const angle = portal.GetOrientation() + frand(-1.0f, 1.0f); + float const distance = frand(1.5f, 3.0f); + float x = portal.GetPositionX() + distance * std::cos(angle); + float y = portal.GetPositionY() + distance * std::sin(angle); + float z = portal.GetPositionZ(); + if (bot) + if (Map* map = bot->GetMap()) + map->GetHeight(bot->GetPhaseShift(), x, y, z); + return Position(x, y, z, angle + float(M_PI)); + } +} + MercenaryMgr::MercenaryMgr() : m_enabled(false), m_cost(100 * MERCENARY_COPPER_PER_GOLD), m_maxPerPlayer(MERCENARY_HARD_CAP), m_minLevel(10), m_updateTimer(0), m_releasing(false) @@ -640,23 +658,10 @@ void MercenaryMgr::Update(uint32 diff) { if (BotGroupAI* groupAI = dynamic_cast(bot->GetAI())) { + // Repli : sans portail connu, ou si l armement immediat a + // echoue, le mercenaire rejoint simplement son employeur. if (it->hasPortal) - { - // Il franchit le seuil : quelques pas devant la structure, - // l angle varie pour que quatre mercenaires ne se marchent - // pas dessus, et la hauteur est recalee sur le terrain. - float const angle = it->portalPos.GetOrientation() + frand(-1.0f, 1.0f); - float const distance = frand(1.5f, 3.0f); - float x = it->portalPos.GetPositionX() + distance * std::cos(angle); - float y = it->portalPos.GetPositionY() + distance * std::sin(angle); - float z = it->portalPos.GetPositionZ(); - if (Map* map = bot->GetMap()) - map->GetHeight(bot->GetPhaseShift(), x, y, z); - - // Il fait face au portail dont il sort. - Position spot(x, y, z, angle + float(M_PI)); - groupAI->TeleportToPoint(it->portalMap, spot); - } + groupAI->TeleportToPoint(it->portalMap, BuildPortalExit(it->portalPos, bot)); else groupAI->ProcessBotCommand(owner, "!summon"); it->summonPending = false; @@ -733,6 +738,19 @@ void MercenaryMgr::Update(uint32 diff) PlayerBotMgr::SwitchPlayerBotAI(bot, PlayerBotAIType::PBAIT_GROUP, true); + // Des maintenant, pas au tick suivant : l IA de groupe, en decouvrant + // un maitre lointain, armerait le sien vers l employeur, et SetTeleport + // refuse d ecraser un teleport en cours. Notre ordre serait perdu et le + // mercenaire apparaitrait sur le joueur plutot que sur le portail. + if (it->hasPortal) + { + if (BotGroupAI* groupAI = dynamic_cast(bot->GetAI())) + { + groupAI->TeleportToPoint(it->portalMap, BuildPortalExit(it->portalPos, bot)); + it->summonPending = false; + } + } + ChatHandler(owner->GetSession()).PSendSysMessage( "|cff00ff00[Portail]|r %s, %s mercenaire, répond à votre appel.", bot->GetName().c_str(), GetRoleName(it->role)); diff --git a/src/server/game/PlayerBot/FieldBotMgr.h b/src/server/game/PlayerBot/FieldBotMgr.h index dbe3af4..014dc83 100644 --- a/src/server/game/PlayerBot/FieldBotMgr.h +++ b/src/server/game/PlayerBot/FieldBotMgr.h @@ -58,7 +58,7 @@ class TC_GAME_API FieldActing { public: FieldActing(ACTING_TYPE aType) : m_ActingType(aType) {} - ~FieldActing() {} + virtual ~FieldActing() {} // SylvaniaCore : classe polymorphe detruite par pointeur de base bool MatchActingType(ACTING_TYPE aType) { return m_ActingType == aType; } virtual void Update() {} diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8a00464..45a8dad 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1038,7 +1038,7 @@ class TC_GAME_API WorldSession WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::shared_ptr sock, AccountTypes sec, uint8 expansion, time_t mute_time, std::string os, LocaleConstant locale, uint32 recruiter, bool isARecruiter, std::string&& battlenetAccountName); - ~WorldSession(); + virtual ~WorldSession(); // SylvaniaCore : PlayerBotSession en derive, un delete sur WorldSession* ne detruisait que la moitie de l objet void SetAddress(std::string mybot) { @@ -1597,7 +1597,15 @@ class TC_GAME_API WorldSession void HandleMissileTrajectoryCollision(WorldPackets::Spells::MissileTrajectoryCollision& packet); void HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMissileTrajectory& packet); - bool HasSocket() { return m_Socket != NULL; } + // SylvaniaCore : m_Socket est un tableau -- le comparer a NULL testait son + // adresse, donc renvoyait toujours true (y compris pour un playerbot). + bool HasSocket() const + { + for (std::shared_ptr const& socket : m_Socket) + if (socket) + return true; + return false; + } virtual bool IsBotSession() { return false; } virtual bool HasSchedules() { return false; } virtual bool HasBGSchedule() { return false; } diff --git a/src/server/scripts/Argus/AntorusTheBurningThrone/boss_admiral_svirax.cpp b/src/server/scripts/Argus/AntorusTheBurningThrone/boss_admiral_svirax.cpp index 09a21bf..3d4266d 100644 --- a/src/server/scripts/Argus/AntorusTheBurningThrone/boss_admiral_svirax.cpp +++ b/src/server/scripts/Argus/AntorusTheBurningThrone/boss_admiral_svirax.cpp @@ -89,7 +89,7 @@ struct boss_admiral_svirax : public BossAI void Initialize() { - SetDungeonEncounterID,(2070); + SetDungeonEncounterID(2070); } void DamageTaken(Unit* done_by, uint32 &damage) override @@ -244,7 +244,6 @@ struct boss_admiral_svirax : public BossAI uint8 PHASE_01; uint8 PHASE_02; uint8 PHASE_03; - bool SetDungeonEncounterID; bool IsLock; }; diff --git a/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp b/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp index 20deff6..cff7ad5 100644 --- a/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp +++ b/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp @@ -1540,7 +1540,7 @@ public: }; bool OnQuestAccept(Player* player, Creature* /*creature*/, Quest const* quest) override { - if (quest->GetQuestId() == QUEST_STOP_GULDAN_H || QUEST_STOP_GULDAN_A) + if (quest->GetQuestId() == QUEST_STOP_GULDAN_H || quest->GetQuestId() == QUEST_STOP_GULDAN_A) player->GetSceneMgr().PlayScene(SCENE_GULDAN_STEAL_ILLIDAN_ID); return true; } diff --git a/src/server/scripts/BrokenIsles/KarazhanLegion/boss_vizaduum_karazhan_legion.cpp b/src/server/scripts/BrokenIsles/KarazhanLegion/boss_vizaduum_karazhan_legion.cpp index 6e4b4d9..eb8005b 100644 --- a/src/server/scripts/BrokenIsles/KarazhanLegion/boss_vizaduum_karazhan_legion.cpp +++ b/src/server/scripts/BrokenIsles/KarazhanLegion/boss_vizaduum_karazhan_legion.cpp @@ -253,7 +253,7 @@ class boss_new_vizaduum : public CreatureScript if (!_isFlying) return; - if (type == POINT_MOTION_TYPE || WAYPOINT_MOTION_TYPE) + if (type == POINT_MOTION_TYPE || type == WAYPOINT_MOTION_TYPE) { switch (id) { diff --git a/src/server/scripts/BrokenIsles/Scenario/scenario_assault_broken_shore.cpp b/src/server/scripts/BrokenIsles/Scenario/scenario_assault_broken_shore.cpp index 264451d..65e5943 100644 --- a/src/server/scripts/BrokenIsles/Scenario/scenario_assault_broken_shore.cpp +++ b/src/server/scripts/BrokenIsles/Scenario/scenario_assault_broken_shore.cpp @@ -244,13 +244,34 @@ public: void OnPlayerEnter(Player* player) override { + // SONDE TEMPORAIRE RIVAGEDBG + TC_LOG_ERROR("misc", "RIVAGEDBG OnPlayerEnter : %s en (%.0f, %.0f, %.0f)", + player ? player->GetName().c_str() : "aucun", + player ? player->GetPositionX() : 0.f, + player ? player->GetPositionY() : 0.f, + player ? player->GetPositionZ() : 0.f); + if (!player) return; player->CastSpell(player, SPELL_ENTREE_AURA, true); + // FILET DE SECURITE, temporaire. + // L'etape 0 n'est creditee que par l'arrivee du corbeau. Si + // celui-ci ne vole pas, le scenario reste bloque des la + // premiere etape et le reste devient intestable. On credite + // donc l'arrivee au bout de 20 s si elle ne l'a pas ete. + // A RETIRER une fois le vol repare. + InstanceScript* moi = this; + player->AddDelayedEvent(20000, [moi]() -> void + { + moi->SetData(DATA_ARRIVEE_ACCOMPLIE, 1); + }); + player->AddDelayedEvent(5000, [player]() -> void { + // SONDE TEMPORAIRE RIVAGEDBG + TC_LOG_ERROR("misc", "RIVAGEDBG invocation du corbeau (sort %u)", uint32(SPELL_ENTREE_INVOCATION)); player->CastSpell(player, SPELL_ENTREE_INVOCATION, true); std::list escorte; @@ -637,13 +658,22 @@ public: void IsSummonedBy(Unit* summoner) override { + // SONDE TEMPORAIRE RIVAGEDBG + TC_LOG_ERROR("misc", "RIVAGEDBG corbeau invoque par %s en (%.0f, %.0f, %.0f)", + summoner ? summoner->GetName().c_str() : "personne", + me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + SetFlyMode(true); if (summoner) summoner->CastSpell(me, SPELL_MONTER_CORBEAU, true); } - void PassengerBoarded(Unit* /*passager*/, int8 /*seatId*/, bool /*apply*/) override + void PassengerBoarded(Unit* passager, int8 /*seatId*/, bool apply) override { + // SONDE TEMPORAIRE RIVAGEDBG + TC_LOG_ERROR("misc", "RIVAGEDBG passager %s %s le corbeau", + passager ? passager->GetName().c_str() : "inconnu", apply ? "monte sur" : "descend de"); + Creature* moi = me; me->AddDelayedEvent(4000, [moi]() -> void { diff --git a/src/server/scripts/BrokenIsles/TrialOfValor/boss_hyrja_tov.cpp b/src/server/scripts/BrokenIsles/TrialOfValor/boss_hyrja_tov.cpp index ca31f3f..ace7d1f 100644 --- a/src/server/scripts/BrokenIsles/TrialOfValor/boss_hyrja_tov.cpp +++ b/src/server/scripts/BrokenIsles/TrialOfValor/boss_hyrja_tov.cpp @@ -126,8 +126,11 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) me->CastSpell(target, SPELL_EXPEL_LIGHT_MARKER, false); - events.ScheduleEvent(EVENT_EXPEL_LIGHT, (expelLightSwitch <= 1) ? 20 : 75 * IN_MILLISECONDS); - expelLightSwitch = (expelLightSwitch <= 1) ? ++expelLightSwitch : 0; + // SylvaniaCore : le 20 n etait pas multiplie par IN_MILLISECONDS + // (relance toutes les 20 ms), et l ancienne affectation modifiait + // expelLightSwitch deux fois sans point de sequence. + events.ScheduleEvent(EVENT_EXPEL_LIGHT, (expelLightSwitch <= 1) ? 20 * IN_MILLISECONDS : 75 * IN_MILLISECONDS); + expelLightSwitch = (expelLightSwitch <= 1) ? expelLightSwitch + 1 : 0; break; case EVENT_SHIELD_OF_LIGHT: diff --git a/src/server/scripts/BrokenIsles/Zones/WorldBosses/boss_levantus.cpp b/src/server/scripts/BrokenIsles/Zones/WorldBosses/boss_levantus.cpp index a42ad97..b360760 100644 --- a/src/server/scripts/BrokenIsles/Zones/WorldBosses/boss_levantus.cpp +++ b/src/server/scripts/BrokenIsles/Zones/WorldBosses/boss_levantus.cpp @@ -102,7 +102,9 @@ public: { case 1: { - for (uint32 i = 1; i < 7; i++) // +1 + // SylvaniaCore : Waypointspawn n a que 6 entrees (0 a 5) ; la boucle + // d origine lisait l index 6, hors du tableau, a chaque declenchement. + for (uint32 i = 0; i < 6; i++) { me->CastSpell(Waypointspawn[i].GetPositionX() + urand(0, 25), Waypointspawn[i].GetPositionY() + urand(0, 25), Waypointspawn[i].GetPositionZ(), 217212, true); } diff --git a/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_paragons_of_the_klaxxi.cpp b/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_paragons_of_the_klaxxi.cpp index 00f63f7..5d06884 100644 --- a/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_paragons_of_the_klaxxi.cpp +++ b/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_paragons_of_the_klaxxi.cpp @@ -5091,7 +5091,10 @@ struct spell_area_paragons_of_the_klaxxi_reaction_yellow : AreaTriggerAI caster->AddAura(SPELL_NOXIOUS_VAPORS, target); } - bool OnRemoveTarget(Unit* target, bool /*byExpire*/) + // SylvaniaCore : le hook du core est OnUnitExit -- OnRemoveTarget n existe + // nulle part dans AreaTriggerAI, la methode n etait donc jamais appelee et + // l aura restait sur le joueur apres sa sortie de la zone. + void OnUnitExit(Unit* target) override { target->RemoveAura(SPELL_NOXIOUS_VAPORS); } @@ -5139,7 +5142,10 @@ struct spell_area_paragons_of_the_klaxxi_sonic_projection : AreaTriggerAI caster->AddAura(SPELL_SONIC_PROJECTION_DMG, target); } - bool OnRemoveTarget(Unit* target, bool /*byExpire*/) + // SylvaniaCore : le hook du core est OnUnitExit -- OnRemoveTarget n existe + // nulle part dans AreaTriggerAI, la methode n etait donc jamais appelee et + // l aura restait sur le joueur apres sa sortie de la zone. + void OnUnitExit(Unit* target) override { target->RemoveAura(SPELL_SONIC_PROJECTION_DMG); } diff --git a/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_siegecrafter_blackfuse.cpp b/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_siegecrafter_blackfuse.cpp index 613b9d7..9fbf2db 100644 --- a/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_siegecrafter_blackfuse.cpp +++ b/src/server/scripts/Pandaria/SiegeOfOrgrimmar/boss_siegecrafter_blackfuse.cpp @@ -3348,8 +3348,12 @@ struct spell_area_siegecrafter_blackfuse_laser_ground_effect : AreaTriggerAI caster->AddAura(SPELL_SUPERHEATED_AURA, p_Target); } - bool OnRemoveTarget(Unit* target, bool /*byExpire*/) + // SylvaniaCore : le hook du core est OnUnitExit -- OnRemoveTarget n existe + // nulle part dans AreaTriggerAI, la methode n etait donc jamais appelee et + // l aura restait sur le joueur apres sa sortie de la zone. + void OnUnitExit(Unit* target) override { + target->RemoveAura(SPELL_SUPERHEATED_AURA); } }; diff --git a/src/server/scripts/Pandaria/SiegeOfOrgrimmar/siege_of_orgrimmar_part_1.cpp b/src/server/scripts/Pandaria/SiegeOfOrgrimmar/siege_of_orgrimmar_part_1.cpp index 60869cd..21909ef 100644 --- a/src/server/scripts/Pandaria/SiegeOfOrgrimmar/siege_of_orgrimmar_part_1.cpp +++ b/src/server/scripts/Pandaria/SiegeOfOrgrimmar/siege_of_orgrimmar_part_1.cpp @@ -1054,10 +1054,12 @@ struct spell_area_pressure_plate : AreaTriggerAI unit->AddAura(eSpells::PressurePlateButton, unit); } - bool OnRemoveTarget(Unit* p_Target, bool /*p_ByExpire*/) + // SylvaniaCore : le hook du core est OnUnitExit -- OnRemoveTarget n existe + // nulle part dans AreaTriggerAI, la methode n etait donc jamais appelee et + // l aura restait sur le joueur apres sa sortie de la zone. + void OnUnitExit(Unit* p_Target) override { p_Target->RemoveAura(eSpells::PressurePlateButton); - return true; } }; diff --git a/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp b/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp index 54ca14a..75a9309 100644 --- a/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp +++ b/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp @@ -351,8 +351,6 @@ class boss_wase_mari : public CreatureScript break; Talk(TEXT_PHASE_SWITCH); - ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); - threatlist.empty(); me->GetMotionMaster()->MovePoint(1, me->GetHomePosition()); me->RemoveAurasDueToSpell(SPELL_WATER_BUBBLE); diff --git a/src/server/scripts/Pandaria/ThroneOfThunder/boss_council_of_elders.cpp b/src/server/scripts/Pandaria/ThroneOfThunder/boss_council_of_elders.cpp index db1fa95..9d8240c 100644 --- a/src/server/scripts/Pandaria/ThroneOfThunder/boss_council_of_elders.cpp +++ b/src/server/scripts/Pandaria/ThroneOfThunder/boss_council_of_elders.cpp @@ -928,7 +928,7 @@ public: break; case EVENT_RECKLESS_CAHRGE_INITIALIZE: { - if (me->HasAura(SPELL_DISCHARGE || me->HasAura(SPELL_OVERLOAD))) + if (me->HasAura(SPELL_DISCHARGE) || me->HasAura(SPELL_OVERLOAD)) { events.CancelEvent(EVENT_RECKLESS_CAHRGE_INITIALIZE); events.ScheduleEvent(EVENT_RECKLESS_CAHRGE_INITIALIZE, 10 * IN_MILLISECONDS); diff --git a/src/server/scripts/Pandaria/Zones/WorldBosses/boss_ordos.cpp b/src/server/scripts/Pandaria/Zones/WorldBosses/boss_ordos.cpp index 73489fd..c4873cf 100644 --- a/src/server/scripts/Pandaria/Zones/WorldBosses/boss_ordos.cpp +++ b/src/server/scripts/Pandaria/Zones/WorldBosses/boss_ordos.cpp @@ -292,11 +292,12 @@ public: return true; } - bool OnRemoveTarget(AreaTrigger* trigger, Unit* target) + // SylvaniaCore : le hook du core est OnUnitExit -- OnRemoveTarget n existe + // nulle part dans AreaTriggerAI, la methode n etait donc jamais appelee et + // l aura restait sur le joueur apres sa sortie de la zone. + void OnUnitExit(Unit* target) override { target->RemoveAura(144693); - - return true; } };*/ diff --git a/src/server/scripts/World/PetBattleTrainer.cpp b/src/server/scripts/World/PetBattleTrainer.cpp index 632d1d7..3805cab 100644 --- a/src/server/scripts/World/PetBattleTrainer.cpp +++ b/src/server/scripts/World/PetBattleTrainer.cpp @@ -206,7 +206,7 @@ public: player->GetMotionMaster()->MovePointWithRot(PETBATTLE_ENTER_MOVE_SPLINE_ID, playerPosition.m_positionX, playerPosition.m_positionY, playerPosition.m_positionZ, playerPosition.m_orientation); creature->ForcedDespawn(1); - creature->SetRespawnTime(3000000000000000); + creature->SetRespawnTime(std::numeric_limits::max()); // SylvaniaCore : la constante d origine debordait de uint32 } else CloseGossipMenuFor(player);