protected virtual bool ServerCreateEventSearchArea( IWorldServerService world, Vector2Ushort eventPosition, ushort circleRadius, out Vector2Ushort circlePosition) { var biome = world.GetTile(eventPosition).ProtoTile; return(ServerSearchAreaHelper.GenerateSearchArea(eventPosition, biome, circleRadius, out circlePosition, maxAttempts: 100, waterMaxRatio: 0.1)); }
public static void ServerAddMark(IStaticWorldObject staticWorldObject, double serverSpawnTime) { Api.ValidateIsServer(); ushort searchAreaCircleRadius = 0; var searchAreaCirclePosition = Vector2Ushort.Zero; var timeToClaimRemains = SharedCalculateTimeToClaimLimitRemovalSeconds(serverSpawnTime); var biome = staticWorldObject.OccupiedTile.ProtoTile; var position = SharedGetObjectCenterPosition(staticWorldObject); if (IsResourceDepositCoordinatesHiddenUntilCapturePossible && timeToClaimRemains > 0) { var stopwatch = Stopwatch.StartNew(); searchAreaCircleRadius = DepositSearchAreaCircleRadius; try { if (!ServerSearchAreaHelper.GenerateSearchArea(position, biome, searchAreaCircleRadius, out searchAreaCirclePosition, maxAttempts: 100)) { Logger.Warning( "Unable to calculate an approximate search area for the resource deposit location, will use the center area: " + staticWorldObject); searchAreaCirclePosition = position; } } finally { Logger.Important( $"Calculating a resource deposit search area took {stopwatch.ElapsedMilliseconds}ms (for {staticWorldObject} in {biome.ShortId} biome)"); } // hide position position = Vector2Ushort.Zero; } sharedResourceMarksList.Add( new WorldMapResourceMark(staticWorldObject.Id, position, staticWorldObject.ProtoStaticWorldObject, serverSpawnTime, biome: biome, searchAreaCirclePosition: searchAreaCirclePosition, searchAreaCircleRadius: searchAreaCircleRadius)); if (!IsResourceDepositCoordinatesHiddenUntilCapturePossible) { return; } if (timeToClaimRemains <= 0) { return; } ServerTimersSystem.AddAction( timeToClaimRemains + 1, () => { if (staticWorldObject.IsDestroyed) { return; } Logger.Important("It's possible to capture the resource deposit now, adding a mark on the map: " + staticWorldObject); ServerRemoveMark(staticWorldObject); // add on the next frame (give to for the network replication system) ServerTimersSystem.AddAction( 0.1, () => { if (staticWorldObject.IsDestroyed) { return; } ServerAddMark(staticWorldObject, serverSpawnTime); }); }); }