private void OnEntityLeave(EntityLeaveAreaEventArgs e) { var handler = EntityLeave; if (handler != null) { handler(this, e); } }
private void AreaEntityLeave(object sender, EntityLeaveAreaEventArgs e) { #if DEBUG // temp counter Interlocked.Increment(ref EntityAreaChangesCount); #endif // we need to tell entity which areas are far away and not need to listen anymore double tooFarAway = MapArea.AreaSize.X * MapArea.AreaSize.X + MapArea.AreaSize.Y * MapArea.AreaSize.Y; var currentArea = GetArea(new Vector3D(e.Entity.DynamicEntity.Position.X, 0, e.Entity.DynamicEntity.Position.Z)); var previousArea = GetArea(new Vector3D(e.PreviousPosition.X, 0, e.PreviousPosition.Z)); for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { var prev = GetArea(new Vector3D(e.PreviousPosition.X + x * MapArea.AreaSize.X, 0, e.PreviousPosition.Z + z * MapArea.AreaSize.Y)); if (Vector2I.DistanceSquared(currentArea.Position, prev.Position) > tooFarAway) { // area is too far away, stop listening it e.Entity.RemoveArea(prev); // tell them that entity goes away prev.OnEntityOutOfViewRange(e.Entity); } var now = GetArea(new Vector3D(e.Entity.DynamicEntity.Position.X + x * MapArea.AreaSize.X, 0, e.Entity.DynamicEntity.Position.Z + z * MapArea.AreaSize.Y)); if (Vector2I.DistanceSquared(previousArea.Position, now.Position) > tooFarAway) { // area is too far away from previous center, listen it e.Entity.AddArea(now); // tell them that they should listen new entity now.OnEntityInViewRange(e.Entity); } } } e.Entity.CurrentArea = currentArea; currentArea.AddEntity(e.Entity); }