Exemplo n.º 1
0
        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);
                });
            });
        }