LocalityLoaderSystem.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Content.Server.Worldgen.Components;
  2. using Robust.Server.GameObjects;
  3. namespace Content.Server.Worldgen.Systems;
  4. /// <summary>
  5. /// This handles loading in objects based on distance from player, using some metadata on chunks.
  6. /// </summary>
  7. public sealed class LocalityLoaderSystem : BaseWorldSystem
  8. {
  9. [Dependency] private readonly TransformSystem _xformSys = default!;
  10. /// <inheritdoc />
  11. public override void Update(float frameTime)
  12. {
  13. var e = EntityQueryEnumerator<LocalityLoaderComponent, TransformComponent>();
  14. var loadedQuery = GetEntityQuery<LoadedChunkComponent>();
  15. var xformQuery = GetEntityQuery<TransformComponent>();
  16. var controllerQuery = GetEntityQuery<WorldControllerComponent>();
  17. while (e.MoveNext(out var uid, out var loadable, out var xform))
  18. {
  19. if (!controllerQuery.TryGetComponent(xform.MapUid, out var controller))
  20. {
  21. RaiseLocalEvent(uid, new LocalStructureLoadedEvent());
  22. RemCompDeferred<LocalityLoaderComponent>(uid);
  23. continue;
  24. }
  25. var coords = GetChunkCoords(uid, xform);
  26. var done = false;
  27. for (var i = -1; i < 2 && !done; i++)
  28. {
  29. for (var j = -1; j < 2 && !done; j++)
  30. {
  31. var chunk = GetOrCreateChunk(coords + (i, j), xform.MapUid!.Value, controller);
  32. if (!loadedQuery.TryGetComponent(chunk, out var loaded) || loaded.Loaders is null)
  33. continue;
  34. foreach (var loader in loaded.Loaders)
  35. {
  36. if (!xformQuery.TryGetComponent(loader, out var loaderXform))
  37. continue;
  38. if ((_xformSys.GetWorldPosition(loaderXform) - _xformSys.GetWorldPosition(xform)).Length() > loadable.LoadingDistance)
  39. continue;
  40. RaiseLocalEvent(uid, new LocalStructureLoadedEvent());
  41. RemCompDeferred<LocalityLoaderComponent>(uid);
  42. done = true;
  43. break;
  44. }
  45. }
  46. }
  47. }
  48. }
  49. }
  50. /// <summary>
  51. /// A directed fired on a loadable entity when a local loader enters it's vicinity.
  52. /// </summary>
  53. public record struct LocalStructureLoadedEvent;