Changed whole project structure (split client and server into separat projects)

This commit is contained in:
hydrant
2019-02-25 22:12:05 +01:00
parent d2181c4987
commit 33abb3d04f
185 changed files with 282 additions and 596 deletions

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using reallife_gamemode.Server.Entities;
/**
* @overview Life of German Reallife - Entities Ban (Ban.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class Ban
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public User User { get; set; }
public string Reason { get; set; }
public string BannedBy { get; set; }
public int Applied { get; set; }
public int UntilDateTime { get; set; }
}
}

View File

@@ -0,0 +1,31 @@
using reallife_gamemode.Server.Business;
using reallife_gamemode.Server.Managers;
using reallife_gamemode.Server.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace reallife_gamemode.Server.Entities
{
public class BusinessBankAccount : IBankAccount
{
[NotMapped]
private int _balance;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int Balance {
get => _balance;
set
{
_balance = value;
BusinessManager.GetBusiness(BusinessId).Update(value);
}
}
public int BusinessId { get; set; }
}
}

View File

@@ -0,0 +1,82 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
/**
* @overview Life of German Reallife - Entities Ban (Ban.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class Character
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public User User { get; set; }
public bool Gender { get; set; }
public byte Father { get; set; }
public byte Mother { get; set; }
public float Similarity { get; set; }
public float SkinSimilarity { get; set; }
public float NoseWidth { get; set; }
public float NoseBottomHeight { get; set; }
public float NoseTipLength { get; set; }
public float NoseBridgeDepth { get; set; }
public float NoseTipHeight { get; set; }
public float NoseBroken { get; set; }
public float BrowHeight { get; set; }
public float BrowDepth { get; set; }
public float CheekboneHeight { get; set; }
public float CheekboneWidth { get; set; }
public float CheekDepth { get; set; }
public float EyeSize { get; set; }
public float LipThickness { get; set; }
public float JawWidth { get; set; }
public float JawShape { get; set; }
public float ChinHeight { get; set; }
public float ChinDepth { get; set; }
public float ChinWidth { get; set; }
public float ChinIndent { get; set; }
public float NeckWidth { get; set; }
public byte Blemishes { get; set; }
public float BlemishesOpacity { get; set; }
public byte FacialHair { get; set; }
public float FacialHairOpacity { get; set; }
public byte Eyebrows { get; set; }
public float EyebrowsOpacity { get; set; }
public byte Ageing { get; set; }
public float AgeingOpacity { get; set; }
public byte Makeup { get; set; }
public float MakeupOpacity { get; set; }
public byte Blush { get; set; }
public float BlushOpacity { get; set; }
public byte Complexion { get; set; }
public float ComplexionOpacity { get; set; }
public byte SunDamage { get; set; }
public float SunDamageOpacity { get; set; }
public byte Lipstick { get; set; }
public float LipstickOpacity { get; set; }
public byte Freckles { get; set; }
public float FrecklesOpacity { get; set; }
public byte ChestHair { get; set; }
public float ChestHairOpacity { get; set; }
public byte Hair { get; set; }
public byte HairColor { get; set; }
public byte HairHighlightColor { get; set; }
public byte EyebrowColor { get; set; }
public byte BeardColor { get; set; }
public byte EyeColor { get; set; }
public byte BlushColor { get; set; }
public byte LipstickColor { get; set; }
public byte ChestHairColor { get; set; }
}
}

View File

@@ -0,0 +1,28 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
/**
* @overview Life of German Reallife - Entities CharacterCloth CharacterCloth.cs
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class CharacterCloth
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public User User { get; set; }
public bool Duty { get; set; }
public byte SlotType { get; set; }
public int SlotId { get; set; }
public int ClothId { get; set; }
}
}

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Numerics;
using System.Text;
/**
* @overview Life of German Reallife - Entities MaleCombination (MaleCombination.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class ClothCombination
{
[Key]
public int Id { get; set; }
public bool Gender { get; set; }
public int Top { get; set; }
public int Torso { get; set; }
public int Undershirt { get; set; }
}
}

View File

@@ -0,0 +1,36 @@
using GTANetworkAPI;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
/**
* @overview Life of German Reallife - Entities Door (Door.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class Door
{
[Key]
public int Id { get; set; }
public string Category { get; set; }
public string Name { get; set; }
public bool Locked { get; set; }
public int Model { get; set; }
public float X { get; set; }
public float Y { get; set; }
public float Z { get; set; }
public float Radius { get; set; }
[NotMapped]
public Vector3 Position => new Vector3(X, Y, Z);
[ForeignKey("FactionId")]
public int? FactionId { get; set; }
public Faction Faction { get; set; }
}
}

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
/**
* @overview Life of German Reallife - Entities DutyCloth DutyCloth.cs
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class DutyCloth
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Faction")]
public int FactionId { get; set; }
public Faction Faction { get; set; }
public bool Gender { get; set; }
public byte SlotType { get; set; }
public int SlotId { get; set; }
public int ClothId { get; set; }
}
}

View File

@@ -0,0 +1,39 @@
using reallife_gamemode.Server.Models;
using reallife_gamemode.Server.Util;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
/**
* @overview Life of German Reallife - Entities Faction (Faction.cs)
* @author VegaZ, hydrant
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class Faction : IBankAccountOwner
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(32)]
public string Name { get; set; }
public bool StateOwned { get; set; }
public IBankAccount GetBankAccount(DatabaseContext databaseContext = null)
{
if (databaseContext == null)
{
using (databaseContext = new DatabaseContext())
{
return databaseContext.FactionBankAccounts.FirstOrDefault(u => u.FactionId == this.Id);
}
}
else
{
return databaseContext.FactionBankAccounts.FirstOrDefault(u => u.FactionId == this.Id);
}
}
}
}

View File

@@ -0,0 +1,31 @@
using GTANetworkAPI;
using reallife_gamemode.Server.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
/**
* @overview Life of German Reallife - Entities FactionBankAccount (FactionBankAccount.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class FactionBankAccount : IBankAccount
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Faction")]
public int FactionId { get; set; }
public Faction Faction { get; set; }
[StringLength(12)]
public string Bic { get; set; }
[StringLength(32)]
public string Iban { get; set; }
public int Balance { get; set; }
public bool Active { get; set; }
}
}

View File

@@ -0,0 +1,26 @@
using reallife_gamemode.Server.Models;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace reallife_gamemode.Server.Entities
{
public class FactionRank
{
[Key]
public int Id { get; set; }
public string RankName { get; set; }
public int Order { get; set; }
public int FactionId { get; set; }
public Faction Faction { get; set; }
public Faction GetFaction()
{
using (var context = new DatabaseContext())
{
return context.Factions.FirstOrDefault(f => f.Id == FactionId);
}
}
}
}

View File

@@ -0,0 +1,33 @@
using reallife_gamemode.Server.Models;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
/**
* @overview Life of German Reallife - Entities FactionVehicles (FactionVehicle.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
[Table("FactionVehicles")]
public class FactionVehicle : ServerVehicle
{
[ForeignKey("Faction")]
public int? FactionId { get; set; }
public Faction Faction { get; set; }
public Faction GetFaction()
{
using (var context = new DatabaseContext())
{
return context.Factions.FirstOrDefault(f => f.Id == FactionId);
}
}
public override string ToString()
{
return "Fraktions Fahrzeug | Fraktion: " + GetFaction().Name;
}
}
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using reallife_gamemode.Server.Entities;
/**
* @overview Life of German Reallife - Entities GotoPoints (GotoPoints.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class GotoPoint
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(32)]
public string Description { get; set; }
public float X { get; set; }
public float Y { get; set; }
public float Z { get; set; }
public bool Active { get; set; }
}
}

View File

@@ -0,0 +1,75 @@
using GTANetworkAPI;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace reallife_gamemode.Server.Entities
{
public class Interior
{
[NotMapped]
private Vector3 _enterPosition;
[NotMapped]
private Vector3 _exitPosition;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
[Column("EnterPosition")]
public string EnterPositionStr
{
get
{
return JsonConvert.SerializeObject(this._enterPosition);
}
set
{
this._enterPosition = JsonConvert.DeserializeObject<Vector3>(value);
}
}
[Column("ExitPosition")]
public string ExitPositionStr
{
get
{
return JsonConvert.SerializeObject(this._exitPosition);
}
set
{
this._exitPosition = JsonConvert.DeserializeObject<Vector3>(value);
}
}
[NotMapped]
public Vector3 EnterPosition
{
get
{
return this._enterPosition;
}
set
{
this._enterPosition = value;
}
}
[NotMapped]
public Vector3 ExitPosition
{
get
{
return this._exitPosition;
}
set
{
this._exitPosition = value;
}
}
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace reallife_gamemode.Server.Entities
{
public class News
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("User")]
public int? UserId { get; set; }
public User User { get; set; }
public string Caption { get; set; }
public string Content { get; set; }
public bool Active { get; set; }
public int Timestamp { get; set; }
}
}

View File

@@ -0,0 +1,72 @@
using GTANetworkAPI;
using reallife_gamemode.Server.Extensions;
using reallife_gamemode.Server.Managers;
using reallife_gamemode.Server.Util;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace reallife_gamemode.Server.Entities
{
public abstract class ServerVehicle
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public VehicleHash Model { get; set; }
public float PositionX { get; set; }
public float PositionY { get; set; }
public float PositionZ { get; set; }
public float Heading { get; set; }
[StringLength(8)]
public string NumberPlate { get; set; }
public int PrimaryColor { get; set; }
public int SecondaryColor { get; set; }
public bool Locked { get; set; }
public bool Active { get; set; }
[NotMapped]
public Vector3 Position => new Vector3(PositionX, PositionY, PositionZ);
public Vehicle Spawn(Vehicle currentVeh = null)
{
if (currentVeh != null) VehicleManager.DeleteVehicle(currentVeh);
Vector3 position = this.Position;
uint model = (uint)this.Model;
float heading = this.Heading;
int c1 = this.PrimaryColor;
int c2 = this.SecondaryColor;
string np = this.NumberPlate;
Vehicle veh = NAPI.Vehicle.CreateVehicle(Model, position, heading, c1, c2, "", 255, false, false);
VehicleStreaming.SetEngineState(veh, false);
VehicleStreaming.SetLockStatus(veh, this.Locked);
VehicleManager.AddVehicle(this, veh);
string numberplate = $"{this.Id}";
if(this is FactionVehicle fV)
{
numberplate = $"F{fV.FactionId} " + numberplate;
}
if (this is UserVehicle uV)
{
numberplate = $"U{uV.UserId} " + numberplate;
}
if(this is ShopVehicle sV)
{
numberplate = "Shop";
VehicleStreaming.SetLockStatus(veh, false);
TextLabel label = NAPI.TextLabel.CreateTextLabel(NAPI.Vehicle.GetVehicleDisplayName((VehicleHash)veh.Model) + "\n" + "~g~" + sV.Price.ToMoneyString(),
veh.Position.Add(new Vector3(0, 0, 1.3)), 10.0f, 1f, 1, new Color(255, 255, 255));
}
veh.NumberPlate = numberplate;
return veh;
}
public abstract override string ToString();
}
}

View File

@@ -0,0 +1,31 @@
using GTANetworkAPI;
using reallife_gamemode.Server.Business;
using reallife_gamemode.Server.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
/**
* @overview Life of German Reallife - Entities ShopVehicles (ShopVehicles.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
[Table("ShopVehicles")]
public class ShopVehicle : ServerVehicle
{
[ForeignKey("Shop")]
public int? ShopId { get; set; }
public int BusinessId { get; set; }
public int Price { get; set; }
public override string ToString()
{
return "ShopVehicle";
}
}
}

View File

@@ -0,0 +1,163 @@
using GTANetworkAPI;
using reallife_gamemode.Server.Models;
using reallife_gamemode.Server.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
/**
* @overview Life of German Reallife - Entities User (User.cs)
* @author VegaZ, hydrant
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class User : IBankAccountOwner
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(32)]
public string Name { get; set; }
[StringLength(32)]
public string SocialClubName { get; set; }
[StringLength(64)]
public string Password { get; set; }
public int LogUserId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime RegistrationDate { get; set; }
[EmailAddress]
[StringLength(64)]
public string Email { get; set; }
public AdminLevel AdminLevel { get; set; }
public bool Dead { get; set; }
public float PositionX { get; set; }
public float PositionY { get; set; }
public float PositionZ { get; set; }
[ForeignKey("Character")]
public int? CharacterId { get; set; }
public Character Character { get; set; }
[ForeignKey("Ban")]
public int? BanId { get; set; }
public Ban Ban { get; set; }
public int? FactionId { get; set; }
public Faction Faction { get; set; }
public bool FactionLeader { get; set; }
public int? FactionRankId { get; set; }
public FactionRank FactionRank { get;set; }
public int? BusinessId { get; set; }
public Faction GetFaction()
{
using(var context = new DatabaseContext())
{
return context.Factions.FirstOrDefault(f => f.Id == FactionId);
}
}
public FactionRank GetFactionRank()
{
using (var context = new DatabaseContext())
{
FactionRank toReturn = context.FactionRanks.FirstOrDefault(fR => fR.Id == FactionRankId);
if(toReturn == null)
{
toReturn = context.FactionRanks.OrderBy(f => f.Order).FirstOrDefault(f => f.FactionId == FactionId);
}
if(toReturn == null)
{
toReturn = new FactionRank
{
RankName = "Rang-Fehler"
};
}
return toReturn;
}
}
public void BanPlayer(Client admin, string reason, int mins)
{
using (var banUserContext = new DatabaseContext())
{
int unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
Ban banUser;
if (mins == 0)
{
NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + this.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]");
banUser = new Ban { UserId = this.Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp };
GetClient()?.Kick();
mins--;
}
else
{
NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + this.Name + " wurde von " + admin.Name + " für " + mins + " Minuten gebannt. [" + reason + "]");
banUser = new Ban { UserId = this.Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp + mins * 60 };
GetClient()?.Kick();
}
banUserContext.Bans.Add(banUser);
banUserContext.SaveChanges();
var targetUser = banUserContext.Users.FirstOrDefault(u => u.Name == this.Name);
targetUser.BanId = banUser.Id;
banUserContext.SaveChanges();
}
}
public void UnbanPlayer()
{
using (var unbanUser = new DatabaseContext())
{
var targetUser = unbanUser.Users.FirstOrDefault(u => u.Id == this.Id);
targetUser.BanId = null;
unbanUser.SaveChanges();
}
}
public List<UserItem> GetItems()
{
using(var dbContext = new DatabaseContext())
{
return dbContext.UserItems.ToList().FindAll(u => u.UserId == this.Id);
}
}
public bool IsAdmin(AdminLevel level) => AdminLevel >= level;
public IBankAccount GetBankAccount(DatabaseContext databaseContext = null)
{
if (databaseContext == null)
{
using (databaseContext = new DatabaseContext())
{
return databaseContext.UserBankAccounts.FirstOrDefault(u => u.UserId == this.Id);
}
}
else
{
return databaseContext.UserBankAccounts.FirstOrDefault(u => u.UserId == this.Id);
}
}
public Client GetClient()
{
return NAPI.Player.GetPlayerFromName(Name);
}
}
}

View File

@@ -0,0 +1,44 @@
using reallife_gamemode.Server.Models;
using reallife_gamemode.Server.Services;
using reallife_gamemode.Server.Util;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
/**
* @overview Life of German Reallife - Entities UserBankAccount (UserBankAccount.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class UserBankAccount : IBankAccount
{
[NotMapped]
private int _balance;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public User User { get; set; }
[StringLength(12)]
public string Bic { get; set; }
[StringLength(32)]
public string Iban { get; set; }
public int Balance {
get => _balance;
set
{
_balance = value;
using(var dbContext = new DatabaseContext())
{
ClientService.GetClientByNameOrId(dbContext.Users.First(u => u.Id == UserId).Name).TriggerEvent("updateMoney", value);
}
}
}
public bool Active { get; set; }
}
}

View File

@@ -0,0 +1,37 @@
using reallife_gamemode.Server.Models;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
/**
* @overview Life of German Reallife - Entities UserItem (UserItem.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
public class UserItem
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int ItemId { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public User User { get; set; }
public int Amount { get; set; }
public int Slot { get; set; }
public User GetUser()
{
using (var dbContext = new DatabaseContext())
{
return dbContext.Users.FirstOrDefault(u => u.Id == UserId);
}
}
}
}

View File

@@ -0,0 +1,40 @@
using reallife_gamemode.Server.Models;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
/**
* @overview Life of German Reallife - Entities UserVehicle (UserVehicle.cs)
* @author VegaZ
* @copyright (c) 2008 - 2018 Life of German
*/
namespace reallife_gamemode.Server.Entities
{
[Table("UserVehicles")]
public class UserVehicle : ServerVehicle
{
[ForeignKey("User")]
public int UserId { get; set; }
public User User { get; set; }
public override string ToString()
{
return "Spieler Fahrzeug | Besitzer: " + GetOwner().Name;
}
public User GetOwner(DatabaseContext dbContext = null)
{
if (dbContext == null)
{
using (dbContext = new DatabaseContext())
{
return dbContext.Users.FirstOrDefault(u => u.Id == UserId);
}
}
else
{
return dbContext.Users.FirstOrDefault(u => u.Id == UserId);
}
}
}
}

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace reallife_gamemode.Server.Entities
{
public class VehicleMod
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Vehicle")]
public int ServerVehicleId { get; set; }
public ServerVehicle Vehicle { get; set; }
public int Slot { get; set; }
public int ModId { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace reallife_gamemode.Server.Entities
{
public class Whitelist
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string SocialClubName { get; set; }
}
}