Rivage brise 1460 : le phasage rendait les creatures inattaquables
Signale en jeu : creatures visibles, hostiles, mais impossibles a cibler
-- alors qu elles pouvaient attaquer le joueur.
J avais enchaine trois hypotheses (phase, factions, modeles souches).
Les trois etaient de VRAIS defauts et meritaient correction, mais aucune
n etait la cause. J aurais du poser la sonde d abord.
VERDICT DE LA SONDE, dans _IsValidAttackTarget :
Felblade Destroyer | vivante=1 | aucun drapeau bloquant
reaction=1 (hostile) | mesPhases=0 sesPhases=1
Le joueur n a AUCUNE phase, la creature en a une. PhaseShift::CanSee
exige une intersection des phases, et UpdateUnphasedFlag retire le
statut « non phase » des qu un objet en possede une. Aucune intersection
possible.
C est MA modification precedente qui a introduit ce decalage : j avais
place les 757 spawns en phase 169 en croyant que le joueur y etait,
en me fiant a un commentaire du script. Il ne l etait pas.
CORRECTIF : suppression du phasage des deux cotes, ce qui rejoint la
configuration de la reference -- le dump laisse les 757 placements de
cette carte SANS phase. La phase 169 n existe d ailleurs pas dans
Phase.db2 du build 7.3.5.26972.
- PhaseId remis a 0 sur les 757 creatures et les 101 objets ;
- AddPhase retire de OnPlayerEnter ;
- FinalizeSummon ne phase plus rien (conservee comme point de passage
unique, sans quoi les invocations deviendraient invisibles a un
joueur non phase -- le meme probleme en sens inverse).
La sonde ATTDBG est CONSERVEE le temps de la validation en jeu.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -8314,6 +8314,34 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo
|
|||||||
{
|
{
|
||||||
ASSERT(target);
|
ASSERT(target);
|
||||||
|
|
||||||
|
// SONDE TEMPORAIRE - carte 1460 uniquement, et seulement quand un
|
||||||
|
// JOUEUR vise une CREATURE. Volume borne : quelques lignes par seconde
|
||||||
|
// au plus, et uniquement dans ce scenario.
|
||||||
|
if (GetTypeId() == TYPEID_PLAYER && target->GetTypeId() == TYPEID_UNIT && GetMapId() == 1460)
|
||||||
|
{
|
||||||
|
static uint32 sondeAtt = 0;
|
||||||
|
if ((++sondeAtt % 20) == 1)
|
||||||
|
{
|
||||||
|
TC_LOG_ERROR("misc",
|
||||||
|
"ATTDBG cible %s (entree %u) | vivante=%u etatInattaquable=%u | drapeaux=%u "
|
||||||
|
"(NON_ATTACKABLE=%u NOT_ATTACKABLE_1=%u UNK_16=%u IMMUNE_PC=%u NOT_SELECTABLE=%u) "
|
||||||
|
"| reaction=%d | jeLaVois=%u | mesPhases=%u sesPhases=%u",
|
||||||
|
target->GetName().c_str(), target->GetEntry(),
|
||||||
|
uint32(target->IsAlive() ? 1 : 0),
|
||||||
|
uint32(target->HasUnitState(UNIT_STATE_UNATTACKABLE) ? 1 : 0),
|
||||||
|
target->GetUInt32Value(UNIT_FIELD_FLAGS),
|
||||||
|
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) ? 1 : 0),
|
||||||
|
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_1) ? 1 : 0),
|
||||||
|
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_16) ? 1 : 0),
|
||||||
|
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) ? 1 : 0),
|
||||||
|
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) ? 1 : 0),
|
||||||
|
int32(GetReactionTo(target)),
|
||||||
|
uint32(CanSeeOrDetect(target, true) ? 1 : 0),
|
||||||
|
uint32(GetPhaseShift().GetPhases().size()),
|
||||||
|
uint32(target->GetPhaseShift().GetPhases().size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// can't attack self
|
// can't attack self
|
||||||
if (this == target)
|
if (this == target)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -172,7 +172,30 @@ struct scenario_broken_shore_intro : public InstanceScript
|
|||||||
if (player->GetMapId() != 1460)
|
if (player->GetMapId() != 1460)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PhasingHandler::AddPhase(player, PHASE_NORMAL, true);
|
// ==========================================================
|
||||||
|
// SylvaniaCore : phasage retire.
|
||||||
|
//
|
||||||
|
// SIGNALE EN JEU : les creatures etaient visibles, hostiles, mais
|
||||||
|
// impossibles a cibler. Une sonde posee dans _IsValidAttackTarget
|
||||||
|
// a donne le verdict :
|
||||||
|
// reaction=1 (hostile), aucun drapeau bloquant, vivante,
|
||||||
|
// mesPhases=0 sesPhases=1
|
||||||
|
//
|
||||||
|
// Deux objets ne se voient que s'ils PARTAGENT une phase
|
||||||
|
// (PhaseShift::CanSee, intersection des phases), et
|
||||||
|
// UpdateUnphasedFlag retire le statut « non phase » des qu'un
|
||||||
|
// objet en possede une. Le joueur n'en avait aucune : aucune
|
||||||
|
// intersection possible.
|
||||||
|
//
|
||||||
|
// Le phasage etait de toute facon une invention locale : le dump
|
||||||
|
// de reference laisse les 757 placements de cette carte SANS
|
||||||
|
// phase (PhaseId vide). On revient donc a cette configuration --
|
||||||
|
// tout le monde non phase, tout le monde se voit.
|
||||||
|
//
|
||||||
|
// La phase 169 n'existe d'ailleurs pas dans Phase.db2 du build
|
||||||
|
// 7.3.5.26972, ce qui la rendait d'autant plus douteuse.
|
||||||
|
// ==========================================================
|
||||||
|
|
||||||
// objectif « embarquement » (Alliance) : credite aussi ici au cas ou
|
// objectif « embarquement » (Alliance) : credite aussi ici au cas ou
|
||||||
player->KilledMonsterCredit(NPC_CREDIT_SHIP);
|
player->KilledMonsterCredit(NPC_CREDIT_SHIP);
|
||||||
|
|
||||||
@@ -207,10 +230,13 @@ struct scenario_broken_shore_intro : public InstanceScript
|
|||||||
// Toute invocation doit partager la phase des joueurs (OnPlayerEnter les met en 169),
|
// Toute invocation doit partager la phase des joueurs (OnPlayerEnter les met en 169),
|
||||||
// sinon elle est invisible/intangible : cible de quete introuvable, vague intuable.
|
// sinon elle est invisible/intangible : cible de quete introuvable, vague intuable.
|
||||||
// (defaut systemique detecte par le harnais bot le 26/07, deja corrige dans le runner d artefacts)
|
// (defaut systemique detecte par le harnais bot le 26/07, deja corrige dans le runner d artefacts)
|
||||||
|
// SylvaniaCore : ne phase plus rien. Laisser la phase 169 ici alors
|
||||||
|
// que le joueur n'en a aucune rendrait les invocations invisibles --
|
||||||
|
// le probleme meme qu'on vient de corriger, en sens inverse.
|
||||||
|
// Conservee comme point de passage unique pour les invocations, au
|
||||||
|
// cas ou un traitement commun redevienne necessaire.
|
||||||
TempSummon* FinalizeSummon(TempSummon* summon) const
|
TempSummon* FinalizeSummon(TempSummon* summon) const
|
||||||
{
|
{
|
||||||
if (summon)
|
|
||||||
PhasingHandler::AddPhase(summon, PHASE_NORMAL, true);
|
|
||||||
return summon;
|
return summon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user