diff --git a/chantiers/rivage_brise/retour_faction16_1460.sql b/chantiers/rivage_brise/retour_faction16_1460.sql new file mode 100644 index 0000000..0570ed4 --- /dev/null +++ b/chantiers/rivage_brise/retour_faction16_1460.sql @@ -0,0 +1,100 @@ +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102702; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=97510; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113054; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113055; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110617; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102706; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113058; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90506; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=94191; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113056; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110616; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113057; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102696; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113053; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=94190; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=91967; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=94189; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=91970; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=101667; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102701; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113059; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90525; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105176; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105169; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105168; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105171; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105170; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111079; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=90688; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111154; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111089; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=91902; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105166; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105163; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=111165; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111153; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111152; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111149; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111148; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=92558; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105192; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105188; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105190; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105185; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105187; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105186; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105181; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105180; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105182; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105179; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90677; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105203; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90515; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90516; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111167; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111156; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111088; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111087; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105197; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105189; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111173; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111175; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111174; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105183; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105175; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105174; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105165; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105164; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111157; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111155; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111085; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111171; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105206; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105196; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105167; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105205; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105200; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105199; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111074; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105172; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102698; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=92564; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=100621; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110615; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110614; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102704; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102703; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102705; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109591; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113037; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113036; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109604; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109592; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113038; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=91588; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109587; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109586; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=93719; +UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90705; +UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=101632; diff --git a/sql/sylvania/rivage_faction16_1460.sql b/sql/sylvania/rivage_faction16_1460.sql new file mode 100644 index 0000000..f0f15af --- /dev/null +++ b/sql/sylvania/rivage_faction16_1460.sql @@ -0,0 +1,48 @@ +-- ===================================================================== +-- Rivage brisé (carte 1460) — factions démoniaques ramenées à 16 +-- +-- ÉTABLI PAR TEST A/B, pas par raisonnement. +-- Une seule entrée a été basculée en faction 16 — le Molosse de l'effroi +-- gangrené (90686) — toutes choses égales par ailleurs. Résultat en jeu : +-- « les molosses sont maintenant attaquables », les autres non. +-- +-- La sonde SPAWNDBG confirme que seule la faction distingue les deux : +-- Felstalker Dreadhound faction=16 drapeaux=32768 drapeaux2=0 → OK +-- Felguard Legionnaire faction=2780 drapeaux=32768 drapeaux2=0 → bloqué +-- Mêmes drapeaux, même niveau, même vie, mêmes phases. +-- +-- POURQUOI 2780 ÉCHOUE, ALORS QUE LA THÉORIE DIT L'INVERSE +-- `FactionTemplate.db2` donne pour 2780 : Faction=1786, EnemyGroup=15, +-- soit ennemi de tous les groupes, joueurs compris. Et 1786 (« Burning +-- Legion Invaders ») a ReputationIndex=-1, donc aucune réputation +-- n'intervient. Sur le papier, 2780 devrait être hostile. +-- +-- Elle ne l'est pas dans les faits, et je n'ai pas élucidé pourquoi. Le +-- refus vient du client, qui n'interroge jamais le serveur — aucune sonde +-- côté serveur ne peut l'observer. +-- +-- CHOIX ASSUMÉ : on retient la faction 16, qui fonctionne de façon +-- démontrée dans ce scénario même — c'est celle qu'emploient les démons +-- invoqués par le script. C'est un écart avec la donnée de référence, +-- consenti parce qu'il rend le contenu jouable. +-- +-- Effet secondaire bienvenu : les démons cessent de s'entretuer. La +-- faction 16 les rend amis entre eux (Friend_0=14), ce qui met fin au +-- « démons inattaquables qui se battent avec les attaquables ». +-- +-- PORTÉE : uniquement les entrées exclusives à la carte 1460, comme pour +-- les correctifs précédents. Les entrées partagées avec d'autres cartes +-- sont écartées. +-- +-- Retour arrière : chantiers/rivage_brise/retour_faction16_1460.sql +-- ===================================================================== + +UPDATE `creature_template` ct + JOIN (SELECT DISTINCT c.id + FROM creature c + JOIN creature_template t ON t.entry = c.id + WHERE c.map = 1460 + AND t.faction IN (2780, 1768) + AND c.id NOT IN (SELECT DISTINCT id FROM creature WHERE map <> 1460)) AS cible + ON cible.id = ct.entry + SET ct.faction = 16; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 4484e4d..3de99e8 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1574,6 +1574,29 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad GetMap()->AddBattlePet(this); + // SONDE TEMPORAIRE - carte 1460. Etat REEL en memoire une fois la + // creature entierement chargee depuis la base, pour le comparer a ce + // que dit la table. Une sur dix : il y en a 757. + // + // La version precedente etait posee dans un bloc de rechargement que + // ce chemin n'emprunte jamais -- elle n'a produit aucune ligne. + if (GetMapId() == 1460) + { + static uint32 sondeSpawn = 0; + if ((++sondeSpawn % 10) == 1) + { + TC_LOG_ERROR("misc", + "SPAWNDBG %s (entree %u) | faction=%u niveau=%u | pv=" UI64FMTD "/" UI64FMTD + " | vivante=%u | drapeaux=%u drapeaux2=%u dynamiques=%u | phases=%u", + GetName().c_str(), GetEntry(), getFaction(), getLevel(), + GetHealth(), GetMaxHealth(), + uint32(IsAlive() ? 1 : 0), + GetUInt32Value(UNIT_FIELD_FLAGS), GetUInt32Value(UNIT_FIELD_FLAGS_2), + GetUInt32Value(OBJECT_DYNAMIC_FLAGS), + uint32(GetPhaseShift().GetPhases().size())); + } + } + return true; } @@ -3336,26 +3359,6 @@ void Creature::ReLoad(bool skipDB) if (IsAIEnabled) AI()->EnterEvadeMode(); - // SONDE TEMPORAIRE - carte 1460 uniquement. Journalise l'etat REEL en - // memoire, pour le comparer a la base. Une creature sur dix suffit : - // il y en a 757, on veut un echantillon, pas un deluge. - if (GetMapId() == 1460) - { - static uint32 sondeSpawn = 0; - if ((++sondeSpawn % 10) == 1) - { - TC_LOG_ERROR("misc", - "SPAWNDBG %s (entree %u) | faction=%u niveau=%u | pv=" UI64FMTD "/" UI64FMTD - " | vivante=%u | drapeaux=%u drapeaux2=%u dynamiques=%u | phases=%u | reactState=%u", - GetName().c_str(), GetEntry(), getFaction(), getLevel(), - GetHealth(), GetMaxHealth(), - uint32(IsAlive() ? 1 : 0), - GetUInt32Value(UNIT_FIELD_FLAGS), GetUInt32Value(UNIT_FIELD_FLAGS_2), - GetUInt32Value(OBJECT_DYNAMIC_FLAGS), - uint32(GetPhaseShift().GetPhases().size()), - uint32(GetReactState())); - } - } TC_LOG_DEBUG("sql.sql", "Creature SpawnID (" SI64FMTD ") reloaded.", GetSpawnId()); } diff --git a/src/server/scripts/BrokenIsles/Scenario/scenario_broken_shore_intro.cpp b/src/server/scripts/BrokenIsles/Scenario/scenario_broken_shore_intro.cpp index 76995f5..f82e105 100644 --- a/src/server/scripts/BrokenIsles/Scenario/scenario_broken_shore_intro.cpp +++ b/src/server/scripts/BrokenIsles/Scenario/scenario_broken_shore_intro.cpp @@ -363,6 +363,27 @@ struct scenario_broken_shore_intro : public InstanceScript } break; default: + // ===================================================== + // SylvaniaCore : tout demon compte pour l objectif. + // + // SIGNALE EN JEU : « les molosses sont maintenant + // attaquables mais ne comptent pas dans l objectif du + // scenario ». + // + // Le script ne reconnaissait que les CINQ entrees qu il + // invoque lui-meme. Or la carte porte 101 entrees de + // demons placees, affrontees tout au long de l assaut : + // elles ne crediraient rien. + // + // Plutot que d enumerer 101 entrees -- liste qui + // vieillirait mal --, on s appuie sur la donnee : le type + // demon. Tous les demons de cette carte sont desormais + // hostiles (faction 16). Les Seigneurs gangrebois, + // Arganoth, Krosus et Gul dan sont traites avant et n + // arrivent jamais ici : ils ont leurs propres criteres. + // ===================================================== + if (creature->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON) + OnDemonDied(); break; } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index 7d6de76..d55af66 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -57,7 +57,20 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); + // SylvaniaCore : ENSURE_AI faisait tomber TOUT le serveur. + // + // GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, + // c est-a-dire dans l instance du Mont Hyjal. Ailleurs la creature + // recoit une IA quelconque -- et ENSURE_AI, qui ASSERTE, tuait le + // process. Constate en production : un exemplaire de Jaina (17772) + // se trouvait sur la carte 0, a Hurlevent ; lui parler suffisait a + // planter le serveur (SIGSEGV dans Trinity::Assert, appele depuis + // npc_jaina_proudmoore::OnGossipHello). + // + // On echoue desormais proprement : le PNJ ne repond simplement pas. + hyjalAI* ai = dynamic_cast(creature->AI()); + if (!ai) + return false; switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: @@ -81,7 +94,20 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); + // SylvaniaCore : ENSURE_AI faisait tomber TOUT le serveur. + // + // GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, + // c est-a-dire dans l instance du Mont Hyjal. Ailleurs la creature + // recoit une IA quelconque -- et ENSURE_AI, qui ASSERTE, tuait le + // process. Constate en production : un exemplaire de Jaina (17772) + // se trouvait sur la carte 0, a Hurlevent ; lui parler suffisait a + // planter le serveur (SIGSEGV dans Trinity::Assert, appele depuis + // npc_jaina_proudmoore::OnGossipHello). + // + // On echoue desormais proprement : le PNJ ne repond simplement pas. + hyjalAI* ai = dynamic_cast(creature->AI()); + if (!ai) + return false; if (ai->EventBegun) return false; @@ -136,7 +162,20 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { ClearGossipMenuFor(player); - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); + // SylvaniaCore : ENSURE_AI faisait tomber TOUT le serveur. + // + // GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, + // c est-a-dire dans l instance du Mont Hyjal. Ailleurs la creature + // recoit une IA quelconque -- et ENSURE_AI, qui ASSERTE, tuait le + // process. Constate en production : un exemplaire de Jaina (17772) + // se trouvait sur la carte 0, a Hurlevent ; lui parler suffisait a + // planter le serveur (SIGSEGV dans Trinity::Assert, appele depuis + // npc_jaina_proudmoore::OnGossipHello). + // + // On echoue desormais proprement : le PNJ ne repond simplement pas. + hyjalAI* ai = dynamic_cast(creature->AI()); + if (!ai) + return false; ai->DeSpawnVeins();//despawn the alliance veins switch (action) { @@ -161,7 +200,20 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); + // SylvaniaCore : ENSURE_AI faisait tomber TOUT le serveur. + // + // GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, + // c est-a-dire dans l instance du Mont Hyjal. Ailleurs la creature + // recoit une IA quelconque -- et ENSURE_AI, qui ASSERTE, tuait le + // process. Constate en production : un exemplaire de Jaina (17772) + // se trouvait sur la carte 0, a Hurlevent ; lui parler suffisait a + // planter le serveur (SIGSEGV dans Trinity::Assert, appele depuis + // npc_jaina_proudmoore::OnGossipHello). + // + // On echoue desormais proprement : le PNJ ne repond simplement pas. + hyjalAI* ai = dynamic_cast(creature->AI()); + if (!ai) + return false; if (ai->EventBegun) return false; @@ -244,7 +296,20 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); + // SylvaniaCore : ENSURE_AI faisait tomber TOUT le serveur. + // + // GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, + // c est-a-dire dans l instance du Mont Hyjal. Ailleurs la creature + // recoit une IA quelconque -- et ENSURE_AI, qui ASSERTE, tuait le + // process. Constate en production : un exemplaire de Jaina (17772) + // se trouvait sur la carte 0, a Hurlevent ; lui parler suffisait a + // planter le serveur (SIGSEGV dans Trinity::Assert, appele depuis + // npc_jaina_proudmoore::OnGossipHello). + // + // On echoue desormais proprement : le PNJ ne repond simplement pas. + hyjalAI* ai = dynamic_cast(creature->AI()); + if (!ai) + return false; uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); // Only let them get item if Azgalor is dead.