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++;
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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++;
        }