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); }
/// <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); } }