diff --git a/Import/bridge.dll b/Import/bridge.dll
new file mode 100644
index 00000000..97d2887c
Binary files /dev/null and b/Import/bridge.dll differ
diff --git a/ReallifeGamemode.Client/ReallifeGamemode.Client.csproj b/ReallifeGamemode.Client/ReallifeGamemode.Client.csproj
index d98e9154..c5577593 100644
--- a/ReallifeGamemode.Client/ReallifeGamemode.Client.csproj
+++ b/ReallifeGamemode.Client/ReallifeGamemode.Client.csproj
@@ -29,6 +29,7 @@
+
diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts
index a88cf8da..7e1d26f4 100644
--- a/ReallifeGamemode.Client/index.ts
+++ b/ReallifeGamemode.Client/index.ts
@@ -180,3 +180,6 @@ planeSchoolHandle(globalData);
import PilotRouteList from './Jobs/PilotRouteSelect';
PilotRouteList(globalData);
+
+import gangwarHandle from './util/Gangwar';
+gangwarHandle(globalData);
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/util/Gangwar.ts b/ReallifeGamemode.Client/util/Gangwar.ts
new file mode 100644
index 00000000..a917301c
--- /dev/null
+++ b/ReallifeGamemode.Client/util/Gangwar.ts
@@ -0,0 +1,324 @@
+export default function gangwarHandle(globalData: GlobalData) {
+
+ function inside(point, vs) {
+ let x = point[0],
+ y = point[1];
+ let inside = false;
+ for (let i = 0, j = vs.length - 1; i < vs.length; j = i++) {
+ let xi = vs[i][0],
+ yi = vs[i][1];
+ let xj = vs[j][0],
+ yj = vs[j][1];
+ let intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
+ if (intersect) inside = !inside;
+ }
+ return inside;
+ };
+
+ const Natives = {
+ SET_BLIP_CATEGORY: "0x234CDD44D996FD9A",
+ SHOW_HEADING_INDICATOR_ON_BLIP: "0x5FBCA48327B914DF",
+ SET_BLIP_AS_SHORT_RANGE: "0xBE8BE4FE60E27B72",
+ SET_BLIP_DISPLAY: "0x9029B2F3DA924928",
+ SET_BLIP_SPRITE: "0xDF735600A4696DAF",
+ SET_BLIP_ALPHA: "0x45FF974EEE1C8734",
+ ADD_BLIP_FOR_RADIUS: "0x46818D79B1F7499A",
+ SET_BLIP_COLOUR: "0x03D7FB09E75D6B7E",
+ SET_BLIP_ROTATION: "0xF87683CDF73C3F6E",
+ SET_BLIP_FLASHES: "0xB14552383D39CE3E",
+ GET_FIRST_BLIP_INFO_ID: "0x1BEDE233E6CD2A1F",
+ GET_NEXT_BLIP_INFO_ID: "0x14F96AA50D6FBEA7",
+ DOES_BLIP_EXIST: "0xA6DB27D19ECBB7DA"
+ };
+
+ var Gangturf = class {
+
+ name: string;
+ id: number;
+ range: number;
+ x: number;
+ y: number;
+ color: number;
+ colorZone_r: number;
+ colorZone_g: number;
+ colorZone_b: number;
+ rotation: number;
+ owner: string;
+ blip: BlipMp;
+ _colshape: ColshapeMp;
+ vector: Vector3Mp;
+ _status: string;
+ _entered: boolean;
+ _isEntering: boolean;
+ _inColshape: boolean;
+ _timerCheck;
+ edit: boolean;
+
+ constructor(name, id, x, y, range, color, rot, owner, edit) {
+ this._setup(name, id, x, y, range, color, rot, owner, edit);
+ }
+
+ _setup(name, id, x, y, range, color, rot, owner, edit) {
+ var self = this;
+ self.name = name;
+ self.id = id;
+ self.range = range;
+ if (owner = "Ballas") {
+ self.colorZone_r = 143;
+ self.colorZone_g = 0;
+ self.colorZone_b = 199;
+ } else if (owner = "GroveStreet") {
+ self.colorZone_r = 22;
+ self.colorZone_g = 87;
+ self.colorZone_b = 0;
+ } else if (owner = "Neutral") {
+ self.colorZone_r = 255;
+ self.colorZone_g = 255;
+ self.colorZone_b = 255;
+ }
+ self.color = color;
+ self.x = x;
+ self.y = y;
+
+ self.rotation = rot;
+ self._colshape = null;
+ self._status = "normal";
+ self._entered = false;
+ self._isEntering = false;
+ self._inColshape = false;
+ self._timerCheck;
+ self.owner = owner;
+ self.edit = edit;
+ self.loadArea();
+ }
+
+
+
+
+ loadArea() {
+ var self = this;
+ self.blip = mp.game.ui.addBlipForRadius(self.x, self.y, 1, self.range);
+ mp.game.invoke(Natives.SET_BLIP_SPRITE, self.blip, 5);
+ mp.game.invoke(Natives.SET_BLIP_ALPHA, self.blip, 70);
+ mp.game.invoke(Natives.SET_BLIP_COLOUR, self.blip, self.color);
+ self._colshape = mp.colshapes.newCircle(self.x, self.y, self.range * 1.5);
+ }
+ render() {
+
+ var self = this;
+ if (self.blip) {
+ mp.game.invoke(Natives.SET_BLIP_ROTATION, self.blip, self.rotation);
+ }
+ if (self._status == "attack") {
+ if (self.blip) {
+ if (mp.game.gameplay.getDistanceBetweenCoords(mp.players.local.position.x, mp.players.local.position.y, 0, self.x, self.y, 0, true) < self.range * 1.5) {
+ var range = Math.sqrt(((self.range * 1.2) * (self.range * 1.2)) + (((self.range * 1.2) / 2) * ((self.range * 1.2) / 2)));
+ let degrees = (self.rotation + 45) * (Math.PI / 180);
+ let top_right = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ degrees = (self.rotation + 135) * (Math.PI / 180);
+ let top_left = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ degrees = (self.rotation + 225) * (Math.PI / 180);
+ let bottom_left = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ degrees = (self.rotation + 315) * (Math.PI / 180);
+ let bottom_right = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ let z = mp.game.gameplay.getGroundZFor3dCoord(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, 0, false);
+ //mp.game.graphics.drawLine(bottom_right.x, bottom_right.y, z, bottom_right.x, bottom_right.y, z + 25, 0, 255, 0, 255);
+ //mp.game.graphics.drawLine(top_left.x, top_left.y, z, top_left.x, top_left.y, z + 25, 0, 0, 255, 255);
+ let a = 0;
+ for (var i = z; i < z + 1; i += 0.001) {
+ mp.game.graphics.drawLine(top_left.x, top_left.y, i, top_right.x, top_right.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
+ mp.game.graphics.drawLine(top_right.x, top_right.y, i, bottom_right.x, bottom_right.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
+ mp.game.graphics.drawLine(bottom_right.x, bottom_right.y, i, bottom_left.x, bottom_left.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
+ mp.game.graphics.drawLine(bottom_left.x, bottom_left.y, i, top_left.x, top_left.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
+ a += 0.001
+ }
+ }
+ if (self.isInsideArea()) {
+ mp.game.graphics.drawText(self.name, [self.x, self.y, mp.players.local.position.z + 20], {
+ font: 7,
+ color: [255, 255, 255, 185],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: true
+ });
+ }
+ }
+ }
+ }
+
+ updateArea(status, ...args) {
+ var self = this;
+ if (status == "attack") {
+ self._status = "attack";
+ mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, true);
+ return;
+ }
+ if (status == "normal") {
+ self._status = "normal";
+ mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false);
+ return;
+ }
+ if (status == "conquered") {
+ self._status = "normal";
+ self.owner = args[1];
+ mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false);
+ self.blip.setColour(args[0]);
+ return;
+ }
+ }
+
+ isTurfArea(shape) {
+ return (shape == this._colshape)
+ }
+
+ isOwner(gang) {
+ return (gang == this.owner)
+ }
+
+ check() {
+ var self = this
+ if (self._entered == true) {
+ if (!self.isInsideArea() || (self.isNearGround() == false)) {
+ self._entered = false;
+ // mp.events.callRemote("Gangarea:Leave", self.id);
+ }
+ }
+ }
+
+ enter() {
+ var self = this;
+ self._timerCheck = setInterval(function () {
+ if ((!self._entered)) {
+ if (self.isInsideArea() && (self.isNearGround() == true)) {
+ self._entered = true;
+ // mp.events.callRemote("Gangarea:Enter", self.id);
+ }
+ } else if (self._entered == true) {
+ if (!self.isInsideArea() || (self.isNearGround() == false)) {
+ self._entered = false;
+ //mp.events.callRemote("Gangarea:Leave", self.id);
+ }
+ }
+ }, 1000);
+ }
+
+ leave() {
+ var self = this;
+ clearInterval(self._timerCheck);
+ self.check();
+ }
+ isNearGround() {
+ let self = this;
+ let ground = mp.game.gameplay.getGroundZFor3dCoord(self.x, self.y, 9000, 0, false);
+ let max_diff = 75;
+ let dist = mp.game.system.vdist(0, 0, ground, 0, 0, mp.players.local.position.z);
+ if (dist <= max_diff) {
+ return true;
+ }
+ return false;
+ }
+ isInsideArea() {
+ var self = this;
+ let player = {
+ x: mp.players.local.position.x,
+ y: mp.players.local.position.y,
+ z: mp.players.local.position.z
+ };
+ var range = Math.sqrt(((self.range * 1.2) * (self.range * 1.2)) + (((self.range * 1.2) / 2) * ((self.range * 1.2) / 2)));
+ let degrees = (self.rotation + 45) * (Math.PI / 180);
+ let top_right = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ degrees = (self.rotation + 135) * (Math.PI / 180);
+ let top_left = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ degrees = (self.rotation + 225) * (Math.PI / 180);
+ let bottom_left = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ degrees = (self.rotation + 315) * (Math.PI / 180);
+ let bottom_right = {
+ x: self.x + range * Math.cos(degrees),
+ y: self.y + range * Math.sin(degrees)
+ }
+ let turf = [
+ [top_right.x, top_right.y],
+ [top_left.x, top_left.y],
+ [bottom_left.x, bottom_left.y],
+ [bottom_right.x, bottom_right.y]
+ ]
+ if (inside([player.x, player.y], turf)) {
+ return true;
+ }
+ return false;
+ }
+
+ }
+
+ var gangturfs = [];
+
+ mp.events.add('playerEnterColshape', (shape) => {
+ let turfEntered;
+ gangturfs.forEach(function (turf) {
+ if (turf.isTurfArea(shape) == true) {
+ turfEntered = turf;
+ turfEntered.enter()
+ }
+ });
+ });
+ mp.events.add('playerExitColshape', (shape) => {
+ let turfExitted;
+ gangturfs.forEach(function (turf) {
+ if (turf.isTurfArea(shape) == true) {
+ turfExitted = turf;
+ turfExitted.leave()
+ }
+ });
+ });
+ mp.events.add('render', () => {
+ gangturfs.forEach(function (turf, id) {
+ turf.render();
+ });
+ });
+
+ function clearBlips() {
+ mp.game.gameplay.setThisScriptCanRemoveBlipsCreatedByAnyScript(true);
+ var x = 0;
+ let last_blip = mp.game.invoke(Natives.GET_FIRST_BLIP_INFO_ID, 5);
+
+ while (mp.game.invoke(Natives.DOES_BLIP_EXIST, last_blip)) {
+ mp.game.ui.removeBlip(last_blip);
+ last_blip = mp.game.invoke(Natives.GET_NEXT_BLIP_INFO_ID, 5);
+ }
+ }
+
+ mp.events.add('GangAreas:Create', (turfsJSON) => {
+ var turfs = JSON.parse(turfsJSON);
+ clearBlips();
+ if (turfs.length > 0) {
+ gangturfs = [];
+ turfs.forEach(function (turf) {
+ if (turf.Id != undefined) {
+ gangturfs[gangturfs.length] = new Gangturf(turf.Name, turf.Id, turf.X, turf.Y, turf.Range, turf.Color, turf.Rotation, turf.Owner);
+ }
+ });
+ }
+ });
+
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Database/Entities/Turfs.cs b/ReallifeGamemode.Database/Entities/Turfs.cs
new file mode 100644
index 00000000..d7829c56
--- /dev/null
+++ b/ReallifeGamemode.Database/Entities/Turfs.cs
@@ -0,0 +1,31 @@
+using GTANetworkAPI;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Linq;
+using System.Text;
+
+namespace ReallifeGamemode.Database.Entities
+{
+ public class Turfs
+ {
+ [Key]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; set; }
+
+ [ForeignKey("Faction")]
+ public int? FactionId { get; set; }
+ public static Faction Faction { get; set; }
+
+ public string Owner { get; set; }
+
+ public string Name { get; set; }
+ public int X { get; set; }
+ public int Y { get; set; }
+ public int Rotation { get; set; }
+ public int Range { get; set; }
+ public int Color { get; set; }
+
+ }
+}
diff --git a/ReallifeGamemode.Database/Migrations/20191129201024_Turfs.Designer.cs b/ReallifeGamemode.Database/Migrations/20191129201024_Turfs.Designer.cs
new file mode 100644
index 00000000..5ba95936
--- /dev/null
+++ b/ReallifeGamemode.Database/Migrations/20191129201024_Turfs.Designer.cs
@@ -0,0 +1,1384 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using ReallifeGamemode.Database.Models;
+
+namespace ReallifeGamemode.Database.Migrations
+{
+ [DbContext(typeof(DatabaseContext))]
+ [Migration("20191129201024_Turfs")]
+ partial class Turfs
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "2.1.11-servicing-32099")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Balance");
+
+ b.Property("Faulty");
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Id");
+
+ b.ToTable("ATMs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Applied");
+
+ b.Property("BannedBy");
+
+ b.Property("Reason");
+
+ b.Property("UntilDateTime");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("Bans");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Balance");
+
+ b.Property("BusinessId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BusinessId")
+ .IsUnique();
+
+ b.ToTable("BusinessBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BusinessId");
+
+ b.Property("Price");
+
+ b.HasKey("Id");
+
+ b.ToTable("BusinessData");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Description");
+
+ b.HasKey("Id");
+
+ b.ToTable("BusRoutes");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BusRouteId");
+
+ b.Property("Description");
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BusRouteId");
+
+ b.ToTable("BusRoutesPoints");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Ageing");
+
+ b.Property("AgeingOpacity");
+
+ b.Property("BeardColor");
+
+ b.Property("Blemishes");
+
+ b.Property("BlemishesOpacity");
+
+ b.Property("Blush");
+
+ b.Property("BlushColor");
+
+ b.Property("BlushOpacity");
+
+ b.Property("BrowDepth");
+
+ b.Property("BrowHeight");
+
+ b.Property("CheekDepth");
+
+ b.Property("CheekboneHeight");
+
+ b.Property("CheekboneWidth");
+
+ b.Property("ChestHair");
+
+ b.Property("ChestHairColor");
+
+ b.Property("ChestHairOpacity");
+
+ b.Property("ChinDepth");
+
+ b.Property("ChinHeight");
+
+ b.Property("ChinIndent");
+
+ b.Property("ChinWidth");
+
+ b.Property("Complexion");
+
+ b.Property("ComplexionOpacity");
+
+ b.Property("EyeColor");
+
+ b.Property("EyeSize");
+
+ b.Property("EyebrowColor");
+
+ b.Property("Eyebrows");
+
+ b.Property("EyebrowsOpacity");
+
+ b.Property("FacialHair");
+
+ b.Property("FacialHairOpacity");
+
+ b.Property("Father");
+
+ b.Property("Freckles");
+
+ b.Property("FrecklesOpacity");
+
+ b.Property("Gender");
+
+ b.Property("Hair");
+
+ b.Property("HairColor");
+
+ b.Property("HairHighlightColor");
+
+ b.Property("JawShape");
+
+ b.Property("JawWidth");
+
+ b.Property("LipThickness");
+
+ b.Property("Lipstick");
+
+ b.Property("LipstickColor");
+
+ b.Property("LipstickOpacity");
+
+ b.Property("Makeup");
+
+ b.Property("MakeupOpacity");
+
+ b.Property("Mother");
+
+ b.Property("NeckWidth");
+
+ b.Property("NoseBottomHeight");
+
+ b.Property("NoseBridgeDepth");
+
+ b.Property("NoseBroken");
+
+ b.Property("NoseTipHeight");
+
+ b.Property("NoseTipLength");
+
+ b.Property("NoseWidth");
+
+ b.Property("Similarity");
+
+ b.Property("SkinSimilarity");
+
+ b.Property("SunDamage");
+
+ b.Property("SunDamageOpacity");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("Characters");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClothId");
+
+ b.Property("Duty");
+
+ b.Property("SlotId");
+
+ b.Property("SlotType");
+
+ b.Property("Texture");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("CharacterClothes");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Gender");
+
+ b.Property("Top");
+
+ b.Property("Torso");
+
+ b.Property("Undershirt");
+
+ b.HasKey("Id");
+
+ b.ToTable("ClothCombinations");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Category");
+
+ b.Property("FactionId");
+
+ b.Property("Locked");
+
+ b.Property("Model");
+
+ b.Property("Name");
+
+ b.Property("Radius");
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("Doors");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ClothId");
+
+ b.Property("FactionId");
+
+ b.Property("Gender");
+
+ b.Property("SlotId");
+
+ b.Property("SlotType");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("DutyClothes");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Name")
+ .HasMaxLength(32);
+
+ b.Property("StateOwned");
+
+ b.Property("WeaponDealTime");
+
+ b.HasKey("Id");
+
+ b.ToTable("Factions");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Balance");
+
+ b.Property("Bic")
+ .HasMaxLength(12);
+
+ b.Property("FactionId");
+
+ b.Property("Iban")
+ .HasMaxLength(32);
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("FactionBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("FactionId");
+
+ b.Property("Order");
+
+ b.Property("RankName");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("FactionRanks");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Ammount");
+
+ b.Property("FactionId");
+
+ b.Property("Rank");
+
+ b.Property("SlotID");
+
+ b.Property("WeaponModel");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("FactionWeapons");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Description")
+ .HasMaxLength(32);
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Id");
+
+ b.ToTable("GotoPoints");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Name");
+
+ b.HasKey("Id");
+
+ b.ToTable("Groups");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Balance");
+
+ b.Property("GroupId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GroupId");
+
+ b.ToTable("GroupBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CanRentIn");
+
+ b.Property("OwnerId");
+
+ b.Property("Price");
+
+ b.Property("RentalFee");
+
+ b.Property("Type");
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Id");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("Houses");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("HouseId");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("HouseId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("HouseRentals");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("EnterPositionStr")
+ .HasColumnName("EnterPosition");
+
+ b.Property("ExitPositionStr")
+ .HasColumnName("ExitPosition");
+
+ b.Property("Name");
+
+ b.HasKey("Id");
+
+ b.ToTable("Interiors");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Description");
+
+ b.Property("Heading");
+
+ b.Property("X");
+
+ b.Property("Y");
+
+ b.Property("Z");
+
+ b.HasKey("Id");
+
+ b.ToTable("Locations");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Fee");
+
+ b.Property("MoneySent");
+
+ b.Property("NewReceiverBalance");
+
+ b.Property("NewSenderBalance");
+
+ b.Property("Origin")
+ .HasMaxLength(32);
+
+ b.Property("Receiver")
+ .HasMaxLength(32);
+
+ b.Property("ReceiverBalance");
+
+ b.Property("Sender")
+ .HasMaxLength(32);
+
+ b.Property("SenderBalance");
+
+ b.Property("Timestamp")
+ .ValueGeneratedOnAdd();
+
+ b.HasKey("Id");
+
+ b.ToTable("BankAccountTransactionLogs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CauseOfDeath")
+ .HasMaxLength(64);
+
+ b.Property("KillerHeading");
+
+ b.Property("KillerId");
+
+ b.Property("KillerPositionX");
+
+ b.Property("KillerPositionY");
+
+ b.Property("KillerPositionZ");
+
+ b.Property("Timestamp")
+ .ValueGeneratedOnAdd();
+
+ b.Property("VictimHeading");
+
+ b.Property("VictimId");
+
+ b.Property("VictimPositionX");
+
+ b.Property("VictimPositionY");
+
+ b.Property("VictimPositionZ");
+
+ b.HasKey("Id");
+
+ b.HasIndex("KillerId");
+
+ b.HasIndex("VictimId");
+
+ b.ToTable("DeathLogs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Caption");
+
+ b.Property("Content");
+
+ b.Property("Timestamp");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("News");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Alpha");
+
+ b.Property("Color");
+
+ b.Property("Dimension");
+
+ b.Property("DrawDistance");
+
+ b.Property("Name");
+
+ b.Property("PositionX");
+
+ b.Property("PositionY");
+
+ b.Property("PositionZ");
+
+ b.Property("Rotation");
+
+ b.Property("Scale");
+
+ b.Property("ShortRange");
+
+ b.Property("Sprite");
+
+ b.HasKey("Id");
+
+ b.ToTable("Blips");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ColorA");
+
+ b.Property("ColorB");
+
+ b.Property("ColorG");
+
+ b.Property("ColorR");
+
+ b.Property("Dimension");
+
+ b.Property("DirectionX");
+
+ b.Property("DirectionY");
+
+ b.Property("DirectionZ");
+
+ b.Property("PositionX");
+
+ b.Property("PositionY");
+
+ b.Property("PositionZ");
+
+ b.Property("RotationX");
+
+ b.Property("RotationY");
+
+ b.Property("RotationZ");
+
+ b.Property("Scale");
+
+ b.Property("Type");
+
+ b.Property("Visible");
+
+ b.HasKey("Id");
+
+ b.ToTable("Markers");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Dimension");
+
+ b.Property("HashModel");
+
+ b.Property("Heading");
+
+ b.Property("PositionX");
+
+ b.Property("PositionY");
+
+ b.Property("PositionZ");
+
+ b.HasKey("Id");
+
+ b.ToTable("Peds");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("Dimension");
+
+ b.Property("PositionX")
+ .HasMaxLength(128);
+
+ b.Property("PositionY");
+
+ b.Property("PositionZ");
+
+ b.Property("RespawnTime");
+
+ b.Property("RotationX");
+
+ b.Property("RotationY");
+
+ b.Property("RotationZ");
+
+ b.Property("Vehicle");
+
+ b.HasKey("Id");
+
+ b.ToTable("Pickups");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Active");
+
+ b.Property("ColorA");
+
+ b.Property("ColorB");
+
+ b.Property("ColorG");
+
+ b.Property