/// <summary> /// Subscribes a local visible actor /// </summary> /// <param name="regionobject">Object to subscribe</param> public void Subscribe(MapObject regionobject) { bool isalwaysVisible = false; foreach (RegionVisibility att in regionobject.GetType().GetCustomAttributes(typeof(RegionVisibility), true)) { isalwaysVisible = att.Level == VisibilityLevel.Always; } Regiontree tree = regionobject.currentzone.Regiontree; if (isalwaysVisible == false) { regionobject.id = ObtainNextUniqueId(regionobject); if (regionobject.id > 0) { //Calculate new regioncode uint newregion = GetRegionCode(regionobject); tree.Unsubscribe(regionobject, regionobject.region); tree.Subscribe(regionobject, newregion); regionobject.region = newregion; } } else { tree.AlwaysVisibleSubscribe(regionobject); } }
/// <summary> /// Updates the region of the character /// </summary> public static void UpdateRegion(MapObject regionobject) { //Calculate new regioncode uint oldregion = regionobject.region; uint newregion = GetRegionCode(regionobject); //If regioncode differs unsubsribe it if (newregion != oldregion) { lock (regionobject) { Regiontree tree = regionobject.currentzone.Regiontree; tree.Unsubscribe(regionobject, oldregion); tree.Subscribe(regionobject, newregion); regionobject.region = newregion; } } }
/// <summary> /// Unsubscribe a local visible actor /// </summary> /// <param name="regionobject">Object to unsubscribe</param> public bool Unsubscribe(MapObject regionobject) { bool isalwaysVisible = false; foreach (RegionVisibility att in regionobject.GetType().GetCustomAttributes(typeof(RegionVisibility), true)) { isalwaysVisible = att.Level == VisibilityLevel.Always; } Regiontree tree = regionobject.currentzone.Regiontree; if (isalwaysVisible == false) { uint newregion = GetRegionCode(regionobject); bool result = tree.Unsubscribe(regionobject, regionobject.region); regionobject.region = newregion; return(result); } else { tree.AlwaysVisibleUnsubscribe(regionobject); return(true); } }