From 39171026a79ac3726c5fcfcd3dae1d97b1d89cf7 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Mon, 24 Aug 2026 22:44:32 +0200 Subject: [PATCH] =?UTF-8?q?Sagesse=20de=20Mari=20:=20=C2=AB=20Lessiver=20?= =?UTF-8?q?=C2=BB=20frappait=20aussi=20dans=20le=20dos=20du=20boss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signalé en jeu : le jet d'eau de la phase 2 infligeait des dégâts aux joueurs placés derrière le boss, « comme s'il y avait des dégâts de zone autour ». Le sort est en réalité une chaîne de trois. 106329 canalise — et son effet 1 est un « script côté serveur », c'est-à-dire une logique Blizzard jamais distribuée avec les données du client. 106331 est l'aura posée sur le boss, qui déclenche 106334 toutes les 250 ms. C'est 106334 qui blesse : école Givre, recul 200, rayon 60 m, drapeau « ignore la ligne de vue ». Toute la forme du jet tenait donc à une seule valeur, et à une entrée DB2 facultative : ConeAngle = _target ? _target->ConeDegrees : 0.f; Le mode de contrôle associé au ciblage 110, TARGET_CHECK_ENTRY, ne filtre par ailleurs — sans `conditions` — ni l'hostilité ni la position. Valeurs officielles relevées dans les DB2 du build 7.3.5.26972 : SpellTargetRestrictions ligne 7514 : ConeDegrees = 12 SpellRadius ligne 48 : Radius = 60 soit un cône frontal de 12° sur 60 mètres. Le script `spell_wise_mari_wash_away` réimpose ces 12° en dur plutôt que de dépendre d'une donnée invérifiable côté serveur (la table spell_effect de dc_hotfixes est vide, ces données vivent dans les fichiers DB2), et rétablit le contrôle d'hostilité laissé de côté par TARGET_CHECK_ENTRY. Le boss pivote de PI/48 toutes les 300 ms, soit 3,75° : avec un jet de 12°, un joueur immobile est balayé environ une seconde par tour de salle. C'est le comportement d'origine. Co-Authored-By: Claude Opus 5 --- sql/sylvania/lessiver_cone.sql | 37 ++++++++ .../TempleJadeSerpent/boss_wise_mari.cpp | 88 +++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 sql/sylvania/lessiver_cone.sql diff --git a/sql/sylvania/lessiver_cone.sql b/sql/sylvania/lessiver_cone.sql new file mode 100644 index 0000000..66600fa --- /dev/null +++ b/sql/sylvania/lessiver_cone.sql @@ -0,0 +1,37 @@ +-- ===================================================================== +-- « Lessiver » (Wash Away) — le jet d'eau de la Sagesse de Mari +-- frappait aussi les joueurs placés DERRIÈRE le boss. +-- +-- Signalé en jeu : « il me fait des dégâts même si je suis derrière le +-- rayon d'eau, comme s'il y avait des dégâts de zone autour du boss ». +-- +-- CE QUE DISENT LES DONNÉES OFFICIELLES (DB2, build 7.3.5.26972) +-- 106329 la canalisation ; son effet 1 est un « script côté serveur », +-- c'est-à-dire une logique Blizzard jamais distribuée ; +-- 106331 l'aura posée sur le boss, qui déclenche 106334 toutes +-- les 250 ms ; +-- 106334 LES DÉGÂTS RÉELS : école Givre, recul 200, rayon 60 m, +-- drapeau « ignore la ligne de vue », ciblage implicite 110. +-- +-- SpellTargetRestrictions, ligne 7514 : ConeDegrees = 12 +-- SpellRadius, ligne 48 : Radius = 60 +-- => le jet officiel est un cône FRONTAL de 12° sur 60 mètres. +-- +-- POURQUOI ÇA DÉBORDAIT +-- Le cœur classe correctement la cible 110 en cône, mais l'ouverture +-- vient de `SpellInfo::ConeAngle`, alimenté par une entrée DB2 +-- facultative — `ConeAngle = _target ? _target->ConeDegrees : 0.f`. +-- Et le mode de contrôle associé, TARGET_CHECK_ENTRY, ne filtre sans +-- `conditions` NI l'hostilité NI la position. Toute la forme du jet +-- tenait donc à cette unique valeur. +-- +-- Le script C++ `spell_wise_mari_wash_away` réimpose les 12° officiels +-- en dur et rétablit le contrôle d'hostilité. Cette ligne le rattache +-- au sort ; sans elle, le script existe mais ne s'exécute jamais. +-- +-- Rechargeable à chaud : reload spell_script_names (puis reload spell_proc) +-- ===================================================================== + +DELETE FROM `spell_script_names` WHERE `spell_id`=106334; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(106334, 'spell_wise_mari_wash_away'); diff --git a/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp b/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp index 42abf2b..54ca14a 100644 --- a/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp +++ b/src/server/scripts/Pandaria/TempleJadeSerpent/boss_wise_mari.cpp @@ -18,6 +18,8 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellInfo.h" enum eBoss { @@ -459,8 +461,94 @@ class mob_corrupt_living_water : public CreatureScript } }; +// ===================================================================== +// SylvaniaCore - « Lessiver » (Wash Away), le jet d'eau de la phase 2 +// +// SIGNALE EN JEU : le sort infligeait des degats aux joueurs places +// DERRIERE le boss, « comme s'il y avait des degats de zone autour ». +// +// CE QUE DISENT LES DONNEES BLIZZARD (build 7.3.5.26972, DB2 officielles) +// 106329 canalisation ; son effet 1 est un « script cote serveur », +// logique que Blizzard n'a jamais distribuee ; +// 106331 aura posee sur le boss, declenche 106334 toutes les 250 ms ; +// 106334 LES DEGATS REELS : ecole Givre, recul 200, rayon 60 m, +// « ignore la ligne de vue », ciblage implicite 110. +// +// SpellTargetRestrictions (ID 7514) pour 106334 : ConeDegrees = 12. +// SpellRadius (ID 48) : 60 m. +// => le jet officiel est un cone FRONTAL de 12 degres sur 60 metres. +// +// POURQUOI CA DEBORDAIT +// Le coeur classe bien la cible 110 en TARGET_SELECT_CATEGORY_CONE, mais +// l'ouverture vient de `SpellInfo::ConeAngle`, alimente par une entree +// DB2 optionnelle : `ConeAngle = _target ? _target->ConeDegrees : 0.f`. +// Le mode de verification associe est TARGET_CHECK_ENTRY, qui sans +// `conditions` ne filtre NI l'hostilite NI quoi que ce soit d'autre. +// La forme du jet ne tenait donc qu'a cette seule valeur. +// +// On la reimpose ici, en dur et a la valeur officielle, plutot que de +// dependre d'une donnee qu'on ne maitrise pas. On en profite pour +// retablir le controle d'hostilite que TARGET_CHECK_ENTRY laisse tomber. +// +// A noter : le boss pivote de PI/48 toutes les 300 ms, soit 3,75 deg ; +// avec un jet de 12 deg, un joueur immobile est balaye environ une +// seconde par tour de salle. C'est le comportement d'origine. +// ===================================================================== +class spell_wise_mari_wash_away : public SpellScriptLoader +{ + public: + spell_wise_mari_wash_away() : SpellScriptLoader("spell_wise_mari_wash_away") { } + + class spell_wise_mari_wash_away_SpellScript : public SpellScript + { + PrepareSpellScript(spell_wise_mari_wash_away_SpellScript); + + void FiltrerLeCone(std::list& targets) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + // 12 degres d'ouverture totale, soit 6 de chaque cote de + // la direction du regard. HasInArc divise l'arc par 2. + float const arc = 12.0f * float(M_PI) / 180.0f; + + targets.remove_if([caster, arc](WorldObject* obj) -> bool + { + Unit* unite = obj->ToUnit(); + if (!unite) + return true; + + if (!caster->IsValidAttackTarget(unite)) + return true; + + return !caster->HasInArc(arc, unite); + }); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn( + spell_wise_mari_wash_away_SpellScript::FiltrerLeCone, + EFFECT_0, TARGET_UNIT_CONE_ENTRY_110); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn( + spell_wise_mari_wash_away_SpellScript::FiltrerLeCone, + EFFECT_1, TARGET_UNIT_CONE_ENTRY_110); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn( + spell_wise_mari_wash_away_SpellScript::FiltrerLeCone, + EFFECT_2, TARGET_UNIT_CONE_ENTRY_110); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_wise_mari_wash_away_SpellScript(); + } +}; + void AddSC_boss_wise_mari() { new boss_wase_mari(); new mob_corrupt_living_water(); + new spell_wise_mari_wash_away(); }