public static void InitDbPhaseShift(PhaseShift phaseShift, PhaseUseFlagsValues phaseUseFlags, uint phaseId, uint phaseGroupId) { phaseShift.ClearPhases(); phaseShift.IsDbPhaseShift = true; PhaseShiftFlags flags = PhaseShiftFlags.None; if (phaseUseFlags.HasAnyFlag(PhaseUseFlagsValues.AlwaysVisible)) { flags = flags | PhaseShiftFlags.AlwaysVisible | PhaseShiftFlags.Unphased; } if (phaseUseFlags.HasAnyFlag(PhaseUseFlagsValues.Inverse)) { flags |= PhaseShiftFlags.Inverse; } if (phaseId != 0) { phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), null); } else { var phasesInGroup = Global.DB2Mgr.GetPhasesForGroup(phaseGroupId); foreach (uint phaseInGroup in phasesInGroup) { phaseShift.AddPhase(phaseInGroup, GetPhaseFlags(phaseInGroup), null); } } if (phaseShift.Phases.Empty() || phaseShift.HasPhase(169)) { if (flags.HasFlag(PhaseShiftFlags.Inverse)) { flags |= PhaseShiftFlags.InverseUnphased; } else { flags |= PhaseShiftFlags.Unphased; } } phaseShift.Flags = flags; }
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); }