示例#1
0
        public static async void ClaimObject <T>([FromSource] Player player, string json) where T : class, IObject
        {
            var response = RpcResponse <Guid> .Parse(json);

            var  claimerSteamId = player.Identifiers["steam"];
            User claimerUser    = Server.Db.Users.First(u => u.SteamId == claimerSteamId);

            T obj = Server.Db.Set <T>().First(c => c.Id == response.Result);

            Guid currentTrackerId = obj.TrackingUserId;

            obj.TrackingUserId = claimerUser.Id;

            Server.Db.Set <T>().AddOrUpdate(obj);
            await Server.Db.SaveChangesAsync();

            if (currentTrackerId == Guid.Empty)
            {
                return;
            }

            User   currentTrackerUser   = Server.Db.Users.First(u => u.Id == currentTrackerId);
            Player currentTrackerPlayer = Server.Instance.Players.First(p => p.Identifiers["steam"] == currentTrackerUser.SteamId);

            currentTrackerPlayer
            .Event($"igi:{typeof(T).Name}:unclaim")
            .Attach(obj)
            .Trigger();
        }
示例#2
0
        public static void AtmWithdraw([FromSource] Player player, string json)
        {
            var response = RpcResponse <Guid, Guid, double> .Parse(json);

            Server.Log($"AtmWithdraw called: {response.Result1}  {response.Result2}  {response.Result3}");

            try
            {
                BankAtm           atm    = Server.Db.BankAtms.First(a => a.Id == response.Result1);
                BankAccountMember member = Server.Db.BankAccountMembers.First(m => m.Id == response.Result2);
                double            amount = response.Result3;

                member.Account.Balance -= amount;

                Server.Db.BankAccountMembers.AddOrUpdate(member);
                Server.Db.SaveChangesAsync();

                player
                .Event(RpcEvents.BankAtmWithdraw)
                .Attach(true)
                .Trigger();
            }
            catch (Exception e)
            {
                Server.Log($"AtmWithdraw Failed: {e.Message}");

                player
                .Event(RpcEvents.BankAtmWithdraw)
                .Attach(false)
                .Trigger();
            }
        }
示例#3
0
        public static async void Load([FromSource] Player player, string json)
        {
            var response = RpcResponse <Guid> .Parse(json);

            User user = await User.GetOrCreate(player);

            if (user.Characters == null)
            {
                user.Characters = new List <Character>();
            }

            var character = user.Characters.NotDeleted().FirstOrDefault(c => c.Id == response.Result);

            if (character == null)
            {
                return;
            }

            character.LastPlayed = DateTime.UtcNow;

            Server.Db.Characters.AddOrUpdate(character);
            await Server.Db.SaveChangesAsync();

            player
            .Event(RpcEvents.CharacterLoad)
            .Attach(character)
            .Trigger();
        }
示例#4
0
        public static async void Save <T>([FromSource] Player player, string json) where T : class, IVehicle        // Has no ID
        {
            var response = RpcResponse <T> .Parse(json);

            T vehicle = response.Result;

            if (vehicle.Id == Guid.Empty)
            {
                vehicle.Id = Server.Db.Set <T>().FirstOrDefault(c => c.Handle == vehicle.Handle)?.Id ?? Guid.Empty;
            }
            if (vehicle.Id == Guid.Empty)
            {
                return;
            }

            T dbCar = Server.Db.Set <T>().First(c => c.Id == vehicle.Id);

            if (vehicle.TrackingUserId != dbCar.TrackingUserId && dbCar.TrackingUserId != Guid.Empty)
            {
                return;
            }

            Server.Db.Set <T>().AddOrUpdate(vehicle);
            await Server.Db.SaveChangesAsync();
        }
示例#5
0
        public static async void AcceptRules([FromSource] Player player, string json)
        {
            var response = RpcResponse <DateTime> .Parse(json);

            var user = await User.GetOrCreate(player);

            user.AcceptedRules = response.Result;

            Server.Db.Users.AddOrUpdate(user);
            await Server.Db.SaveChangesAsync();
        }
示例#6
0
        public static async void Save([FromSource] Player player, string json)
        {
            var response = RpcResponse <Character> .Parse(json);

            var newChar = response.Result;

            Server.Db.Styles.AddOrUpdate(newChar.Style);
            Server.Db.Characters.AddOrUpdate(newChar);

            await Server.Db.SaveChangesAsync();
        }
示例#7
0
        public static void TransferObject <T>([FromSource] Player player, string json) where T : class, IObject
        {
            var response = RpcResponse <T> .Parse(json);

            T obj = response.Result;

            obj.Id = Server.Db.Set <T>().First(c => c.Handle == obj.Handle).Id;

            player
            .Event($"igi:{typeof(T).Name}:claim")
            .Attach(obj)
            .Trigger();
        }
示例#8
0
        public static async void UnclaimObject <T>([FromSource] Player player, string json) where T : class, IObject
        {
            var response = RpcResponse <int> .Parse(json);

            T obj = Server.Db.Set <T>().First(c => c.NetId == response.Result);

            obj.TrackingUserId = Guid.Empty;
            obj.Handle         = null;
            obj.NetId          = null;

            Server.Db.Set <T>().AddOrUpdate(obj);
            await Server.Db.SaveChangesAsync();
        }
示例#9
0
        public static async void Create <T>([FromSource] Player player, string json) where T : class, IVehicle
        {
            var response = RpcResponse <T> .Parse(json);

            T vehicle = response.Result;

            Server.Db.Set <T>().Add(vehicle);
            await Server.Db.SaveChangesAsync();

            player
            .Event($"igi:{vehicle.VehicleType().Name}:create")
            .Attach(vehicle)
            .Trigger();
        }
示例#10
0
        public static async void Create([FromSource] Player player, string json)
        {
            var response = RpcResponse <Character> .Parse(json);

            User user = await User.GetOrCreate(player);

            if (user.Characters == null)
            {
                user.Characters = new List <Character>();
            }

            Character character = response.Result;

            character.Id       = GuidGenerator.GenerateTimeBasedGuid();
            character.Alive    = true;
            character.Health   = 10000;
            character.Armor    = 0;
            character.Ssn      = "123-45-6789";
            character.Position = new Vector3 {
                X = -1038.121f, Y = -2738.279f, Z = 20.16929f
            };                                                                                              // Airport terminal
            //character.Position = new Vector3 { X = 153.7846f, Y = -1032.899f, Z = 29.33798f }; // Legion Square Fleeca
            //character.Position = new Vector3 { X = 892.55f, Y = -182.25f, Z = 73.72f }; // Downtown Cab Co.
            character.LastPlayed = null;
            character.Created    = DateTime.UtcNow;
            character.Style      = new Style {
                Id = GuidGenerator.GenerateTimeBasedGuid()
            };
            //character.Inventory = new Inventory { Id = GuidGenerator.GenerateTimeBasedGuid() };

            // TODO: Convert to event handler instead of method call.
            foreach (ServerService service in Server.Instance.Services)
            {
                character = await service.OnCharacterCreate(character);
            }

            user.Characters.Add(character);

            Server.Db.Users.AddOrUpdate(user);
            await Server.Db.SaveChangesAsync();

            player
            .Event(RpcEvents.CharacterCreate)
            .Attach(character)
            .Trigger();
        }
示例#11
0
        private static void LoadNearbyVehicles([FromSource] Player citizen, string charJson)
        {
            var requestResponse = RpcResponse <Character> .Parse(charJson);

            Character character = requestResponse.Result;

            foreach (Vehicle vehicle in Server.Db.Vehicles.Where(v => v.Handle == null).ToArray())
            {
                if (!(Vector3.Distance(vehicle.Position, character.Position) < VehicleLoadDistance))
                {
                    continue;
                }

                Server.Log($"Spawning vehicle to {citizen.Name} via event: 'igi:{vehicle.VehicleType().Name}:spawn'");
                citizen.Event($"igi:{vehicle.VehicleType().Name}:spawn")
                .Attach(vehicle)
                .Trigger();
            }
        }
示例#12
0
        public static async void Save <T>([FromSource] Player player, string json) where T : Vehicle        // Has no ID
        {
            var response = RpcResponse <T> .Parse(json);

            T vehicle = response.Result;

            if (vehicle.Id == Guid.Empty)
            {
                vehicle.Id = Server.Db.Set <T>().FirstOrDefault(c => c.Handle == vehicle.Handle)?.Id ?? Guid.Empty;
            }
            if (vehicle.Id == Guid.Empty)
            {
                return;
            }

            T dbVeh = Server.Db.Set <T>()
                      .Include(v => v.Extras)
                      .Include(v => v.Wheels)
                      .Include(v => v.Doors)
                      .Include(v => v.Windows)
                      .Include(v => v.Seats)
                      .Include(v => v.Mods)
                      .FirstOrDefault(c => c.Id == vehicle.Id);


            if (dbVeh == null || vehicle.TrackingUserId != dbVeh.TrackingUserId && dbVeh.TrackingUserId != Guid.Empty)
            {
                return;
            }

            Server.Db.Entry(dbVeh).CurrentValues.SetValues(vehicle);


            // Wheels
            foreach (VehicleWheel dbVehWheel in dbVeh.Wheels.ToList())
            {
                if (vehicle.Wheels.All(m => m.Position != dbVehWheel.Position))
                {
                    Server.Db.VehicleWheels.Remove(dbVehWheel);
                }
            }

            foreach (VehicleWheel vehWheel in vehicle.Wheels)
            {
                var dbVehWheel = dbVeh.Wheels.SingleOrDefault(s => s.Position == vehWheel.Position);
                if (dbVehWheel != null)
                {
                    vehWheel.Id = dbVehWheel.Id;
                    Server.Db.Entry(dbVehWheel).CurrentValues.SetValues(vehWheel);
                    // We have to manually set enums for some reason...
                    Server.Db.Entry(dbVehWheel).Property("Position").CurrentValue = vehWheel.Position;
                }
                else
                {
                    dbVeh.Wheels.Add(vehWheel);
                }
            }

            // Doors
            foreach (VehicleDoor dbVehDoor in dbVeh.Doors.ToList())
            {
                if (vehicle.Doors.All(m => m.Index != dbVehDoor.Index))
                {
                    Server.Db.VehicleDoors.Remove(dbVehDoor);
                }
            }

            foreach (VehicleDoor vehDoor in vehicle.Doors)
            {
                var dbVehDoor = dbVeh.Doors.SingleOrDefault(s => s.Index == vehDoor.Index);
                if (dbVehDoor != null)
                {
                    vehDoor.Id = dbVehDoor.Id;
                    Server.Db.Entry(dbVehDoor).CurrentValues.SetValues(vehDoor);
                }
                else
                {
                    dbVeh.Doors.Add(vehDoor);
                }
            }

            // Extras
            foreach (VehicleExtra dbVehExtra in dbVeh.Extras.ToList())
            {
                if (vehicle.Extras.All(m => m.Index != dbVehExtra.Index))
                {
                    Server.Db.VehicleExtras.Remove(dbVehExtra);
                }
            }

            foreach (VehicleExtra vehExtra in vehicle.Extras)
            {
                var dbVehExtra = dbVeh.Extras.SingleOrDefault(s => s.Index == vehExtra.Index);
                if (dbVehExtra != null)
                {
                    vehExtra.Id = dbVehExtra.Id;
                    Server.Db.Entry(dbVehExtra).CurrentValues.SetValues(vehExtra);
                }
                else
                {
                    dbVeh.Extras.Add(vehExtra);
                }
            }

            // Windows
            foreach (VehicleWindow dbVehWindow in dbVeh.Windows.ToList())
            {
                if (vehicle.Windows.All(m => m.Index != dbVehWindow.Index))
                {
                    Server.Db.VehicleWindows.Remove(dbVehWindow);
                }
            }

            foreach (VehicleWindow vehWindow in vehicle.Windows)
            {
                var dbVehWindow = dbVeh.Windows.SingleOrDefault(s => s.Index == vehWindow.Index);
                if (dbVehWindow != null)
                {
                    vehWindow.Id = dbVehWindow.Id;
                    Server.Db.Entry(dbVehWindow).CurrentValues.SetValues(vehWindow);
                }
                else
                {
                    dbVeh.Windows.Add(vehWindow);
                }
            }

            // Seats
            foreach (VehicleSeat dbVehSeat in dbVeh.Seats.ToList())
            {
                if (vehicle.Seats.All(m => m.Index != dbVehSeat.Index))
                {
                    Server.Db.VehicleSeats.Remove(dbVehSeat);
                }
            }

            foreach (VehicleSeat vehSeat in vehicle.Seats)
            {
                var dbVehSeat = dbVeh.Seats.SingleOrDefault(s => s.Index == vehSeat.Index);
                if (dbVehSeat != null)
                {
                    vehSeat.Id = dbVehSeat.Id;
                    Server.Db.Entry(dbVehSeat).CurrentValues.SetValues(vehSeat);
                }
                else
                {
                    dbVeh.Seats.Add(vehSeat);
                }
            }

            // TODO: Mods

            await Server.Db.SaveChangesAsync();
        }