Exemplo n.º 1
0
        public bool UpdateRange(Object curObj, bool forceUpdate = false)
        {
            if (!curObj.IsActive || curObj.IsDisposed)
            {
                return(false);
            }

            if (curObj.X == 0 && curObj.Y == 0)
            {
                return(false);
            }

            float distance = curObj.Get2DDistanceToWorldPoint(curObj.LastRangeCheck);

            if (distance > 100 || forceUpdate)
            {
                curObj.LastRangeCheck.X = curObj.WorldPosition.X;
                curObj.LastRangeCheck.Y = curObj.WorldPosition.Y;
            }
            else
            {
                return(false);
            }

            curObj.OnRangeUpdate();

            GetRangedObject(curObj, 1, distObj =>
            {
                if (distObj == null)
                {
                    return;
                }

                if (IsVisibleBForA(curObj, distObj) && !curObj.HasInRange(distObj))
                {
                    curObj.AddInRange(distObj);
                    distObj.AddInRange(curObj);

                    if (curObj.IsPlayer())
                    {
                        distObj.SendMeTo(curObj.GetPlayer());
                    }

                    if (distObj.IsPlayer())
                    {
                        curObj.SendMeTo(distObj.GetPlayer());
                    }
                }
            });

            Object dist;

            for (var i = 0; i < curObj.ObjectsInRange.Count; ++i)
            {
                if ((dist = curObj.ObjectsInRange[i]) == null)
                {
                    continue;
                }

                if (dist.Get2DDistanceToObject(curObj) > MaxVisibilityRange || !IsVisibleBForA(curObj, dist))
                {
                    curObj.RemoveInRange(dist);
                    dist.RemoveInRange(curObj);
                    i--;
                }
            }

            return(true);
        }