Example #1
0
        public Task <IObjectImpl> GetInRangeObject(ObjectGUID guid)
        {
            IObjectImpl ret = null;

            _inrangeObjects.TryGetValue(guid, out ret);
            return(Task.FromResult(ret));
        }
Example #2
0
        public async Task UpdateInRangeObject(IObjectImpl obj, List <ObjectGUID> ignoreGuids)
        {
            List <Task> tasks = new List <Task>();
            var         posx  = await obj.GetPositionX();

            var posy = await obj.GetPositionY();

            var cellx = GetCellX(posx);
            var celly = GetCellY(posy);

            var player = await obj.IsPlayer();

            if (player)
            {
                ServerLog.Debug("Map", "Updating inrange for player");
            }

            for (var x = cellx - 1; x <= cellx + 1; ++x)
            {
                for (var y = celly - 1; y <= celly + 1; ++y)
                {
                    var cell = await GetCellDirect(x, y);

                    if (cell != null)
                    {
                        tasks.Add(cell.UpdateInRange(obj, ignoreGuids));
                    }
                }
            }

            await Task.WhenAll(tasks);
        }
Example #3
0
        public async Task RemoveObject(IObjectImpl obj)
        {
            var guid = await obj.GetGUID();

            State.ObjectList.Remove(guid);

            var isactivator = await obj.IsCellActivator();

            var posx = await obj.GetPositionX();

            var posy = await obj.GetPositionY();

            if (isactivator)
            {
                State.ActiveObjects.Remove(guid);
                await DecRefCells(posx, posy);
            }

            var cellkey = await obj.GetCell();

            if (cellkey != 0)
            {
                var cell = await GetCell(cellkey);

                await cell.RemoveObject(guid, obj);
            }
        }
Example #4
0
 public async Task RemoveInRangeObject(ObjectGUID guid, IObjectImpl obj, bool remove_other = true)
 {
     RemoveInRangeObjectImpl(guid, obj);
     if (remove_other)
     {
         await obj.RemoveInRangeObject(oGUID, this, false);
     }
 }
Example #5
0
 protected void RemoveInRangeObjectImpl(ObjectGUID guid, IObjectImpl obj)
 {
     State.InRangeObjects.Remove(guid);
     _inrangeObjects.Remove(guid);
     if (obj is IPlayer)
     {
         _inrangePlayers.Remove(guid);
     }
 }
Example #6
0
        public async Task OnObjectMove(IObjectImpl obj, float oldx, float oldy, float newx, float newy)
        {
            //this activates and deactivates cells
            var is_activator = await obj.IsCellActivator();

            if (is_activator)
            {
                await OnActivatorMove(obj, oldx, oldy, newx, newy);
            }
        }
Example #7
0
        public async Task <MapAddResult> AddObject(IObjectImpl obj)
        {
            List <Task> tasks = new List <Task>();
            var         guid  = await obj.GetGUID();

            if ((await obj.IsOnMap()))
            {
                var currentmap = await obj.GetMap();

                if (currentmap != this)
                {
                    //could be doing a map quick-change
                    await currentmap.RemoveObject(guid, obj);
                }
            }


            if (State.ObjectList.Contains(guid))
            {
                return(MapAddResult.AlreadyOnMap);
            }

            var isactivator = await obj.IsCellActivator();

            var posx = await obj.GetPositionX();

            var posy = await obj.GetPositionY();

            var cellkey = GetCellKey(posx, posy);
            var cell    = await GetCell(cellkey, true);

            ServerLog.Debug("Map", "Adding {0} to map {1} instance {2} at {3}, {4}", guid.ToUInt64(), State.MapID,
                            State.InstanceID, posx, posy);

            if (cell == null)
            {
                return(MapAddResult.InvalidPosition);
            }

            tasks.Add(obj.SetMap(this));
            State.ObjectList.Add(guid);
            _objectCache.Add(guid, obj);

            tasks.Add(cell.AddObject(guid, obj));

            if (isactivator)
            {
                State.ActiveObjects.Add(guid);
                tasks.Add(AddRefCells(posx, posy));
            }

            await Task.WhenAll(tasks);

            return(MapAddResult.OK);
        }
Example #8
0
        public virtual async Task <bool> CanSee(IObjectImpl other)
        {
            var otherposx = await other.GetPositionX();

            var otherposy = await other.GetPositionY();

            float dist = _GetDistance2DSq(otherposx, otherposy);

            if (dist > (100 * 100)) //todo: implement, 100 yds for now
            {
                return(false);
            }

            return(true);
        }
Example #9
0
        public async Task UpdateInRange(IObjectImpl obj, List<ObjectGUID> ignoreGuids)
        {
            List<Task> tasks = new List<Task>();

            foreach (var o in _objectCache)
            {
                if (ignoreGuids.Contains(o.Key))
                    continue;
                var cansee = await obj.CanSee(o.Value);

                if (cansee)
                    tasks.Add(obj.AddInRangeObject(o.Key, o.Value));
            }

            await Task.WhenAll(tasks);
        }
Example #10
0
        public async Task RemoveObject(ObjectGUID guid, IObjectImpl obj)
        {
            State.ObjectList.Remove(guid);
            State.ActiveObjects.Remove(guid);
            State.UpdatedObjects.Remove(guid);
            _objectCache.Remove(guid);

            bool activator = await obj.IsCellActivator();

            if (activator)
            {
                var posx = await obj.GetPositionX();

                var posy = await obj.GetPositionY();

                await DecRefCells(posx, posy);
            }
        }
Example #11
0
        //Returns a key of the cell ((x << 32) | y) and updates cell references
        public async Task <UInt64> OnActivatorMove(IObjectImpl obj, float oldx, float oldy, float newx, float newy)
        {
            var old_cell = GetCell(oldx, oldy);
            var new_cell = GetCell(newx, newy);

            if (old_cell != new_cell)
            {
                await AddRefCells(newx, newy);
                await DecRefCells(oldx, oldy);
            }

            if (new_cell != null)
            {
                return(GetCellKey(newx, newy));
            }

            return(0);
        }
Example #12
0
        public async Task AddInRangeObject(ObjectGUID guid, IObjectImpl obj, bool add_other = true)
        {
            if (guid == oGUID) //Cannot be inrange of self
            {
                return;
            }
            if (_inrangeObjects.ContainsKey(guid))
            {
                return; //already inrange
            }
            AddInRangeObjectImpl(guid, obj);

            await OnAddInRangeObject(guid, obj);

            if (add_other)
            {
                await obj.AddInRangeObject(oGUID, this, false);
            }
        }
Example #13
0
        protected void AddInRangeObjectImpl(ObjectGUID guid, IObjectImpl obj)
        {
            if (guid == oGUID) //Cannot be inrange of self
            {
                return;
            }
            if (!State.InRangeObjects.Contains(guid))
            {
                State.InRangeObjects.Add(guid);
            }
            if (!_inrangeObjects.ContainsKey(guid))
            {
                _inrangeObjects.Add(guid, obj);
                if (obj is IPlayer)
                {
                    _inrangePlayers.Add(guid, obj);
                }
            }

            if (_inrangeObjectTracker != null)
            {
                _inrangeObjectTracker.Add(guid, obj);
            }
        }
Example #14
0
 public async Task BuildCreateUpdateForObject(IObjectImpl obj)
 {
     State.PendingUpdateData.Add(await obj.BuildCreateUpdateFor(this as IPlayer));
 }
Example #15
0
 public override async Task OnAddInRangeObject(ObjectGUID guid, IObjectImpl obj)
 {
     await BuildCreateUpdateForObject(obj);
 }
Example #16
0
 public async Task AddObject(ObjectGUID guid, IObjectImpl obj)
 {
     State.Objects.Add(guid);
     _objectCache.Add(guid, obj);
     await obj.SetCell((UInt64) this.GetPrimaryKeyLong());
 }
Example #17
0
 public async Task RemoveObject(ObjectGUID guid, IObjectImpl obj)
 {
     State.Objects.Remove(guid);
     _objectCache.Remove(guid);
     await obj.SetCell(0);
 }
Example #18
0
 public virtual Task OnAddInRangeObject(ObjectGUID guid, IObjectImpl obj)
 {
     return(TaskDone.Done);
 }