diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index da2af3c..19e8de5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8314,6 +8314,34 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo { 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 if (this == target) return false; 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 b7d796c..76995f5 100644 --- a/src/server/scripts/BrokenIsles/Scenario/scenario_broken_shore_intro.cpp +++ b/src/server/scripts/BrokenIsles/Scenario/scenario_broken_shore_intro.cpp @@ -172,7 +172,30 @@ struct scenario_broken_shore_intro : public InstanceScript if (player->GetMapId() != 1460) 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 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), // 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) + // 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 { - if (summon) - PhasingHandler::AddPhase(summon, PHASE_NORMAL, true); return summon; }