Sagesse de Mari : « Lessiver » frappait aussi dans le dos du boss
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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');
|
||||
@@ -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<WorldObject*>& 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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user