diff --git a/Main.cs b/Main.cs index 4f19f29f..c7fbc1c2 100644 --- a/Main.cs +++ b/Main.cs @@ -34,6 +34,8 @@ namespace reallife_gamemode TuningManager.AddTuningGarage(new Vector3(-341, -134, 38.5)); + BusinessManager.LoadBusinesses(); + using (var context = new DatabaseContext()) { context.Bans.FirstOrDefault(); diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index b9758761..4255923e 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -23,6 +23,7 @@ namespace reallife_gamemode.Model public DatabaseContext() { + } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) @@ -34,6 +35,10 @@ namespace reallife_gamemode.Model protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); + + modelBuilder.Entity() + .HasIndex(b => b.BusinessId) + .IsUnique(true); } //User @@ -69,7 +74,6 @@ namespace reallife_gamemode.Model public DbSet ShopVehicles { get; set; } // Business - public DbSet Businesses { get; set; } public DbSet BusinessBankAccounts { get; set; } // Control Panel diff --git a/Server/Entities/Business.cs b/Server/Business/IBusiness.cs similarity index 56% rename from Server/Entities/Business.cs rename to Server/Business/IBusiness.cs index 3f4ab18f..f118b7ae 100644 --- a/Server/Entities/Business.cs +++ b/Server/Business/IBusiness.cs @@ -1,23 +1,21 @@ -using reallife_gamemode.Model; +using GTANetworkAPI; +using reallife_gamemode.Model; using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; -namespace reallife_gamemode.Server.Entities +namespace reallife_gamemode.Server.Business { - public class Business : IBankAccountOwner + public abstract class BusinessBase : IBankAccountOwner { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } + public abstract int Id { get; } + public abstract string Name { get; } - public string Name { get; set; } + public abstract Vector3 Position { get; } - public IBankAccount GetBankAccount (DatabaseContext databaseContext = null) + public IBankAccount GetBankAccount(DatabaseContext databaseContext = null) { if (databaseContext == null) { @@ -31,5 +29,7 @@ namespace reallife_gamemode.Server.Entities return databaseContext.BusinessBankAccounts.FirstOrDefault(u => u.BusinessId == this.Id); } } + + public abstract void Load(); } } diff --git a/Server/Business/TestBusiness.cs b/Server/Business/TestBusiness.cs new file mode 100644 index 00000000..d856214c --- /dev/null +++ b/Server/Business/TestBusiness.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using reallife_gamemode.Model; +using reallife_gamemode.Server.Util; + +namespace reallife_gamemode.Server.Business +{ + class TestBusiness : BusinessBase + { + public override int Id => 1; + + public override string Name => "Test Business"; + + public override Vector3 Position => throw new NotImplementedException(); + + public override void Load() + { + throw new NotImplementedException(); + } + } +} diff --git a/Server/Entities/BusinessBankAccount.cs b/Server/Entities/BusinessBankAccount.cs index 0139e19f..fd283008 100644 --- a/Server/Entities/BusinessBankAccount.cs +++ b/Server/Entities/BusinessBankAccount.cs @@ -1,4 +1,5 @@ -using reallife_gamemode.Server.Util; +using reallife_gamemode.Server.Business; +using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -14,8 +15,8 @@ namespace reallife_gamemode.Server.Entities public int Id { get; set; } public int Balance { get; set; } - [ForeignKey("Business")] public int BusinessId { get; set; } - public Business Business { get; set; } + [NotMapped] + public BusinessBase Business { get; set; } } } diff --git a/Server/Managers/BankManager.cs b/Server/Managers/BankManager.cs index 4d4b1d77..6b5cf39c 100644 --- a/Server/Managers/BankManager.cs +++ b/Server/Managers/BankManager.cs @@ -16,7 +16,7 @@ using reallife_gamemode.Server.Util; namespace reallife_gamemode.Server.Managers { - public class BankManager : Script + public class BankManager { public static TransactionResult TransferMoney(IBankAccountOwner sender, IBankAccountOwner receiver, int amount, string origin) { diff --git a/Server/Managers/BusinessManager.cs b/Server/Managers/BusinessManager.cs new file mode 100644 index 00000000..be3e0ef7 --- /dev/null +++ b/Server/Managers/BusinessManager.cs @@ -0,0 +1,41 @@ +using GTANetworkAPI; +using reallife_gamemode.Server.Business; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace reallife_gamemode.Server.Managers +{ + class BusinessManager : Script + { + private static List businesses; + + public static void LoadBusinesses() + { + businesses = new List(); + + IEnumerable allTypes = Assembly.GetExecutingAssembly().GetTypes().Where(type => type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(BusinessBase))); + foreach (Type item in allTypes) + { + NAPI.Util.ConsoleOutput($"Loading Business {item.Name}"); + if (Activator.CreateInstance(item) is BusinessBase o) + { + if (businesses.Find(b => b.GetType() == item) != null) + { + throw new InvalidOperationException($"Double Business found: {o.Id} | {o.Name}"); + } + businesses.Add(o); + o.Load(); + } + } + } + + public static T GetBusiness() where T : BusinessBase + { + return (T)businesses.Find(b => b.GetType() == typeof(T)); + } + + } +} diff --git a/reallife-gamemode.csproj b/reallife-gamemode.csproj index 95166b1a..8019dc4d 100644 --- a/reallife-gamemode.csproj +++ b/reallife-gamemode.csproj @@ -22,6 +22,9 @@ ..\Bootstrapper.dll + + +