public static void RemovePhaseGroup(WorldObject obj, uint phaseGroupId, bool updateVisibility) { var phasesInGroup = Global.DB2Mgr.GetPhasesForGroup(phaseGroupId); if (phasesInGroup.Empty()) { return; } bool changed = false; foreach (uint phaseId in phasesInGroup) { changed = obj.GetPhaseShift().RemovePhase(phaseId) || changed; } Unit unit = obj.ToUnit(); if (unit) { unit.OnPhaseChange(); ForAllControlled(unit, controlled => { RemovePhaseGroup(controlled, phaseGroupId, updateVisibility); }); unit.RemoveNotOwnSingleTargetAuras(true); } UpdateVisibilityIfNeeded(obj, updateVisibility, changed); }
public static void RemovePhase(WorldObject obj, uint phaseId, bool updateVisibility) { bool changed = obj.GetPhaseShift().RemovePhase(phaseId); Unit unit = obj.ToUnit(); if (unit) { unit.OnPhaseChange(); ForAllControlled(unit, controlled => { RemovePhase(controlled, phaseId, updateVisibility); }); unit.RemoveNotOwnSingleTargetAuras(true); } UpdateVisibilityIfNeeded(obj, updateVisibility, changed); }
public static void OnConditionChange(WorldObject obj) { PhaseShift phaseShift = obj.GetPhaseShift(); PhaseShift suppressedPhaseShift = obj.GetSuppressedPhaseShift(); PhaseShift newSuppressions = new PhaseShift(); ConditionSourceInfo srcInfo = new ConditionSourceInfo(obj); bool changed = false; foreach (var pair in phaseShift.Phases.ToList()) { if (pair.Value.AreaConditions != null && !Global.ConditionMgr.IsObjectMeetToConditions(srcInfo, pair.Value.AreaConditions)) { newSuppressions.AddPhase(pair.Key, pair.Value.Flags, pair.Value.AreaConditions, pair.Value.References); phaseShift.ModifyPhasesReferences(pair.Key, pair.Value, -pair.Value.References); phaseShift.Phases.Remove(pair.Key); } } foreach (var pair in suppressedPhaseShift.Phases.ToList()) { if (Global.ConditionMgr.IsObjectMeetToConditions(srcInfo, pair.Value.AreaConditions)) { changed = phaseShift.AddPhase(pair.Key, pair.Value.Flags, pair.Value.AreaConditions, pair.Value.References) || changed; suppressedPhaseShift.ModifyPhasesReferences(pair.Key, pair.Value, -pair.Value.References); suppressedPhaseShift.Phases.Remove(pair.Key); } } foreach (var pair in phaseShift.VisibleMapIds.ToList()) { if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.TerrainSwap, pair.Key, srcInfo)) { newSuppressions.AddVisibleMapId(pair.Key, pair.Value.VisibleMapInfo, pair.Value.References); foreach (uint uiMapPhaseId in pair.Value.VisibleMapInfo.UiMapPhaseIDs) { changed = phaseShift.RemoveUiMapPhaseId(uiMapPhaseId) || changed; } phaseShift.VisibleMapIds.Remove(pair.Key); } } foreach (var pair in suppressedPhaseShift.VisibleMapIds.ToList()) { if (Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.TerrainSwap, pair.Key, srcInfo)) { changed = phaseShift.AddVisibleMapId(pair.Key, pair.Value.VisibleMapInfo, pair.Value.References) || changed; foreach (uint uiMapPhaseId in pair.Value.VisibleMapInfo.UiMapPhaseIDs) { changed = phaseShift.AddUiMapPhaseId(uiMapPhaseId) || changed; } suppressedPhaseShift.VisibleMapIds.Remove(pair.Key); } } Unit unit = obj.ToUnit(); if (unit) { foreach (AuraEffect aurEff in unit.GetAuraEffectsByType(AuraType.Phase)) { uint phaseId = (uint)aurEff.GetMiscValueB(); // if condition was met previously there is nothing to erase if (newSuppressions.RemovePhase(phaseId)) { phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), null);//todo needs checked } } foreach (AuraEffect aurEff in unit.GetAuraEffectsByType(AuraType.PhaseGroup)) { var phasesInGroup = Global.DB2Mgr.GetPhasesForGroup((uint)aurEff.GetMiscValueB()); if (!phasesInGroup.Empty()) { foreach (uint phaseId in phasesInGroup) { var eraseResult = newSuppressions.RemovePhase(phaseId); // if condition was met previously there is nothing to erase if (eraseResult) { phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), null); } } } } } changed = changed || !newSuppressions.Phases.Empty() || !newSuppressions.VisibleMapIds.Empty(); foreach (var pair in newSuppressions.Phases) { suppressedPhaseShift.AddPhase(pair.Key, pair.Value.Flags, pair.Value.AreaConditions, pair.Value.References); } foreach (var pair in newSuppressions.VisibleMapIds) { suppressedPhaseShift.AddVisibleMapId(pair.Key, pair.Value.VisibleMapInfo, pair.Value.References); } if (unit) { if (changed) { unit.OnPhaseChange(); } ForAllControlled(unit, controlled => { InheritPhaseShift(controlled, unit); }); if (changed) { unit.RemoveNotOwnSingleTargetAuras(true); } } UpdateVisibilityIfNeeded(obj, true, changed); }
public static void OnAreaChange(WorldObject obj) { PhaseShift phaseShift = obj.GetPhaseShift(); PhaseShift suppressedPhaseShift = obj.GetSuppressedPhaseShift(); var oldPhases = phaseShift.GetPhases(); // for comparison ConditionSourceInfo srcInfo = new ConditionSourceInfo(obj); obj.GetPhaseShift().ClearPhases(); obj.GetSuppressedPhaseShift().ClearPhases(); uint areaId = obj.GetAreaId(); AreaTableRecord areaEntry = CliDB.AreaTableStorage.LookupByKey(areaId); while (areaEntry != null) { var newAreaPhases = Global.ObjectMgr.GetPhasesForArea(areaEntry.Id); if (!newAreaPhases.Empty()) { foreach (PhaseAreaInfo phaseArea in newAreaPhases) { if (phaseArea.SubAreaExclusions.Contains(areaId)) { continue; } uint phaseId = phaseArea.PhaseInfo.Id; if (Global.ConditionMgr.IsObjectMeetToConditions(srcInfo, phaseArea.Conditions)) { phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), phaseArea.Conditions); } else { suppressedPhaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), phaseArea.Conditions); } } } areaEntry = CliDB.AreaTableStorage.LookupByKey(areaEntry.ParentAreaID); } bool changed = phaseShift.GetPhases() != oldPhases; Unit unit = obj.ToUnit(); if (unit) { foreach (AuraEffect aurEff in unit.GetAuraEffectsByType(AuraType.Phase)) { uint phaseId = (uint)aurEff.GetMiscValueB(); changed = phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), null) || changed; } foreach (AuraEffect aurEff in unit.GetAuraEffectsByType(AuraType.PhaseGroup)) { var phasesInGroup = Global.DB2Mgr.GetPhasesForGroup((uint)aurEff.GetMiscValueB()); foreach (uint phaseId in phasesInGroup) { changed = phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), null) || changed; } } if (changed) { unit.OnPhaseChange(); } ForAllControlled(unit, controlled => { InheritPhaseShift(controlled, unit); }); if (changed) { unit.RemoveNotOwnSingleTargetAuras(true); } } UpdateVisibilityIfNeeded(obj, true, changed); }