Example #1
0
        private void OnEntityLeave(EntityLeaveAreaEventArgs e)
        {
            var handler = EntityLeave;

            if (handler != null)
            {
                handler(this, e);
            }
        }
Example #2
0
        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);
        }