Exemple #1
0
        public async Task PreUpdateAsync(Player player, Dictionary <RegionCoordinates, HashSet <RegionUpdateMessage> > encodes,
                                         Dictionary <RegionCoordinates, HashSet <RegionUpdateMessage> > updates)
        {
            Position old = player.Position;

            _walkingQueueHandler.Pulse(player);
            var local = true;

            if (player.IsTeleporting)
            {
                player.ResetViewingDistance();
                local = false;
            }

            Position position = player.Position;

            if (!player.HasLastKnownRegion() || IsRegionUpdateRequired(player))
            {
                player.RegionChanged = true;
                local = false;
                player.LastKnownRegion = position;
                await _protoMessageSender.SendAsync(player, new RegionChangeMessage { CentralRegionX = position.CentralRegionX, CentralRegionY = position.CentralRegionY });
            }

            var oldViewable = _regionRepository.FromPosition(old).GetSurrounding();
            var newViewable = _regionRepository.FromPosition(position).GetSurrounding();

            var differences = newViewable.ToHashSet();

            differences.RemoveWhere(t => !oldViewable.Contains(t));

            var full = newViewable.ToHashSet();

            if (local)
            {
                full.RemoveWhere(t => oldViewable.Contains(t));
            }

            await SendUpdates(player, player.LastKnownRegion, differences, full, encodes, updates);
        }
Exemple #2
0
        /// <summary>
        /// Adds the <c>next</c> step to this WalkingQueue.
        /// </summary>
        /// <param name="mob">The mob.</param>
        /// <param name="current">The current <see cref="Position"/>.</param>
        /// <param name="next">The next Position.</param>
        private void AddStep(Mob mob, Position current, Position next)
        {
            int nextX = next.X, nextY = next.Y, height = next.Height;
            int deltaX = nextX - current.X;
            int deltaY = nextY - current.Y;

            int     max    = Math.Max(Math.Abs(deltaX), Math.Abs(deltaY));
            IRegion region = _regionRepository.FromPosition(current);

            for (int count = 0; count < max; count++)
            {
                if (deltaX < 0)
                {
                    deltaX++;
                }
                else if (deltaX > 0)
                {
                    deltaX--;
                }

                if (deltaY < 0)
                {
                    deltaY++;
                }
                else if (deltaY > 0)
                {
                    deltaY--;
                }

                Position step = new Position(nextX - deltaX, nextY - deltaY, height);
                if (!region.Contains(step))
                {
                    region = _regionRepository.FromPosition(step);
                }

                mob.WalkingQueue.Points.AddToBack(step);
            }
        }