/// <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); } }
public static bool TryFind <T>(uint instanceid, MapObject e, out T b) where T : class { MapObject target; Regiontree.TryFind(instanceid, e, out target); b = target as T; return(b != null); }
public static int GetCharacterCount(MapObject instance, uint regionCode) { Region region; Regiontree tree = instance.currentzone.Regiontree; if (tree.regions.TryGetValue(regionCode, out region)) { return(region.characters.Count); } return(0); }
public static bool TryFind(uint instanceid, MapObject e, out MapObject b) { Predicate <MapObject> FindActor = delegate(MapObject match) { return(match.id == instanceid); }; Regiontree tree = e.currentzone.Regiontree; b = tree.SearchActor(FindActor, e, SearchFlags.DynamicObjects | SearchFlags.StaticObjects); if (b == null) { b = tree.SearchActor(FindActor, SearchFlags.DynamicObjects); } return(b != null); }
/// <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; } } }
public void WideMovement(params WaypointStructure[] waypoints) { SMSG_WIDEMOVEMENTSTART spkt = new SMSG_WIDEMOVEMENTSTART(); spkt.SourceActorID = this.id; spkt.Speed = (ushort)this.Status.WalkingSpeed; for (int i = 0; i < waypoints.Length; i++) { spkt.AddWaypoint(waypoints[i].point, waypoints[i].rotation); } Regiontree tree = this.currentzone.Regiontree; foreach (Character character in tree.SearchActors(SearchFlags.Characters)) { if (character.client.isloaded == false) { continue; } spkt.SessionId = character.id; character.client.Send((byte[])spkt); } }
/// <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); } }