ChunkSenderGrain.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using MineCase.Server.Network;
  6. using MineCase.Server.User;
  7. using MineCase.Server.World;
  8. using MineCase.World;
  9. using Orleans;
  10. using Orleans.Concurrency;
  11. namespace MineCase.Server.Game
  12. {
  13. [Reentrant]
  14. internal class ChunkSenderGrain : Grain, IChunkSender
  15. {
  16. private Guid _jobWorkerId;
  17. public override Task OnActivateAsync()
  18. {
  19. _jobWorkerId = Guid.NewGuid();
  20. return base.OnActivateAsync();
  21. }
  22. public Task PostChunk(ChunkWorldPos chunkPos, IReadOnlyCollection<IClientboundPacketSink> clients, IReadOnlyCollection<IUserChunkLoader> loaders)
  23. {
  24. var stream = GetStreamProvider(StreamProviders.JobsProvider).GetStream<SendChunkJob>(_jobWorkerId, StreamProviders.Namespaces.ChunkSender);
  25. stream.OnNextAsync(new SendChunkJob
  26. {
  27. World = GrainFactory.GetGrain<IWorld>(this.GetPrimaryKeyString()),
  28. ChunkPosition = chunkPos,
  29. Clients = clients,
  30. Loaders = loaders
  31. }).Ignore();
  32. return Task.CompletedTask;
  33. }
  34. }
  35. }