From 9ee382d31790d0a4c1e3f3b8d2debdd3f1514e51 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 17 Apr 2021 17:16:10 +0200 Subject: [PATCH 01/53] Duty-Restriktionen /Klamotten /FS /Job --- ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs | 8 +++++++- ReallifeGamemode.Server/Events/Key.cs | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs index 9163cc08..7c59d03d 100644 --- a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs +++ b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs @@ -99,7 +99,11 @@ namespace ReallifeGamemode.Server.DrivingSchool private static void EntityEnterBusinessColShape(ColShape colShape, Player client) { if (client.IsInVehicle || !client.IsLoggedIn()) return; - + if (client.GetData("duty") == true) + { + client.SendNotification("~r~Im Dienst kannst du keinen Führerschein machen", false); + return; + } client.TriggerEvent("drivingSchoolMenu"); } @@ -112,11 +116,13 @@ namespace ReallifeGamemode.Server.DrivingSchool public void StartDrivingSchool(Player client) { User user = client.GetUser(); + if (user.DriverLicenseVehicle || client.HasData("ActiveSchool")) { client.SendChatMessage("~b~[INFO]~s~ Du besitzt schon einen Führerschein."); return; } + if (user.Handmoney < 2500) { client.SendNotification("~r~[FEHLER]~s~ Du hast nicht genug Geld auf der Hand($2.500)!", true); diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 2652ad41..0fbef061 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -507,6 +507,11 @@ namespace ReallifeGamemode.Server.Events } if (nearestClotheShopPoint != null) { + if (player.GetData("duty") == true) + { + player.SendNotification("~r~Im Dienst kannst du keine Kleidung kaufen", false); + return; + } nearestClotheShopPoint.clotheShop.LoadShopNUI(player); } if (nearestItemShopPoint != null) @@ -547,6 +552,11 @@ namespace ReallifeGamemode.Server.Events } if (!job.GetUsersInJob().Contains(player)) { + if (player.GetData("duty") == true) + { + player.SendNotification("~r~Im Dienst kannst du keinen Job ausführen", false); + return; + } if (player.GetUser().JobId == 3) { if (nearestJobPoint.Skill > user.PilotSkill) From 3d249c3006a8a87fa34ea204e62262e39513d8c8 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 17 Apr 2021 18:22:31 +0200 Subject: [PATCH 02/53] Finish https://life-of-german.org/bugtracker/bug/19-restriktionen-von-spielern/ --- .../DrivingSchool/DrivingSchool.cs | 3 ++- ReallifeGamemode.Server/Events/Key.cs | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs index 7c59d03d..73b06218 100644 --- a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs +++ b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs @@ -98,8 +98,9 @@ namespace ReallifeGamemode.Server.DrivingSchool private static void EntityEnterBusinessColShape(ColShape colShape, Player client) { + var user = client.GetUser(); if (client.IsInVehicle || !client.IsLoggedIn()) return; - if (client.GetData("duty") == true) + if (user.GetData("duty")) { client.SendNotification("~r~Im Dienst kannst du keinen Führerschein machen", false); return; diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 0fbef061..3155ed33 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -230,8 +230,8 @@ namespace ReallifeGamemode.Server.Events WeaponPoint nearestWeapon = PositionManager.WeaponPoints.Find(w => w.Position.DistanceTo(player.Position) <= 1.5 && w.FactionId == user.FactionId); JailReleasePoint nearestJailReleasePoint = PositionManager.JailReleasePoints.Find(j => j.Position.DistanceTo(player.Position) <= 1.5 && (user.FactionId == 1 || user.FactionId == 3) && user.GetData("duty")); ElevatorPoint nearestElevatorPoint = PositionManager.ElevatorPoints.Find(e => e.Position.DistanceTo(player.Position) <= 1.5 && (user.FactionId == 1 || user.FactionId == 2 || user.FactionId == 3)); - ClotheshopPoint nearestClotheShopPoint = PositionManager.clotheshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5 && (!user.GetData("duty"))); - FriseurPoint nearestFriseurPoint = PositionManager.friseurPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5 && (!user.GetData("duty"))); + ClotheshopPoint nearestClotheShopPoint = PositionManager.clotheshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5); + FriseurPoint nearestFriseurPoint = PositionManager.friseurPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5); ItemshopPoint nearestItemShopPoint = PositionManager.itemshopPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5); JobPoint nearestJobPoint = PositionManager.JobPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6); Player nearestCuffPlayer = PositionManager.cuffPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6 && user.GetData("duty")); @@ -507,7 +507,7 @@ namespace ReallifeGamemode.Server.Events } if (nearestClotheShopPoint != null) { - if (player.GetData("duty") == true) + if (user.GetData("duty")) { player.SendNotification("~r~Im Dienst kannst du keine Kleidung kaufen", false); return; @@ -520,6 +520,11 @@ namespace ReallifeGamemode.Server.Events } if (nearestFriseurPoint != null) { + if (user.GetData("duty")) + { + player.SendNotification("~r~Im Dienst wirst du nicht vom Friseur bedient", false); + return; + } nearestFriseurPoint.friseurShop.LoadShopNUI(player); } if (nearestAmmunationPoint != null) @@ -552,7 +557,7 @@ namespace ReallifeGamemode.Server.Events } if (!job.GetUsersInJob().Contains(player)) { - if (player.GetData("duty") == true) + if (user.GetData("duty")) { player.SendNotification("~r~Im Dienst kannst du keinen Job ausführen", false); return; From 735ff66fb4fba892c33bd2574cfafbced3590d7e Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 17 Apr 2021 18:54:53 +0200 Subject: [PATCH 03/53] Wanted Restriktionen https://life-of-german.org/bugtracker/bug/19-restriktionen-von-spielern/ --- ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs | 5 +++++ ReallifeGamemode.Server/Events/Key.cs | 7 ++++++- ReallifeGamemode.Server/Managers/InteractionManager.cs | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs index 73b06218..fe51c527 100644 --- a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs +++ b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs @@ -105,6 +105,11 @@ namespace ReallifeGamemode.Server.DrivingSchool client.SendNotification("~r~Im Dienst kannst du keinen Führerschein machen", false); return; } + if (user.Wanteds > 0) + { + client.SendNotification("~r~Mit Wanteds kannst du keinen Führerschein machen", false); + return; + } client.TriggerEvent("drivingSchoolMenu"); } diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 3155ed33..cc56f637 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -511,7 +511,7 @@ namespace ReallifeGamemode.Server.Events { player.SendNotification("~r~Im Dienst kannst du keine Kleidung kaufen", false); return; - } + } nearestClotheShopPoint.clotheShop.LoadShopNUI(player); } if (nearestItemShopPoint != null) @@ -562,6 +562,11 @@ namespace ReallifeGamemode.Server.Events player.SendNotification("~r~Im Dienst kannst du keinen Job ausführen", false); return; } + if (user.Wanteds > 0) + { + player.SendNotification("~r~Mit Wanteds kannst du keinen Job starten", false); + return; + } if (player.GetUser().JobId == 3) { if (nearestJobPoint.Skill > user.PilotSkill) diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index a80c1688..ffb80dd6 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -181,6 +181,11 @@ namespace ReallifeGamemode.Server.Managers ChatService.ErrorMessage(player, "Dieser Spieler ist schon in einer Fraktion"); return; } + if (targetUser?.Wanteds > 0) + { + player.SendNotification("~r~Dieser Spieler wird aktuell gesucht (Wanted)", false); + return; + } target.SetData("accept_faction_invite", player.Name); From f65284c38eeccaef1196d2465e3eb1207518d13d Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 17 Apr 2021 19:33:08 +0200 Subject: [PATCH 04/53] Restric JobPlayer --- .../Events/EnterVehicleAttempt.cs | 3 ++- ReallifeGamemode.Server/Events/Key.cs | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs index b63b7661..7573fb6a 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs @@ -9,6 +9,7 @@ using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Util; using ReallifeGamemode.Server.WeaponDeal; using ReallifeGamemode.Server.Managers; +using ReallifeGamemode.Server.Job; namespace ReallifeGamemode.Server.Events { @@ -28,7 +29,7 @@ namespace ReallifeGamemode.Server.Events if (vehicle.GetServerVehicle() is FactionVehicle veh) { - if (!veh.GetOwners().Contains(player.GetUser().FactionId ?? 0) && !(u.IsAdmin(AdminLevel.HEADADMIN) && player.IsAdminDuty())) + if (!veh.GetOwners().Contains(player.GetUser().FactionId ?? 0) && !(u.IsAdmin(AdminLevel.HEADADMIN) && player.IsAdminDuty()) && !JobBase.GetPlayerInJob().Contains(player)) { if ((VehicleHash)vehicle.Model == VehicleHash.Burrito3) { diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index cc56f637..253deb17 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -511,7 +511,12 @@ namespace ReallifeGamemode.Server.Events { player.SendNotification("~r~Im Dienst kannst du keine Kleidung kaufen", false); return; - } + } + if(JobBase.GetPlayerInJob().Contains(player)) + { + player.SendNotification("~r~Im aktiven Job kannst du keine Kleidung kaufen", false); + return; + } nearestClotheShopPoint.clotheShop.LoadShopNUI(player); } if (nearestItemShopPoint != null) @@ -525,6 +530,11 @@ namespace ReallifeGamemode.Server.Events player.SendNotification("~r~Im Dienst wirst du nicht vom Friseur bedient", false); return; } + if (JobBase.GetPlayerInJob().Contains(player)) + { + player.SendNotification("~r~Im aktiven Job wirst du nicht vom Friseur bedient", false); + return; + } nearestFriseurPoint.friseurShop.LoadShopNUI(player); } if (nearestAmmunationPoint != null) From 8d231c8359c6d4998a965f4f34bb1735da23d964 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 17 Apr 2021 19:52:06 +0200 Subject: [PATCH 05/53] Fix explanation Wanted Invite --- ReallifeGamemode.Server/Managers/InteractionManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index ffb80dd6..d94029a1 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -183,7 +183,7 @@ namespace ReallifeGamemode.Server.Managers } if (targetUser?.Wanteds > 0) { - player.SendNotification("~r~Dieser Spieler wird aktuell gesucht (Wanted)", false); + player.SendNotification("~r~Du kannst diesen Spieler nicht inviten da er aktuell gesucht wird. (Wanted)", false); return; } From 6a28cbe60d469e1a2657de5f09a9961a48ba2760 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 17 Apr 2021 22:51:35 +0200 Subject: [PATCH 06/53] Initial Specate --- ReallifeGamemode.Client/admin/spectate.ts | 12 +++++++++ ReallifeGamemode.Client/index.ts | 1 + .../Commands/AdminCommands.cs | 27 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 ReallifeGamemode.Client/admin/spectate.ts diff --git a/ReallifeGamemode.Client/admin/spectate.ts b/ReallifeGamemode.Client/admin/spectate.ts new file mode 100644 index 00000000..cf66bb43 --- /dev/null +++ b/ReallifeGamemode.Client/admin/spectate.ts @@ -0,0 +1,12 @@ +let cam: CameraMp = mp.cameras.new('spectateCam');; +mp.events.add("SERVER:ADMIN_SPECTATE", (targetPlayer) => { + cam.attachTo(targetPlayer.handle, 10.0, 0.0, 10.0, true); + cam.setActive(true); +}); + +mp.events.add("SERVER:ADMIN_STOP_SPECTATE", () => { + if (cam.isActive() == true) { + cam.setActive(false); + } +}); + \ No newline at end of file diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 5a2a287f..89257c40 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -267,6 +267,7 @@ ammunation(globalData); require('./Gui/policedepartment'); require('./Gui/helptext'); +require('./admin/spectate'); interface VehicleData { EngineState: boolean; diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 90862772..60ba7593 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -1693,6 +1693,32 @@ namespace ReallifeGamemode.Server.Commands NAPI.Vehicle.SetVehicleTyreSmokeColor(veh, new Color(r, g, b)); } + [Command("spectate", "~m~Benutzung: ~s~/spectate [NAME/ID]", Alias = "spec")] + public void CmdAdminSpectate(Player player, string targetname = null) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Player target; + if (targetname != null) + { + target = PlayerService.GetPlayerByNameOrId(targetname); + if (target == null || !target.IsLoggedIn()) + { + ChatService.PlayerNotFound(player); + return; + } + player.TriggerEvent("SERVER:ADMIN_SPECTATE", target); + } + else + { + player.TriggerEvent("SERVER:ADMIN_STOP_SPECTATE"); + } + } + + #endregion Admin #region ALevel1337 @@ -2066,6 +2092,7 @@ namespace ReallifeGamemode.Server.Commands return; } + [Command("showtuningmenu", "~m~Benutzung: ~s~/showtuningmenu", Alias = "stm")] public void CmdAdminShowtuningmenu(Player player) { From 0b8be38254ba9625be80823ec0664216b77d5654 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 18 Apr 2021 00:54:55 +0200 Subject: [PATCH 07/53] Added Job Quit to Interaction -> JOB --- .../Interaction/interactionmenu.ts | 17 +++++++++++++++++ ReallifeGamemode.Client/global.d.ts | 1 + ReallifeGamemode.Server/Events/Key.cs | 1 + ReallifeGamemode.Server/Managers/JobManager.cs | 2 +- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index 3864a46d..0eb1b053 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -464,6 +464,23 @@ export default function (globalData: IGlobalData) { wageItem.SetRightLabel("$" + jobdata.wage.toString()) } jobMenu.AddItem(wageItem); + + if (jobdata.isActive) { + var quitJobItem = new UIMenuItem("Job Beenden", "Beendet den Job und bringt dich zurück zur Base") + jobMenu.AddItem(quitJobItem); + quitJobItem.HighlightedBackColor = new Color(213, 0, 0); + quitJobItem.BackColor = new Color(229, 57, 53); + + jobMenu.ItemSelect.on((item, index) => { + if (item == quitJobItem) { + mp.events.callRemote("CLIENT:Job_StopJob"); + jobMenu.Close(true); + mp.gui.chat.activate(true); + globalData.InMenu = false; + } + }); + } + jobMenu.Visible = false; mp.gui.chat.show(false); return jobMenu; diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 576f9826..dfd560c5 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -30,6 +30,7 @@ declare type JobData = { busskill: number; pilotskill: number; wage: number; + isActive: boolean; } declare type VehicleData = { diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 253deb17..d0372911 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -168,6 +168,7 @@ namespace ReallifeGamemode.Server.Events busskill = u.BusSkill, pilotskill = u.PilotSkill, wage = u.Wage, + isActive = JobBase.GetPlayerInJob().Contains(player), }; var memberList = dbContext.Users.Where(f => f.FactionId == u.FactionId && u.FactionId != 0).OrderByDescending(f => f.FactionRank.Order).ThenBy(f => f.Name).Select(m => new diff --git a/ReallifeGamemode.Server/Managers/JobManager.cs b/ReallifeGamemode.Server/Managers/JobManager.cs index bd66afbe..63abaff8 100644 --- a/ReallifeGamemode.Server/Managers/JobManager.cs +++ b/ReallifeGamemode.Server/Managers/JobManager.cs @@ -186,7 +186,7 @@ namespace ReallifeGamemode.Server.Managers { VehicleStreaming.SetEngineState(player.Vehicle, false); } - + player.Position = playerJobStartPosition[player]; job.StopJob(player); if (playerTimersJobVehicleRespawn.ContainsKey(player)) From cc3fcb9f60c9fb5a33bc956bd8eb949c8df30107 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 18 Apr 2021 14:14:49 +0200 Subject: [PATCH 08/53] add fbi garage --- ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf diff --git a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf new file mode 100644 index 00000000..ab42f534 --- /dev/null +++ b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f50bbe18f89e8ba9794580aac98cc1eb28230fb3dd8c15b723f0c16444aad938 +size 35328 From 207a69b1a0261c070818c8d4e351a3832903145a Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 18 Apr 2021 15:33:33 +0200 Subject: [PATCH 09/53] test fbi garage --- ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf index ab42f534..0ae83a28 100644 --- a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf +++ b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f50bbe18f89e8ba9794580aac98cc1eb28230fb3dd8c15b723f0c16444aad938 +oid sha256:c68cdcee5da9b1b7800f4bdc487bf2feb1b82f6747c03c7f86dd364d1289c256 size 35328 From da4b6bca4df0a0b4246288874669e2a665b518d0 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 18 Apr 2021 17:38:17 +0200 Subject: [PATCH 10/53] fbi garage test --- ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf index 0ae83a28..ca513b42 100644 --- a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf +++ b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c68cdcee5da9b1b7800f4bdc487bf2feb1b82f6747c03c7f86dd364d1289c256 -size 35328 +oid sha256:1e40413c355d3721e2a483add948aaad408b17c3ed9a0db409b141aa6110dbb6 +size 35840 From 75d9497de30c82fd88063451dcea067bc32cacbd Mon Sep 17 00:00:00 2001 From: kookroach Date: Sun, 18 Apr 2021 22:09:47 +0200 Subject: [PATCH 11/53] Change HP amount and Cooldown --- ReallifeGamemode.Server/Inventory/Items/Apfel.cs | 4 ++-- ReallifeGamemode.Server/Inventory/Items/AviateChips.cs | 2 +- ReallifeGamemode.Server/Inventory/Items/Baklava.cs | 4 ++-- ReallifeGamemode.Server/Inventory/Items/Cheeseburger.cs | 4 ++-- ReallifeGamemode.Server/Inventory/Items/Chips.cs | 4 ++-- ReallifeGamemode.Server/Inventory/Items/Döner.cs | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ReallifeGamemode.Server/Inventory/Items/Apfel.cs b/ReallifeGamemode.Server/Inventory/Items/Apfel.cs index 116dbfc7..4b396c17 100644 --- a/ReallifeGamemode.Server/Inventory/Items/Apfel.cs +++ b/ReallifeGamemode.Server/Inventory/Items/Apfel.cs @@ -17,8 +17,8 @@ namespace ReallifeGamemode.Server.Inventory.Items public override string Einheit => "g"; public override int HpAmount => 10; public override uint Object => 2240524752; - public override int Price => 200; - public override float Cooldown => 10000; + public override int Price => 50; + public override float Cooldown => 60000; public override void Consume(UserItem uItem) { diff --git a/ReallifeGamemode.Server/Inventory/Items/AviateChips.cs b/ReallifeGamemode.Server/Inventory/Items/AviateChips.cs index 025c98f7..b65f0f86 100644 --- a/ReallifeGamemode.Server/Inventory/Items/AviateChips.cs +++ b/ReallifeGamemode.Server/Inventory/Items/AviateChips.cs @@ -19,7 +19,7 @@ namespace ReallifeGamemode.Server.Inventory.Items public override uint Object => 2240524752; public override int Price => 1000; - public override float Cooldown => 5000; + public override float Cooldown => 60000; public override void Consume(UserItem uItem) { diff --git a/ReallifeGamemode.Server/Inventory/Items/Baklava.cs b/ReallifeGamemode.Server/Inventory/Items/Baklava.cs index 88e7ccfd..e5825cf8 100644 --- a/ReallifeGamemode.Server/Inventory/Items/Baklava.cs +++ b/ReallifeGamemode.Server/Inventory/Items/Baklava.cs @@ -17,9 +17,9 @@ namespace ReallifeGamemode.Server.Inventory.Items public override string Einheit => "g"; public override int HpAmount => 30; public override uint Object => 2240524752; - public override int Price => 600; + public override int Price => 150; - public override float Cooldown => 20000; + public override float Cooldown => 180000; public override void Consume(UserItem uItem) { diff --git a/ReallifeGamemode.Server/Inventory/Items/Cheeseburger.cs b/ReallifeGamemode.Server/Inventory/Items/Cheeseburger.cs index ccf4d4fe..225962ba 100644 --- a/ReallifeGamemode.Server/Inventory/Items/Cheeseburger.cs +++ b/ReallifeGamemode.Server/Inventory/Items/Cheeseburger.cs @@ -20,8 +20,8 @@ namespace ReallifeGamemode.Server.Inventory.Items public override string Einheit => "g"; public override int HpAmount => 20; public override uint Object => 2240524752; - public override int Price => 500; - public override float Cooldown => 7000; + public override int Price => 100; + public override float Cooldown => 120000; public override void Consume(UserItem uItem) { diff --git a/ReallifeGamemode.Server/Inventory/Items/Chips.cs b/ReallifeGamemode.Server/Inventory/Items/Chips.cs index 323e1b99..3198deb5 100644 --- a/ReallifeGamemode.Server/Inventory/Items/Chips.cs +++ b/ReallifeGamemode.Server/Inventory/Items/Chips.cs @@ -17,9 +17,9 @@ namespace ReallifeGamemode.Server.Inventory.Items public override string Einheit => "g"; public override int HpAmount => 5; public override uint Object => 2240524752; - public override int Price => 5; + public override int Price => 25; - public override float Cooldown => 5500; + public override float Cooldown => 30000; public override void Consume(UserItem uItem) { diff --git a/ReallifeGamemode.Server/Inventory/Items/Döner.cs b/ReallifeGamemode.Server/Inventory/Items/Döner.cs index 06408896..6f2f62ad 100644 --- a/ReallifeGamemode.Server/Inventory/Items/Döner.cs +++ b/ReallifeGamemode.Server/Inventory/Items/Döner.cs @@ -15,11 +15,11 @@ namespace ReallifeGamemode.Server.Inventory.Items public override string Description => "Von Emre selbst gemacht."; public override int Gewicht => 500; public override string Einheit => "g"; - public override int HpAmount => 80; + public override int HpAmount => 50; public override uint Object => 2240524752; - public override int Price => 1800; + public override int Price => 250; - public override float Cooldown => 50000; + public override float Cooldown => 300000; public override void Consume(UserItem uItem) { From d72702951f87332217677839a52aa47b08c04b5b Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 19 Apr 2021 00:32:00 +0200 Subject: [PATCH 12/53] player cuff nach clear --- ReallifeGamemode.Server/Commands/FactionCommands.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index 2383b2fe..6147647e 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -538,6 +538,7 @@ namespace ReallifeGamemode.Server.Commands target.TriggerEvent("jailTime", 0); targetUser.Wanteds = 0; + PositionManager.cuffPoints.Remove(target); targetUser.SetBlipAndNametagColor(); From a56b30c1d52c22899179590c80138b0b67e22ebf Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 19 Apr 2021 00:38:36 +0200 Subject: [PATCH 13/53] =?UTF-8?q?ja=C2=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/Commands/FactionCommands.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index 6147647e..5d8c523b 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -538,7 +538,11 @@ namespace ReallifeGamemode.Server.Commands target.TriggerEvent("jailTime", 0); targetUser.Wanteds = 0; - PositionManager.cuffPoints.Remove(target); + + if (PositionManager.cuffPoints.Contains(player)) + { + PositionManager.cuffPoints.Remove(player); + } targetUser.SetBlipAndNametagColor(); From 1ad1cf75fce31867e690abbfc16cc6edbb904ac8 Mon Sep 17 00:00:00 2001 From: Luke Date: Sun, 18 Apr 2021 23:02:26 +0000 Subject: [PATCH 14/53] Add files --- .../assets/css/onlinelist/style.css | 220 ++++++++++++++++++ .../assets/css/onlinelist/style.css.map | 9 + .../assets/css/onlinelist/style.scss | 137 +++++++++++ .../assets/html/onlinelist/index.html | 51 ++++ .../assets/js/onlinelist/script.js | 19 ++ 5 files changed, 436 insertions(+) create mode 100644 ReallifeGamemode.Client/assets/css/onlinelist/style.css create mode 100644 ReallifeGamemode.Client/assets/css/onlinelist/style.css.map create mode 100644 ReallifeGamemode.Client/assets/css/onlinelist/style.scss create mode 100644 ReallifeGamemode.Client/assets/html/onlinelist/index.html create mode 100644 ReallifeGamemode.Client/assets/js/onlinelist/script.js diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css b/ReallifeGamemode.Client/assets/css/onlinelist/style.css new file mode 100644 index 00000000..dd58bc2c --- /dev/null +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css @@ -0,0 +1,220 @@ +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: 100vh; + background: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +html, body { + margin: unset; +} + +*, *:before, *:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +body { + margin: 10vh auto 0; + width: 32vw; + color: white; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 1em; +} + +h1, h2 { + margin: unset; + line-height: 1; +} + +h1 { + font-size: 1.75em; +} + +h2 { + font-size: 1.125em; +} + +.heading { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + margin-bottom: 1.5em; + padding: 1em 1em 0; +} + +.wrapper { + height: 80vh; + overflow-y: scroll; + border-radius: .25em; + background-color: rgba(0, 0, 0, 0.75); +} + +.wrapper::-webkit-scrollbar { + display: none; +} + +table { + border-collapse: collapse; + width: 100%; + border-radius: inherit; +} + +table th { + position: -webkit-sticky; + position: sticky; + top: 0; + text-align: left; + z-index: 2; + background-color: black; +} + +table th:first-child { + border-top-left-radius: .25em; +} + +table th:last-child { + border-top-right-radius: .25em; +} + +table th, table td { + padding: .75em .5em; +} + +table th:first-child, table td:first-child { + padding-left: 1em; +} + +table th:last-child, table td:last-child { + padding-right: 1em; +} + +table tr td { + overflow: hidden; +} + +table tr td:nth-child(1) { + width: 7ch !important; +} + +table tr td:nth-child(2) { + max-width: 36ch; + font-weight: bold; + overflow-x: auto; + white-space: nowrap; +} + +table tr td:nth-child(2)::-webkit-scrollbar { + display: none; +} + +table tr td:nth-child(3) { + width: 14ch !important; +} + +table tr td:nth-child(4) { + width: 13ch !important; +} + +table tr:nth-child(even) { + background-color: rgba(0, 0, 0, 0.25); +} + +.group::before { + content: ""; + height: .65em; + width: .65em; + border-radius: 50%; + display: inline-block; + color: inherit; + border: 2px solid rgba(255, 255, 255, 0.125); + margin-right: .4em; + margin-bottom: 1px; +} + +.group--0::before { + background-color: white; +} + +.group--1::before { + background-color: #005fbe; +} + +.group--2::before { + background-color: #c80000; +} + +.group--3::before { + background-color: #0000aa; +} + +.group--4::before { + background-color: #ffb400; +} + +.group--5::before { + background-color: #ffb400; +} + +.group--6::before { + background-color: white; +} + +.group--7::before { + background-color: #004000; +} + +.group--8::before { + background-color: #ab0096; +} + +.group--9::before { + background-color: #00a685; +} + +ol.inline { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + list-style: unset; + list-style-type: none; + margin: 0; + padding: unset; +} + +ol.inline li:not(:last-child) { + margin-right: 1em; +} + +ol.inline.stats { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +ol.inline.stats:first-of-type { + margin-top: 1em !important; +} + +ol.inline.stats:last-of-type { + margin-bottom: 1em; +} + +ol.inline.stats:not(:last-of-type) { + margin-bottom: .125em; +} + +ol.inline.stats abbr { + text-decoration: none; +} +/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map b/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map new file mode 100644 index 00000000..70cbc841 --- /dev/null +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "style.scss" + ], + "names": [], + "file": "style.css" +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss new file mode 100644 index 00000000..dda32c7c --- /dev/null +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss @@ -0,0 +1,137 @@ +html { + box-sizing: border-box; + height: 100vh; + background: transparent; + user-select: none; +} + +html, body { margin: unset; } +*, *:before, *:after { box-sizing: inherit; } + +body { + margin: 10vh auto 0; + + width: 32vw; + color: white; + + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-size: 1em; +} + +h1, h2 { + margin: unset; + line-height: 1; +} + +h1 { font-size: 1.75em; } +h2 { font-size: 1.125em; } + +.heading { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1.5em; + padding: 1em 1em 0; +} + +.wrapper { + height: 80vh; + overflow-y: scroll; + + border-radius: .25em; + background-color: rgba(0, 0, 0, .75); + + &::-webkit-scrollbar { display: none; } +} + +table { + border-collapse: collapse; + width: 100%; + border-radius: inherit; + + th { + position: sticky; + top: 0; + text-align: left; + z-index: 2; + + background-color: black; + + &:first-child { border-top-left-radius: .25em; } + &:last-child { border-top-right-radius: .25em; } + } + + th, td { + padding: .75em .5em; + + &:first-child { padding-left: 1em; } + &:last-child { padding-right: 1em; } + } + + tr { + td { + overflow: hidden; + + &:nth-child(1) { width: 7ch !important; } + &:nth-child(2) { + max-width: 36ch; + font-weight: bold; + overflow-x: auto; + white-space: nowrap; + + &::-webkit-scrollbar { display: none; } + } + &:nth-child(3) { width: 14ch !important; } + &:nth-child(4) { width: 13ch !important; } + } + + &:nth-child(even) { background-color: rgba(0, 0, 0, .25); } + } +} + +.group { + &::before { + content: ""; + height: .65em; + width: .65em; + border-radius: 50%; + display: inline-block; + color: inherit; + border: 2px solid rgba(255, 255, 255, 0.125); + + margin-right: .4em; + margin-bottom: 1px; + } + + &--0::before { background-color: rgb(255, 255, 255); } + &--1::before { background-color: rgb(0, 95, 190); } + &--2::before { background-color: rgb(200, 0, 0); } + &--3::before { background-color: rgb(0, 0, 170); } + &--4::before { background-color: rgb(255, 180, 0); } + &--5::before { background-color: rgb(255, 180, 0); } + &--6::before { background-color: rgb(255, 255, 255); } + &--7::before { background-color: rgb(0, 64, 0); } + &--8::before { background-color: rgb(171, 0, 150); } + &--9::before { background-color: rgb(0, 166, 133); } +} + +ol.inline { + display: flex; + + list-style: unset; + list-style-type: none; + margin: 0; + padding: unset; + + li:not(:last-child) { margin-right: 1em; } +} + +ol.inline.stats { + justify-content: center; + + &:first-of-type { margin-top: 1em !important; } + &:last-of-type { margin-bottom: 1em; } + &:not(:last-of-type) { margin-bottom: .125em; } + + abbr { text-decoration: none; } +} diff --git a/ReallifeGamemode.Client/assets/html/onlinelist/index.html b/ReallifeGamemode.Client/assets/html/onlinelist/index.html new file mode 100644 index 00000000..023cb2bc --- /dev/null +++ b/ReallifeGamemode.Client/assets/html/onlinelist/index.html @@ -0,0 +1,51 @@ + + + + + + + Spielerliste + + + +
+
+

Spielerliste

+

Spieler:

+
+ + + + + + + + + + + + + +
IDNameFraktionPing (ms)
+ +
    +
  1. LSPD: 5
  2. +
  3. FIB: 5
  4. +
  5. LSED: 5
  6. +
+ +
    +
  1. GSF: 5
  2. +
  3. FYB: 5
  4. +
  5. LSV: 5
  6. +
+ +
    +
  1. NR: 5
  2. +
  3. Zivilisten: 5
  4. +
+
+ + + + \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/js/onlinelist/script.js b/ReallifeGamemode.Client/assets/js/onlinelist/script.js new file mode 100644 index 00000000..db952af2 --- /dev/null +++ b/ReallifeGamemode.Client/assets/js/onlinelist/script.js @@ -0,0 +1,19 @@ +window.onbeforeunload = () => { window.scrollTo(0, 0); } + +setPlayerCount = (factionId, value) => { + if (factionId == -1) { + document.getElementById('player-count').innerHTML = value; + } else if (factionId >= 0 && factionId <= 9) { + document.getElementById(factionId).innerHTML = value; + } +} + +addPlayerEntry = (userId, userName, factionId, factionName, userPing) => { + document.getElementById('players').innerHTML += `${userId} ${userName} ${factionName} ${userPing}`; +} + +addPlayerEntries = (json) => { + JSON.parse(json).forEach(e => { + + }); +} From c722c637bd73ca01234fef5f1c7d9930eaa1f48e Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 18 Apr 2021 23:12:58 +0200 Subject: [PATCH 15/53] Server Crash OnPlayerEnterVehicle vmtl gefixt --- ReallifeGamemode.Server/Events/EnterVehicle.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Server/Events/EnterVehicle.cs b/ReallifeGamemode.Server/Events/EnterVehicle.cs index 0ac95d38..1ae08f5a 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicle.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicle.cs @@ -22,12 +22,15 @@ namespace ReallifeGamemode.Server.Events if (vehicle.HasMarkerBehind()) vehicle.RemoveMarkerBehind(); - if (!VehicleManager.lastDriversInVehicle.ContainsKey(vehicle)) + if(vehicle != null && !string.IsNullOrEmpty(client.Name)) { - VehicleManager.lastDriversInVehicle.Add(vehicle, new Dictionary()); - } + if (!VehicleManager.lastDriversInVehicle.ContainsKey(vehicle)) + { + VehicleManager.lastDriversInVehicle.Add(vehicle, new Dictionary()); + } - VehicleManager.lastDriversInVehicle[vehicle][client.Name] = DateTime.Now; + VehicleManager.lastDriversInVehicle[vehicle][client.Name] = DateTime.Now; + } if (vehicle.GetServerVehicle() is FactionVehicle veh) { From 4961c463b4aafb9e268d47111b0eb0a966400d0d Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 18 Apr 2021 23:13:19 +0200 Subject: [PATCH 16/53] =?UTF-8?q?/ga=20universell=20f=C3=BCr=20alle=20Gang?= =?UTF-8?q?Owned=20Fraktionen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/FactionCommands.cs | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index 5d8c523b..d15cdab6 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -48,35 +48,29 @@ namespace ReallifeGamemode.Server.Commands { User user = player.GetUser(); Faction f = user?.Faction; - if ((f == null || f.StateOwned) && !user.IsAdmin(AdminLevel.ADMIN)) + if ((f == null || !f.GangOwned) && !user.IsAdmin(AdminLevel.ADMIN)) { ChatService.NotAuthorized(player); return; } - if (f?.Name == "Ballas" || f?.Name == "Grove" || user.IsAdmin(AdminLevel.ADMIN)) + + message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); + + string rank = string.Empty; + + if (f?.GangOwned == true) { - message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); - - string rank = string.Empty; - - if (f?.Name == "Ballas" || f?.Name == "Grove") - { - rank = player.GetUser().GetFactionRank().RankName; - } - else - { - rank = "[ADMIN]"; - } - - string broadcastMessage = "!{FF0000}** " + rank + " " + player.Name + ": " + message + " **"; - using (var context = new DatabaseContext()) - { - ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.GangOwned), true); - } + rank = player.GetUser().GetFactionRank().RankName; } else { - return; + rank = "[ADMIN]"; + } + + string broadcastMessage = "!{FF0000}** " + rank + " " + player.Name + ": " + message + " **"; + using (var context = new DatabaseContext()) + { + ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.GangOwned), true); } } @@ -356,7 +350,7 @@ namespace ReallifeGamemode.Server.Commands public void CmdFactionMedicHealive(Player player, string receiver, int price = 10) { Player target = PlayerService.GetPlayerByNameOrId(receiver); - if(target == null || !target.IsLoggedIn()) + if (target == null || !target.IsLoggedIn()) { ChatService.PlayerNotFound(player); return; From ce20ca20d802976b2818612a20ea43db7b288e25 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 18 Apr 2021 23:40:50 +0200 Subject: [PATCH 17/53] hp reg ausschalten --- ReallifeGamemode.Client/admin/anticheat.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReallifeGamemode.Client/admin/anticheat.ts b/ReallifeGamemode.Client/admin/anticheat.ts index 0eaf4fed..44807c32 100644 --- a/ReallifeGamemode.Client/admin/anticheat.ts +++ b/ReallifeGamemode.Client/admin/anticheat.ts @@ -183,6 +183,8 @@ var loop = Behaviour.secs() mp.events.add("render", () => { + mp.game.player.setHealthRechargeMultiplier(0); + Behaviour.health = Number(mp.players.local.getHealth()) + Number(mp.players.local.getArmour()) if (loop < Behaviour.secs()) { if (Behaviour.active) { From 60e97695b555acb46407f2efb31ebfdd53788a5d Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 01:18:36 +0200 Subject: [PATCH 18/53] vagos in wt --- .../Events/EnterVehicle.cs | 4 +-- .../Events/EnterVehicleAttempt.cs | 2 +- ReallifeGamemode.Server/Events/ExitVehicle.cs | 5 ++-- ReallifeGamemode.Server/Events/Key.cs | 10 ++----- ReallifeGamemode.Server/Events/Vehicle.cs | 12 +++----- .../Extensions/VehicleExtension.cs | 3 +- .../Inventory/Items/WeaponDealItem.cs | 3 +- .../WeaponDeal/WeaponDealManager.cs | 29 ++++++++++++++----- 8 files changed, 37 insertions(+), 31 deletions(-) diff --git a/ReallifeGamemode.Server/Events/EnterVehicle.cs b/ReallifeGamemode.Server/Events/EnterVehicle.cs index 1ae08f5a..5725b4a3 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicle.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicle.cs @@ -37,7 +37,7 @@ namespace ReallifeGamemode.Server.Events User u = client.GetUser(); if (u.FactionId != null && veh.GetOwners().Contains(u.FactionId.Value) - && (veh.Model == VehicleHash.Burrito3 || veh.Model == VehicleHash.Policet) + && (veh.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH || veh.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) && vehicle.HasData("weaponDeal") && vehicle.GetData("weaponDeal") == true && (!vehicle.HasData("WeaponDealLoad") || vehicle.GetData("WeaponDealLoad") == false)) @@ -47,7 +47,7 @@ namespace ReallifeGamemode.Server.Events CheckPointHandle.StartCheckPointRoute(client, dealPoint, 5000, 1, 7, 3, true, "loadWeaponTransport"); } else if ((u.FactionId != null) - && ((VehicleHash)vehicle.Model == VehicleHash.Burrito3 || (VehicleHash)vehicle.Model == VehicleHash.Policet) + && (veh.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH || veh.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) && vehicle.HasData("WeaponDealLoad") && vehicle.GetData("WeaponDealLoad") == true) { diff --git a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs index 7573fb6a..0370afa7 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs @@ -31,7 +31,7 @@ namespace ReallifeGamemode.Server.Events { if (!veh.GetOwners().Contains(player.GetUser().FactionId ?? 0) && !(u.IsAdmin(AdminLevel.HEADADMIN) && player.IsAdminDuty()) && !JobBase.GetPlayerInJob().Contains(player)) { - if ((VehicleHash)vehicle.Model == VehicleHash.Burrito3) + if ((VehicleHash)vehicle.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH) { if (WeaponDealManager.checkWeaponDbyVehicle(vehicle)) return; diff --git a/ReallifeGamemode.Server/Events/ExitVehicle.cs b/ReallifeGamemode.Server/Events/ExitVehicle.cs index b6e0187a..255b4a5c 100644 --- a/ReallifeGamemode.Server/Events/ExitVehicle.cs +++ b/ReallifeGamemode.Server/Events/ExitVehicle.cs @@ -8,6 +8,7 @@ using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Managers; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Util; +using ReallifeGamemode.Server.WeaponDeal; namespace ReallifeGamemode.Server.Events { @@ -27,7 +28,7 @@ namespace ReallifeGamemode.Server.Events User u = client.GetUser(); if ((u.FactionId != null) && (veh.GetOwners().Contains(u.FactionId ?? 0)) - && ((VehicleHash)vehicle.Model == VehicleHash.Burrito3 || (VehicleHash)vehicle.Model == VehicleHash.Policet) + && (veh.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH || veh.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) && vehicle.HasData("weaponDeal") && vehicle.GetData("weaponDeal") == true) { @@ -35,7 +36,7 @@ namespace ReallifeGamemode.Server.Events client.TriggerEvent("destroyCP"); } else if ((u.FactionId != null) - && ((VehicleHash)vehicle.Model == VehicleHash.Burrito3 || (VehicleHash)vehicle.Model == VehicleHash.Policet) + && (veh.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH || veh.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) && vehicle.HasData("WeaponDealLoad") && vehicle.GetData("WeaponDealLoad") == true) { diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index d0372911..a2abdcb3 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -800,14 +800,8 @@ namespace ReallifeGamemode.Server.Events } else if (sV is FactionVehicle fV) { - if (fV.Model == VehicleHash.Burrito3 && u.FactionId == 1 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 3 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 7 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 8 - || fV.Model == VehicleHash.Policet && u.FactionId == 1 - || fV.Model == VehicleHash.Policet && u.FactionId == 3 - || fV.Model == VehicleHash.Policet && u.FactionId == 7 - || fV.Model == VehicleHash.Policet && u.FactionId == 8) + if ((fV.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH || fV.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) + && WeaponDealManager.WEAPON_DEAL_FACTIONS.Contains(u.FactionId ?? 0)) { VehicleStreaming.SetEngineState(v, !state); } diff --git a/ReallifeGamemode.Server/Events/Vehicle.cs b/ReallifeGamemode.Server/Events/Vehicle.cs index 263b8f8a..c9bbe549 100644 --- a/ReallifeGamemode.Server/Events/Vehicle.cs +++ b/ReallifeGamemode.Server/Events/Vehicle.cs @@ -1,10 +1,12 @@ using System; +using System.Linq; using GTANetworkAPI; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Util; +using ReallifeGamemode.Server.WeaponDeal; namespace ReallifeGamemode.Server.Events { @@ -38,14 +40,8 @@ namespace ReallifeGamemode.Server.Events } else if (sV is FactionVehicle fV) { - if (fV.Model == VehicleHash.Burrito3 && u.FactionId == 1 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 3 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 7 - || fV.Model == VehicleHash.Burrito3 && u.FactionId == 8 - || fV.Model == VehicleHash.Policet && u.FactionId == 1 - || fV.Model == VehicleHash.Policet && u.FactionId == 3 - || fV.Model == VehicleHash.Policet && u.FactionId == 7 - || fV.Model == VehicleHash.Policet && u.FactionId == 8) + if ((fV.Model == WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH || fV.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) + && WeaponDealManager.WEAPON_DEAL_FACTIONS.Contains(u.FactionId ?? 0)) { VehicleStreaming.SetEngineState(v, !state); } diff --git a/ReallifeGamemode.Server/Extensions/VehicleExtension.cs b/ReallifeGamemode.Server/Extensions/VehicleExtension.cs index 06af94bf..e0f75f46 100644 --- a/ReallifeGamemode.Server/Extensions/VehicleExtension.cs +++ b/ReallifeGamemode.Server/Extensions/VehicleExtension.cs @@ -3,6 +3,7 @@ using GTANetworkAPI; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Managers; +using ReallifeGamemode.Server.WeaponDeal; namespace ReallifeGamemode.Server.Extensions { @@ -107,7 +108,7 @@ namespace ReallifeGamemode.Server.Extensions return 0; case 18: - if ((VehicleHash)vehicle.Model == VehicleHash.Policet) + if ((VehicleHash)vehicle.Model == WeaponDealManager.WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) return 1000 * 1000; else if ((VehicleHash)vehicle.Model == VehicleHash.Firetruk || (VehicleHash)vehicle.Model == VehicleHash.Pbus diff --git a/ReallifeGamemode.Server/Inventory/Items/WeaponDealItem.cs b/ReallifeGamemode.Server/Inventory/Items/WeaponDealItem.cs index fdaff5cd..d36904d7 100644 --- a/ReallifeGamemode.Server/Inventory/Items/WeaponDealItem.cs +++ b/ReallifeGamemode.Server/Inventory/Items/WeaponDealItem.cs @@ -2,6 +2,7 @@ using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Inventory.Interfaces; +using ReallifeGamemode.Server.WeaponDeal; namespace ReallifeGamemode.Server.Inventory.Items { @@ -19,7 +20,7 @@ namespace ReallifeGamemode.Server.Inventory.Items { if (!fVeh.GetOwners().Contains(client.GetUser().FactionId ?? 0)) return false; - if (fVeh.Model != VehicleHash.Burrito3) + if (fVeh.Model != WeaponDealManager.WEAPON_DEAL_GANG_VEHICLE_HASH) return false; return true; diff --git a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs index 560c4e4b..1b6c3231 100644 --- a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs +++ b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs @@ -12,6 +12,14 @@ namespace ReallifeGamemode.Server.WeaponDeal { public class WeaponDealManager : Script { + public static readonly int[] WEAPON_DEAL_GANG_IDS = new int[] { 5, 7, 8 }; + public static readonly int[] WEAPON_DEAL_STAATSFRAK_IDS = new int[] { 1, 3 }; + + public static int[] WEAPON_DEAL_FACTIONS => WEAPON_DEAL_GANG_IDS.Concat(WEAPON_DEAL_STAATSFRAK_IDS).Distinct().ToArray(); + + public static readonly VehicleHash WEAPON_DEAL_GANG_VEHICLE_HASH = VehicleHash.Burrito3; + public static readonly VehicleHash WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH = VehicleHash.Policet; + private const int WEAPON_AMOUNT_GANG = 2; private const int WEAPON_AMOUNT_COP = 4; private const int WEAPON_AMOUNT_COP_STUNGUN = 4; @@ -30,14 +38,17 @@ namespace ReallifeGamemode.Server.WeaponDeal public void SrvEVENT_startWeaponDeal(Player client) { var user = client.GetUser(); - if(user == null || user.FactionId == null) + if (user == null || user.FactionId == null) { return; } using (var context = new DatabaseContext(true)) { - FactionVehicle factionVehicle = context.FactionVehicles.Where(f => f.Model == VehicleHash.Burrito3 || f.Model == VehicleHash.Policet).ToList().Where(f => f.GetOwners().Contains(user.FactionId ?? 0)).FirstOrDefault(); + FactionVehicle factionVehicle = context.FactionVehicles.Where(f => f.Model == WEAPON_DEAL_GANG_VEHICLE_HASH || f.Model == WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) + .ToList() + .Where(f => f.GetOwners().Contains(user.FactionId ?? 0)) + .FirstOrDefault(); if (factionVehicle == null) { @@ -54,7 +65,7 @@ namespace ReallifeGamemode.Server.WeaponDeal } float distance = fVeh.Position.DistanceTo2D(client.Position); - if ((distance > 80 && factionVehicle.Model == VehicleHash.Burrito3) || (distance > 400 && factionVehicle.Model == VehicleHash.Policet)) + if ((distance > 80 && factionVehicle.Model == WEAPON_DEAL_GANG_VEHICLE_HASH) || (distance > 400 && factionVehicle.Model == WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH)) { ChatService.ErrorMessage(client, "Der Transporter ist zu weit entfernt"); return; @@ -175,7 +186,7 @@ namespace ReallifeGamemode.Server.WeaponDeal { return; } - if ((VehicleHash)veh.Model != VehicleHash.Burrito3 && (VehicleHash)veh.Model != VehicleHash.Policet) + if ((VehicleHash)veh.Model != WEAPON_DEAL_GANG_VEHICLE_HASH && (VehicleHash)veh.Model != WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) { return; } @@ -184,11 +195,13 @@ namespace ReallifeGamemode.Server.WeaponDeal using (var context = new DatabaseContext()) { FactionVehicle factionVehicle = context.FactionVehicles - .Where(f => f.Model == VehicleHash.Burrito3 || f.Model == VehicleHash.Policet) + .Where(f => f.Model == WEAPON_DEAL_GANG_VEHICLE_HASH || f.Model == WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH) .ToList() .Where(f => f.GetOwners().Contains(user.FactionId ?? 0)) .FirstOrDefault(); + var owners = factionVehicle.GetOwners(); + Vehicle fVeh = VehicleManager.GetVehicleFromServerVehicle(factionVehicle); fVeh.SetData("weaponDeal", false); fVeh.SetData("WeaponDealLoad", true); @@ -198,7 +211,7 @@ namespace ReallifeGamemode.Server.WeaponDeal InventoryManager.RemoveAllItemsfromVehicleInventory(fVeh); int oMembers = NAPI.Pools.GetAllPlayers().Where(p => !p.IsAfk() && p.IsLoggedIn() && p.GetUser(context).FactionId == user.FactionId).Count(); - if (factionVehicle.GetOwners().Contains(8) || factionVehicle.GetOwners().Contains(7)) + if (owners.Any(o => WEAPON_DEAL_GANG_IDS.Contains(o))) // Gang WT { VehicleItem item = new VehicleItem() { ItemId = 2, VehicleId = factionVehicle.Id, Amount = WEAPON_AMOUNT_GANG * oMembers }; //pistol50 InventoryManager.AddItemToVehicleInventory(fVeh, item.ItemId, item.Amount); @@ -211,7 +224,7 @@ namespace ReallifeGamemode.Server.WeaponDeal VehicleItem item5 = new VehicleItem() { ItemId = 13, VehicleId = factionVehicle.Id, Amount = WEAPON_AMOUNT_GANG * oMembers }; //AssaultRifle InventoryManager.AddItemToVehicleInventory(fVeh, item5.ItemId, item5.Amount); } - else if (factionVehicle.GetOwners().Contains(1)) + else if (owners.Contains(1)) // LSPD { VehicleItem item = new VehicleItem() { ItemId = 1, VehicleId = factionVehicle.Id, Amount = WEAPON_AMOUNT_COP * oMembers }; //pistol InventoryManager.AddItemToVehicleInventory(fVeh, item.ItemId, item.Amount); @@ -228,7 +241,7 @@ namespace ReallifeGamemode.Server.WeaponDeal VehicleItem item7 = new VehicleItem() { ItemId = 14, VehicleId = factionVehicle.Id, Amount = WEAPON_AMOUNT_COP_STUNGUN * oMembers }; // AssaultSmg InventoryManager.AddItemToVehicleInventory(fVeh, item7.ItemId, item7.Amount); } - else if (factionVehicle.GetOwners().Contains(3)) + else if (owners.Contains(3)) // FIB { VehicleItem item = new VehicleItem() { ItemId = 3, VehicleId = factionVehicle.Id, Amount = WEAPON_AMOUNT_COP * oMembers }; //pistol_mk2 InventoryManager.AddItemToVehicleInventory(fVeh, item.ItemId, item.Amount); From ac91ceb1f343376e5b7cf1f635e40d53e66b7086 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 01:25:15 +0200 Subject: [PATCH 19/53] fix gw leave fehler --- ReallifeGamemode.Server/Gangwar/Gangwar.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index 376d5e77..35a5778f 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -94,6 +94,11 @@ namespace ReallifeGamemode.Server.Gangwar [RemoteEvent("Gangarea:Leave")] public void RmtEvent_TurfLeave(Player client, string jsonId) { + if(string.IsNullOrEmpty(jsonId)) + { + return; + } + int id = JsonConvert.DeserializeObject(jsonId); foreach (var turf in getTurfs()) From 13d7af7ca838666abb37fa6562570c5073850d05 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 01:28:26 +0200 Subject: [PATCH 20/53] vagos gangwar BITTE TESTEN --- ReallifeGamemode.Server/Gangwar/Gangwar.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index 35a5778f..2f03c031 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -186,7 +186,13 @@ namespace ReallifeGamemode.Server.Gangwar [RemoteEvent("SERVER:StartGangwar")] public void RmtEvent_StartGangwar(Player client) { - if (!client.GetUser().FactionLeader) + User user = client.GetUser(); + if(user == null || user.Faction == null) + { + return; + } + + if (!user.FactionLeader) return; foreach (var turf in getTurfs()) @@ -197,7 +203,7 @@ namespace ReallifeGamemode.Server.Gangwar return; } } - if (client.GetUser().Faction.Name == "Ballas" || client.GetUser().Faction.Name == "Grove") + if (user.Faction.GangOwned) { foreach (var turf in getTurfs()) { @@ -205,8 +211,11 @@ namespace ReallifeGamemode.Server.Gangwar { if (u == client) { - if (turf.Owner != client.GetUser().Faction.Name) - turf.attack(client.GetUser().Faction.Name); + if (turf.Owner != user.Faction.Name) + { + turf.attack(user.Faction.Name); + break; + } } } } From efa72299143eb87a3bec791d699e7089d9b5d36b Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 01:32:04 +0200 Subject: [PATCH 21/53] vagos blip und nametag BITTE TESTEN --- ReallifeGamemode.Client/Gui/nametags.ts | 2 +- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts index 97fd1cc5..b0a00dbe 100644 --- a/ReallifeGamemode.Client/Gui/nametags.ts +++ b/ReallifeGamemode.Client/Gui/nametags.ts @@ -19,7 +19,7 @@ const colors = [ { id: 2, color: [200, 0, 0, alpha] }, //lsed { id: 3, color: [0, 0, 170, alpha] }, //fib { id: 4, color: [255, 180, 0, alpha] }, //trucker - { id: 5, color: [255, 255, 255, alpha] }, //terroristen + { id: 5, color: [255, 180, 0, alpha] }, //vagos { id: 6, color: [255, 255, 255, alpha] }, //hitman { id: 7, color: [0, 64, 0, alpha] }, //grove { id: 8, color: [171, 0, 150, alpha] }, //ballas diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 7058cbae..e5815e2b 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -378,10 +378,10 @@ namespace ReallifeGamemode.Server.Extensions break; case 4: - blipColor = 5; break; case 5: + blipColor = 5; break; case 6: From 994672d99c1ae494c1a5c6428a4b0f936e974ebd Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 01:54:14 +0200 Subject: [PATCH 22/53] NEUE ONLINELISTE DANKE EMRE.NL --- ReallifeGamemode.Client/Gui/playerlist.ts | 35 ++++++++++++++----- .../assets/html/onlinelist/index.html | 19 +++++----- .../assets/js/onlinelist/script.js | 24 +++++++------ ReallifeGamemode.Server/Events/Key.cs | 20 +++++++---- 4 files changed, 63 insertions(+), 35 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/playerlist.ts b/ReallifeGamemode.Client/Gui/playerlist.ts index 3a136335..03ad7497 100644 --- a/ReallifeGamemode.Client/Gui/playerlist.ts +++ b/ReallifeGamemode.Client/Gui/playerlist.ts @@ -8,30 +8,47 @@ export default function playerList(globalData: IGlobalData): void { var playerlistBrowser: BrowserMp = null; var pList; + var factionPlayersMap: Map = new Map(); + const factionIds = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; mp.events.add("showPlayerlist", (playersJson) => { - + if (playerlistBrowser !== null) { playerlistBrowser.destroy(); playerlistBrowser = null; globalData.InMenu = false; mp.gui.cursor.show(false, false); - mp.gui.chat.activate(true); + mp.gui.chat.activate(true); } else if (!globalData.InMenu) { globalData.InMenu = true; - playerlistBrowser = mp.browsers.new('package://assets/html/Playerlist/Tabliste.html'); + playerlistBrowser = mp.browsers.new('package://assets/html/onlinelist/index.html'); mp.gui.chat.activate(false); mp.gui.cursor.show(true, true); pList = JSON.parse(playersJson); - pList.forEach((player) => { - playerlistBrowser.execute(`ad_row('${JSON.stringify(player.Id)}','${JSON.stringify(player.Name)}',${JSON.stringify(player.FactionName)},'${JSON.stringify(player.Ping)}');`); - }); - } + + + } }); - mp.events.add("CEF:fetchPlayerList", () => { - + mp.events.add("CEF:PlayerList_Loaded", () => { + factionIds.forEach(f => { + factionPlayersMap.set(f, 0); + }); + + pList.forEach((player) => { + var facId = player.FactionId; + + playerlistBrowser.execute(`addPlayerEntry('${player.Id}','${player.Name}', '${facId}', '${player.FactionName}','${player.Ping}');`); + + factionPlayersMap.set(facId, factionPlayersMap.get(facId) + 1); + }); + + factionPlayersMap.forEach((value, key) => { + playerlistBrowser.execute(`setPlayerCount(${key}, ${value});`) + }); + + playerlistBrowser.execute(`setPlayerCount(-1, ${pList.length});`); }); } diff --git a/ReallifeGamemode.Client/assets/html/onlinelist/index.html b/ReallifeGamemode.Client/assets/html/onlinelist/index.html index 023cb2bc..a052ea50 100644 --- a/ReallifeGamemode.Client/assets/html/onlinelist/index.html +++ b/ReallifeGamemode.Client/assets/html/onlinelist/index.html @@ -11,7 +11,7 @@

Spielerliste

-

Spieler:

+

Spieler: 0

@@ -29,23 +29,24 @@
    -
  1. LSPD: 5
  2. -
  3. FIB: 5
  4. -
  5. LSED: 5
  6. +
  7. LSPD: 0
  8. +
  9. FIB: 0
  10. +
  11. LSED: 0
    -
  1. GSF: 5
  2. -
  3. FYB: 5
  4. -
  5. LSV: 5
  6. +
  7. GSF: 0
  8. +
  9. FYB: 0
  10. +
  11. LSV: 0
    -
  1. NR: 5
  2. -
  3. Zivilisten: 5
  4. +
  5. NR: 0
  6. +
  7. Zivilisten: 0
+ \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/js/onlinelist/script.js b/ReallifeGamemode.Client/assets/js/onlinelist/script.js index db952af2..a1e8eae5 100644 --- a/ReallifeGamemode.Client/assets/js/onlinelist/script.js +++ b/ReallifeGamemode.Client/assets/js/onlinelist/script.js @@ -1,19 +1,23 @@ window.onbeforeunload = () => { window.scrollTo(0, 0); } +$(document).ready(function () { + mp.trigger('CEF:PlayerList_Loaded'); +}); + setPlayerCount = (factionId, value) => { - if (factionId == -1) { - document.getElementById('player-count').innerHTML = value; - } else if (factionId >= 0 && factionId <= 9) { - document.getElementById(factionId).innerHTML = value; - } + if (factionId == -1) { + document.getElementById('player-count').innerHTML = value; + } else if (factionId >= 0 && factionId <= 9) { + document.getElementById(factionId).innerHTML = value; + } } -addPlayerEntry = (userId, userName, factionId, factionName, userPing) => { - document.getElementById('players').innerHTML += `${userId} ${userName} ${factionName} ${userPing}`; +function addPlayerEntry(userId, userName, factionId, factionName, userPing) { + document.getElementById('players').innerHTML += `${userId} ${userName} ${factionName} ${userPing}`; } addPlayerEntries = (json) => { - JSON.parse(json).forEach(e => { - - }); + JSON.parse(json).forEach(e => { + + }); } diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index d0372911..ef44c839 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -453,7 +453,7 @@ namespace ReallifeGamemode.Server.Events int amount = 0; var tempFactionWeapon = weapons.Where(f => f.WeaponModel == weapon).FirstOrDefault(); - if(tempFactionWeapon != null) + if (tempFactionWeapon != null) { amount = tempFactionWeapon.Ammount; } @@ -513,7 +513,7 @@ namespace ReallifeGamemode.Server.Events player.SendNotification("~r~Im Dienst kannst du keine Kleidung kaufen", false); return; } - if(JobBase.GetPlayerInJob().Contains(player)) + if (JobBase.GetPlayerInJob().Contains(player)) { player.SendNotification("~r~Im aktiven Job kannst du keine Kleidung kaufen", false); return; @@ -686,12 +686,18 @@ namespace ReallifeGamemode.Server.Events List players = NAPI.Pools.GetAllPlayers().Where(p => p.IsLoggedIn() == true).OrderBy(o => o.Handle.Value).ToList(); - var listPlayers = players.Select(p => new + var listPlayers = players.Select(p => { - Id = p.Handle.Value, - p.Name, - p.Ping, - FactionName = p.GetUser()?.Faction?.Name ?? "Zivilist", + User u = p.GetUser(); + + return new + { + Id = p.Handle.Value, + p.Name, + p.Ping, + FactionName = u?.Faction?.Name ?? "Zivilist", + FactionId = u?.FactionId ?? 0 + }; }); player.TriggerEvent("showPlayerlist", JsonConvert.SerializeObject(listPlayers)); } From 2ce107eff5f71f5b13676d524a4f277e6a41480a Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 01:57:05 +0200 Subject: [PATCH 23/53] VAGOS WAFFENSCHRANK --- ReallifeGamemode.Server/Managers/PositionManager.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ReallifeGamemode.Server/Managers/PositionManager.cs b/ReallifeGamemode.Server/Managers/PositionManager.cs index e53e9aef..7a3c8c05 100644 --- a/ReallifeGamemode.Server/Managers/PositionManager.cs +++ b/ReallifeGamemode.Server/Managers/PositionManager.cs @@ -88,11 +88,17 @@ namespace ReallifeGamemode.Server.Managers Position = new Vector3(129.8998, -1938.709, 20.61865), FactionId = 7 }; + WeaponPoint weaponPointVagos = new WeaponPoint() + { + Position = new Vector3(-1076.6572, -1677.4907, 4.575236), + FactionId = 5 + }; WeaponPoints.Add(weaponPointLSPD); WeaponPoints.Add(weaponPointFIB); WeaponPoints.Add(weaponPointBallas); WeaponPoints.Add(weaponPointGrove); + WeaponPoints.Add(weaponPointVagos); foreach (WeaponPoint w in WeaponPoints) { From 4805a198f9a868aa1f20c1c8e95f32c48e918bcd Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 02:11:26 +0200 Subject: [PATCH 24/53] Vagos WT FIX --- ReallifeGamemode.Server/Events/Key.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index a81c0488..b1fd2ed1 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -240,7 +240,7 @@ namespace ReallifeGamemode.Server.Events if (user?.FactionId != null) { - BehindVehiclePoint nearestBehindVehiclePoint = MarkerBehinVehicle.behindVehiclePoints.Find(s => s.marker.Position.DistanceTo(player.Position) <= 3 && (user.FactionId == 8 || user.FactionId == 7 || user.FactionId == 1 || user.FactionId == 3)); + BehindVehiclePoint nearestBehindVehiclePoint = MarkerBehinVehicle.behindVehiclePoints.Find(s => s.marker.Position.DistanceTo(player.Position) <= 3 && WeaponDealManager.WEAPON_DEAL_FACTIONS.Contains(user.FactionId ?? 0)); if (nearestBehindVehiclePoint != null) { if (player.HasAttachment("ammobox")) return; From 37834f24f705c45963241c57dce24b4699cef326 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 02:11:37 +0200 Subject: [PATCH 25/53] vagos nametag blip fix --- ReallifeGamemode.Client/Gui/nametags.ts | 2 +- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts index b0a00dbe..21e76eea 100644 --- a/ReallifeGamemode.Client/Gui/nametags.ts +++ b/ReallifeGamemode.Client/Gui/nametags.ts @@ -19,7 +19,7 @@ const colors = [ { id: 2, color: [200, 0, 0, alpha] }, //lsed { id: 3, color: [0, 0, 170, alpha] }, //fib { id: 4, color: [255, 180, 0, alpha] }, //trucker - { id: 5, color: [255, 180, 0, alpha] }, //vagos + { id: 5, color: [255, 255, 100, alpha] }, //vagos { id: 6, color: [255, 255, 255, alpha] }, //hitman { id: 7, color: [0, 64, 0, alpha] }, //grove { id: 8, color: [171, 0, 150, alpha] }, //ballas diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index e5815e2b..80ef22a7 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -381,7 +381,7 @@ namespace ReallifeGamemode.Server.Extensions break; case 5: - blipColor = 5; + blipColor = 33; break; case 6: From ebe2f774125ff6a6e1dbe13a73504f56983775ab Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 02:13:17 +0200 Subject: [PATCH 26/53] vagos gangwar --- ReallifeGamemode.Client/util/Gangwar.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReallifeGamemode.Client/util/Gangwar.ts b/ReallifeGamemode.Client/util/Gangwar.ts index 102908c0..962add52 100644 --- a/ReallifeGamemode.Client/util/Gangwar.ts +++ b/ReallifeGamemode.Client/util/Gangwar.ts @@ -111,6 +111,11 @@ self.colorZone_r = 22; self.colorZone_g = 87; self.colorZone_b = 0; + } else if (owner === "Vagos") { + self.color = 0; + self.colorZone_r = 255; + self.colorZone_g = 255; + self.colorZone_b = 100; } else if (owner === "Neutral") { self.color = 0; self.colorZone_r = 255; From a60f92f9923a2188efa3da393c26926d08b9346f Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 02:37:39 +0200 Subject: [PATCH 27/53] fix vagos gw zone farbe --- ReallifeGamemode.Client/util/Gangwar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/util/Gangwar.ts b/ReallifeGamemode.Client/util/Gangwar.ts index 962add52..f9136552 100644 --- a/ReallifeGamemode.Client/util/Gangwar.ts +++ b/ReallifeGamemode.Client/util/Gangwar.ts @@ -112,7 +112,7 @@ self.colorZone_g = 87; self.colorZone_b = 0; } else if (owner === "Vagos") { - self.color = 0; + self.color = 33; self.colorZone_r = 255; self.colorZone_g = 255; self.colorZone_b = 100; From 3d5cf177613a6863be183684502465eb0df0b88f Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 11:09:44 +0200 Subject: [PATCH 28/53] Command Logs --- .../Entities/Logs/CommandLogEntry.cs | 19 + .../20210419090246_CommandLogs.Designer.cs | 2010 +++++++++++++++++ .../Migrations/20210419090246_CommandLogs.cs | 44 + .../DatabaseContextModelSnapshot.cs | 29 + .../Models/DatabaseContext.cs | 1 + .../Commands/CommandHandler.cs | 14 + 6 files changed, 2117 insertions(+) create mode 100644 ReallifeGamemode.Database/Entities/Logs/CommandLogEntry.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.Designer.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.cs diff --git a/ReallifeGamemode.Database/Entities/Logs/CommandLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/CommandLogEntry.cs new file mode 100644 index 00000000..903c5565 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/CommandLogEntry.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs +{ + public class CommandLogEntry + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + + public User User { get; set; } + + public string Command { get; set; } + + public DateTime Time { get; set; } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.Designer.cs b/ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.Designer.cs new file mode 100644 index 00000000..7652c2e8 --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.Designer.cs @@ -0,0 +1,2010 @@ +// +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("20210419090246_CommandLogs")] + partial class CommandLogs + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("PropertyAccessMode", PropertyAccessMode.PreferFieldDuringConstruction) + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Faulty") + .HasColumnType("tinyint(1)"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ATMs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Applied") + .HasColumnType("int"); + + b.Property("BannedBy") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Reason") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("UntilDateTime") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Bans"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("BusRoutes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusRouteId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BusRouteId"); + + b.ToTable("BusRoutesPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.ToTable("BusinessBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("BusinessData"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ageing") + .HasColumnType("tinyint unsigned"); + + b.Property("AgeingOpacity") + .HasColumnType("float"); + + b.Property("BeardColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Blemishes") + .HasColumnType("tinyint unsigned"); + + b.Property("BlemishesOpacity") + .HasColumnType("float"); + + b.Property("Blush") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushColor") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushOpacity") + .HasColumnType("float"); + + b.Property("BrowDepth") + .HasColumnType("float"); + + b.Property("BrowHeight") + .HasColumnType("float"); + + b.Property("CheekDepth") + .HasColumnType("float"); + + b.Property("CheekboneHeight") + .HasColumnType("float"); + + b.Property("CheekboneWidth") + .HasColumnType("float"); + + b.Property("ChestHair") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairOpacity") + .HasColumnType("float"); + + b.Property("ChinDepth") + .HasColumnType("float"); + + b.Property("ChinHeight") + .HasColumnType("float"); + + b.Property("ChinIndent") + .HasColumnType("float"); + + b.Property("ChinWidth") + .HasColumnType("float"); + + b.Property("Complexion") + .HasColumnType("tinyint unsigned"); + + b.Property("ComplexionOpacity") + .HasColumnType("float"); + + b.Property("EyeColor") + .HasColumnType("tinyint unsigned"); + + b.Property("EyeSize") + .HasColumnType("float"); + + b.Property("EyebrowColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Eyebrows") + .HasColumnType("tinyint unsigned"); + + b.Property("EyebrowsOpacity") + .HasColumnType("float"); + + b.Property("FacialHair") + .HasColumnType("tinyint unsigned"); + + b.Property("FacialHairOpacity") + .HasColumnType("float"); + + b.Property("Father") + .HasColumnType("tinyint unsigned"); + + b.Property("Freckles") + .HasColumnType("tinyint unsigned"); + + b.Property("FrecklesOpacity") + .HasColumnType("float"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Hair") + .HasColumnType("tinyint unsigned"); + + b.Property("HairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("HairHighlightColor") + .HasColumnType("tinyint unsigned"); + + b.Property("JawShape") + .HasColumnType("float"); + + b.Property("JawWidth") + .HasColumnType("float"); + + b.Property("LipThickness") + .HasColumnType("float"); + + b.Property("Lipstick") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickColor") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickOpacity") + .HasColumnType("float"); + + b.Property("Makeup") + .HasColumnType("tinyint unsigned"); + + b.Property("MakeupOpacity") + .HasColumnType("float"); + + b.Property("Mother") + .HasColumnType("tinyint unsigned"); + + b.Property("NeckWidth") + .HasColumnType("float"); + + b.Property("NoseBottomHeight") + .HasColumnType("float"); + + b.Property("NoseBridgeDepth") + .HasColumnType("float"); + + b.Property("NoseBroken") + .HasColumnType("float"); + + b.Property("NoseTipHeight") + .HasColumnType("float"); + + b.Property("NoseTipLength") + .HasColumnType("float"); + + b.Property("NoseWidth") + .HasColumnType("float"); + + b.Property("Similarity") + .HasColumnType("float"); + + b.Property("SkinSimilarity") + .HasColumnType("float"); + + b.Property("SunDamage") + .HasColumnType("tinyint unsigned"); + + b.Property("SunDamageOpacity") + .HasColumnType("float"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Characters"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("Duty") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.Property("Texture") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CharacterClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Top") + .HasColumnType("int"); + + b.Property("Torso") + .HasColumnType("int"); + + b.Property("Undershirt") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ClothCombinations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Radius") + .HasColumnType("float"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("Doors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("DutyClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("GangOwned") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("StateOwned") + .HasColumnType("tinyint(1)"); + + b.Property("WeaponDealTime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Factions"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("FactionBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RankName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionRanks"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammount") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Rank") + .HasColumnType("int"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Description") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("GotoPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("GroupBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("CanRentIn") + .HasColumnType("tinyint(1)"); + + b.Property("LastRentSetTime") + .HasColumnType("datetime(6)"); + + b.Property("OwnerId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("RentalFee") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Houses"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("HouseBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("HouseId"); + + b.HasIndex("UserId"); + + b.ToTable("HouseRentals"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("EnterPositionStr") + .HasColumnName("EnterPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("ExitPositionStr") + .HasColumnName("ExitPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("Interiors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("double"); + + b.Property("X") + .HasColumnType("double"); + + b.Property("Y") + .HasColumnType("double"); + + b.Property("Z") + .HasColumnType("double"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Fee") + .HasColumnType("int"); + + b.Property("MoneySent") + .HasColumnType("int"); + + b.Property("NewReceiverBalance") + .HasColumnType("int"); + + b.Property("NewSenderBalance") + .HasColumnType("int"); + + b.Property("Origin") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Receiver") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("ReceiverBalance") + .HasColumnType("int"); + + b.Property("Sender") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("SenderBalance") + .HasColumnType("int"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("BankAccountTransactionLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Command") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CommandLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CauseOfDeath") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("KillerHeading") + .HasColumnType("float"); + + b.Property("KillerId") + .HasColumnType("int"); + + b.Property("KillerPositionX") + .HasColumnType("float"); + + b.Property("KillerPositionY") + .HasColumnType("float"); + + b.Property("KillerPositionZ") + .HasColumnType("float"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("VictimHeading") + .HasColumnType("float"); + + b.Property("VictimId") + .HasColumnType("int"); + + b.Property("VictimPositionX") + .HasColumnType("float"); + + b.Property("VictimPositionY") + .HasColumnType("float"); + + b.Property("VictimPositionZ") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("KillerId"); + + b.HasIndex("VictimId"); + + b.ToTable("DeathLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Caption") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Content") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Timestamp") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("News"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Alpha") + .HasColumnType("tinyint unsigned"); + + b.Property("Color") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("ShortRange") + .HasColumnType("tinyint(1)"); + + b.Property("Sprite") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("Blips"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DirectionX") + .HasColumnType("float"); + + b.Property("DirectionY") + .HasColumnType("float"); + + b.Property("DirectionZ") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("tinyint unsigned"); + + b.Property("Visible") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Markers"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("HashModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Peds"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("PositionX") + .HasColumnType("float") + .HasMaxLength(128); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RespawnTime") + .HasColumnType("int"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Vehicle") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Pickups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Font") + .HasColumnType("tinyint unsigned"); + + b.Property("LOS") + .HasColumnType("tinyint(1)"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Text") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("TextLabels"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Variable") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ServerVariables"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVehicle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("DistanceDriven") + .HasColumnType("float"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("Livery") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int unsigned"); + + b.Property("NumberPlate") + .HasColumnType("varchar(8) CHARACTER SET utf8mb4") + .HasMaxLength(8); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("PrimaryColor") + .HasColumnType("int"); + + b.Property("SecondaryColor") + .HasColumnType("int"); + + b.Property("TankAmount") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ServerVehicles"); + + b.HasDiscriminator("Discriminator").HasValue("ServerVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopClothe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("int"); + + b.Property("ClotheId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("TypeId") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ShopClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ShopItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.TuningGarage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("TuningGarages"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("MaxValue") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Owner") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Range") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Surplus") + .HasColumnType("tinyint(1)"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Vector") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Turfs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AdminLevel") + .HasColumnType("int"); + + b.Property("BanId") + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("BusSkill") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Dead") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseBike") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseVehicle") + .HasColumnType("tinyint(1)"); + + b.Property("Email") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("FactionLeader") + .HasColumnType("tinyint(1)"); + + b.Property("FactionRankId") + .HasColumnType("int"); + + b.Property("FlyingLicensePlane") + .HasColumnType("tinyint(1)"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("GroupRank") + .HasColumnType("int"); + + b.Property("Handmoney") + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("JailTime") + .HasColumnType("int"); + + b.Property("JobId") + .HasColumnType("int"); + + b.Property("LogUserId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Password") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("PaydayTimer") + .HasColumnType("int"); + + b.Property("PilotSkill") + .HasColumnType("int"); + + b.Property("PlayedMinutes") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RegistrationDate") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("SocialClubName") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Wage") + .HasColumnType("int"); + + b.Property("Wanteds") + .HasColumnType("int"); + + b.Property("WeaponLicense") + .HasColumnType("tinyint(1)"); + + b.Property("failpoints") + .HasColumnType("int"); + + b.Property("otheramount") + .HasColumnType("int"); + + b.Property("trashcount") + .HasColumnType("int"); + + b.Property("warn") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BanId"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.HasIndex("CharacterId"); + + b.HasIndex("FactionId"); + + b.HasIndex("FactionRankId"); + + b.HasIndex("GroupId"); + + b.HasIndex("HouseId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("UserBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("WeaponId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("WeaponId"); + + b.ToTable("UserWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ModId") + .HasColumnType("int"); + + b.Property("ServerVehicleId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ServerVehicleId", "Slot") + .IsUnique(); + + b.ToTable("VehicleMods"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("AmmunationActive") + .HasColumnType("tinyint(1)"); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Legal") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.ToTable("Weapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.WeaponCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WeaponCategories"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Whitelist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WhitelistEntries"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BuyPrice") + .HasColumnType("int"); + + b.Property("Owners") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.ToTable("FactionVehicles"); + + b.HasDiscriminator().HasValue("FactionVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.JobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("JobId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("JobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobSpawnVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobSpawnVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("SavedVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.SchoolVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("SchoolId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("SchoolVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.ToTable("ShopVehicles"); + + b.HasDiscriminator().HasValue("ShopVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("Price") + .HasColumnName("UserVehicle_Price") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasIndex("UserId"); + + b.ToTable("UserVehicles"); + + b.HasDiscriminator().HasValue("UserVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.BusRoute", "BusRoute") + .WithMany("RoutePoints") + .HasForeignKey("BusRouteId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.FactionBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.GroupBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.HouseBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany("Rentals") + .HasForeignKey("HouseId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") + .WithMany() + .HasForeignKey("KillerId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Victim") + .WithMany() + .HasForeignKey("VictimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Ban", "Ban") + .WithMany() + .HasForeignKey("BanId"); + + b.HasOne("ReallifeGamemode.Database.Entities.UserBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Character", "Character") + .WithMany() + .HasForeignKey("CharacterId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + + b.HasOne("ReallifeGamemode.Database.Entities.FactionRank", "FactionRank") + .WithMany() + .HasForeignKey("FactionRankId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany() + .HasForeignKey("HouseId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ReallifeGamemode.Database.Entities.Weapon", "Weapon") + .WithMany() + .HasForeignKey("WeaponId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("ServerVehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.WeaponCategory", "WeaponCategory") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.cs b/ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.cs new file mode 100644 index 00000000..45864b80 --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210419090246_CommandLogs.cs @@ -0,0 +1,44 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class CommandLogs : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CommandLogs", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(nullable: true), + Command = table.Column(nullable: true), + Time = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CommandLogs", x => x.Id); + table.ForeignKey( + name: "FK_CommandLogs_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_CommandLogs_UserId", + table: "CommandLogs", + column: "UserId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CommandLogs"); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index d392d034..5432790d 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -797,6 +797,28 @@ namespace ReallifeGamemode.Database.Migrations b.ToTable("BankAccountTransactionLogs"); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Command") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CommandLogs"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => { b.Property("Id") @@ -1856,6 +1878,13 @@ namespace ReallifeGamemode.Database.Migrations .HasForeignKey("UserId"); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => { b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") diff --git a/ReallifeGamemode.Database/Models/DatabaseContext.cs b/ReallifeGamemode.Database/Models/DatabaseContext.cs index 890b0768..673a0684 100644 --- a/ReallifeGamemode.Database/Models/DatabaseContext.cs +++ b/ReallifeGamemode.Database/Models/DatabaseContext.cs @@ -97,6 +97,7 @@ namespace ReallifeGamemode.Database.Models //public DbSet BanLogs { get; set; } public DbSet BankAccountTransactionLogs { get; set; } public DbSet DeathLogs { get; set; } + public DbSet CommandLogs { get; set; } //Saves public DbSet ATMs { get; set; } diff --git a/ReallifeGamemode.Server.Core/Commands/CommandHandler.cs b/ReallifeGamemode.Server.Core/Commands/CommandHandler.cs index 91819a84..a372974b 100644 --- a/ReallifeGamemode.Server.Core/Commands/CommandHandler.cs +++ b/ReallifeGamemode.Server.Core/Commands/CommandHandler.cs @@ -8,6 +8,8 @@ using ReallifeGamemode.Server.Types; using ReallifeGamemode.Server.Common; using ReallifeGamemode.Server.Log; using Microsoft.Extensions.Logging; +using ReallifeGamemode.Database.Entities.Logs; +using ReallifeGamemode.Server.Core.Extensions; namespace ReallifeGamemode.Server.Core.Commands { @@ -33,6 +35,18 @@ namespace ReallifeGamemode.Server.Core.Commands logger.LogInformation("Player '{Name}' executed command '{command}'", player.Name, command); + using var dbContext = Main.GetDbContext(); + + var commandLogEntry = new CommandLogEntry() + { + Command = "/" + string.Join(' ', args), + Time = DateTime.Now, + User = player.GetUser(dbContext) + }; + + dbContext.CommandLogs.Add(commandLogEntry); + dbContext.SaveChanges(); + if (legacyCommands.Contains(command)) { return; From 06de6ef1a4c50b183046a62fc4d23073f263f4c8 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 11:20:45 +0200 Subject: [PATCH 29/53] vmtl fix medic online duty count --- ReallifeGamemode.Server/Factions/Medic/Medic.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Factions/Medic/Medic.cs b/ReallifeGamemode.Server/Factions/Medic/Medic.cs index f5c27650..50ef6941 100644 --- a/ReallifeGamemode.Server/Factions/Medic/Medic.cs +++ b/ReallifeGamemode.Server/Factions/Medic/Medic.cs @@ -297,7 +297,7 @@ namespace ReallifeGamemode.Server.Factions.Medic public static void UpdateDutyMedics() { - dutyMedics = NAPI.Pools.GetAllPlayers().Where(c => c.GetData("duty") == true && c.GetUser().FactionId == 2).ToList().Count; + dutyMedics = NAPI.Pools.GetAllPlayers().Where(c => c.IsDuty() == true && c.GetUser().FactionId == 2).ToList().Count; NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", dutyMedics); } } From f0b2eca5603c5ac19e4d11d442c5f252a400dd3e Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 12:17:56 +0200 Subject: [PATCH 30/53] login logout logs --- .../Entities/Logs/LoginLogoutLogEntry.cs | 27 + ...20210419100958_LoginLogoutLogs.Designer.cs | 2051 +++++++++++++++++ .../20210419100958_LoginLogoutLogs.cs | 48 + .../DatabaseContextModelSnapshot.cs | 41 + .../Models/DatabaseContext.cs | 1 + ReallifeGamemode.Server/Events/Disconnect.cs | 14 + ReallifeGamemode.Server/Events/Login.cs | 15 + ReallifeGamemode.Server/Events/Register.cs | 14 + 8 files changed, 2211 insertions(+) create mode 100644 ReallifeGamemode.Database/Entities/Logs/LoginLogoutLogEntry.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.Designer.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.cs diff --git a/ReallifeGamemode.Database/Entities/Logs/LoginLogoutLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/LoginLogoutLogEntry.cs new file mode 100644 index 00000000..56a5ef79 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/LoginLogoutLogEntry.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs +{ + public class LoginLogoutLogEntry + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + + public string Username { get; set; } + + public string SocialClubName { get; set; } + + public User User { get; set; } + + public long PlayerId { get; set; } + + public string IpAddress { get; set; } + + public bool LoginLogout { get; set; } + + public DateTime Time { get; set; } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.Designer.cs b/ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.Designer.cs new file mode 100644 index 00000000..d26084ca --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.Designer.cs @@ -0,0 +1,2051 @@ +// +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("20210419100958_LoginLogoutLogs")] + partial class LoginLogoutLogs + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("PropertyAccessMode", PropertyAccessMode.PreferFieldDuringConstruction) + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Faulty") + .HasColumnType("tinyint(1)"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ATMs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Applied") + .HasColumnType("int"); + + b.Property("BannedBy") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Reason") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("UntilDateTime") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Bans"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("BusRoutes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusRouteId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BusRouteId"); + + b.ToTable("BusRoutesPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.ToTable("BusinessBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("BusinessData"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ageing") + .HasColumnType("tinyint unsigned"); + + b.Property("AgeingOpacity") + .HasColumnType("float"); + + b.Property("BeardColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Blemishes") + .HasColumnType("tinyint unsigned"); + + b.Property("BlemishesOpacity") + .HasColumnType("float"); + + b.Property("Blush") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushColor") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushOpacity") + .HasColumnType("float"); + + b.Property("BrowDepth") + .HasColumnType("float"); + + b.Property("BrowHeight") + .HasColumnType("float"); + + b.Property("CheekDepth") + .HasColumnType("float"); + + b.Property("CheekboneHeight") + .HasColumnType("float"); + + b.Property("CheekboneWidth") + .HasColumnType("float"); + + b.Property("ChestHair") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairOpacity") + .HasColumnType("float"); + + b.Property("ChinDepth") + .HasColumnType("float"); + + b.Property("ChinHeight") + .HasColumnType("float"); + + b.Property("ChinIndent") + .HasColumnType("float"); + + b.Property("ChinWidth") + .HasColumnType("float"); + + b.Property("Complexion") + .HasColumnType("tinyint unsigned"); + + b.Property("ComplexionOpacity") + .HasColumnType("float"); + + b.Property("EyeColor") + .HasColumnType("tinyint unsigned"); + + b.Property("EyeSize") + .HasColumnType("float"); + + b.Property("EyebrowColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Eyebrows") + .HasColumnType("tinyint unsigned"); + + b.Property("EyebrowsOpacity") + .HasColumnType("float"); + + b.Property("FacialHair") + .HasColumnType("tinyint unsigned"); + + b.Property("FacialHairOpacity") + .HasColumnType("float"); + + b.Property("Father") + .HasColumnType("tinyint unsigned"); + + b.Property("Freckles") + .HasColumnType("tinyint unsigned"); + + b.Property("FrecklesOpacity") + .HasColumnType("float"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Hair") + .HasColumnType("tinyint unsigned"); + + b.Property("HairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("HairHighlightColor") + .HasColumnType("tinyint unsigned"); + + b.Property("JawShape") + .HasColumnType("float"); + + b.Property("JawWidth") + .HasColumnType("float"); + + b.Property("LipThickness") + .HasColumnType("float"); + + b.Property("Lipstick") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickColor") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickOpacity") + .HasColumnType("float"); + + b.Property("Makeup") + .HasColumnType("tinyint unsigned"); + + b.Property("MakeupOpacity") + .HasColumnType("float"); + + b.Property("Mother") + .HasColumnType("tinyint unsigned"); + + b.Property("NeckWidth") + .HasColumnType("float"); + + b.Property("NoseBottomHeight") + .HasColumnType("float"); + + b.Property("NoseBridgeDepth") + .HasColumnType("float"); + + b.Property("NoseBroken") + .HasColumnType("float"); + + b.Property("NoseTipHeight") + .HasColumnType("float"); + + b.Property("NoseTipLength") + .HasColumnType("float"); + + b.Property("NoseWidth") + .HasColumnType("float"); + + b.Property("Similarity") + .HasColumnType("float"); + + b.Property("SkinSimilarity") + .HasColumnType("float"); + + b.Property("SunDamage") + .HasColumnType("tinyint unsigned"); + + b.Property("SunDamageOpacity") + .HasColumnType("float"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Characters"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("Duty") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.Property("Texture") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CharacterClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Top") + .HasColumnType("int"); + + b.Property("Torso") + .HasColumnType("int"); + + b.Property("Undershirt") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ClothCombinations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Radius") + .HasColumnType("float"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("Doors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("DutyClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("GangOwned") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("StateOwned") + .HasColumnType("tinyint(1)"); + + b.Property("WeaponDealTime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Factions"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("FactionBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RankName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionRanks"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammount") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Rank") + .HasColumnType("int"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Description") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("GotoPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("GroupBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("CanRentIn") + .HasColumnType("tinyint(1)"); + + b.Property("LastRentSetTime") + .HasColumnType("datetime(6)"); + + b.Property("OwnerId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("RentalFee") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Houses"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("HouseBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("HouseId"); + + b.HasIndex("UserId"); + + b.ToTable("HouseRentals"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("EnterPositionStr") + .HasColumnName("EnterPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("ExitPositionStr") + .HasColumnName("ExitPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("Interiors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("double"); + + b.Property("X") + .HasColumnType("double"); + + b.Property("Y") + .HasColumnType("double"); + + b.Property("Z") + .HasColumnType("double"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Fee") + .HasColumnType("int"); + + b.Property("MoneySent") + .HasColumnType("int"); + + b.Property("NewReceiverBalance") + .HasColumnType("int"); + + b.Property("NewSenderBalance") + .HasColumnType("int"); + + b.Property("Origin") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Receiver") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("ReceiverBalance") + .HasColumnType("int"); + + b.Property("Sender") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("SenderBalance") + .HasColumnType("int"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("BankAccountTransactionLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Command") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CommandLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CauseOfDeath") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("KillerHeading") + .HasColumnType("float"); + + b.Property("KillerId") + .HasColumnType("int"); + + b.Property("KillerPositionX") + .HasColumnType("float"); + + b.Property("KillerPositionY") + .HasColumnType("float"); + + b.Property("KillerPositionZ") + .HasColumnType("float"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("VictimHeading") + .HasColumnType("float"); + + b.Property("VictimId") + .HasColumnType("int"); + + b.Property("VictimPositionX") + .HasColumnType("float"); + + b.Property("VictimPositionY") + .HasColumnType("float"); + + b.Property("VictimPositionZ") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("KillerId"); + + b.HasIndex("VictimId"); + + b.ToTable("DeathLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("IpAddress") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("LoginLogout") + .HasColumnType("tinyint(1)"); + + b.Property("PlayerId") + .HasColumnType("bigint"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Username") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("LoginLogoutLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Caption") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Content") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Timestamp") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("News"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Alpha") + .HasColumnType("tinyint unsigned"); + + b.Property("Color") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("ShortRange") + .HasColumnType("tinyint(1)"); + + b.Property("Sprite") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("Blips"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DirectionX") + .HasColumnType("float"); + + b.Property("DirectionY") + .HasColumnType("float"); + + b.Property("DirectionZ") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("tinyint unsigned"); + + b.Property("Visible") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Markers"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("HashModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Peds"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("PositionX") + .HasColumnType("float") + .HasMaxLength(128); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RespawnTime") + .HasColumnType("int"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Vehicle") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Pickups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Font") + .HasColumnType("tinyint unsigned"); + + b.Property("LOS") + .HasColumnType("tinyint(1)"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Text") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("TextLabels"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Variable") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ServerVariables"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVehicle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("DistanceDriven") + .HasColumnType("float"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("Livery") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int unsigned"); + + b.Property("NumberPlate") + .HasColumnType("varchar(8) CHARACTER SET utf8mb4") + .HasMaxLength(8); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("PrimaryColor") + .HasColumnType("int"); + + b.Property("SecondaryColor") + .HasColumnType("int"); + + b.Property("TankAmount") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ServerVehicles"); + + b.HasDiscriminator("Discriminator").HasValue("ServerVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopClothe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("int"); + + b.Property("ClotheId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("TypeId") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ShopClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ShopItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.TuningGarage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("TuningGarages"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("MaxValue") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Owner") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Range") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Surplus") + .HasColumnType("tinyint(1)"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Vector") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Turfs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AdminLevel") + .HasColumnType("int"); + + b.Property("BanId") + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("BusSkill") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Dead") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseBike") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseVehicle") + .HasColumnType("tinyint(1)"); + + b.Property("Email") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("FactionLeader") + .HasColumnType("tinyint(1)"); + + b.Property("FactionRankId") + .HasColumnType("int"); + + b.Property("FlyingLicensePlane") + .HasColumnType("tinyint(1)"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("GroupRank") + .HasColumnType("int"); + + b.Property("Handmoney") + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("JailTime") + .HasColumnType("int"); + + b.Property("JobId") + .HasColumnType("int"); + + b.Property("LogUserId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Password") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("PaydayTimer") + .HasColumnType("int"); + + b.Property("PilotSkill") + .HasColumnType("int"); + + b.Property("PlayedMinutes") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RegistrationDate") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("SocialClubName") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Wage") + .HasColumnType("int"); + + b.Property("Wanteds") + .HasColumnType("int"); + + b.Property("WeaponLicense") + .HasColumnType("tinyint(1)"); + + b.Property("failpoints") + .HasColumnType("int"); + + b.Property("otheramount") + .HasColumnType("int"); + + b.Property("trashcount") + .HasColumnType("int"); + + b.Property("warn") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BanId"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.HasIndex("CharacterId"); + + b.HasIndex("FactionId"); + + b.HasIndex("FactionRankId"); + + b.HasIndex("GroupId"); + + b.HasIndex("HouseId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("UserBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("WeaponId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("WeaponId"); + + b.ToTable("UserWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ModId") + .HasColumnType("int"); + + b.Property("ServerVehicleId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ServerVehicleId", "Slot") + .IsUnique(); + + b.ToTable("VehicleMods"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("AmmunationActive") + .HasColumnType("tinyint(1)"); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Legal") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.ToTable("Weapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.WeaponCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WeaponCategories"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Whitelist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WhitelistEntries"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BuyPrice") + .HasColumnType("int"); + + b.Property("Owners") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.ToTable("FactionVehicles"); + + b.HasDiscriminator().HasValue("FactionVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.JobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("JobId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("JobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobSpawnVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobSpawnVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("SavedVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.SchoolVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("SchoolId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("SchoolVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.ToTable("ShopVehicles"); + + b.HasDiscriminator().HasValue("ShopVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("Price") + .HasColumnName("UserVehicle_Price") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasIndex("UserId"); + + b.ToTable("UserVehicles"); + + b.HasDiscriminator().HasValue("UserVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.BusRoute", "BusRoute") + .WithMany("RoutePoints") + .HasForeignKey("BusRouteId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.FactionBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.GroupBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.HouseBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany("Rentals") + .HasForeignKey("HouseId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") + .WithMany() + .HasForeignKey("KillerId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Victim") + .WithMany() + .HasForeignKey("VictimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Ban", "Ban") + .WithMany() + .HasForeignKey("BanId"); + + b.HasOne("ReallifeGamemode.Database.Entities.UserBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Character", "Character") + .WithMany() + .HasForeignKey("CharacterId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + + b.HasOne("ReallifeGamemode.Database.Entities.FactionRank", "FactionRank") + .WithMany() + .HasForeignKey("FactionRankId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany() + .HasForeignKey("HouseId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ReallifeGamemode.Database.Entities.Weapon", "Weapon") + .WithMany() + .HasForeignKey("WeaponId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("ServerVehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.WeaponCategory", "WeaponCategory") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.cs b/ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.cs new file mode 100644 index 00000000..7f6b3fef --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210419100958_LoginLogoutLogs.cs @@ -0,0 +1,48 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class LoginLogoutLogs : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "LoginLogoutLogs", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + Username = table.Column(nullable: true), + SocialClubName = table.Column(nullable: true), + UserId = table.Column(nullable: true), + PlayerId = table.Column(nullable: false), + IpAddress = table.Column(nullable: true), + LoginLogout = table.Column(nullable: false), + Time = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_LoginLogoutLogs", x => x.Id); + table.ForeignKey( + name: "FK_LoginLogoutLogs_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_LoginLogoutLogs_UserId", + table: "LoginLogoutLogs", + column: "UserId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "LoginLogoutLogs"); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index 5432790d..3937a6b0 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -872,6 +872,40 @@ namespace ReallifeGamemode.Database.Migrations b.ToTable("DeathLogs"); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("IpAddress") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("LoginLogout") + .HasColumnType("tinyint(1)"); + + b.Property("PlayerId") + .HasColumnType("bigint"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Username") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("LoginLogoutLogs"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => { b.Property("Id") @@ -1898,6 +1932,13 @@ namespace ReallifeGamemode.Database.Migrations .IsRequired(); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => { b.HasOne("ReallifeGamemode.Database.Entities.User", "User") diff --git a/ReallifeGamemode.Database/Models/DatabaseContext.cs b/ReallifeGamemode.Database/Models/DatabaseContext.cs index 673a0684..6d06c435 100644 --- a/ReallifeGamemode.Database/Models/DatabaseContext.cs +++ b/ReallifeGamemode.Database/Models/DatabaseContext.cs @@ -98,6 +98,7 @@ namespace ReallifeGamemode.Database.Models public DbSet BankAccountTransactionLogs { get; set; } public DbSet DeathLogs { get; set; } public DbSet CommandLogs { get; set; } + public DbSet LoginLogoutLogs { get; set; } //Saves public DbSet ATMs { get; set; } diff --git a/ReallifeGamemode.Server/Events/Disconnect.cs b/ReallifeGamemode.Server/Events/Disconnect.cs index 14d74fb3..356d548b 100644 --- a/ReallifeGamemode.Server/Events/Disconnect.cs +++ b/ReallifeGamemode.Server/Events/Disconnect.cs @@ -17,6 +17,7 @@ using ReallifeGamemode.Server.Report; using ReallifeGamemode.Server.Factions.Medic; using ReallifeGamemode.Server.Inventory.Interfaces; using ReallifeGamemode.Server.Inventory; +using ReallifeGamemode.Database.Entities.Logs; /** * @overview Life of German Reallife - Event Login (Login.cs) @@ -40,6 +41,19 @@ namespace ReallifeGamemode.Server.Events return; } + var logEntry = new LoginLogoutLogEntry() + { + LoginLogout = false, + User = user, + PlayerId = player.Handle.Value, + Username = player.Name, + SocialClubName = player.SocialClubName, + IpAddress = player.Address, + Time = DateTime.Now, + }; + + saveUser.LoginLogoutLogs.Add(logEntry); + if (type == DisconnectionType.Left) { NAPI.Util.ConsoleOutput(player.Name + " left"); diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index de2ba0cd..197ccbdc 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -13,6 +13,7 @@ using ReallifeGamemode.Database.Entities; using System; using System.Collections.Generic; using ReallifeGamemode.Server.Inventory.Interfaces; +using ReallifeGamemode.Database.Entities.Logs; /** * @overview Life of German Reallife - Event Login (Login.cs) @@ -56,6 +57,20 @@ namespace ReallifeGamemode.Server.Events return; } + var logEntry = new LoginLogoutLogEntry() + { + IpAddress = player.Address, + User = user, + PlayerId = player.Handle.Value, + SocialClubName = player.SocialClubName, + Username = player.Name, + LoginLogout = true, + Time = DateTime.Now + }; + + dbContext.LoginLogoutLogs.Add(logEntry); + dbContext.SaveChanges(); + player.SetData("dbId", user.Id); player.Name = username; player.TriggerEvent("SERVER:Login_Success"); diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index 1ec96ced..37baf622 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -6,6 +6,7 @@ using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Util; using System; +using ReallifeGamemode.Database.Entities.Logs; /** * @overview Life of German Reallife - Event Register (Register.cs) @@ -51,7 +52,20 @@ namespace ReallifeGamemode.Server.Events } }; + var logEntry = new LoginLogoutLogEntry() + { + IpAddress = player.Address, + User = user, + PlayerId = player.Handle.Value, + SocialClubName = player.SocialClubName, + Username = player.Name, + LoginLogout = true, + Time = DateTime.Now + }; + dbContext.Users.Add(user); + dbContext.LoginLogoutLogs.Add(logEntry); + dbContext.SaveChanges(); player.SetData("dbId", user.Id); From 8485102e49148e869467d03f3780937181d7ed46 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 14:15:08 +0200 Subject: [PATCH 31/53] chat logs --- .../Entities/Logs/Chat/ChatLogEntry.cs | 23 + .../Logs/Chat/DepartmentChatLogEntry.cs | 10 + .../Entities/Logs/Chat/FactionChatLogEntry.cs | 15 + .../Entities/Logs/Chat/GangChatLogEntry.cs | 10 + .../Entities/Logs/Chat/GroupChatLogEntry.cs | 15 + .../Entities/Logs/Chat/LeaderChatLogEntry.cs | 10 + .../Entities/Logs/Chat/LocalChatLogEntry.cs | 10 + .../Entities/Logs/Chat/NewsChatLogEntry.cs | 10 + .../Entities/Logs/Chat/OChatLogEntry.cs | 10 + .../20210419104509_ChatLogs.Designer.cs | 2167 +++++++++++++++++ .../Migrations/20210419104509_ChatLogs.cs | 70 + .../DatabaseContextModelSnapshot.cs | 116 + .../Models/DatabaseContext.cs | 17 +- .../Commands/AdminCommands.cs | 21 +- .../Commands/FactionCommands.cs | 138 +- .../Commands/GroupCommands.cs | 29 +- ReallifeGamemode.Server/Events/Chat.cs | 20 + 17 files changed, 2662 insertions(+), 29 deletions(-) create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/ChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/DepartmentChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/FactionChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/GangChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/GroupChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/LeaderChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/LocalChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/NewsChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Entities/Logs/Chat/OChatLogEntry.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.Designer.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.cs diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/ChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/ChatLogEntry.cs new file mode 100644 index 00000000..815c51cf --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/ChatLogEntry.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public abstract class ChatLogEntry + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + + [ForeignKey(nameof(UserId))] + public User User { get; set; } + + public int UserId { get; set; } + + public string Text { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public DateTime Time { get; set; } + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/DepartmentChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/DepartmentChatLogEntry.cs new file mode 100644 index 00000000..625812d4 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/DepartmentChatLogEntry.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class DepartmentChatLogEntry : ChatLogEntry + { + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/FactionChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/FactionChatLogEntry.cs new file mode 100644 index 00000000..b71e1767 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/FactionChatLogEntry.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class FactionChatLogEntry : ChatLogEntry + { + [ForeignKey(nameof(Faction))] + public int FactionId { get; set; } + + public Faction Faction { get; set; } + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/GangChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/GangChatLogEntry.cs new file mode 100644 index 00000000..8df7c95e --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/GangChatLogEntry.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class GangChatLogEntry : ChatLogEntry + { + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/GroupChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/GroupChatLogEntry.cs new file mode 100644 index 00000000..75768a04 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/GroupChatLogEntry.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class GroupChatLogEntry : ChatLogEntry + { + public int GroupId { get; set; } + + [ForeignKey(nameof(GroupId))] + public Group Group { get; set; } + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/LeaderChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/LeaderChatLogEntry.cs new file mode 100644 index 00000000..ab1052c2 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/LeaderChatLogEntry.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class LeaderChatLogEntry : ChatLogEntry + { + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/LocalChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/LocalChatLogEntry.cs new file mode 100644 index 00000000..1d68b01a --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/LocalChatLogEntry.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class LocalChatLogEntry : ChatLogEntry + { + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/NewsChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/NewsChatLogEntry.cs new file mode 100644 index 00000000..80cc617c --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/NewsChatLogEntry.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class NewsChatLogEntry : ChatLogEntry + { + } +} diff --git a/ReallifeGamemode.Database/Entities/Logs/Chat/OChatLogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/Chat/OChatLogEntry.cs new file mode 100644 index 00000000..4a9dbbe7 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/Chat/OChatLogEntry.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs.Chat +{ + public class OChatLogEntry : ChatLogEntry + { + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.Designer.cs b/ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.Designer.cs new file mode 100644 index 00000000..5b6acf89 --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.Designer.cs @@ -0,0 +1,2167 @@ +// +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("20210419104509_ChatLogs")] + partial class ChatLogs + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("PropertyAccessMode", PropertyAccessMode.PreferFieldDuringConstruction) + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Faulty") + .HasColumnType("tinyint(1)"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ATMs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Applied") + .HasColumnType("int"); + + b.Property("BannedBy") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Reason") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("UntilDateTime") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Bans"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("BusRoutes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusRouteId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BusRouteId"); + + b.ToTable("BusRoutesPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.ToTable("BusinessBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("BusinessData"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ageing") + .HasColumnType("tinyint unsigned"); + + b.Property("AgeingOpacity") + .HasColumnType("float"); + + b.Property("BeardColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Blemishes") + .HasColumnType("tinyint unsigned"); + + b.Property("BlemishesOpacity") + .HasColumnType("float"); + + b.Property("Blush") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushColor") + .HasColumnType("tinyint unsigned"); + + b.Property("BlushOpacity") + .HasColumnType("float"); + + b.Property("BrowDepth") + .HasColumnType("float"); + + b.Property("BrowHeight") + .HasColumnType("float"); + + b.Property("CheekDepth") + .HasColumnType("float"); + + b.Property("CheekboneHeight") + .HasColumnType("float"); + + b.Property("CheekboneWidth") + .HasColumnType("float"); + + b.Property("ChestHair") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("ChestHairOpacity") + .HasColumnType("float"); + + b.Property("ChinDepth") + .HasColumnType("float"); + + b.Property("ChinHeight") + .HasColumnType("float"); + + b.Property("ChinIndent") + .HasColumnType("float"); + + b.Property("ChinWidth") + .HasColumnType("float"); + + b.Property("Complexion") + .HasColumnType("tinyint unsigned"); + + b.Property("ComplexionOpacity") + .HasColumnType("float"); + + b.Property("EyeColor") + .HasColumnType("tinyint unsigned"); + + b.Property("EyeSize") + .HasColumnType("float"); + + b.Property("EyebrowColor") + .HasColumnType("tinyint unsigned"); + + b.Property("Eyebrows") + .HasColumnType("tinyint unsigned"); + + b.Property("EyebrowsOpacity") + .HasColumnType("float"); + + b.Property("FacialHair") + .HasColumnType("tinyint unsigned"); + + b.Property("FacialHairOpacity") + .HasColumnType("float"); + + b.Property("Father") + .HasColumnType("tinyint unsigned"); + + b.Property("Freckles") + .HasColumnType("tinyint unsigned"); + + b.Property("FrecklesOpacity") + .HasColumnType("float"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Hair") + .HasColumnType("tinyint unsigned"); + + b.Property("HairColor") + .HasColumnType("tinyint unsigned"); + + b.Property("HairHighlightColor") + .HasColumnType("tinyint unsigned"); + + b.Property("JawShape") + .HasColumnType("float"); + + b.Property("JawWidth") + .HasColumnType("float"); + + b.Property("LipThickness") + .HasColumnType("float"); + + b.Property("Lipstick") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickColor") + .HasColumnType("tinyint unsigned"); + + b.Property("LipstickOpacity") + .HasColumnType("float"); + + b.Property("Makeup") + .HasColumnType("tinyint unsigned"); + + b.Property("MakeupOpacity") + .HasColumnType("float"); + + b.Property("Mother") + .HasColumnType("tinyint unsigned"); + + b.Property("NeckWidth") + .HasColumnType("float"); + + b.Property("NoseBottomHeight") + .HasColumnType("float"); + + b.Property("NoseBridgeDepth") + .HasColumnType("float"); + + b.Property("NoseBroken") + .HasColumnType("float"); + + b.Property("NoseTipHeight") + .HasColumnType("float"); + + b.Property("NoseTipLength") + .HasColumnType("float"); + + b.Property("NoseWidth") + .HasColumnType("float"); + + b.Property("Similarity") + .HasColumnType("float"); + + b.Property("SkinSimilarity") + .HasColumnType("float"); + + b.Property("SunDamage") + .HasColumnType("tinyint unsigned"); + + b.Property("SunDamageOpacity") + .HasColumnType("float"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Characters"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("Duty") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.Property("Texture") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CharacterClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Top") + .HasColumnType("int"); + + b.Property("Torso") + .HasColumnType("int"); + + b.Property("Undershirt") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ClothCombinations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Radius") + .HasColumnType("float"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("Doors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ClothId") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("SlotType") + .HasColumnType("tinyint unsigned"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("DutyClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("GangOwned") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("StateOwned") + .HasColumnType("tinyint(1)"); + + b.Property("WeaponDealTime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Factions"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("FactionBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RankName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionRanks"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammount") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("Rank") + .HasColumnType("int"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("FactionId"); + + b.ToTable("FactionWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Description") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("GotoPoints"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("GroupBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("CanRentIn") + .HasColumnType("tinyint(1)"); + + b.Property("LastRentSetTime") + .HasColumnType("datetime(6)"); + + b.Property("OwnerId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("RentalFee") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Houses"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Balance") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("HouseBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("HouseId"); + + b.HasIndex("UserId"); + + b.ToTable("HouseRentals"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("EnterPositionStr") + .HasColumnName("EnterPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("ExitPositionStr") + .HasColumnName("ExitPosition") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("Interiors"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("double"); + + b.Property("X") + .HasColumnType("double"); + + b.Property("Y") + .HasColumnType("double"); + + b.Property("Z") + .HasColumnType("double"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Fee") + .HasColumnType("int"); + + b.Property("MoneySent") + .HasColumnType("int"); + + b.Property("NewReceiverBalance") + .HasColumnType("int"); + + b.Property("NewSenderBalance") + .HasColumnType("int"); + + b.Property("Origin") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Receiver") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("ReceiverBalance") + .HasColumnType("int"); + + b.Property("Sender") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("SenderBalance") + .HasColumnType("int"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("BankAccountTransactionLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Text") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ChatLogs"); + + b.HasDiscriminator("Discriminator").HasValue("ChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Command") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CommandLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CauseOfDeath") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("KillerHeading") + .HasColumnType("float"); + + b.Property("KillerId") + .HasColumnType("int"); + + b.Property("KillerPositionX") + .HasColumnType("float"); + + b.Property("KillerPositionY") + .HasColumnType("float"); + + b.Property("KillerPositionZ") + .HasColumnType("float"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("VictimHeading") + .HasColumnType("float"); + + b.Property("VictimId") + .HasColumnType("int"); + + b.Property("VictimPositionX") + .HasColumnType("float"); + + b.Property("VictimPositionY") + .HasColumnType("float"); + + b.Property("VictimPositionZ") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("KillerId"); + + b.HasIndex("VictimId"); + + b.ToTable("DeathLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("IpAddress") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("LoginLogout") + .HasColumnType("tinyint(1)"); + + b.Property("PlayerId") + .HasColumnType("bigint"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Username") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("LoginLogoutLogs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Caption") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Content") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Timestamp") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("News"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Alpha") + .HasColumnType("tinyint unsigned"); + + b.Property("Color") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("ShortRange") + .HasColumnType("tinyint(1)"); + + b.Property("Sprite") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("Blips"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DirectionX") + .HasColumnType("float"); + + b.Property("DirectionY") + .HasColumnType("float"); + + b.Property("DirectionZ") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Scale") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("tinyint unsigned"); + + b.Property("Visible") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Markers"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("HashModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Peds"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("PositionX") + .HasColumnType("float") + .HasMaxLength(128); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RespawnTime") + .HasColumnType("int"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Vehicle") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Pickups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("ColorA") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorB") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorG") + .HasColumnType("tinyint unsigned"); + + b.Property("ColorR") + .HasColumnType("tinyint unsigned"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("DrawDistance") + .HasColumnType("float"); + + b.Property("Font") + .HasColumnType("tinyint unsigned"); + + b.Property("LOS") + .HasColumnType("tinyint(1)"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Text") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("TextLabels"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Variable") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ServerVariables"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVehicle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("DistanceDriven") + .HasColumnType("float"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("Livery") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int unsigned"); + + b.Property("NumberPlate") + .HasColumnType("varchar(8) CHARACTER SET utf8mb4") + .HasMaxLength(8); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("PrimaryColor") + .HasColumnType("int"); + + b.Property("SecondaryColor") + .HasColumnType("int"); + + b.Property("TankAmount") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ServerVehicles"); + + b.HasDiscriminator("Discriminator").HasValue("ServerVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopClothe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("int"); + + b.Property("ClotheId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("TypeId") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ShopClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ShopItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.TuningGarage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("TuningGarages"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("MaxValue") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Owner") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Range") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Surplus") + .HasColumnType("tinyint(1)"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Vector") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Turfs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AdminLevel") + .HasColumnType("int"); + + b.Property("BanId") + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("BusSkill") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Dead") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseBike") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseVehicle") + .HasColumnType("tinyint(1)"); + + b.Property("Email") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("FactionLeader") + .HasColumnType("tinyint(1)"); + + b.Property("FactionRankId") + .HasColumnType("int"); + + b.Property("FlyingLicensePlane") + .HasColumnType("tinyint(1)"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("GroupRank") + .HasColumnType("int"); + + b.Property("Handmoney") + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("JailTime") + .HasColumnType("int"); + + b.Property("JobId") + .HasColumnType("int"); + + b.Property("LogUserId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Password") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("PaydayTimer") + .HasColumnType("int"); + + b.Property("PilotSkill") + .HasColumnType("int"); + + b.Property("PlayedMinutes") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RegistrationDate") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("SocialClubName") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Wage") + .HasColumnType("int"); + + b.Property("Wanteds") + .HasColumnType("int"); + + b.Property("WeaponLicense") + .HasColumnType("tinyint(1)"); + + b.Property("failpoints") + .HasColumnType("int"); + + b.Property("otheramount") + .HasColumnType("int"); + + b.Property("trashcount") + .HasColumnType("int"); + + b.Property("warn") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BanId"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.HasIndex("CharacterId"); + + b.HasIndex("FactionId"); + + b.HasIndex("FactionRankId"); + + b.HasIndex("GroupId"); + + b.HasIndex("HouseId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserBankAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Balance") + .HasColumnType("int"); + + b.Property("Bic") + .HasColumnType("varchar(12) CHARACTER SET utf8mb4") + .HasMaxLength(12); + + b.Property("Iban") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.HasKey("Id"); + + b.ToTable("UserBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("WeaponId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("WeaponId"); + + b.ToTable("UserWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ModId") + .HasColumnType("int"); + + b.Property("ServerVehicleId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ServerVehicleId", "Slot") + .IsUnique(); + + b.ToTable("VehicleMods"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("AmmunationActive") + .HasColumnType("tinyint(1)"); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Legal") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.ToTable("Weapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.WeaponCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WeaponCategories"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Whitelist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WhitelistEntries"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.DepartmentChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("DepartmentChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.HasIndex("FactionId"); + + b.HasDiscriminator().HasValue("FactionChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GangChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("GangChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LeaderChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LeaderChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LocalChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LocalChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.NewsChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("NewsChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.OChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("OChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BuyPrice") + .HasColumnType("int"); + + b.Property("Owners") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.ToTable("FactionVehicles"); + + b.HasDiscriminator().HasValue("FactionVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.JobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("JobId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("JobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobSpawnVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobSpawnVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("SavedVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.SchoolVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("SchoolId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("SchoolVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.ToTable("ShopVehicles"); + + b.HasDiscriminator().HasValue("ShopVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("Price") + .HasColumnName("UserVehicle_Price") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasIndex("UserId"); + + b.ToTable("UserVehicles"); + + b.HasDiscriminator().HasValue("UserVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.BusRoute", "BusRoute") + .WithMany("RoutePoints") + .HasForeignKey("BusRouteId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.FactionBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.GroupBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.HouseBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany("Rentals") + .HasForeignKey("HouseId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") + .WithMany() + .HasForeignKey("KillerId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Victim") + .WithMany() + .HasForeignKey("VictimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Ban", "Ban") + .WithMany() + .HasForeignKey("BanId"); + + b.HasOne("ReallifeGamemode.Database.Entities.UserBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Character", "Character") + .WithMany() + .HasForeignKey("CharacterId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + + b.HasOne("ReallifeGamemode.Database.Entities.FactionRank", "FactionRank") + .WithMany() + .HasForeignKey("FactionRankId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany() + .HasForeignKey("HouseId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ReallifeGamemode.Database.Entities.Weapon", "Weapon") + .WithMany() + .HasForeignKey("WeaponId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("ServerVehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.WeaponCategory", "WeaponCategory") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.cs b/ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.cs new file mode 100644 index 00000000..75e644a0 --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210419104509_ChatLogs.cs @@ -0,0 +1,70 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class ChatLogs : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ChatLogs", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + UserId = table.Column(nullable: true), + Text = table.Column(nullable: true), + Time = table.Column(nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + Discriminator = table.Column(nullable: false), + FactionId = table.Column(nullable: true), + GroupId = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ChatLogs", x => x.Id); + table.ForeignKey( + name: "FK_ChatLogs_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + column: x => x.FactionId, + principalTable: "Factions", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + column: x => x.GroupId, + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_ChatLogs_UserId", + table: "ChatLogs", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_ChatLogs_FactionId", + table: "ChatLogs", + column: "FactionId"); + + migrationBuilder.CreateIndex( + name: "IX_ChatLogs_GroupId", + table: "ChatLogs", + column: "GroupId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ChatLogs"); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index 3937a6b0..a13f30e6 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -797,6 +797,35 @@ namespace ReallifeGamemode.Database.Migrations b.ToTable("BankAccountTransactionLogs"); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Text") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Time") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ChatLogs"); + + b.HasDiscriminator("Discriminator").HasValue("ChatLogEntry"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => { b.Property("Id") @@ -1709,6 +1738,72 @@ namespace ReallifeGamemode.Database.Migrations b.ToTable("WhitelistEntries"); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.DepartmentChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("DepartmentChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.HasIndex("FactionId"); + + b.HasDiscriminator().HasValue("FactionChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GangChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("GangChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LeaderChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LeaderChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LocalChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LocalChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.NewsChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("NewsChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.OChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("OChatLogEntry"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => { b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); @@ -1912,6 +2007,13 @@ namespace ReallifeGamemode.Database.Migrations .HasForeignKey("UserId"); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => { b.HasOne("ReallifeGamemode.Database.Entities.User", "User") @@ -2028,6 +2130,20 @@ namespace ReallifeGamemode.Database.Migrations .IsRequired(); }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => { b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") diff --git a/ReallifeGamemode.Database/Models/DatabaseContext.cs b/ReallifeGamemode.Database/Models/DatabaseContext.cs index 6d06c435..6a8fb10d 100644 --- a/ReallifeGamemode.Database/Models/DatabaseContext.cs +++ b/ReallifeGamemode.Database/Models/DatabaseContext.cs @@ -53,7 +53,7 @@ namespace ReallifeGamemode.Database.Models e.HasIndex(u => u.Name) .IsUnique(true); }); - + modelBuilder.Entity() .Property(sv => sv.Active) @@ -87,7 +87,7 @@ namespace ReallifeGamemode.Database.Models public DbSet FactionVehicles { get; set; } //Shops - public DbSet ShopClothes { get; set; } + public DbSet ShopClothes { get; set; } public DbSet ShopItems { get; set; } public DbSet Weapons { get; set; } public DbSet WeaponCategories { get; set; } @@ -100,6 +100,19 @@ namespace ReallifeGamemode.Database.Models public DbSet CommandLogs { get; set; } public DbSet LoginLogoutLogs { get; set; } + // Chat Logs + + public DbSet ChatLogs { get; set; } + public DbSet FactionChatLogs { get; set; } + public DbSet DepartmentChatLogs { get; set; } + public DbSet GangChatLogs { get; set; } + public DbSet GroupChatLogs { get; set; } + public DbSet LeaderChatLogs { get; set; } + public DbSet LocalChatLogs { get; set; } + public DbSet NewsChatLogs { get; set; } + public DbSet OChatLogs { get; set; } + + //Saves public DbSet ATMs { get; set; } public DbSet Blips { get; set; } diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 60ba7593..b2ab2901 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -7,6 +7,7 @@ using GTANetworkAPI; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; +using ReallifeGamemode.Database.Entities.Logs.Chat; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Business; using ReallifeGamemode.Server.Classes; @@ -302,13 +303,31 @@ namespace ReallifeGamemode.Server.Commands [Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)] public void CmdAdminO(Player player, string message) { - if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + if(!player.IsLoggedIn()) + { + return; + } + + using var dbContext = new DatabaseContext(); + User user = player.GetUser(dbContext); + + if (!user.IsAdmin(AdminLevel.SUPPORTER)) { ChatService.NotAuthorized(player); return; } message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); + + var logEntry = new OChatLogEntry() + { + Text = message, + UserId = user.Id, + }; + + dbContext.OChatLogs.Add(logEntry); + dbContext.SaveChanges(); + message = Regex.Replace(message, "#([0-9A-Fa-f]{6})", m => "!{" + m.Groups[0].Value + "}"); string publicMessage = "~b~(( " + player.GetUser().AdminLevel.GetName() + " " + player.Name + ": " + message + " ~b~))"; diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index d15cdab6..c3eede29 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -5,6 +5,7 @@ using System.Text.RegularExpressions; using GTANetworkAPI; using Microsoft.EntityFrameworkCore; using ReallifeGamemode.Database.Entities; +using ReallifeGamemode.Database.Entities.Logs.Chat; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Admin; using ReallifeGamemode.Server.Extensions; @@ -30,7 +31,15 @@ namespace ReallifeGamemode.Server.Commands [Command("f", "~m~Benutzung: ~s~/f [Nachricht]", GreedyArg = true)] public void CmdFactionF(Player player, string message) { - Faction f = player.GetUser()?.Faction; + if (!player.IsLoggedIn()) + { + return; + } + + using var dbContext = new DatabaseContext(); + User user = player.GetUser(); + + Faction f = user?.Faction; if (f == null || f.StateOwned) { ChatService.NotAuthorized(player); @@ -39,14 +48,31 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); - string broadcastMessage = "!{02FCFF}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + " **"; + var logEntry = new FactionChatLogEntry() + { + Text = message, + UserId = user.Id, + FactionId = user.Faction.Id, + }; + + dbContext.FactionChatLogs.Add(logEntry); + dbContext.SaveChanges(); + + string broadcastMessage = "!{02FCFF}** " + user.FactionRank.RankName + " " + player.Name + ": " + message + " **"; ChatService.BroadcastFaction(broadcastMessage, f); } [Command("ga", "~m~Benutzung: ~s~/ga [Nachricht]", GreedyArg = true)] public void CmdFactionGA(Player player, string message) { - User user = player.GetUser(); + if (!player.IsLoggedIn()) + { + return; + } + + using var dbContext = new DatabaseContext(); + + User user = player.GetUser(dbContext); Faction f = user?.Faction; if ((f == null || !f.GangOwned) && !user.IsAdmin(AdminLevel.ADMIN)) { @@ -60,13 +86,22 @@ namespace ReallifeGamemode.Server.Commands if (f?.GangOwned == true) { - rank = player.GetUser().GetFactionRank().RankName; + rank = user.FactionRank.RankName; } else { rank = "[ADMIN]"; } + var logEntry = new GangChatLogEntry() + { + Text = message, + UserId = user.Id, + }; + + dbContext.GangChatLogs.Add(logEntry); + dbContext.SaveChanges(); + string broadcastMessage = "!{FF0000}** " + rank + " " + player.Name + ": " + message + " **"; using (var context = new DatabaseContext()) { @@ -77,7 +112,14 @@ namespace ReallifeGamemode.Server.Commands [Command("r", "~m~Benutzung: ~s~/r [Nachricht]", GreedyArg = true)] public void CmdFactionR(Player player, string message) { - Faction f = player.GetUser()?.Faction; + if (!player.IsLoggedIn()) + { + return; + } + using var dbContext = new DatabaseContext(); + + User user = player.GetUser(dbContext); + Faction f = user?.Faction; if (f == null || !f.StateOwned) { ChatService.NotAuthorized(player); @@ -86,6 +128,16 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); + var logEntry = new FactionChatLogEntry() + { + Text = message, + UserId = user.Id, + Faction = user.Faction, + }; + + dbContext.FactionChatLogs.Add(logEntry); + dbContext.SaveChanges(); + string broadcastMessage = "!{33AA33}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **"; ChatService.BroadcastFaction(broadcastMessage, f); } @@ -93,9 +145,16 @@ namespace ReallifeGamemode.Server.Commands [Command("d", "~m~Benutzung: ~s~/d [Nachricht]", GreedyArg = true)] public void CmdFactionD(Player player, string message) { - User u = player.GetUser(); - Faction f = player.GetUser()?.Faction; - if ((f == null || !f.StateOwned) && !u.IsAdmin(AdminLevel.ADMIN)) + if (!player.IsLoggedIn()) + { + return; + } + + using var dbContext = new DatabaseContext(); + + User user = player.GetUser(dbContext); + Faction f = user?.Faction; + if ((f == null || !f.StateOwned) && !user.IsAdmin(AdminLevel.ADMIN)) { ChatService.NotAuthorized(player); return; @@ -107,13 +166,22 @@ namespace ReallifeGamemode.Server.Commands if (f?.StateOwned ?? false) { - factionName = u.GetFactionRank().RankName; + factionName = user.FactionRank.RankName; } else { factionName = "[ADMIN]"; } + var logEntry = new DepartmentChatLogEntry() + { + Text = message, + UserId = user.Id, + }; + + dbContext.DepartmentChatLogs.Add(logEntry); + dbContext.SaveChanges(); + string broadcastMessage = "!{CC3333}** " + factionName + " " + player.Name + ": " + message + ", over **"; using (var context = new DatabaseContext()) { @@ -128,23 +196,34 @@ namespace ReallifeGamemode.Server.Commands [Command("news", "~m~Benutzung: ~s~/news [Nachricht]", GreedyArg = true)] public void CmdFactionNR(Player player, string message) { - Faction f = player.GetUser()?.Faction; - if (f == null) + if (!player.IsLoggedIn()) + { + return; + } + + using var dbContext = new DatabaseContext(); + + User user = player.GetUser(dbContext); + + Faction f = user?.Faction; + if (f == null || f.Id != 9) { ChatService.NotAuthorized(player); return; } - if (player.GetUser().Faction.Id == 9) - { - message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); + message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); - string broadcastMessage = "!{ff9531}** News Reporter" + " " + player.Name + ": " + message + " **"; - ChatService.Broadcast(broadcastMessage); - } - else + var logEntry = new NewsChatLogEntry() { - return; - } + Text = message, + UserId = user.Id, + }; + + dbContext.NewsChatLogs.Add(logEntry); + dbContext.SaveChanges(); + + string broadcastMessage = "!{ff9531}** News Reporter" + " " + player.Name + ": " + message + " **"; + ChatService.Broadcast(broadcastMessage); } #endregion NewsReporter commands @@ -194,7 +273,13 @@ namespace ReallifeGamemode.Server.Commands [Command("lc", "~m~Benutzung: ~s~/lc [Nachricht]", GreedyArg = true)] public void CmdFactionLc(Player player, string message) { - User user = player.GetUser(); + if (!player.IsLoggedIn()) + { + return; + } + using var dbContext = new DatabaseContext(); + + User user = player.GetUser(dbContext); if ((user?.FactionId == null || user.FactionLeader == false) && !user.IsAdmin(AdminLevel.ADMIN)) { ChatService.NotAuthorized(player); @@ -203,10 +288,19 @@ namespace ReallifeGamemode.Server.Commands message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); + var logEntry = new LeaderChatLogEntry() + { + Text = message, + UserId = user.Id, + }; + + dbContext.LeaderChatLogs.Add(logEntry); + dbContext.SaveChanges(); + string factionName = string.Empty; if (user.FactionLeader) { - factionName = player.GetUser().Faction.Name; + factionName = user.Faction.Name; } else { diff --git a/ReallifeGamemode.Server/Commands/GroupCommands.cs b/ReallifeGamemode.Server/Commands/GroupCommands.cs index 47c790e9..88e89c03 100644 --- a/ReallifeGamemode.Server/Commands/GroupCommands.cs +++ b/ReallifeGamemode.Server/Commands/GroupCommands.cs @@ -1,5 +1,7 @@ -using System.Text.RegularExpressions; -using GTANetworkAPI; +using GTANetworkAPI; +using ReallifeGamemode.Database.Entities; +using ReallifeGamemode.Database.Entities.Logs.Chat; +using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Services; @@ -12,14 +14,33 @@ namespace ReallifeGamemode.Server.Commands [Command("gc", "~m~Benutzung: ~s~/gc [Nachricht]", GreedyArg = true)] public void CmdGroupG(Player player, string message) { - Database.Entities.Group group = player.GetUser().Group; + if(!player.IsLoggedIn()) + { + return; + } + + using var dbContext = new DatabaseContext(); + User user = player.GetUser(dbContext); + + Group group = user?.Group; if (group == null) { ChatService.NotAuthorized(player); return; } - message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); + + var logEntry = new GroupChatLogEntry() + { + Text = message, + UserId = user.Id, + GroupId = user.Group.Id + }; + + dbContext.GroupChatLogs.Add(logEntry); + dbContext.SaveChanges(); + + message = System.Text.RegularExpressions.Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); message = $"{player.Name}: {message}"; ChatService.BroadcastGroup(message, group); diff --git a/ReallifeGamemode.Server/Events/Chat.cs b/ReallifeGamemode.Server/Events/Chat.cs index 47f1e8fa..6d6782ca 100644 --- a/ReallifeGamemode.Server/Events/Chat.cs +++ b/ReallifeGamemode.Server/Events/Chat.cs @@ -1,5 +1,8 @@ using System.Text.RegularExpressions; using GTANetworkAPI; +using ReallifeGamemode.Database.Entities.Logs.Chat; +using ReallifeGamemode.Database.Models; +using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Services; namespace ReallifeGamemode.Server.Events @@ -9,8 +12,25 @@ namespace ReallifeGamemode.Server.Events [ServerEvent(Event.ChatMessage)] public void ChatEvent(Player player, string message) { + if(!player.IsLoggedIn()) + { + return; + } + string serverMsg = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", ""); if (serverMsg.Trim().Length == 0) return; + + using var dbContext = new DatabaseContext(); + + var logEntry = new LocalChatLogEntry() + { + Text = serverMsg, + UserId = player.GetUser(dbContext).Id + }; + + dbContext.LocalChatLogs.Add(logEntry); + dbContext.SaveChanges(); + NAPI.Player.GetPlayersInRadiusOfPlayer(25, player).ForEach(p => { ChatService.SendMessage(p, $"{player.Name} sagt: {serverMsg}"); From a9882992c36324238ba8857a281472e0ec0680ad Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 19:59:02 +0200 Subject: [PATCH 32/53] afk 10 min --- ReallifeGamemode.Client/Player/antiafk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index b8060c0c..1db1251f 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -30,7 +30,7 @@ } } - if (afkCounter >= 30) { + if (afkCounter >= 60) { afkStatus = true; globalData.IsAfk = afkStatus; setServerAfkStatus(afkStatus); From e30f1bb7f351e7bc4b8a22eb58b6cf6a00f3cb61 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 21:16:15 +0200 Subject: [PATCH 33/53] admin unshow und tsupport links anzeigen --- ReallifeGamemode.Client/Gui/blips.ts | 15 ++++-- ReallifeGamemode.Client/Gui/infobox.ts | 46 ++++++++++++++----- ReallifeGamemode.Client/Gui/nametags.ts | 4 ++ .../Entities/Logs/LogEntry.cs | 30 ++++++++++++ .../Commands/AdminCommands.cs | 29 ++++++++++++ .../Extensions/ClientExtension.cs | 8 +++- 6 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 ReallifeGamemode.Database/Entities/Logs/LogEntry.cs diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index 1c44de47..250bed9a 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -26,13 +26,22 @@ } let pBlip = playerBlipMap.get(player); if (player.isDead()) { - pBlip.setSprite(303); + pBlip.setSprite(274); + pBlip.setScale(0.5); } else { pBlip.setSprite(1); + pBlip.setSprite(0.7); } let color = player.getVariable("blipColor"); - pBlip.setColour(isNaN(color) ? 0 : color); - pBlip.setPosition(player.position.x, player.position.y, player.position.z); + + if (color === -1) { + pBlip.setAlpha(0); + } else { + pBlip.setAlpha(200); + + pBlip.setColour(isNaN(color) ? 0 : color); + pBlip.setPosition(player.position.x, player.position.y, player.position.z); + } }); }, 50); diff --git a/ReallifeGamemode.Client/Gui/infobox.ts b/ReallifeGamemode.Client/Gui/infobox.ts index eb8a65fa..5e53bb15 100644 --- a/ReallifeGamemode.Client/Gui/infobox.ts +++ b/ReallifeGamemode.Client/Gui/infobox.ts @@ -14,6 +14,8 @@ export default function (globalData: IGlobalData): void { var draw = false; var editMode = false; var adutyMode = false; + var adminUnshow = false; + var adminTSupport = false; var dutyMode = false; let jailTime = 0; let att_score = 0; @@ -62,6 +64,14 @@ export default function (globalData: IGlobalData): void { adutyMode = toggle; }); + mp.events.add('toggleTSupportMode', (toggle) => { + adminTSupport = toggle; + }); + + mp.events.add('toggleAdminUnshowMode', (toggle) => { + adminUnshow = toggle; + }); + mp.events.add("toggleEditMode", (toggle) => { editMode = toggle; }); @@ -300,16 +310,6 @@ export default function (globalData: IGlobalData): void { centre: false }) } - if (adutyMode === true) { - mp.game.graphics.drawText("~r~SUPPORT", [0.92, 0.6], - { - font: 2, - color: [0, 255, 255, 255], - scale: [0.7, 0.7], - outline: true, - centre: false - }) - } if (dutyMode === true) { mp.game.graphics.drawText("~r~Duty", [0.92, 0.55], { @@ -320,7 +320,31 @@ export default function (globalData: IGlobalData): void { centre: false }) } - + if (adutyMode === true) { + var adutyText = "~r~SUPPORT"; + if (adminTSupport) { + adutyText = "SUPPORT"; + } + mp.game.graphics.drawText(adutyText, [0.92, 0.6], + { + font: 2, + color: [0, 229, 238, 255], + scale: [0.7, 0.7], + outline: true, + centre: false + }) + } + if (adminUnshow) { + mp.game.graphics.drawText("~r~UNSHOW", [0.92, 0.65], + { + font: 2, + color: [0, 255, 255, 255], + scale: [0.7, 0.7], + outline: true, + centre: false + }) + } + if (countdown > 0) { var now = Date.now(); var diff = Math.trunc((now - cdTimestamp) / 1000); diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts index 21e76eea..1c106922 100644 --- a/ReallifeGamemode.Client/Gui/nametags.ts +++ b/ReallifeGamemode.Client/Gui/nametags.ts @@ -49,6 +49,10 @@ export default function customNametags() { let colorId = game.players.at(player.remoteId).nametagColor; + if (colorId === -3) { + return; + } + let color = colors.find(c => c.id === colorId).color; let nametagText = player.name + " (" + player.remoteId + ")"; diff --git a/ReallifeGamemode.Database/Entities/Logs/LogEntry.cs b/ReallifeGamemode.Database/Entities/Logs/LogEntry.cs new file mode 100644 index 00000000..0b025ba2 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/Logs/LogEntry.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace ReallifeGamemode.Database.Entities.Logs +{ + public class LogEntry + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + + public User User { get; set; } + + public int UserId { get; set; } + + public User AffectedBy { get; set; } + + public int? AffectedById { get; set; } + + public Faction AffectedFaction { get; set; } + + public int? AffectedFactionId { get; set; } + + public string Message { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public DateTime Time { get; set; } + } +} diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index b2ab2901..8706a6b4 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -259,11 +259,13 @@ namespace ReallifeGamemode.Server.Commands } if (player.GetData("SAdminduty") == false) { + player.TriggerEvent("toggleTSupportMode", true); player.SetData("SAdminduty", true); ChatService.SendMessage(player, "~g~ ** " + "Du befindest dich im T-Support"); } else { + player.TriggerEvent("toggleTSupportMode", false); player.SetData("SAdminduty", false); ChatService.SendMessage(player, "!{#ee4d2e}** " + "Du befindest dich nicht mehr im T-Support"); } @@ -1442,6 +1444,33 @@ namespace ReallifeGamemode.Server.Commands Medic.delReviveTask(target); } + [Command("aunshow", "~m~Benutzung:~s~ /aunshow")] + public void CmdAdminUnshow(Player player) + { + User user = player.GetUser(); + if (!user.IsAdmin(AdminLevel.HEADADMIN)) + { + ChatService.NotAuthorized(player); + return; + } + + bool currentStatus = user.GetData("adminUnshow"); + currentStatus = !currentStatus; + user.SetData("adminUnshow", currentStatus); + player.TriggerEvent("toggleAdminUnshowMode", currentStatus); + + user.SetBlipAndNametagColor(); + + if(currentStatus) + { + ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du bist nun Unshow"); + } + else + { + ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du bist nun nicht mehr Unshow"); + } + } + [Command("setap", "~m~Benutzung: ~s~/setap [Spieler] (Armor)")] public void CmdAdminSetAP(Player player, string name, int armor = 100) { diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 80ef22a7..3a665dd0 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -345,8 +345,14 @@ namespace ReallifeGamemode.Server.Extensions } bool duty = user.GetData("duty"); + bool adminUnshow = user.GetData("adminUnshow"); - if (player.GetData("SAdminduty")) + if(adminUnshow) + { + blipColor = -1; + nameTagColor = -3; + } + else if (player.GetData("SAdminduty")) { blipColor = 30; nameTagColor = -2; From 3e547afa2357e8b417e84c61ea51def571df3e1b Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 21:22:10 +0200 Subject: [PATCH 34/53] blips verbuggt --- ReallifeGamemode.Client/Gui/blips.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index 250bed9a..09189ddc 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -34,8 +34,8 @@ } let color = player.getVariable("blipColor"); - if (color === -1) { - pBlip.setAlpha(0); + if (color == -1) { + //pBlip.setAlpha(0); } else { pBlip.setAlpha(200); From 3265a91dcd178e2373cae2b95192ded7347635f5 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 21:24:44 +0200 Subject: [PATCH 35/53] blips bruch --- ReallifeGamemode.Client/Gui/blips.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index 09189ddc..cacfdfdb 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -34,15 +34,11 @@ } let color = player.getVariable("blipColor"); - if (color == -1) { - //pBlip.setAlpha(0); - } else { - pBlip.setAlpha(200); - pBlip.setColour(isNaN(color) ? 0 : color); - pBlip.setPosition(player.position.x, player.position.y, player.position.z); - } - + + pBlip.setColour(isNaN(color) ? 0 : color); + pBlip.setPosition(player.position.x, player.position.y, player.position.z); + }); }, 50); From 6da99e8bccf2abb857d76a8ee7b7557ab452eb54 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 21:28:12 +0200 Subject: [PATCH 36/53] blips bruch ^2 --- ReallifeGamemode.Client/Gui/blips.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index cacfdfdb..e1136141 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -30,15 +30,19 @@ pBlip.setScale(0.5); } else { pBlip.setSprite(1); - pBlip.setSprite(0.7); + pBlip.setScale(0.7); } let color = player.getVariable("blipColor"); + if (color == -1) { + pBlip.setAlpha(0); + } else { + pBlip.setAlpha(200); - - pBlip.setColour(isNaN(color) ? 0 : color); - pBlip.setPosition(player.position.x, player.position.y, player.position.z); - + pBlip.setColour(isNaN(color) ? 0 : color); + pBlip.setPosition(player.position.x, player.position.y, player.position.z); + } + }); }, 50); From 5fef1ab564c5097e577fe963f19ccd3e036da6d6 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 21:30:42 +0200 Subject: [PATCH 37/53] dead blip 0.7 scale --- ReallifeGamemode.Client/Gui/blips.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index e1136141..1716d787 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -27,7 +27,7 @@ let pBlip = playerBlipMap.get(player); if (player.isDead()) { pBlip.setSprite(274); - pBlip.setScale(0.5); + pBlip.setScale(0.7); } else { pBlip.setSprite(1); pBlip.setScale(0.7); From 478427ea3e5afde5202358e4097aeb49225413e5 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 21:36:06 +0200 Subject: [PATCH 38/53] test unshow --- ReallifeGamemode.Client/Gui/blips.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index 1716d787..85b9e1ae 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -36,8 +36,10 @@ if (color == -1) { pBlip.setAlpha(0); + player.setAlpha(0); } else { pBlip.setAlpha(200); + player.setAlpha(255); pBlip.setColour(isNaN(color) ? 0 : color); pBlip.setPosition(player.position.x, player.position.y, player.position.z); From 262c8bbe03a6f0f08b6dd6f46b3a3cf86bea61cb Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 18 Apr 2021 01:37:30 +0200 Subject: [PATCH 39/53] Add Car sell confirmation --- ReallifeGamemode.Server/Events/Key.cs | 16 ++++++++++ .../Managers/InteractionManager.cs | 30 +++++++++++++------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index b1fd2ed1..92a7af80 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -625,6 +625,15 @@ namespace ReallifeGamemode.Server.Events return; } + if(player.GetData("SellVehicleDecision") == true && player.HasData("VehicleToSell")) + { + InteractionManager.SellPlayerVehicle(player, player.GetData("VehicleToSell")); + player.ResetData("SellVehicleDecision"); + player.ResetData("VehicleToSell"); + player.SendNotification("~g~Du hast dein Fahrzeug verkauft"); + return; + } + User u = player.GetUser(); if (u.JobId == null) return; @@ -780,6 +789,13 @@ namespace ReallifeGamemode.Server.Events Medic.MakeHealDecision(player, false); return; } + if (player.GetData("SellVehicleDecision") == true && player.HasData("VehicleToSell")) + { + player.ResetData("SellVehicleDecision"); + player.ResetData("VehicleToSell"); + player.SendNotification("~r~Du hast den Fahrzeugverkauf abgebrochen"); + return; + } if (!player.IsInVehicle) return; if (player.VehicleSeat != 0) return; diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index d94029a1..1cc4b1a4 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -473,18 +473,30 @@ namespace ReallifeGamemode.Server.Managers { var vehPrice = userVehicle.Price; var backPrice = (int)(vehPrice * 0.4); - - user.BankAccount.Balance += backPrice; - - ChatService.SendMessage(player, $"~b~[INFO]~s~ Du hast durch den Autoverkauf ~g~{backPrice.ToMoneyString()}~s~ erhalten."); - - dbContext.UserVehicles.Remove(userVehicle); - dbContext.SaveChanges(); - - veh?.Delete(); + player.SetData("SellVehicleDecision", true); + player.SetData("VehicleToSell", id); + ChatService.SendMessage(player,"~s~Möchtes du das Fahrzeug ~y~" + veh.DisplayName + " ~s~wirklich für ~g~$" + backPrice + " ~s~verkaufen? Drücke ~g~J~s~ zum Bestätigen oder ~r~N ~s~zum Abbrechen"); } } + public static void SellPlayerVehicle(Player player, int id) + { + using var dbContext = new DatabaseContext(); + var user = player.GetUser(dbContext); + var userVehicle = dbContext.UserVehicles.Where(v => v.Id == id && v.UserId == user.Id).FirstOrDefault(); + var vehPrice = userVehicle.Price; + var backPrice = (int)(vehPrice * 0.4); + GTANetworkAPI.Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(userVehicle); + user.BankAccount.Balance += backPrice; + + ChatService.SendMessage(player, $"~b~[INFO]~s~ Du hast durch den Autoverkauf ~g~{backPrice.ToMoneyString()}~s~ erhalten."); + + dbContext.UserVehicles.Remove(userVehicle); + dbContext.SaveChanges(); + + veh?.Delete(); + } + [RemoteEvent("CLIENT:InteractionMenu_FactionVehicleInteraction")] public void FactionVehicleInteraction(Player player, int id, string selection) { From 654840fefe5f8c5f19bb36aa29391b0ed18cfaef Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 00:26:55 +0000 Subject: [PATCH 40/53] liste kleiner, user kleiner --- ReallifeGamemode.Client/Gui/playerlist.ts | 11 +++------ .../assets/css/onlinelist/style.css | 7 +++--- .../assets/css/onlinelist/style.css.map | 2 +- .../assets/css/onlinelist/style.scss | 9 ++++---- .../assets/html/onlinelist/index.html | 10 ++++---- .../assets/js/onlinelist/script.js | 23 +++++++++++++------ 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/playerlist.ts b/ReallifeGamemode.Client/Gui/playerlist.ts index 03ad7497..4fadec66 100644 --- a/ReallifeGamemode.Client/Gui/playerlist.ts +++ b/ReallifeGamemode.Client/Gui/playerlist.ts @@ -1,4 +1,4 @@ -/** +/** * @overview Life of German Reallife - Gui Playerlist playerlist.js * @author VegaZ. Siga. * @copyright (c) 2008 - 2018 Life of German @@ -12,7 +12,6 @@ export default function playerList(globalData: IGlobalData): void { const factionIds = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; mp.events.add("showPlayerlist", (playersJson) => { - if (playerlistBrowser !== null) { playerlistBrowser.destroy(); playerlistBrowser = null; @@ -26,8 +25,6 @@ export default function playerList(globalData: IGlobalData): void { mp.gui.chat.activate(false); mp.gui.cursor.show(true, true); pList = JSON.parse(playersJson); - - } }); @@ -38,9 +35,7 @@ export default function playerList(globalData: IGlobalData): void { pList.forEach((player) => { var facId = player.FactionId; - - playerlistBrowser.execute(`addPlayerEntry('${player.Id}','${player.Name}', '${facId}', '${player.FactionName}','${player.Ping}');`); - + playerlistBrowser.execute(`addPlayerEntry('${player.Id}','${player.Name}', '${facId}','${player.Ping}');`); factionPlayersMap.set(facId, factionPlayersMap.get(facId) + 1); }); @@ -59,4 +54,4 @@ export default function playerList(globalData: IGlobalData): void { // table = table + tableRow; // }) // return document.write(table); -//} \ No newline at end of file +//} diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css b/ReallifeGamemode.Client/assets/css/onlinelist/style.css index dd58bc2c..607052da 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.css +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css @@ -54,7 +54,8 @@ h2 { } .wrapper { - height: 80vh; + min-height: 60vh; + max-height: 80vh; overflow-y: scroll; border-radius: .25em; background-color: rgba(0, 0, 0, 0.75); @@ -88,7 +89,7 @@ table th:last-child { } table th, table td { - padding: .75em .5em; + padding: .6em .3em; } table th:first-child, table td:first-child { @@ -119,7 +120,7 @@ table tr td:nth-child(2)::-webkit-scrollbar { } table tr td:nth-child(3) { - width: 14ch !important; + width: 15ch !important; } table tr td:nth-child(4) { diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map b/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map index 70cbc841..74b823b9 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "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", + "mappings": "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", "sources": [ "style.scss" ], diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss index dda32c7c..83b0cfd0 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss @@ -35,7 +35,8 @@ h2 { font-size: 1.125em; } } .wrapper { - height: 80vh; + min-height: 60vh; + max-height: 80vh; overflow-y: scroll; border-radius: .25em; @@ -62,7 +63,7 @@ table { } th, td { - padding: .75em .5em; + padding: .6em .3em; &:first-child { padding-left: 1em; } &:last-child { padding-right: 1em; } @@ -81,7 +82,7 @@ table { &::-webkit-scrollbar { display: none; } } - &:nth-child(3) { width: 14ch !important; } + &:nth-child(3) { width: 15ch !important; } &:nth-child(4) { width: 13ch !important; } } @@ -134,4 +135,4 @@ ol.inline.stats { &:not(:last-of-type) { margin-bottom: .125em; } abbr { text-decoration: none; } -} +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/html/onlinelist/index.html b/ReallifeGamemode.Client/assets/html/onlinelist/index.html index a052ea50..be241f2e 100644 --- a/ReallifeGamemode.Client/assets/html/onlinelist/index.html +++ b/ReallifeGamemode.Client/assets/html/onlinelist/index.html @@ -1,9 +1,9 @@ - + - + Spielerliste @@ -41,12 +41,12 @@
    -
  1. NR: 0
  2. -
  3. Zivilisten: 0
  4. +
  5. WZN: 0
  6. +
  7. Z: 0
- \ No newline at end of file + diff --git a/ReallifeGamemode.Client/assets/js/onlinelist/script.js b/ReallifeGamemode.Client/assets/js/onlinelist/script.js index a1e8eae5..8ee9dfd4 100644 --- a/ReallifeGamemode.Client/assets/js/onlinelist/script.js +++ b/ReallifeGamemode.Client/assets/js/onlinelist/script.js @@ -12,12 +12,21 @@ setPlayerCount = (factionId, value) => { } } -function addPlayerEntry(userId, userName, factionId, factionName, userPing) { +function getFactionNameByFactionId(factionId) { + switch (factionId) { + case 1: return "LSPD"; + case 2: return "LSED"; + case 3: return "FIB"; + case 4: return "Trucker"; + case 5: return "Vagos"; + case 7: return "Grove Street"; + case 8: return "Ballas"; + case 9: return "Weazle News"; + default: return "Zivilisten"; + } +} + +function addPlayerEntry(userId, userName, factionId, userPing) { + var factionName = getFactionNameByFactionId(factionId); document.getElementById('players').innerHTML += `${userId} ${userName} ${factionName} ${userPing}`; } - -addPlayerEntries = (json) => { - JSON.parse(json).forEach(e => { - - }); -} From 680e33283a1fb576db48423ff6bed95a8c5e34e8 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 00:38:02 +0000 Subject: [PATCH 41/53] fix passwort-auge bei registrierung --- ReallifeGamemode.Client/assets/html/login/register.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/assets/html/login/register.html b/ReallifeGamemode.Client/assets/html/login/register.html index 31a5be29..afd9bd89 100644 --- a/ReallifeGamemode.Client/assets/html/login/register.html +++ b/ReallifeGamemode.Client/assets/html/login/register.html @@ -1,4 +1,4 @@ - + @@ -6,6 +6,8 @@ Registrierung | Life of German + + From 4b6e585eb727d43ad917d8e39879720c5bc2268d Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 13:16:52 +0000 Subject: [PATCH 42/53] =?UTF-8?q?neue=20logo=20neue=20gl=C3=BCck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/img/login/logo-light.png | Bin 16810 -> 7972 bytes .../assets/img/login/logo.png | Bin 15917 -> 7541 bytes .../assets/img/login/source.txt | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/assets/img/login/logo-light.png b/ReallifeGamemode.Client/assets/img/login/logo-light.png index 54b271b64f9739d3c2373d4cb1719d4b7990cf50..46f93732225d099a930379591393f4adde34c764 100644 GIT binary patch literal 7972 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 diff --git a/ReallifeGamemode.Client/assets/img/login/logo.png b/ReallifeGamemode.Client/assets/img/login/logo.png index 42b11ef18fd5894d42c09f9f9c9c3972d8613ce8..ded9237016d572dd3972ba335aae5f06b3ee1c06 100644 GIT binary patch literal 7541 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 literal 15917 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 WI}Y+?RKeeW&{39GldF_55Bp!th!R%- diff --git a/ReallifeGamemode.Client/assets/img/login/source.txt b/ReallifeGamemode.Client/assets/img/login/source.txt index b6409761..8bddd06d 100644 --- a/ReallifeGamemode.Client/assets/img/login/source.txt +++ b/ReallifeGamemode.Client/assets/img/login/source.txt @@ -1,2 +1,2 @@ Enter-Icon: https://icons8.com/icons/set/enter-mac-key -Augen: Icons made by Pixel perfect from www.flaticon.com \ No newline at end of file +Augen: Font Awesome From 2fc5f1d9ef5562e1bbb2e42f747f2e09a67401f3 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 14:12:44 +0000 Subject: [PATCH 43/53] ol angepasst --- ReallifeGamemode.Client/assets/css/onlinelist/style.css | 6 +++--- ReallifeGamemode.Client/assets/css/onlinelist/style.scss | 8 ++++---- ReallifeGamemode.Client/assets/html/onlinelist/index.html | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css b/ReallifeGamemode.Client/assets/css/onlinelist/style.css index 607052da..28dd56ed 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.css +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css @@ -19,7 +19,7 @@ html, body { } body { - margin: 10vh auto 0; + margin: 15vh auto 0; width: 32vw; color: white; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; @@ -54,8 +54,8 @@ h2 { } .wrapper { - min-height: 60vh; - max-height: 80vh; + min-height: 50vh; + max-height: 70vh; overflow-y: scroll; border-radius: .25em; background-color: rgba(0, 0, 0, 0.75); diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss index 83b0cfd0..6486aa77 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.scss +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.scss @@ -9,7 +9,7 @@ html, body { margin: unset; } *, *:before, *:after { box-sizing: inherit; } body { - margin: 10vh auto 0; + margin: 15vh auto 0; width: 32vw; color: white; @@ -35,8 +35,8 @@ h2 { font-size: 1.125em; } } .wrapper { - min-height: 60vh; - max-height: 80vh; + min-height: 50vh; + max-height: 70vh; overflow-y: scroll; border-radius: .25em; @@ -135,4 +135,4 @@ ol.inline.stats { &:not(:last-of-type) { margin-bottom: .125em; } abbr { text-decoration: none; } -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/assets/html/onlinelist/index.html b/ReallifeGamemode.Client/assets/html/onlinelist/index.html index be241f2e..84fe2a70 100644 --- a/ReallifeGamemode.Client/assets/html/onlinelist/index.html +++ b/ReallifeGamemode.Client/assets/html/onlinelist/index.html @@ -42,11 +42,11 @@
  1. WZN: 0
  2. -
  3. Z: 0
  4. +
  5. Zivilisten: 0
- + From 2a88e48d422cf6cdbef08e965ed41141a4940ee4 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 14:18:02 +0000 Subject: [PATCH 44/53] =?UTF-8?q?login=20tags=C3=BCber=20dunkler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/css/login/styles.css | 15 ++++++++------- .../assets/css/login/styles.css.map | 4 ++-- .../assets/css/login/styles.scss | 12 ++++++++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ReallifeGamemode.Client/assets/css/login/styles.css b/ReallifeGamemode.Client/assets/css/login/styles.css index f08dfd6d..7385c7db 100644 --- a/ReallifeGamemode.Client/assets/css/login/styles.css +++ b/ReallifeGamemode.Client/assets/css/login/styles.css @@ -1,8 +1,10 @@ html { - -webkit-box-sizing: border-box; - box-sizing: border-box; - user-select: none; - + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } *, *::before, *::after { @@ -10,7 +12,6 @@ html { box-sizing: inherit; } - a { color: inherit; font-weight: bold; @@ -50,7 +51,7 @@ header { background-repeat: no-repeat; background-position: center; background-size: contain; - opacity: .3; + opacity: .4; } main { @@ -60,7 +61,7 @@ main { border-radius: .25em; font-size: 1em; line-height: 1.25; - background-color: rgba(0, 0, 0, 0.3); + background-color: rgba(0, 0, 0, 0.4); } main h1, main p { diff --git a/ReallifeGamemode.Client/assets/css/login/styles.css.map b/ReallifeGamemode.Client/assets/css/login/styles.css.map index 5bee04cc..66999e01 100644 --- a/ReallifeGamemode.Client/assets/css/login/styles.css.map +++ b/ReallifeGamemode.Client/assets/css/login/styles.css.map @@ -1,9 +1,9 @@ { "version": 3, - "mappings": "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", + "mappings": "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", "sources": [ "styles.scss" ], "names": [], "file": "styles.css" -} \ No newline at end of file +} diff --git a/ReallifeGamemode.Client/assets/css/login/styles.scss b/ReallifeGamemode.Client/assets/css/login/styles.scss index fcffc634..f4ecceaa 100644 --- a/ReallifeGamemode.Client/assets/css/login/styles.scss +++ b/ReallifeGamemode.Client/assets/css/login/styles.scss @@ -1,4 +1,8 @@ -html { box-sizing: border-box; } +html { + box-sizing: border-box; + user-select: none; +} + *, *::before, *::after { box-sizing: inherit; } a { @@ -34,7 +38,7 @@ header { background-repeat: no-repeat; background-position: center; background-size: contain; - opacity: .3; + opacity: .4; } main { @@ -46,7 +50,7 @@ main { font-size: 1em; line-height: 1.25; - background-color: rgba(0, 0, 0, .3); + background-color: rgba(0, 0, 0, .4); h1, p { margin: 0; @@ -220,4 +224,4 @@ body.light { footer { color: rgba(255, 255, 255, .5); } -} \ No newline at end of file +} From 9d567cca26cfed86fc41c705ad1e7ed34dd59ab7 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 17:49:13 +0000 Subject: [PATCH 45/53] fix onlinelist --- .../assets/js/onlinelist/script.js | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/ReallifeGamemode.Client/assets/js/onlinelist/script.js b/ReallifeGamemode.Client/assets/js/onlinelist/script.js index 8ee9dfd4..160d65cc 100644 --- a/ReallifeGamemode.Client/assets/js/onlinelist/script.js +++ b/ReallifeGamemode.Client/assets/js/onlinelist/script.js @@ -13,17 +13,30 @@ setPlayerCount = (factionId, value) => { } function getFactionNameByFactionId(factionId) { + var factionName = ""; + switch (factionId) { - case 1: return "LSPD"; - case 2: return "LSED"; - case 3: return "FIB"; - case 4: return "Trucker"; - case 5: return "Vagos"; - case 7: return "Grove Street"; - case 8: return "Ballas"; - case 9: return "Weazle News"; - default: return "Zivilisten"; + case 1: + factionName = "LSPD"; break; + case 2: + factionName = "LSED"; break; + case 3: + factionName = "FIB"; break; + case 4: + factionName = "Trucker"; break; + case 5: + factionName = "Vagos"; break; + case 7: + factionName = "Grove Street"; break; + case 8: + factionName = "Ballas"; break; + case 9: + factionName = "Weazle News"; break; + default: + factionName = "Zivilisten"; break; } + + return factionName; } function addPlayerEntry(userId, userName, factionId, userPing) { From 516868308f30e7f87efa26127c60e3a506abdaa7 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 20 Apr 2021 18:12:04 +0000 Subject: [PATCH 46/53] =?UTF-8?q?Die=20ganzen=20Zahlen=20(auch=20Ganzzahle?= =?UTF-8?q?n,=20lat.=20numeri=20integri)=20sind=20eine=20Erweiterung=20der?= =?UTF-8?q?=20nat=C3=BCrlichen=20Zahlen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/js/onlinelist/script.js | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/ReallifeGamemode.Client/assets/js/onlinelist/script.js b/ReallifeGamemode.Client/assets/js/onlinelist/script.js index 160d65cc..c9b9e2b9 100644 --- a/ReallifeGamemode.Client/assets/js/onlinelist/script.js +++ b/ReallifeGamemode.Client/assets/js/onlinelist/script.js @@ -13,30 +13,17 @@ setPlayerCount = (factionId, value) => { } function getFactionNameByFactionId(factionId) { - var factionName = ""; - - switch (factionId) { - case 1: - factionName = "LSPD"; break; - case 2: - factionName = "LSED"; break; - case 3: - factionName = "FIB"; break; - case 4: - factionName = "Trucker"; break; - case 5: - factionName = "Vagos"; break; - case 7: - factionName = "Grove Street"; break; - case 8: - factionName = "Ballas"; break; - case 9: - factionName = "Weazle News"; break; - default: - factionName = "Zivilisten"; break; + switch (parseInt(factionId)) { + case 1: return "LSPD"; + case 2: return "LSED"; + case 3: return "FIB"; + case 4: return "Trucker"; + case 5: return "Vagos"; + case 7: return "Grove Street"; + case 8: return "Ballas"; + case 9: return "Weazle News"; + default: return "Zivilisten"; } - - return factionName; } function addPlayerEntry(userId, userName, factionId, userPing) { From 99eaa6c8a88f4d607a76c6a70a66ad303a20ea39 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 19 Apr 2021 23:19:57 +0200 Subject: [PATCH 47/53] remove fbi garage --- ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf diff --git a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf deleted file mode 100644 index ca513b42..00000000 --- a/ReallifeGamemode.Client/dlcpacks/fbigarage/dlc.rpf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e40413c355d3721e2a483add948aaad408b17c3ed9a0db409b141aa6110dbb6 -size 35840 From e3a9b0d7e54b304e373f3b389b44f2bb2735041a Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 20 Apr 2021 23:34:48 +0200 Subject: [PATCH 48/53] wt gburrito2 --- ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs index 1b6c3231..4aa656ca 100644 --- a/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs +++ b/ReallifeGamemode.Server/WeaponDeal/WeaponDealManager.cs @@ -17,7 +17,7 @@ namespace ReallifeGamemode.Server.WeaponDeal public static int[] WEAPON_DEAL_FACTIONS => WEAPON_DEAL_GANG_IDS.Concat(WEAPON_DEAL_STAATSFRAK_IDS).Distinct().ToArray(); - public static readonly VehicleHash WEAPON_DEAL_GANG_VEHICLE_HASH = VehicleHash.Burrito3; + public static readonly VehicleHash WEAPON_DEAL_GANG_VEHICLE_HASH = VehicleHash.Gburrito2; public static readonly VehicleHash WEAPON_DEAL_STAATSFRAK_VEHICLE_HASH = VehicleHash.Policet; private const int WEAPON_AMOUNT_GANG = 2; From d12f10fbb466d321528a12b757407da3f33e8271 Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 20 Apr 2021 23:41:22 +0200 Subject: [PATCH 49/53] /tog d & ga --- .../Commands/AdminCommands.cs | 23 +++++++++++++++++++ .../Commands/FactionCommands.cs | 8 +++---- .../Services/ChatService.cs | 4 ++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 8706a6b4..87a22942 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -240,6 +240,29 @@ namespace ReallifeGamemode.Server.Commands player.SendNotification("~g~[Info]~w~ Connect-Logs werden nun angezeigt."); } break; + case "d": + if (player.HasData("togd")) + { + player.ResetData("togd"); + player.SendNotification("~g~[Info]~w~ D-Chat wird nun ausgeblendet."); + } + else + { + player.SetData("togd", true); + player.SendNotification("~g~[Info]~w~ D-Chat wird nun angezeigt."); + } + case "ga": + if (player.HasData("togga")) + { + player.ResetData("togga"); + player.SendNotification("~g~[Info]~w~ GA-Chat wird nun ausgeblendet."); + } + else + { + player.SetData("togga", true); + player.SendNotification("~g~[Info]~w~ GA-Chat wird nun angezeigt."); + } + break; } } diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index c3eede29..83ec06b3 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -74,7 +74,7 @@ namespace ReallifeGamemode.Server.Commands User user = player.GetUser(dbContext); Faction f = user?.Faction; - if ((f == null || !f.GangOwned) && !user.IsAdmin(AdminLevel.ADMIN)) + if ((f == null || !f.GangOwned) && !user.IsAdmin(AdminLevel.ADMIN) && !player.HasData("togga")) { ChatService.NotAuthorized(player); return; @@ -105,7 +105,7 @@ namespace ReallifeGamemode.Server.Commands string broadcastMessage = "!{FF0000}** " + rank + " " + player.Name + ": " + message + " **"; using (var context = new DatabaseContext()) { - ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.GangOwned), true); + ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.GangOwned), true, (admin) => admin.HasData("togga")); } } @@ -154,7 +154,7 @@ namespace ReallifeGamemode.Server.Commands User user = player.GetUser(dbContext); Faction f = user?.Faction; - if ((f == null || !f.StateOwned) && !user.IsAdmin(AdminLevel.ADMIN)) + if ((f == null || !f.StateOwned) && !user.IsAdmin(AdminLevel.ADMIN) && !player.HasData("todg")) { ChatService.NotAuthorized(player); return; @@ -185,7 +185,7 @@ namespace ReallifeGamemode.Server.Commands string broadcastMessage = "!{CC3333}** " + factionName + " " + player.Name + ": " + message + ", over **"; using (var context = new DatabaseContext()) { - ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.StateOwned), true); + ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.StateOwned), true, (admin) => admin.HasData("togd")); } } diff --git a/ReallifeGamemode.Server/Services/ChatService.cs b/ReallifeGamemode.Server/Services/ChatService.cs index c4584315..fa3b1165 100644 --- a/ReallifeGamemode.Server/Services/ChatService.cs +++ b/ReallifeGamemode.Server/Services/ChatService.cs @@ -53,7 +53,7 @@ namespace ReallifeGamemode.Server.Services /// /// Die Nachricht, die gesendet werden soll /// Die Liste an Fraktionen, die diese Nachricht bekommen sollen - public static void BroadcastFaction(string message, List factions, bool toAdmins = false) + public static void BroadcastFaction(string message, List factions, bool toAdmins = false, Predicate shouldSendToAdmins = null) { foreach (Player c in NAPI.Pools.GetAllPlayers()) { @@ -63,7 +63,7 @@ namespace ReallifeGamemode.Server.Services { ChatService.SendMessage(c, message); } - else if (user.IsAdmin(AdminLevel.ADMIN) && toAdmins) + else if (user.IsAdmin(AdminLevel.ADMIN) && (toAdmins && (shouldSendToAdmins == null || shouldSendToAdmins(c)))) { ChatService.SendMessage(c, message); } From 126aefe4b86bd6484ddac1e80f7e059b9f80d5a9 Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 20 Apr 2021 23:53:59 +0200 Subject: [PATCH 50/53] fix tog d --- ReallifeGamemode.Server/Commands/AdminCommands.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 87a22942..4a29423d 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -251,6 +251,7 @@ namespace ReallifeGamemode.Server.Commands player.SetData("togd", true); player.SendNotification("~g~[Info]~w~ D-Chat wird nun angezeigt."); } + break; case "ga": if (player.HasData("togga")) { From 7a7b7fde22ef0b022189000d6d1abae5c0fae782 Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 21 Apr 2021 00:07:00 +0200 Subject: [PATCH 51/53] fix tog --- ReallifeGamemode.Server/Commands/FactionCommands.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index 83ec06b3..829b3436 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -74,7 +74,7 @@ namespace ReallifeGamemode.Server.Commands User user = player.GetUser(dbContext); Faction f = user?.Faction; - if ((f == null || !f.GangOwned) && !user.IsAdmin(AdminLevel.ADMIN) && !player.HasData("togga")) + if ((f == null || !f.GangOwned) && (!user.IsAdmin(AdminLevel.ADMIN) || !player.HasData("togga"))) { ChatService.NotAuthorized(player); return; @@ -154,7 +154,7 @@ namespace ReallifeGamemode.Server.Commands User user = player.GetUser(dbContext); Faction f = user?.Faction; - if ((f == null || !f.StateOwned) && !user.IsAdmin(AdminLevel.ADMIN) && !player.HasData("todg")) + if ((f == null || !f.StateOwned) && (!user.IsAdmin(AdminLevel.ADMIN) || !player.HasData("todg"))) { ChatService.NotAuthorized(player); return; From 479d5adc3252fde3bd605c6ef1b6a53faf4760b7 Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 21 Apr 2021 00:10:44 +0200 Subject: [PATCH 52/53] fix tog lc --- ReallifeGamemode.Server/Commands/FactionCommands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Commands/FactionCommands.cs b/ReallifeGamemode.Server/Commands/FactionCommands.cs index 829b3436..d9dd2668 100644 --- a/ReallifeGamemode.Server/Commands/FactionCommands.cs +++ b/ReallifeGamemode.Server/Commands/FactionCommands.cs @@ -312,7 +312,7 @@ namespace ReallifeGamemode.Server.Commands NAPI.Pools.GetAllPlayers().ForEach(p => { User pUser = p.GetUser(); - if ((pUser?.FactionLeader ?? false) || (pUser.IsAdmin(AdminLevel.ADMIN) && !p.HasData("toglc"))) + if ((pUser?.FactionLeader ?? false) || (pUser.IsAdmin(AdminLevel.ADMIN) && p.HasData("toglc"))) { ChatService.SendMessage(p, broadcastMsg); } From 38457a5588e3be8640426e9c748154e8b13b6a54 Mon Sep 17 00:00:00 2001 From: hydrant Date: Wed, 21 Apr 2021 00:14:28 +0200 Subject: [PATCH 53/53] evtl look mauszeiger --- ReallifeGamemode.Client/Gui/vehiclemenu/main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts b/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts index 385eaacb..b967f544 100644 --- a/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts +++ b/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts @@ -33,6 +33,7 @@ export default function vehicleMenu(globalData: IGlobalData) { mp.events.add("CEF:VehicleLook_Loaded", () => { lastDriversBrowser.execute(`setDrivers('${JSON.stringify(lastDrivers)}');`); + mp.gui.cursor.show(true, true); }); mp.events.add("removeLookMenu", () => {