public Task <IObjectImpl> GetInRangeObject(ObjectGUID guid) { IObjectImpl ret = null; _inrangeObjects.TryGetValue(guid, out ret); return(Task.FromResult(ret)); }
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); }
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); } }
public async Task RemoveInRangeObject(ObjectGUID guid, IObjectImpl obj, bool remove_other = true) { RemoveInRangeObjectImpl(guid, obj); if (remove_other) { await obj.RemoveInRangeObject(oGUID, this, false); } }
protected void RemoveInRangeObjectImpl(ObjectGUID guid, IObjectImpl obj) { State.InRangeObjects.Remove(guid); _inrangeObjects.Remove(guid); if (obj is IPlayer) { _inrangePlayers.Remove(guid); } }
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); } }
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); }
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); }
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); }
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); } }
//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); }
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); } }
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); } }
public async Task BuildCreateUpdateForObject(IObjectImpl obj) { State.PendingUpdateData.Add(await obj.BuildCreateUpdateFor(this as IPlayer)); }
public override async Task OnAddInRangeObject(ObjectGUID guid, IObjectImpl obj) { await BuildCreateUpdateForObject(obj); }
public async Task AddObject(ObjectGUID guid, IObjectImpl obj) { State.Objects.Add(guid); _objectCache.Add(guid, obj); await obj.SetCell((UInt64) this.GetPrimaryKeyLong()); }
public async Task RemoveObject(ObjectGUID guid, IObjectImpl obj) { State.Objects.Remove(guid); _objectCache.Remove(guid); await obj.SetCell(0); }
public virtual Task OnAddInRangeObject(ObjectGUID guid, IObjectImpl obj) { return(TaskDone.Done); }