public void SendUpdate(RealmTime time) { mapWidth = Owner.Map.Width; mapHeight = Owner.Map.Height; var map = Owner.Map; var xBase = (int)X; var yBase = (int)Y; var sendEntities = new HashSet <Entity>(GetNewEntities()); var list = new List <UpdatePacket.TileData>(APPOX_AREA_OF_SIGHT); var sent = 0; foreach (var i in Sight.Cast(this, WorldInstance.Difficulty, SIGHTRADIUS)) { var x = i.X + xBase; var y = i.Y + yBase; WmapTile tile; if (x < 0 || x >= mapWidth || y < 0 || y >= mapHeight || tiles[x, y] >= (tile = map[x, y]).UpdateCount) { continue; } var world = Manager.GetWorld(Owner.Id); if (world.Dungeon) { //Todo add blocksight } list.Add(new UpdatePacket.TileData() { X = (short)x, Y = (short)y, Tile = tile.TileId }); tiles[x, y] = tile.UpdateCount; sent++; } FameCounter.TileSent(sent); var dropEntities = GetRemovedEntities().Distinct().ToArray(); clientEntities.RemoveWhere(_ => Array.IndexOf(dropEntities, _.Id) != -1); var toRemove = lastUpdate.Keys.Where(i => !clientEntities.Contains(i)).ToList(); toRemove.ForEach(i => lastUpdate.Remove(i)); foreach (var i in sendEntities) { lastUpdate[i] = i.UpdateCount; } var newStatics = GetNewStatics(xBase, yBase).ToArray(); var removeStatics = GetRemovedStatics(xBase, yBase).ToArray(); var removedIds = new List <int>(); foreach (var i in removeStatics) { removedIds.Add(Owner.Map[i.X, i.Y].ObjId); clientStatic.Remove(i); } if (sendEntities.Count <= 0 && list.Count <= 0 && dropEntities.Length <= 0 && newStatics.Length <= 0 && removedIds.Count <= 0) { return; } var packet = new UpdatePacket() { Tiles = list.ToArray(), NewObjects = sendEntities.Select(_ => _.ToDefinition()).Concat(newStatics).ToArray(), RemovedObjectIds = dropEntities.Concat(removedIds).ToArray() }; Client.SendPacket(packet); UpdatesSend++; }
private void SendUpdate(RealmTime time) { // init sight circle var sCircle = Sight.GetSightCircle(Owner.Blocking); // get list of tiles for update var tilesUpdate = new List <Update.TileData>(AppoxAreaOfSight); foreach (var point in sCircle) { var x = point.X; var y = point.Y; var tile = Owner.Map[x, y]; if (tile.TileId == 255 || tiles[x, y] >= tile.UpdateCount) { continue; } tilesUpdate.Add(new Update.TileData() { X = (short)x, Y = (short)y, Tile = (Tile)tile.TileId }); tiles[x, y] = tile.UpdateCount; } FameCounter.TileSent(tilesUpdate.Count); // get list of new static objects to add var staticsUpdate = GetNewStatics(sCircle).ToArray(); // get dropped entities list var entitiesRemove = new HashSet <int>(GetRemovedEntities(sCircle)); // removed stale entities _clientEntities.RemoveWhere(e => entitiesRemove.Contains(e.Id)); // get list of added entities var entitiesAdd = GetNewEntities(sCircle).ToArray(); // get dropped statics list var staticsRemove = new HashSet <IntPoint>(GetRemovedStatics(sCircle)); _clientStatic.ExceptWith(staticsRemove); if (tilesUpdate.Count > 0 || entitiesRemove.Count > 0 || staticsRemove.Count > 0 || entitiesAdd.Length > 0 || staticsUpdate.Length > 0) { entitiesRemove.UnionWith( staticsRemove.Select(s => Owner.Map[s.X, s.Y].ObjId)); _tiles = tilesUpdate.ToArray(); _newObjects = entitiesAdd.Select(_ => _.ToDefinition()).Concat(staticsUpdate).ToArray(); _removedObjects = entitiesRemove.ToArray(); _client.SendPacket(new Update { Tiles = _tiles, NewObjs = _newObjects, Drops = _removedObjects }); AwaitUpdateAck(time.TotalElapsedMs); } }
void SendUpdate(RealmTime time) { mapWidth = Owner.Map.Width; mapHeight = Owner.Map.Height; var map = Owner.Map; int _x = (int)X; int _y = (int)Y; var sendEntities = new HashSet <Entity>(GetNewEntities()); var list = new List <UpdatePacket.TileData>(APPOX_AREA_OF_SIGHT); int sent = 0; foreach (var i in Sight.GetSightCircle(RADIUS)) { int x = i.X + _x; int y = i.Y + _y; WmapTile tile; if (x < 0 || x >= mapWidth || y < 0 || y >= mapHeight || tiles[x, y] >= (tile = map[x, y]).UpdateCount) { continue; } list.Add(new UpdatePacket.TileData() { X = (short)x, Y = (short)y, Tile = (Tile)tile.TileId }); tiles[x, y] = tile.UpdateCount; sent++; } FameCounter.TileSent(sent); var dropEntities = GetRemovedEntities().Distinct().ToArray(); clientEntities.RemoveWhere(_ => Array.IndexOf(dropEntities, _.Id) != -1); foreach (var i in sendEntities) { lastUpdate[i] = i.UpdateCount; } var newStatics = GetNewStatics(_x, _y).ToArray(); var removeStatics = GetRemovedStatics(_x, _y).ToArray(); List <int> removedIds = new List <int>(); foreach (var i in removeStatics) { removedIds.Add(Owner.Map[i.X, i.Y].ObjId); clientStatic.Remove(i); } if (sendEntities.Count > 0 || list.Count > 0 || dropEntities.Length > 0 || newStatics.Length > 0 || removedIds.Count > 0) { UpdatePacket packet = new UpdatePacket(); packet.Tiles = list.ToArray(); packet.NewObjects = sendEntities.Select(_ => _.ToDefinition()).Concat(newStatics).ToArray(); packet.RemovedObjectIds = dropEntities.Concat(removedIds).ToArray(); client.SendPacket(packet); } SendNewTick(time); }
public void HandleUpdate(RealmTime time) { Wmap map = Owner.Map; WmapTile tile; World world = GameServer.Manager.GetWorld(Owner.Id); int xBase = (int)X; int yBase = (int)Y; int sent = 0; HashSet <Entity> sendEntities = new HashSet <Entity>(GetNewEntities()); List <UPDATE.TileData> list = new List <UPDATE.TileData>(APPOX_AREA_OF_SIGHT); mapWidth = Owner.Map.Width; mapHeight = Owner.Map.Height; blocksight = (world.Dungeon ? Sight.RayCast(this, 15) : Sight.GetSightCircle(SIGHTRADIUS)).ToList(); foreach (IntPoint i in blocksight.ToList()) { int x = i.X + xBase; int y = i.Y + yBase; if (x < 0 || x >= mapWidth || y < 0 || y >= mapHeight || tiles[x, y] >= (tile = map[x, y]).UpdateCount) { continue; } if (!visibleTiles.ContainsKey(new IntPoint(x, y))) { visibleTiles[new IntPoint(x, y)] = true; } list.Add(new UPDATE.TileData { X = (short)x, Y = (short)y, Tile = tile.TileId }); tiles[x, y] = tile.UpdateCount; sent++; } FameCounter.TileSent(sent); int[] dropEntities = GetRemovedEntities().Distinct().ToArray(); clientEntities.RemoveWhere(_ => Array.IndexOf(dropEntities, _.Id) != -1); List <Entity> toRemove = lastUpdate.Keys.Where(i => !clientEntities.Contains(i)).ToList(); toRemove.ForEach(i => lastUpdate.TryRemove(i, out int val)); foreach (var i in sendEntities) { lastUpdate[i] = i.UpdateCount; } IEnumerable <ObjectDef> newStatics = GetNewStatics(xBase, yBase); IEnumerable <IntPoint> removeStatics = GetRemovedStatics(xBase, yBase); List <int> removedIds = new List <int>(); if (!world.Dungeon) { foreach (IntPoint i in removeStatics.ToArray()) { removedIds.Add(Owner.Map[i.X, i.Y].ObjId); clientStatic.Remove(i); } } if (sendEntities.Count <= 0 && list.Count <= 0 && dropEntities.Length <= 0 && newStatics.ToArray().Length <= 0 && removedIds.Count <= 0) { return; } UPDATE packet = new UPDATE() { Tiles = list.ToArray(), NewObjects = sendEntities.Select(_ => _.ToDefinition()).Concat(newStatics.ToArray()).ToArray(), RemovedObjectIds = dropEntities.Concat(removedIds).ToArray() }; Client.SendMessage(packet); UpdatesSend++; }