예제 #1
0
        public override async Task Action()
        {
            var callback = new AsyncFunctionCallback <IPlayer>(async(player) =>
            {
                var serverPlayer = player as ServerPlayer;

                if (serverPlayer != null && serverPlayer.IsSpawned && !serverPlayer.IsDead)
                {
                    serverPlayer.Hunger -= Math.Max((ushort)_random.Next(2, 7), (ushort)0);
                    serverPlayer.Thirst -= Math.Max((ushort)_random.Next(4, 11), (ushort)0);

                    if (serverPlayer.Hunger <= 0)
                    {
                        serverPlayer.Health -= Math.Min((ushort)10, serverPlayer.Health);
                    }

                    if (serverPlayer.Thirst <= 0)
                    {
                        serverPlayer.Health -= Math.Min((ushort)30, serverPlayer.Health);
                    }
                }

                await Task.CompletedTask;
            });

            await Alt.ForEachPlayers(callback);
        }
예제 #2
0
        public Task OnSave()
        {
            // characters
            var playersTask = Task.Run(async() =>
            {
                var charsToUpdate = new List <Character>();
                var callback      = new AsyncFunctionCallback <IPlayer>(async(player) =>
                {
                    var serverPlayer = (ServerPlayer)player;

                    if (serverPlayer.IsSpawned)
                    {
                        serverPlayer.Character.Position = serverPlayer.Position;
                        serverPlayer.Character.Rotation = serverPlayer.Rotation;

                        serverPlayer.Character.Health = serverPlayer.Health;
                        serverPlayer.Character.Armor  = serverPlayer.Armor;

                        serverPlayer.Character.Cash   = serverPlayer.Cash;
                        serverPlayer.Character.Thirst = serverPlayer.Thirst;
                        serverPlayer.Character.Hunger = serverPlayer.Hunger;
                        // serverPlayer.Character.Alcohol = serverPlayer.Alcohol;
                        // serverPlayer.Character.Drugs = serverPlayer.Drugs;

                        charsToUpdate.Add(serverPlayer.Character);
                    }

                    await Task.CompletedTask;
                });

                await Alt.ForEachPlayers(callback);

                using var dbContext = _dbContextFactory.CreateDbContext();
                dbContext.Characters.UpdateRange(charsToUpdate);
                await dbContext.SaveChangesAsync();
            });

            var vehiclesTask = Task.Run(async() =>
            {
                var vehiclesToUpdate = new List <Core.Contracts.Models.Database.Vehicle>();
                var callback         = new AsyncFunctionCallback <IVehicle>(async(vehicle) =>
                {
                    var serverVehicle = (ServerVehicle)vehicle;

                    if (serverVehicle.DbEntity != null)
                    {
                        serverVehicle.DbEntity.Position = serverVehicle.Position;
                        serverVehicle.DbEntity.Rotation = serverVehicle.Rotation;

                        serverVehicle.DbEntity.Locked = serverVehicle.LockState != AltV.Net.Enums.VehicleLockState.Unlocked;
                        // serverVehicle.DbEntity.Fuel = serverVehicle.Fuel;
                        // serverVehicle.DbEntity.Mileage = serverVehicle.Mileage;

                        vehiclesToUpdate.Add(serverVehicle.DbEntity);
                    }

                    await Task.CompletedTask;
                });

                await Alt.ForEachVehicles(callback);

                using var dbContext = _dbContextFactory.CreateDbContext();
                dbContext.Vehicles.UpdateRange(vehiclesToUpdate);
                await dbContext.SaveChangesAsync();
            });

            return(Task.WhenAll(playersTask, vehiclesTask));
        }