From 7fbc90c5e9a8c88c41b3f8b08060e2d01ecafd0c Mon Sep 17 00:00:00 2001 From: VegaZ Date: Fri, 30 Nov 2018 21:21:56 +0100 Subject: [PATCH 01/30] Change to some medic commands. Add /heal --- Server/Commands/Faction.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Server/Commands/Faction.cs b/Server/Commands/Faction.cs index b4a4e937..dbb64f13 100644 --- a/Server/Commands/Faction.cs +++ b/Server/Commands/Faction.cs @@ -227,15 +227,35 @@ namespace reallife_gamemode.Server.Commands player.SendChatMessage("~r~[FEHLER]~s~ Du kannst dich nicht selbst wiederbeleben!"); return; } - + player.PlayAnimation("amb@medic@standing@kneel@enter", "enter", 0); + deadPlayer.TriggerEvent("onPlayerRevived"); deadPlayer.SendNotification("Du wurdest von ~r~" + player.Name + "~s~ wiederbelebt."); deadPlayer.SetData("isDead", false); NAPI.Player.SpawnPlayer(deadPlayer, deadPlayer.Position); deadPlayer.Health = 50; } + + [Command("heal", "~m~Benutzung: ~s~/heal [Spieler]")] //TODO Eventuell noch mit Geldbetrag wie bei SA:MP + public void CmdFactionMedicHealive(Client player, string receiver) + { + if (player.GetUser()?.FactionId == null || player.GetUser().FactionId != 2) + { + ChatService.NotAuthorized(player); + return; + } + if (player.IsInVehicle) + { + player.SendChatMessage("~r~[FEHLER]~s~ Du kannst in einem Auto nicht heilen!"); + return; + } + Client target = ClientService.GetClientByNameOrId(receiver); + target.Health = 100; + target.SendNotification("Du wurdest von ~g~" + player.Name + " ~s~geheilt.", false); + player.SendNotification("Du hast~g~" + target.Name + " ~s~geheilt.", false); + } #endregion - #region Global Fraktions Commands + #region Global Fraktions Commands [Command("duty", "~m~Benutzung: ~s~/duty")] public void CmdFactionDuty(Client player) { From 865436b0a8e50c359cc06b08576c20ada23a7653 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 1 Dec 2018 19:29:02 +0100 Subject: [PATCH 02/30] Adapted EnterVehicleAttempt.cs to new Vehicle System --- Server/Events/EnterVehicleAttempt.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Server/Events/EnterVehicleAttempt.cs b/Server/Events/EnterVehicleAttempt.cs index e4c4edee..aceeb9e3 100644 --- a/Server/Events/EnterVehicleAttempt.cs +++ b/Server/Events/EnterVehicleAttempt.cs @@ -13,13 +13,16 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerEnterVehicleAttempt)] public void OnPlayerEnterVehicleAttempt(Client player, Vehicle vehicle, sbyte seat) { - if (vehicle.HasData("factionId")) + if (seat != 0) { - if((vehicle.GetData("factionId") != player.GetUser().FactionId) && seat == 0) + return; + } + + if (vehicle.GetServerVehicle() is FactionVehicle veh) + { + if(veh.FactionId != player.GetUser().FactionId) { - //TODO REWORK - player.SetIntoVehicle(vehicle, 1); - player.WarpOutOfVehicle(); + player.StopAnimation(); player.SendNotification("~r~Du darfst dieses Fahrzeug nicht benutzen!", true); return; } From 8bfbe5753764c9bc69830919bb681a8d60b453db Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 1 Dec 2018 19:47:33 +0100 Subject: [PATCH 03/30] Switched /save argument to lowercase check --- Server/Commands/Admin.cs | 13 ++++++------- Server/Managers/SaveManager.cs | 1 - 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 3da48bca..39dd56ba 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1266,12 +1266,12 @@ namespace reallife_gamemode.Server.Commands ChatService.NotAuthorized(player); return; } - switch (typ) + switch (typ.ToLower()) { - case "Blip": + case "blip": player.TriggerEvent("saveBlip"); break; - case "Goto": + case "goto": if (description == null) { player.SendChatMessage("Für Goto musst du einen dritten Parameter angeben. Beispiel: Ort des Goto-Punktes."); @@ -1296,7 +1296,7 @@ namespace reallife_gamemode.Server.Commands } break; - case "Vehicle": + case "vehicle": if (player.IsInVehicle) { Vehicle vehicle = player.Vehicle; @@ -1308,7 +1308,7 @@ namespace reallife_gamemode.Server.Commands } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; - case "FVehicle": + case "fvehicle": if (player.IsInVehicle) { if (player.GetUser().GetFaction() == null) @@ -1319,7 +1319,6 @@ namespace reallife_gamemode.Server.Commands else { Vehicle vehicle = player.Vehicle; - player.SendChatMessage("second color: " + vehicle.SecondaryColor); int playerSeat = player.VehicleSeat; vehicle = SaveManager.SaveFactionVehicleData(vehicle, (VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, vehicle.PrimaryColor, vehicle.SecondaryColor, vehicle.Locked, vehicle.EngineStatus, player.GetUser().FactionId); @@ -1329,7 +1328,7 @@ namespace reallife_gamemode.Server.Commands } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; - case "SVehicle": + case "svehicle": if (player.IsInVehicle) { Vehicle vehicle = player.Vehicle; diff --git a/Server/Managers/SaveManager.cs b/Server/Managers/SaveManager.cs index 89e845a3..eab7c693 100644 --- a/Server/Managers/SaveManager.cs +++ b/Server/Managers/SaveManager.cs @@ -84,7 +84,6 @@ namespace reallife_gamemode.Server.Events { using (var saveData = new DatabaseContext()) { - Console.WriteLine("Adding Faction Vehicle Secondary Color: " + vehicleSecondaryColor); var dataSet = new FactionVehicle { Model = vehicleModel, From d4fe12766237e4f95044a727caae7ea47a9af61b Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 1 Dec 2018 20:21:54 +0100 Subject: [PATCH 04/30] Changed /save help colors --- Server/Commands/Admin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 39dd56ba..f344cf30 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1258,7 +1258,7 @@ namespace reallife_gamemode.Server.Commands } } - [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, Goto (X), ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle, FVehicle, SVehicle] (Beschreibung) = (X)")] + [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip~s~, ~g~Goto (X)~s~, ~r~Marker~s~, ~r~Ped~s~, ~r~Pickup~s~, ~r~TextLabel~s~, ~g~Vehicle~s~, ~g~FVehicle~s~, ~g~SVehicle~s~] (Beschreibung) = (X)")] public void CmdAdminSave(Client player, string typ, string description = null) { if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) From c5be51f3aa6ca728b927091466a290d1cdcaf532 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 14:17:07 +0100 Subject: [PATCH 05/30] Fixed seat bug for dune3 --- Server/Events/EnterVehicleAttempt.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Server/Events/EnterVehicleAttempt.cs b/Server/Events/EnterVehicleAttempt.cs index aceeb9e3..86a43108 100644 --- a/Server/Events/EnterVehicleAttempt.cs +++ b/Server/Events/EnterVehicleAttempt.cs @@ -13,11 +13,14 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerEnterVehicleAttempt)] public void OnPlayerEnterVehicleAttempt(Client player, Vehicle vehicle, sbyte seat) { - if (seat != 0) + if ((VehicleHash)vehicle.Model == VehicleHash.Dune3) { - return; + if (seat == 1) seat = 0; + else if (seat == 0) seat = 1; } + if (seat != 0) return; + if (vehicle.GetServerVehicle() is FactionVehicle veh) { if(veh.FactionId != player.GetUser().FactionId) From 938e30fa966af96b9a8665030e671c5b121232fc Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 15:00:41 +0100 Subject: [PATCH 06/30] Added /remove command for vehicles and goto points --- Server/Commands/Admin.cs | 67 +++++++++++++++++++++++++++++- Server/Entities/FactionVehicles.cs | 5 +++ Server/Entities/UserVehicle.cs | 22 ++++++++++ Server/Saves/SavedVehicle.cs | 7 +++- 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index f344cf30..ac74321e 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -571,7 +571,7 @@ namespace reallife_gamemode.Server.Commands } using (var dbContext = new DatabaseContext()) { - Entities.GotoPoint p = dbContext.GotoPoints.FirstOrDefault(x => x.Description == location); + GotoPoint p = dbContext.GotoPoints.FirstOrDefault(x => x.Description == location); if(p == null) { @@ -1344,6 +1344,71 @@ namespace reallife_gamemode.Server.Commands } } + [Command("remove", "~m~Benutzung: ~s~/remove [Vehicle, Goto] [Option]")] + public void CmdAdminRemove(Client player, string type, string option = "") + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + switch(type.ToLower()) + { + case "vehicle": + if(!player.IsInVehicle) + { + player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); + return; + } + + ServerVehicle veh = player.Vehicle.GetServerVehicle(); + if(veh == null) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieses Fahrzeug wird nicht von einem Server-System genutzt."); + return; + } + + if(option.ToLower() != "yes") + { + player.SendChatMessage("Bist du sicher, dass du folgendes Fahrzeug löschen willst: ~m~" + veh.ToString() + " ~s~?"); + player.SendChatMessage("Falls ~g~Ja~s~, nutze ~y~/remove vehicle yes"); + return; + } + + using (var dbContext = new DatabaseContext()) + { + VehicleManager.DeleteVehicle(player.Vehicle); + dbContext.ServerVehicles.Remove(veh); + + dbContext.SaveChanges(); + } + break; + + case "goto": + if(option == "") + { + player.SendChatMessage("~m~Benutzung: ~s~/remove [Goto] [Punkt]"); + return; + } + using (var dbContext = new DatabaseContext()) + { + GotoPoint p = dbContext.GotoPoints.FirstOrDefault(x => x.Description == option); + if(p == null) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieser Goto-Punkt existiert nicht."); + return; + } + + dbContext.GotoPoints.Remove(p); + dbContext.SaveChanges(); + + player.SendNotification("Der Goto-Punkt ~r~" + p.Description + "~s~ wurde erfolgreich gelöscht."); + } + break; + } + } + #region loadCommand [Command("load", "~m~Benutzung: ~s~/load [Typ = OnlineBunkers, ArcadiusBusinessCentre, MazeBankBuilding, LomBank, MazeBankWest, ClubWareHouse, SpecialLocations, GRHYacht, DHYacht, PYacht, AircraftCarrier, BridgeTC, BridgeTN, NorthYankton, ONeilsFarmB, ONeilsFarm, Morgue")] public void CmdAdminloadlocation(Client player, string typ) diff --git a/Server/Entities/FactionVehicles.cs b/Server/Entities/FactionVehicles.cs index 8cb88532..7f04dc57 100644 --- a/Server/Entities/FactionVehicles.cs +++ b/Server/Entities/FactionVehicles.cs @@ -30,5 +30,10 @@ namespace reallife_gamemode.Server.Entities return context.Factions.FirstOrDefault(f => f.Id == FactionId); } } + + public override string ToString() + { + return "Fraktions Fahrzeug | Fraktion: " + GetFaction().Name; + } } } diff --git a/Server/Entities/UserVehicle.cs b/Server/Entities/UserVehicle.cs index e6021bc9..a24f9703 100644 --- a/Server/Entities/UserVehicle.cs +++ b/Server/Entities/UserVehicle.cs @@ -1,9 +1,11 @@ using GTANetworkAPI; +using reallife_gamemode.Model; using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; using System.Text; /** @@ -20,5 +22,25 @@ namespace reallife_gamemode.Server.Entities [ForeignKey("User")] public int UserId { get; set; } public User User { get; set; } + + public override string ToString() + { + return "Spieler Fahrzeug | Besitzer: " + GetOwner().Name; + } + + public User GetOwner(DatabaseContext dbContext = null) + { + if (dbContext == null) + { + using (dbContext = new DatabaseContext()) + { + return dbContext.Users.FirstOrDefault(u => u.BusinessId == Id); + } + } + else + { + return dbContext.Users.FirstOrDefault(u => u.BusinessId == Id); + } + } } } diff --git a/Server/Saves/SavedVehicle.cs b/Server/Saves/SavedVehicle.cs index 43f9c3d3..74c8a0c1 100644 --- a/Server/Saves/SavedVehicle.cs +++ b/Server/Saves/SavedVehicle.cs @@ -15,5 +15,10 @@ using reallife_gamemode.Server.Entities; namespace reallife_gamemode.Server.Saves { public class SavedVehicle : ServerVehicle - { } + { + public override string ToString() + { + return "Gespeichertes Fahrzeug"; + } + } } From cb3373af2d2da1edba4642073fe3d5098872ea0b Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 15:18:07 +0100 Subject: [PATCH 07/30] Fixed UserVehicle.GetOwner() --- Server/Entities/UserVehicle.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/Entities/UserVehicle.cs b/Server/Entities/UserVehicle.cs index a24f9703..122febbc 100644 --- a/Server/Entities/UserVehicle.cs +++ b/Server/Entities/UserVehicle.cs @@ -34,12 +34,12 @@ namespace reallife_gamemode.Server.Entities { using (dbContext = new DatabaseContext()) { - return dbContext.Users.FirstOrDefault(u => u.BusinessId == Id); + return dbContext.Users.FirstOrDefault(u => u.Id == UserId); } } else { - return dbContext.Users.FirstOrDefault(u => u.BusinessId == Id); + return dbContext.Users.FirstOrDefault(u => u.Id == UserId); } } } From a9d6cef9520b450cef23927c42441f0935de88e5 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 15:55:12 +0100 Subject: [PATCH 08/30] Fixed /own vehicle registration --- Server/Commands/Admin.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index ac74321e..82657b0a 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1921,7 +1921,9 @@ namespace reallife_gamemode.Server.Commands Active = true }; saveVehicle.UserVehicles.Add(dataSet); - saveVehicle.SaveChanges(); + saveVehicle.SaveChanges(); + + dataSet.Spawn(playerVehicle); } } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); From 4c6fcf8a117890d9a47deb7db1d306185af09f4b Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 16:54:29 +0100 Subject: [PATCH 09/30] Added dynamic whitelist --- Model/DatabaseContext.cs | 3 +++ Server/Commands/Admin.cs | 49 ++++++++++++++++++++++++++++++++++++ Server/Entities/Whitelist.cs | 16 ++++++++++++ Server/Events/Connect.cs | 43 ++++++++++++++++--------------- 4 files changed, 89 insertions(+), 22 deletions(-) create mode 100644 Server/Entities/Whitelist.cs diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index da6f835b..3d393416 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -91,5 +91,8 @@ namespace reallife_gamemode.Model // Server Vehicles public DbSet ServerVehicles { get; set; } public DbSet VehicleMods { get; set; } + + // Whitelist + public DbSet WhitelistEntries { get; set; } } } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 82657b0a..8bc26e4a 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1883,6 +1883,55 @@ namespace reallife_gamemode.Server.Commands BankManager.SetMoney(player, business, amount, "Admin"); } + + [Command("whitelist", "~m~Benutzung: ~s~/whitelist [Add / Remove] [Socialclub Name]")] + public void CmdAdminWhitelist(Client player, string option, string scName) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + option = option.ToLower(); + + if(option != "add" && option != "remove") + { + player.SendChatMessage("~m~Benutzung: ~s~/whitelist [Add / Remove] [Socialclub Name]"); + return; + } + + using(var dbContext = new DatabaseContext()) + { + if(option == "add") + { + if (dbContext.WhitelistEntries.Any(w => w.SocialClubName.ToLower() == scName.ToLower())) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieser Name ist schon auf der Whitelist."); + return; + } + + Whitelist whitelist = new Whitelist { SocialClubName = scName.ToLower() }; + dbContext.WhitelistEntries.Add(whitelist); + + player.SendChatMessage("~b~[ADMIN]~s~ ~y~" + scName + "~s~ wurde erfolgreich zur Whitelist hinzugefügt."); + } + else if(option == "remove") + { + if (!dbContext.WhitelistEntries.Any(w => w.SocialClubName.ToLower() == scName.ToLower())) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieser Name ist nicht auf der Whitelist."); + return; + } + + Whitelist whitelist = dbContext.WhitelistEntries.FirstOrDefault(w => w.SocialClubName.ToLower() == scName.ToLower()); + dbContext.WhitelistEntries.Remove(whitelist); + + player.SendChatMessage("~b~[ADMIN]~s~ ~y~" + scName + "~s~ wurde erfolgreich aus der Whitelist entfernt."); + } + dbContext.SaveChanges(); + } + } #endregion #region ALevel1338 diff --git a/Server/Entities/Whitelist.cs b/Server/Entities/Whitelist.cs new file mode 100644 index 00000000..e195de72 --- /dev/null +++ b/Server/Entities/Whitelist.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace reallife_gamemode.Server.Entities +{ + public class Whitelist + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public string SocialClubName { get; set; } + } +} diff --git a/Server/Events/Connect.cs b/Server/Events/Connect.cs index 5c7ac1df..63053ad1 100644 --- a/Server/Events/Connect.cs +++ b/Server/Events/Connect.cs @@ -21,37 +21,36 @@ namespace reallife_gamemode.Server.Events { class Connect : Script { - private List whitelistNames = new List() - { - "VegasZ", - "datgame_", - "xSprite", - "xPrike", - "xNccPlay", - }; [ServerEvent(Event.PlayerConnected)] public void OnPlayerConnected(Client player) { - if(!whitelistNames.Any(x => x == player.SocialClubName)) - { - player.TriggerEvent("disableLogin"); - player.Kick(); - - string msg2 = "~m~*** " + player.Name + "[" + player.SocialClubName + "] (" + player.Address + ") hat versucht, sich einzuloggen, steht aber nicht auf der Whitelist."; - ChatService.BroadcastAdmin(msg2, AdminLevel.ADMIN); - - return; - } - player.SetData("isLoggedIn", false); player.Position = new Vector3(-1883.736, -781.4911, -10); player.FreezePosition = true; - string name = player.Name; - List playerlist = NAPI.Pools.GetAllPlayers(); - string msg = "~m~*** " + player.Name + "[" + player.SocialClubName + "] [ID:" + player.Handle.Value + "] (" + player.Address + ")"; + NAPI.Util.ConsoleOutput(player.SocialClubName); + + using (var dbContext = new DatabaseContext()) + { + if(!dbContext.WhitelistEntries.Any(w => w.SocialClubName.ToLower() == player.SocialClubName.ToLower())) + { + player.TriggerEvent("disableLogin"); + + string msg2 = "~m~*** " + player.Name + "[" + player.SocialClubName + "] (" + player.Address + ") hat versucht, sich einzuloggen, steht aber nicht auf der Whitelist."; + ChatService.BroadcastAdmin(msg2, AdminLevel.ADMIN); + + NAPI.Util.ConsoleOutput(player.Name + " tried to join without whitelist entry"); + + player.SendChatMessage("~m~Du stehst nicht auf der Whitelist"); + + player.Kick(); + return; + } + } + + string msg = "~m~*** " + player.Name + " [" + player.SocialClubName + "] [ID:" + player.Handle.Value + "] (" + player.Address + ")"; ChatService.BroadcastAdmin(msg, AdminLevel.ADMIN); } From 53a64dfac119af99ec7cfcee9b44c4e46eafb25e Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 17:00:09 +0100 Subject: [PATCH 10/30] Removed console output at connect --- Server/Events/Connect.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Server/Events/Connect.cs b/Server/Events/Connect.cs index 63053ad1..2a903747 100644 --- a/Server/Events/Connect.cs +++ b/Server/Events/Connect.cs @@ -30,8 +30,6 @@ namespace reallife_gamemode.Server.Events player.Position = new Vector3(-1883.736, -781.4911, -10); player.FreezePosition = true; - NAPI.Util.ConsoleOutput(player.SocialClubName); - using (var dbContext = new DatabaseContext()) { if(!dbContext.WhitelistEntries.Any(w => w.SocialClubName.ToLower() == player.SocialClubName.ToLower())) From 4e48082dac3b92d2feef768b059c1c05fc6e3da7 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 17:06:21 +0100 Subject: [PATCH 11/30] Set player in new car on /own --- Server/Commands/Admin.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 8bc26e4a..0afed36e 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1953,6 +1953,7 @@ namespace reallife_gamemode.Server.Commands if (player.IsInVehicle) { Vehicle playerVehicle = player.Vehicle; + int playerSeat = player.VehicleSeat; using (var saveVehicle = new DatabaseContext()) { var dataSet = new UserVehicle @@ -1972,7 +1973,7 @@ namespace reallife_gamemode.Server.Commands saveVehicle.UserVehicles.Add(dataSet); saveVehicle.SaveChanges(); - dataSet.Spawn(playerVehicle); + player.SetIntoVehicle(dataSet.Spawn(playerVehicle), -1); } } else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); From 3b8166633f6e8e7237c0029be6bd20a22cb4df88 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 19:21:06 +0100 Subject: [PATCH 12/30] Improved tuning --- Client/Tuning/main.js | 100 +++++++++++++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 20 deletions(-) diff --git a/Client/Tuning/main.js b/Client/Tuning/main.js index 8b5428ed..c5c398ff 100644 --- a/Client/Tuning/main.js +++ b/Client/Tuning/main.js @@ -6,28 +6,36 @@ var keyBound = false; -var carModTypes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 25, 27, 28, 30, 33, 34, 35, 38, 46, 48]; +var carModTypes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 25, 27, 28, 33, 34, 35, 38, 46, 48]; var carModSlotName = [ - { Slot: 0, Name: "Spoiler" }, // 0 - { Slot: 1, Name: "Frontstoßstange"}, // 1 - { Slot: 2, Name: "Heckstoßstange"}, // 2 - { Slot: 3, Name: "Seitenschweller"}, // 3 - { Slot: 4, Name: "Auspuff"}, // 4 - { Slot: 5, Name: "Rahmen"}, // 5 - { Slot: 6, Name: "Kühlergrill"}, // 6 - { Slot: 7, Name: "Motorhaube"}, // 7 - { Slot: 8, Name: "Linker Kotflügel"}, // 8 - { Slot: 9, Name: "Rechter Kotflügel"}, // 9 - { Slot: 10, Name: "Dach"}, // 10 - { Slot: 11, Name: "Motor" }, // 11 - { Slot: 12, Name: "Bremsen"}, // 12 - { Slot: 13, Name: "Getriebe"}, // 13 - { Slot: 14, Name: "Hupe"}, // 14 - { Slot: 15, Name: "Federung"}, // 15 - { Slot: 18, Name: "Turbo"}, // 18 - { Slot: 22, Name: "Licht"}, // 22 - { Slot: 23, Name: "Reifen"} // 23 + { Slot: 0, Name: "Spoiler" }, + { Slot: 1, Name: "Frontstoßstange"}, + { Slot: 2, Name: "Heckstoßstange"}, + { Slot: 3, Name: "Seitenschweller"}, + { Slot: 4, Name: "Auspuff"}, + { Slot: 5, Name: "Rahmen"}, + { Slot: 6, Name: "Kühlergrill"}, + { Slot: 7, Name: "Motorhaube"}, + { Slot: 8, Name: "Linker Kotflügel"}, + { Slot: 9, Name: "Rechter Kotflügel"}, + { Slot: 10, Name: "Dach"}, + { Slot: 11, Name: "Motor" }, + { Slot: 12, Name: "Bremsen"}, + { Slot: 13, Name: "Getriebe"}, + { Slot: 14, Name: "Hupe"}, + { Slot: 15, Name: "Federung"}, + { Slot: 18, Name: "Turbo"}, + { Slot: 22, Name: "Licht"}, + { Slot: 23, Name: "Reifen" }, + { Slot: 25, Name: "Nummernschildhalter" }, + { Slot: 27, Name: "Innenausstatung" }, + { Slot: 28, Name: "Wackelkopf" }, + { Slot: 33, Name: "Lenkrad" }, + { Slot: 34, Name: "Schalthebel" }, + { Slot: 35, Name: "Schild" }, + { Slot: 38, Name: "Hydraulik" }, + { Slot: 48, Name: "Design" } ]; var customPartNames = [ @@ -66,6 +74,27 @@ var customPartNames = [ Name: "Stoßdämpfer" } ] + }, + { + Model: 3308022675, + Names: [ + { + Slot: 9, + Name: "Kotflügel" + } + ] + } +]; + +var doorOpeners = [ + { + Model: 3308022675, + Doors: [ + { + Slot: 7, + Door: 4 + } + ] } ]; @@ -154,6 +183,15 @@ mp.events.add("showTuningMenu", () => { modSlot = parseInt(restStr); } + if (modSlot === 38) { + localVehicle.setDoorOpen(5, false, false); + } + + var door = getDoor(localVehicle.model, modSlot); + if (door !== undefined) { + localVehicle.setDoorOpen(door, false, false); + } + var currentMod = localVehicle.getMod(modSlot); var currentModItem; @@ -200,6 +238,14 @@ mp.events.add("showTuningMenu", () => { }); modMenu.MenuClose.on(() => { + if (modSlot === 38) { + localVehicle.setDoorShut(5, false); + } + + if (door !== undefined) { + localVehicle.setDoorShut(door, false); + } + localVehicle.setMod(modSlot, currentMod); mainMenu.Visible = true; modMenu.Visible = false; @@ -276,5 +322,19 @@ function getCustomId(model, name) { } }); + return toReturn; +} + +function getDoor(model, slot) { + var toReturn = undefined; + + doorOpeners.forEach((cpn) => { + if (cpn.Model === model) { + cpn.Doors.forEach((door) => { + if (door.Slot === slot) toReturn = door.Door; + }); + } + }); + return toReturn; } \ No newline at end of file From 5bdfb872fc4a1f1d614a3e24468fef0adf570494 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 19:26:16 +0100 Subject: [PATCH 13/30] Fixed door issue --- Client/Tuning/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/Tuning/main.js b/Client/Tuning/main.js index c5c398ff..123b184c 100644 --- a/Client/Tuning/main.js +++ b/Client/Tuning/main.js @@ -91,7 +91,7 @@ var doorOpeners = [ Model: 3308022675, Doors: [ { - Slot: 7, + Slot: 6, Door: 4 } ] From 3d25a6584829dd1fbf4f72ff68c6db99d273c0da Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 19:33:01 +0100 Subject: [PATCH 14/30] Really fix --- Client/Tuning/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/Tuning/main.js b/Client/Tuning/main.js index 123b184c..397befa4 100644 --- a/Client/Tuning/main.js +++ b/Client/Tuning/main.js @@ -91,7 +91,7 @@ var doorOpeners = [ Model: 3308022675, Doors: [ { - Slot: 6, + Slot: 5, Door: 4 } ] From 1ddba0fd2e878e1c36322272e3f2484c0cfc988d Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 23:17:10 +0100 Subject: [PATCH 15/30] Improved tuning --- Client/Tuning/main.js | 113 +++++++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 23 deletions(-) diff --git a/Client/Tuning/main.js b/Client/Tuning/main.js index 397befa4..c0d4927a 100644 --- a/Client/Tuning/main.js +++ b/Client/Tuning/main.js @@ -17,7 +17,7 @@ var carModSlotName = [ { Slot: 5, Name: "Rahmen"}, { Slot: 6, Name: "Kühlergrill"}, { Slot: 7, Name: "Motorhaube"}, - { Slot: 8, Name: "Linker Kotflügel"}, + { Slot: 8, Name: "Kotflügel"}, { Slot: 9, Name: "Rechter Kotflügel"}, { Slot: 10, Name: "Dach"}, { Slot: 11, Name: "Motor" }, @@ -48,15 +48,6 @@ var customPartNames = [ } ] }, - { - Model: 159274291, - Names: [ - { - Slot: 8, - Name: "Kotflügel" - } - ] - }, { Model: 223240013, Names: [ @@ -103,16 +94,12 @@ var bikeModTypes = []; const NativeUI = require("nativeui"); const Menu = NativeUI.Menu; const UIMenuItem = NativeUI.UIMenuItem; -const UIMenuListItem = NativeUI.UIMenuListItem; -const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem; -const UIMenuSliderItem = NativeUI.UIMenuSliderItem; const BadgeStyle = NativeUI.BadgeStyle; const Point = NativeUI.Point; -const ItemsCollection = NativeUI.ItemsCollection; -const Color = NativeUI.Color; -const ListItem = NativeUI.ListItem; var mainMenu; +var modMenu; +var closeMenu = false; mp.events.add('showTuningInfo', () => { mp.game.ui.setTextComponentFormat('STRING'); @@ -128,7 +115,13 @@ mp.events.add('hideTuningInfo', (unbind) => { mp.gui.chat.show(true); if (typeof mainMenu !== "undefined" && unbind) { - mainMenu.Visible = false; + mainMenu.Close(); + globalData.InTuning = false; + } + + if (typeof modMenu !== "undefined" && modMenu.Visible && unbind) { + closeMenu = true; + modMenu.Close(); globalData.InTuning = false; } @@ -153,9 +146,15 @@ mp.events.add("showTuningMenu", () => { return; } + if (typeof modMenu !== "undefined" && modMenu.Visible) { + return; + } + globalData.InTuning = true; - mainMenu = new Menu("Fahrzeugwerkstatt", "Modifiziere dein Fahrzeug", new Point(50, 50)); + var carName = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(localVehicle.model)); + + mainMenu = new Menu("Fahrzeugwerkstatt", carName, new Point(50, 50)); carModTypes.forEach((modType) => { if (localVehicle.getModSlotName(modType) !== "undefined") { @@ -174,7 +173,7 @@ mp.events.add("showTuningMenu", () => { } }); - mainMenu.Visible = true; + mainMenu.Open(); mainMenu.ItemSelect.on((item) => { var modSlot = getSlotId(item.Text); @@ -197,7 +196,7 @@ mp.events.add("showTuningMenu", () => { var modNum = localVehicle.getNumMods(modSlot); - var modMenu = new Menu(item.Text, "Änderung: " + item.Text, new Point(50, 50)); + modMenu = new Menu(item.Text, "Änderung: " + item.Text, new Point(50, 50)); for (var i = -1; i < modNum; i++) { var modItem; @@ -205,9 +204,8 @@ mp.events.add("showTuningMenu", () => { if (i === -1) { modItem = new UIMenuItem("Serie", ""); } else { - var modName = localVehicle.getModTextLabel(modSlot, i); - var realModName = mp.game.ui.getLabelText(modName); - modItem = new UIMenuItem(realModName, ""); + var modName = getModName(localVehicle, modSlot, i); + modItem = new UIMenuItem(modName, ""); } if (i === currentMod) { @@ -247,6 +245,12 @@ mp.events.add("showTuningMenu", () => { } localVehicle.setMod(modSlot, currentMod); + + if (closeMenu) { + closeMenu = false; + return; + } + mainMenu.Visible = true; modMenu.Visible = false; }); @@ -337,4 +341,67 @@ function getDoor(model, slot) { }); return toReturn; +} + +function getModName(vehicle, slot, mod) { + var modName = vehicle.getModTextLabel(slot, mod); + var realModName = mp.game.ui.getLabelText(modName); + + if (slot === 11) { + switch (mod) { + case 0: + realModName = "EMS Verbesserung 1"; + break; + case 1: + realModName = "EMS Verbesserung 2"; + break; + case 2: + realModName = "EMS Verbesserung 3"; + break; + case 3: + realModName = "EMS Verbesserung 4"; + break; + } + } else if (slot === 12) { + switch (mod) { + case 0: + realModName = "Straßenbremsen"; + break; + case 1: + realModName = "Sportbremsen"; + break; + case 2: + realModName = "Rennbremsen"; + break; + } + } else if (slot === 13) { + switch (mod) { + case 0: + realModName = "Straßengetriebe"; + break; + case 1: + realModName = "Sportgetriebe"; + break; + case 2: + realModName = "Renngetriebe"; + break; + } + } else if (slot === 15) { + switch (mod) { + case 0: + realModName = "Tiefere Federung"; + break; + case 1: + realModName = "Straßenfederung"; + break; + case 2: + realModName = "Sportfederung"; + break; + case 3: + realModName = "Rennfederung"; + break; + } + } + + return realModName; } \ No newline at end of file From ba02c523edeed1d7d0c8ad2968de02789570e38e Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 23:30:35 +0100 Subject: [PATCH 16/30] Disabled colors in chat, except of /o --- Server/Commands/Admin.cs | 13 +++++++++++-- Server/Commands/Faction.cs | 9 +++++++++ Server/Events/Chat.cs | 5 ++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 0afed36e..06632001 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -16,6 +16,7 @@ using reallife_gamemode.Server.Util; using reallife_gamemode.Server.Managers; using reallife_gamemode.Server.Saves; using reallife_gamemode.Server.Business; +using System.Text.RegularExpressions; /** * @overview Life of German Reallife - Admin Commands (Admin.cs) @@ -38,7 +39,9 @@ namespace reallife_gamemode.Server.Commands return; } - string publicMessage = "~b~(( " + player.GetUser().AdminLevel.GetName() + " " + player.Name + ": " + message + " ))"; + 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~))"; NAPI.Chat.SendChatMessageToAll(publicMessage); } @@ -151,6 +154,8 @@ namespace reallife_gamemode.Server.Commands return; } + msg = Regex.Replace(msg, "(!{(.*)})", ""); + player.SendChatMessage("~y~PM an " + target.Name + ": " + msg + " "); string Message = "~y~PM von " + player.GetUser().AdminLevel.GetName() + " " + player.Name + ": " + msg + ""; NAPI.Chat.SendChatMessageToPlayer(target, Message); @@ -203,6 +208,8 @@ namespace reallife_gamemode.Server.Commands return; } + message = Regex.Replace(message, "(!{(.*)})", ""); + ChatService.BroadcastAdmin("~r~[ADMINCHAT]: " + player.GetUser().AdminLevel.GetName() + " " + player.Name + "~w~: " + message, AdminLevel.ADMIN); } @@ -505,10 +512,12 @@ namespace reallife_gamemode.Server.Commands return; } + reason = Regex.Replace(reason, "(!{(.*)})", ""); + target.GetUser().BanPlayer(admin, reason, mins); } - [Command("unban", "~m~Benutzung: ~s~/unban [Name] ", GreedyArg = true)] + [Command("unban", "~m~Benutzung: ~s~/unban [Name] ")] public void CmdAdminUnban(Client admin, string userName) { if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) diff --git a/Server/Commands/Faction.cs b/Server/Commands/Faction.cs index dbb64f13..e7737612 100644 --- a/Server/Commands/Faction.cs +++ b/Server/Commands/Faction.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; /** * @overview Life of German Reallife - Faction Commands (Faction.cs) @@ -32,6 +33,8 @@ namespace reallife_gamemode.Server.Commands return; } + message = Regex.Replace(message, "(!{(.*)})", ""); + string broadcastMessage = "!{02FCFF}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + " )) **"; ChatService.BroadcastFaction(broadcastMessage, f); } @@ -46,6 +49,8 @@ namespace reallife_gamemode.Server.Commands return; } + message = Regex.Replace(message, "(!{(.*)})", ""); + string broadcastMessage = "!{33AA33}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **"; ChatService.BroadcastFaction(broadcastMessage, f); } @@ -60,6 +65,8 @@ namespace reallife_gamemode.Server.Commands return; } + message = Regex.Replace(message, "(!{(.*)})", ""); + string broadcastMessage = "!{CC3333}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **"; using (var context = new DatabaseContext()) { @@ -196,6 +203,8 @@ namespace reallife_gamemode.Server.Commands return; } + message = Regex.Replace(message, "(!{(.*)})", ""); + string broadcastMsg = "~y~[" + player.GetUser().GetFaction().Name + "] " + player.Name + ": " + message; NAPI.Pools.GetAllPlayers().ForEach(p => diff --git a/Server/Events/Chat.cs b/Server/Events/Chat.cs index 42cfe262..5079f560 100644 --- a/Server/Events/Chat.cs +++ b/Server/Events/Chat.cs @@ -1,4 +1,5 @@ using GTANetworkAPI; +using System.Text.RegularExpressions; namespace reallife_gamemode.Server.Events { @@ -7,7 +8,9 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.ChatMessage)] public void ChatEvent(Client player, string message) { - NAPI.Player.GetPlayersInRadiusOfPlayer(10, player).ForEach(p => p.SendChatMessage($"{player.Name} sagt: {message}")); + string serverMsg = Regex.Replace(message, "(!{(.*)})", ""); + if (serverMsg.Trim().Length == 0) return; + NAPI.Player.GetPlayersInRadiusOfPlayer(10, player).ForEach(p => p.SendChatMessage($"{player.Name} sagt: {serverMsg}")); } } } \ No newline at end of file From 94632cc428ef85ddad28a2b9704121c75287daac Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 Dec 2018 23:37:29 +0100 Subject: [PATCH 17/30] Added real time clock --- Main.cs | 1 + Server/Managers/TimeManager.cs | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 Server/Managers/TimeManager.cs diff --git a/Main.cs b/Main.cs index fd9b67f5..fd2a2bb2 100644 --- a/Main.cs +++ b/Main.cs @@ -36,6 +36,7 @@ namespace reallife_gamemode NAPI.Data.SetWorldData("playerCreatorDimension", 0); TuningManager.AddTuningGarage(new Vector3(-341, -134, 38.5)); + TimeManager.StartTimeManager(); DatabaseHelper.InitDatabaseFirstTime(); FactionHelper.CheckFactionBankAccounts(); diff --git a/Server/Managers/TimeManager.cs b/Server/Managers/TimeManager.cs new file mode 100644 index 00000000..43f2a843 --- /dev/null +++ b/Server/Managers/TimeManager.cs @@ -0,0 +1,25 @@ +using GTANetworkAPI; +using System; +using System.Collections.Generic; +using System.Text; +using System.Timers; + +namespace reallife_gamemode.Server.Managers +{ + public class TimeManager + { + public static void StartTimeManager() + { + Timer t = new Timer(1000); + t.Elapsed += SetTime; + + t.Start(); + } + + private static void SetTime(object sender, ElapsedEventArgs args) + { + DateTime now = DateTime.Now; + NAPI.World.SetTime(now.Hour, now.Minute, now.Second); + } + } +} From 76392f3c3835c594ca4b3aeeb73d62708c538c5c Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 00:13:28 +0100 Subject: [PATCH 18/30] Changed /a chat --- Server/Commands/Admin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 06632001..d3388573 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -210,7 +210,7 @@ namespace reallife_gamemode.Server.Commands message = Regex.Replace(message, "(!{(.*)})", ""); - ChatService.BroadcastAdmin("~r~[ADMINCHAT]: " + player.GetUser().AdminLevel.GetName() + " " + player.Name + "~w~: " + message, AdminLevel.ADMIN); + ChatService.BroadcastAdmin("~r~[ADMINCHAT]~s~ " + player.GetUser().AdminLevel.GetName() + " " + player.Name + "~w~: " + message, AdminLevel.ADMIN); } [Command("freeze", "~m~Benutzung: ~s~/freeze [Spieler]")] From 2dbdc3f2eb839000e08f7c8710479521e58df364 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 00:22:27 +0100 Subject: [PATCH 19/30] Added /car command (information about current vehicle) --- Server/Commands/User.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Server/Commands/User.cs b/Server/Commands/User.cs index 3119c56c..adbf9e3b 100644 --- a/Server/Commands/User.cs +++ b/Server/Commands/User.cs @@ -1,5 +1,6 @@ using GTANetworkAPI; using reallife_gamemode.Model; +using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Extensions; using System; using System.Collections.Generic; @@ -17,7 +18,7 @@ namespace reallife_gamemode.Server.Commands option = option.ToLower(); - switch(option) + switch(option) { case "invite": { @@ -57,5 +58,23 @@ namespace reallife_gamemode.Server.Commands } } } + + [Command("car", "~m~Benutzung: ~s~/car")] + public void CmdUserCar(Client player) + { + if (!player.IsLoggedIn()) return; + if (!player.IsInVehicle) return; + + Vehicle pVeh = player.Vehicle; + + if(pVeh.GetServerVehicle() is ServerVehicle veh) + { + player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | " + veh.ToString() + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor); + } + else + { + player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor); + } + } } } From ca433e537e43fd43e82597acb2c7729c18c0484e Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 00:46:13 +0100 Subject: [PATCH 20/30] Added /tov and /ghv (To Vehicle & Get Here Vehicle) --- Server/Commands/Admin.cs | 38 +++++++++++++++++++++++++++++++ Server/Commands/User.cs | 12 ++++++++-- Server/Managers/VehicleManager.cs | 5 ++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index d3388573..f88dd7b4 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -667,6 +667,44 @@ namespace reallife_gamemode.Server.Commands target.SendChatMessage("~b~Deine Waffen wurden dir von " + player.Name + "(Admin) abgenommen"); player.SendChatMessage("~b~Dem Spieler " + target.Name + " wurden erfolgreich alle Waffen abgenommen "); } + + [Command("tov", "~m~Benutzung: ~s~/tov [Fahrzeug ID]")] + public void CmdAdminTov(Client player, int vehid) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + Vehicle v = VehicleManager.GetVehicleFromId(vehid); + if(v == null) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieses Fahrzeug existiert nicht."); + return; + } + + player.Position = v.Position; + } + + [Command("ghv", "~m~Benutzung: ~s~/ghv [Fahrzeug ID]")] + public void CmdAdminGhv(Client player, int vehid) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + Vehicle v = VehicleManager.GetVehicleFromId(vehid); + if (v == null) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieses Fahrzeug existiert nicht."); + return; + } + + v.Position = player.Position; + } #endregion diff --git a/Server/Commands/User.cs b/Server/Commands/User.cs index adbf9e3b..aa5f86db 100644 --- a/Server/Commands/User.cs +++ b/Server/Commands/User.cs @@ -2,6 +2,7 @@ using reallife_gamemode.Model; using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; using System.Linq; @@ -69,11 +70,18 @@ namespace reallife_gamemode.Server.Commands if(pVeh.GetServerVehicle() is ServerVehicle veh) { - player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | " + veh.ToString() + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor); + if(player.GetUser().IsAdmin(AdminLevel.SUPPORTER)) + { + player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | " + veh.ToString() + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value); + } + else + { + player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value); + } } else { - player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor); + player.SendChatMessage("~m~" + ((VehicleHash)pVeh.Model) + " | Farbe 1: " + pVeh.PrimaryColor + " | Farbe 2: " + pVeh.SecondaryColor + " | ID: " + pVeh.Handle.Value); } } } diff --git a/Server/Managers/VehicleManager.cs b/Server/Managers/VehicleManager.cs index d2345fbb..d449561e 100644 --- a/Server/Managers/VehicleManager.cs +++ b/Server/Managers/VehicleManager.cs @@ -41,6 +41,11 @@ namespace reallife_gamemode.Server.Managers return NAPI.Pools.GetAllVehicles().Find(v => v.Handle == handle); } + public static Vehicle GetVehicleFromId(int id) + { + return NAPI.Pools.GetAllVehicles().Find(v => v.Handle.Value == id); + } + public static Vehicle GetVehicleFromServerVehicle(ServerVehicle serverVehicle) { if(!_serverVehicles.ContainsKey(serverVehicle.Id)) From 2c64fbf5f6211d64a6d94f0a0c546390c46d5d02 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 00:49:13 +0100 Subject: [PATCH 21/30] Added little slap for admin on /ghv and /tov so they dont get stuck in vehicle --- Server/Commands/Admin.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index f88dd7b4..bff7cfb5 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -684,7 +684,7 @@ namespace reallife_gamemode.Server.Commands return; } - player.Position = v.Position; + player.Position = v.Position.Add(new Vector3(0, 0, 2)); } [Command("ghv", "~m~Benutzung: ~s~/ghv [Fahrzeug ID]")] @@ -704,6 +704,7 @@ namespace reallife_gamemode.Server.Commands } v.Position = player.Position; + player.Position = player.Position.Add(new Vector3(0, 0, 2)); } #endregion From e5ae1351c4786da69c4e2869f6d1b0cfb92ed282 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 14:01:11 +0100 Subject: [PATCH 22/30] Added repair option in tuning --- Client/Tuning/main.js | 25 +++++++++++++++++++++++++ Server/Entities/ServerVehicle.cs | 11 ++++++++++- Server/Managers/TuningManager.cs | 7 +++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Client/Tuning/main.js b/Client/Tuning/main.js index c0d4927a..185df4a1 100644 --- a/Client/Tuning/main.js +++ b/Client/Tuning/main.js @@ -156,6 +156,31 @@ mp.events.add("showTuningMenu", () => { mainMenu = new Menu("Fahrzeugwerkstatt", carName, new Point(50, 50)); + if (localVehicle.getBodyHealth() !== 1000) { + + var repairItem = new UIMenuItem("Fahrzeug reparieren"); + mainMenu.AddItem(repairItem); + + mainMenu.ItemSelect.on((selectedItem, index) => { + if (selectedItem === repairItem) { + mp.events.callRemote("repairVehicle"); + mainMenu.Close(); + setTimeout(() => { + mp.events.call("showTuningMenu"); + }, 500); + } + }); + + mainMenu.MenuClose.on(() => { + globalData.InTuning = false; + mp.events.call("hideTuningInfo", false); + }); + + mainMenu.Open(); + + return; + } + carModTypes.forEach((modType) => { if (localVehicle.getModSlotName(modType) !== "undefined") { var slotName = mp.game.ui.getLabelText(localVehicle.getModSlotName(modType)); diff --git a/Server/Entities/ServerVehicle.cs b/Server/Entities/ServerVehicle.cs index 5c58010c..ce4ba97f 100644 --- a/Server/Entities/ServerVehicle.cs +++ b/Server/Entities/ServerVehicle.cs @@ -36,11 +36,20 @@ namespace reallife_gamemode.Server.Entities Vehicle veh = NAPI.Vehicle.CreateVehicle(this.Model, this.Position, this.Heading, this.PrimaryColor, this.SecondaryColor, this.NumberPlate, locked: this.Locked, engine: false); VehicleManager.AddVehicle(this, veh); + string numberplate = $"{this.Id}"; + if(this is FactionVehicle fV) { - veh.NumberPlate = fV.GetFaction().Name; + numberplate = $"F{fV.FactionId} " + numberplate; } + if (this is UserVehicle uV) + { + numberplate = $"U{uV.UserId} " + numberplate; + } + + veh.NumberPlate = numberplate; + return veh; } } diff --git a/Server/Managers/TuningManager.cs b/Server/Managers/TuningManager.cs index 3f45c37e..af14867c 100644 --- a/Server/Managers/TuningManager.cs +++ b/Server/Managers/TuningManager.cs @@ -62,6 +62,13 @@ namespace reallife_gamemode.Server.Managers player.TriggerEvent("showTuningMenu"); } + [RemoteEvent("repairVehicle")] + public void RepairVehicle(Client player) + { + if (!player.IsInVehicle) return; + player.Vehicle.Repair(); + } + [RemoteEvent("setVehicleMod")] public void SetVehicleMod(Client player, int slot, int index) { From bcf6c2b8ff99b0890fdd9446ecbf95a81d859163 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 14:09:56 +0100 Subject: [PATCH 23/30] Added los santos customs --- Main.cs | 2 ++ Server/Managers/TuningManager.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Main.cs b/Main.cs index fd2a2bb2..feb753c8 100644 --- a/Main.cs +++ b/Main.cs @@ -36,6 +36,8 @@ namespace reallife_gamemode NAPI.Data.SetWorldData("playerCreatorDimension", 0); TuningManager.AddTuningGarage(new Vector3(-341, -134, 38.5)); + TuningManager.AddTuningGarage(new Vector3(732, -1088, 21)); + TuningManager.AddTuningGarage(new Vector3(-1155, -2006, 12)); TimeManager.StartTimeManager(); DatabaseHelper.InitDatabaseFirstTime(); diff --git a/Server/Managers/TuningManager.cs b/Server/Managers/TuningManager.cs index af14867c..5318d077 100644 --- a/Server/Managers/TuningManager.cs +++ b/Server/Managers/TuningManager.cs @@ -17,7 +17,7 @@ namespace reallife_gamemode.Server.Managers /// Die Position der Garage public static void AddTuningGarage(Vector3 pos) { - ColShape colShape = NAPI.ColShape.CreateSphereColShape(pos, 10, 0); + ColShape colShape = NAPI.ColShape.CreateSphereColShape(pos, 5, 0); colShape.OnEntityEnterColShape += (cs, c) => { From 91eddfc58077017953e89b5b20c35588c89ed489 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 Dec 2018 18:37:11 +0100 Subject: [PATCH 24/30] Improved color code prohibition --- Server/Commands/Admin.cs | 8 ++++---- Server/Commands/Faction.cs | 10 +++++----- Server/Events/Chat.cs | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index bff7cfb5..1496050e 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -38,7 +38,7 @@ namespace reallife_gamemode.Server.Commands ChatService.NotAuthorized(player); return; } - + message = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); 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~))"; @@ -154,7 +154,7 @@ namespace reallife_gamemode.Server.Commands return; } - msg = Regex.Replace(msg, "(!{(.*)})", ""); + msg = Regex.Replace(msg, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); player.SendChatMessage("~y~PM an " + target.Name + ": " + msg + " "); string Message = "~y~PM von " + player.GetUser().AdminLevel.GetName() + " " + player.Name + ": " + msg + ""; @@ -208,7 +208,7 @@ namespace reallife_gamemode.Server.Commands return; } - message = Regex.Replace(message, "(!{(.*)})", ""); + message = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); ChatService.BroadcastAdmin("~r~[ADMINCHAT]~s~ " + player.GetUser().AdminLevel.GetName() + " " + player.Name + "~w~: " + message, AdminLevel.ADMIN); } @@ -512,7 +512,7 @@ namespace reallife_gamemode.Server.Commands return; } - reason = Regex.Replace(reason, "(!{(.*)})", ""); + reason = Regex.Replace(reason, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); target.GetUser().BanPlayer(admin, reason, mins); } diff --git a/Server/Commands/Faction.cs b/Server/Commands/Faction.cs index e7737612..c162e78b 100644 --- a/Server/Commands/Faction.cs +++ b/Server/Commands/Faction.cs @@ -33,7 +33,7 @@ namespace reallife_gamemode.Server.Commands return; } - message = Regex.Replace(message, "(!{(.*)})", ""); + message = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); string broadcastMessage = "!{02FCFF}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + " )) **"; ChatService.BroadcastFaction(broadcastMessage, f); @@ -49,7 +49,7 @@ namespace reallife_gamemode.Server.Commands return; } - message = Regex.Replace(message, "(!{(.*)})", ""); + message = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); string broadcastMessage = "!{33AA33}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **"; ChatService.BroadcastFaction(broadcastMessage, f); @@ -65,7 +65,7 @@ namespace reallife_gamemode.Server.Commands return; } - message = Regex.Replace(message, "(!{(.*)})", ""); + message = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); string broadcastMessage = "!{CC3333}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **"; using (var context = new DatabaseContext()) @@ -203,7 +203,7 @@ namespace reallife_gamemode.Server.Commands return; } - message = Regex.Replace(message, "(!{(.*)})", ""); + message = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); string broadcastMsg = "~y~[" + player.GetUser().GetFaction().Name + "] " + player.Name + ": " + message; @@ -264,7 +264,7 @@ namespace reallife_gamemode.Server.Commands player.SendNotification("Du hast~g~" + target.Name + " ~s~geheilt.", false); } #endregion - #region Global Fraktions Commands + #region Global Fraktions Commands [Command("duty", "~m~Benutzung: ~s~/duty")] public void CmdFactionDuty(Client player) { diff --git a/Server/Events/Chat.cs b/Server/Events/Chat.cs index 5079f560..a2cc9b77 100644 --- a/Server/Events/Chat.cs +++ b/Server/Events/Chat.cs @@ -8,7 +8,7 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.ChatMessage)] public void ChatEvent(Client player, string message) { - string serverMsg = Regex.Replace(message, "(!{(.*)})", ""); + string serverMsg = Regex.Replace(message, "(~[a-zA-Z]~{1})|(!{(.*)})", ""); if (serverMsg.Trim().Length == 0) return; NAPI.Player.GetPlayersInRadiusOfPlayer(10, player).ForEach(p => p.SendChatMessage($"{player.Name} sagt: {serverMsg}")); } From 6f8d9598a74afb0042270b22174440f4fb87805f Mon Sep 17 00:00:00 2001 From: xSprite Date: Tue, 4 Dec 2018 16:18:32 +0100 Subject: [PATCH 25/30] Add makeadmin, change adminlevel --- Server/Commands/Admin.cs | 58 +++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 1496050e..d9acdfdf 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1439,6 +1439,11 @@ namespace reallife_gamemode.Server.Commands player.SendChatMessage("~m~Benutzung: ~s~/remove [Goto] [Punkt]"); return; } + if (!player.GetUser()?.IsAdmin(AdminLevel.PROJEKTLEITUNG) ?? true) //1338 + { + ChatService.NotAuthorized(player); + return; + } using (var dbContext = new DatabaseContext()) { GotoPoint p = dbContext.GotoPoints.FirstOrDefault(x => x.Description == option); @@ -1932,10 +1937,14 @@ namespace reallife_gamemode.Server.Commands BankManager.SetMoney(player, business, amount, "Admin"); } + #endregion + + #region ALevel1338 + [Command("whitelist", "~m~Benutzung: ~s~/whitelist [Add / Remove] [Socialclub Name]")] public void CmdAdminWhitelist(Client player, string option, string scName) { - if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + if (!player.GetUser()?.IsAdmin(AdminLevel.PROJEKTLEITUNG) ?? true) { ChatService.NotAuthorized(player); return; @@ -1943,15 +1952,15 @@ namespace reallife_gamemode.Server.Commands option = option.ToLower(); - if(option != "add" && option != "remove") + if (option != "add" && option != "remove") { player.SendChatMessage("~m~Benutzung: ~s~/whitelist [Add / Remove] [Socialclub Name]"); return; } - using(var dbContext = new DatabaseContext()) + using (var dbContext = new DatabaseContext()) { - if(option == "add") + if (option == "add") { if (dbContext.WhitelistEntries.Any(w => w.SocialClubName.ToLower() == scName.ToLower())) { @@ -1964,7 +1973,7 @@ namespace reallife_gamemode.Server.Commands player.SendChatMessage("~b~[ADMIN]~s~ ~y~" + scName + "~s~ wurde erfolgreich zur Whitelist hinzugefügt."); } - else if(option == "remove") + else if (option == "remove") { if (!dbContext.WhitelistEntries.Any(w => w.SocialClubName.ToLower() == scName.ToLower())) { @@ -1980,13 +1989,44 @@ namespace reallife_gamemode.Server.Commands dbContext.SaveChanges(); } } + + [Command("makeadmin", "~m~Benutzung: ~s~/makeadmin [Name] [Adminlevel]")] + public void CmdAdminSetadmin(Client player, string name, int rank) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.PROJEKTLEITUNG) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + if (!Enum.IsDefined(typeof(AdminLevel), rank)) + { + player.SendChatMessage("~r~[FEHLER]~s~ Dieser Adminrang ist nicht definiert."); + return; + } + + Client target = ClientService.GetClientByNameOrId(name); + if (target == null || !target.IsLoggedIn()) + { + ChatService.PlayerNotFound(player); + return; + } + + using (var dbContext = new DatabaseContext()) + { + target.GetUser(dbContext).AdminLevel = (AdminLevel)rank; + dbContext.SaveChanges(); + } + target.SendChatMessage("Du wurdest durch " + player.Name + " auf Adminlevel " + target.GetUser().AdminLevel.GetName() + ":(" + rank + ") gesetzt."); + player.SendChatMessage("Du hast " + target.Name + " auf Adminlevel " + target.GetUser().AdminLevel.GetName() + ":(" + rank + ") gesetzt."); + + } + + #endregion - #region ALevel1338 - // ): - #endregion - /* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ + /* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ //TEST COMMAND [Command("own")] From 54b647c38e923bfedbd4d074dd253beeba4d0540 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 6 Dec 2018 19:32:37 +0100 Subject: [PATCH 26/30] Some improvements --- Client/Gui/infobox.js | 2 +- Server/Events/Death.cs | 1 + Server/Events/Register.cs | 5 ++++- Server/Extensions/IntegerExtension.cs | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Client/Gui/infobox.js b/Client/Gui/infobox.js index f8262bd2..f631969f 100644 --- a/Client/Gui/infobox.js +++ b/Client/Gui/infobox.js @@ -69,7 +69,7 @@ mp.events.add("toggleUi", (show) => { //} mp.events.add("updateMoney", (money) => { - playerMoney = money; + playerMoney = money.toLocaleString("de-DE", { minimumFractionDigits: 0 }); }); mp.events.add("render", () => { diff --git a/Server/Events/Death.cs b/Server/Events/Death.cs index 04faaefb..578072f6 100644 --- a/Server/Events/Death.cs +++ b/Server/Events/Death.cs @@ -22,6 +22,7 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerDeath)] public void OnPlayerDeath(Client player, Client killer, uint reason) { + if (!player.IsLoggedIn()) player.Kick(); player.SetData("isDead", true); if (player.GetUser().IsAdmin(AdminLevel.ADMIN) == true) diff --git a/Server/Events/Register.cs b/Server/Events/Register.cs index 7e285c7d..01b503ee 100644 --- a/Server/Events/Register.cs +++ b/Server/Events/Register.cs @@ -28,7 +28,10 @@ namespace reallife_gamemode.Server.Events { Name = player.Name, SocialClubName = player.SocialClubName, - Password = NAPI.Util.GetHashSha256(password) + Password = NAPI.Util.GetHashSha256(password), + PositionX = Main.DEFAULT_SPAWN_POSITION.X, + PositionY = Main.DEFAULT_SPAWN_POSITION.Y, + PositionZ = Main.DEFAULT_SPAWN_POSITION.Z }; dbContext.Users.Add(user); diff --git a/Server/Extensions/IntegerExtension.cs b/Server/Extensions/IntegerExtension.cs index 96bd1aa8..d5172998 100644 --- a/Server/Extensions/IntegerExtension.cs +++ b/Server/Extensions/IntegerExtension.cs @@ -12,7 +12,7 @@ namespace reallife_gamemode.Server.Extensions } public static string ToMoneyString(this int money) { - return string.Format(Main.SERVER_CULTURE, "{0:C0}", money).Replace('€', '$'); + return "$" + string.Format(Main.SERVER_CULTURE, "{0:C0}", money).Replace("€", ""); } } } From a5269637c3ff7e753fb156f445d25ed8375185f3 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 8 Dec 2018 14:37:50 +0100 Subject: [PATCH 27/30] Improved postbuild events, added freecam (F5), add check if vehicle hash is valid, improved deathscreen --- Client/Gui/deathscreen.js | 10 ++- Client/Player/freecam.js | 124 ++++++++++++++++++++++++++++++ Client/index.js | 4 + Server/Commands/Admin.cs | 18 ++--- Server/Managers/VehicleManager.cs | 20 +++++ reallife-gamemode.csproj | 2 +- 6 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 Client/Player/freecam.js diff --git a/Client/Gui/deathscreen.js b/Client/Gui/deathscreen.js index 639403b9..682dcb4f 100644 --- a/Client/Gui/deathscreen.js +++ b/Client/Gui/deathscreen.js @@ -68,7 +68,13 @@ mp.events.add("render", () => { var medicString; if (dutyMedics > 0) { - medicString = "Derzeit sind ~g~" + dutyMedics + " Medics ~s~im Dienst ~c~und versuchen dich wiederzubeleben..."; + medicString = "Derzeit "; + if (dutyMedics === 1) { + medicString += "ist ~g~" + dutyMedics + " Medic"; + } else { + medicString = "sind ~g~" + dutyMedics + " Medics"; + } + medicString += " ~s~im Dienst ~c~und versuchen dich wiederzubeleben..."; } else { medicString = "Derzeit sind ~r~keine Medics ~s~im Dienst."; } @@ -76,6 +82,7 @@ mp.events.add("render", () => { deathSeconds = respawnTime - Math.floor(currentDate.getTime() / 1000); var alpha = fade + Math.floor(currentDate.getTime() / 1000 - deathDate.getTime() / 1000); if (deathSeconds >= 0) { + mp.game.graphics.set2dLayer(2); mp.game.graphics.drawSprite("Mptattoos", "clearout", 0.625, 0.52, 0.1, 0.1, 0, 255, 255, 255, 236); mp.game.graphics.drawText("Respawn in: ~y~" + deathSeconds, [0.5, 0.5], { @@ -91,6 +98,7 @@ mp.events.add("render", () => { scale: [0.4, 0.4], outline: true }); + mp.game.graphics.set2dLayer(1); mp.game.graphics.drawRect(0.5, 0.5, 1, 1, 0, 0, 0, alpha); } else { diff --git a/Client/Player/freecam.js b/Client/Player/freecam.js new file mode 100644 index 00000000..a31d2521 --- /dev/null +++ b/Client/Player/freecam.js @@ -0,0 +1,124 @@ +const controlsIds = { + F5: 327, + W: 32, // 232 + S: 33, // 31, 219, 233, 268, 269 + A: 34, // 234 + D: 35, // 30, 218, 235, 266, 267 + Space: 321, + LCtrl: 326, +}; + +global.fly = { + flying: false, f: 2.0, w: 2.0, h: 2.0, point_distance: 1000, +}; +global.gameplayCam = mp.cameras.new('gameplay'); + +mp.game.graphics.notify('~r~Fly script loaded!'); +mp.game.graphics.notify('~r~F5~w~ - enable/disable\n~r~F5+Space~w~ - disable without warping to ground\n~r~W/A/S/D/Space/LCtrl~w~ - move'); +mp.game.graphics.notify('~r~/savecam~w~ - save Camera position.'); + +let direction = null; +let coords = null; + +function pointingAt(distance) { + const farAway = new mp.Vector3((direction.x * distance) + (coords.x), (direction.y * distance) + (coords.y), (direction.z * distance) + (coords.z)); + + const result = mp.raycasting.testPointToPoint(coords, farAway, [1, 16]); + if (result === undefined) { + return 'undefined'; + } + return result; +} + +mp.events.add('render', () => { + const controls = mp.game.controls; + const fly = global.fly; + direction = global.gameplayCam.getDirection(); + coords = global.gameplayCam.getCoord(); + + mp.game.graphics.drawText(`Coords: ${JSON.stringify(coords)}`, [0.5, 0.005], { + font: 0, + color: [255, 255, 255, 185], + scale: [0.3, 0.3], + outline: true, + }); + mp.game.graphics.drawText(`pointAtCoord: ${JSON.stringify(pointingAt(fly.point_distance).position)}`, [0.5, 0.025], { + font: 0, + color: [255, 255, 255, 185], + scale: [0.3, 0.3], + outline: true, + }); + + if (controls.isControlJustPressed(0, controlsIds.F5)) { + fly.flying = !fly.flying; + + const player = mp.players.local; + + player.setInvincible(fly.flying); + player.freezePosition(fly.flying); + player.setAlpha(fly.flying ? 0 : 255); + + if (!fly.flying && !controls.isControlPressed(0, controlsIds.Space)) { + const position = mp.players.local.position; + position.z = mp.game.gameplay.getGroundZFor3dCoord(position.x, position.y, position.z, 0.0, false); + mp.players.local.setCoordsNoOffset(position.x, position.y, position.z, false, false, false); + } + + mp.game.graphics.notify(fly.flying ? 'Fly: ~g~Enabled' : 'Fly: ~r~Disabled'); + } else if (fly.flying) { + let updated = false; + const position = mp.players.local.position; + + if (controls.isControlPressed(0, controlsIds.W)) { + if (fly.f < 8.0) { fly.f *= 1.025; } + + position.x += direction.x * fly.f; + position.y += direction.y * fly.f; + position.z += direction.z * fly.f; + updated = true; + } else if (controls.isControlPressed(0, controlsIds.S)) { + if (fly.f < 8.0) { fly.f *= 1.025; } + + position.x -= direction.x * fly.f; + position.y -= direction.y * fly.f; + position.z -= direction.z * fly.f; + updated = true; + } else { + fly.f = 2.0; + } + + if (controls.isControlPressed(0, controlsIds.A)) { + if (fly.l < 8.0) { fly.l *= 1.025; } + + position.x += (-direction.y) * fly.l; + position.y += direction.x * fly.l; + updated = true; + } else if (controls.isControlPressed(0, controlsIds.D)) { + if (fly.l < 8.0) { fly.l *= 1.05; } + + position.x -= (-direction.y) * fly.l; + position.y -= direction.x * fly.l; + updated = true; + } else { + fly.l = 2.0; + } + + if (controls.isControlPressed(0, controlsIds.Space)) { + if (fly.h < 8.0) { fly.h *= 1.025; } + + position.z += fly.h; + updated = true; + } else if (controls.isControlPressed(0, controlsIds.LCtrl)) { + if (fly.h < 8.0) { fly.h *= 1.05; } + + position.z -= fly.h; + updated = true; + } else { + fly.h = 2.0; + } + + if (updated) { + mp.players.local.setCoordsNoOffset(position.x, position.y, position.z, false, false, false); + } + } +}); \ No newline at end of file diff --git a/Client/index.js b/Client/index.js index 39cecf52..cf5f0946 100644 --- a/Client/index.js +++ b/Client/index.js @@ -9,6 +9,8 @@ let globalData = { HideGui: false }; +mp.game.gameplay.enableMpDlcMaps(true); + require('./CharCreator/index.js'); require('./FactionManagement/main.js'); @@ -24,6 +26,8 @@ require('./Login/main.js'); require('./Player/dutycloth.js'); require('./Player/keys.js'); +require('./Player/quit.js'); +require('./Player/freecam.js'); require('./Save/main.js'); diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index d9acdfdf..e4595b99 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -800,23 +800,15 @@ namespace reallife_gamemode.Server.Commands return; } - hash = hash.ToUpper(); + uint uHash = NAPI.Util.GetHashKey(hash); - if (!uint.TryParse(hash, out uint vehHash)) + if(!VehicleManager.IsValidHash(uHash)) { - if (!Enum.TryParse(hash, true, out VehicleHash realHash)) - { - player.SendChatMessage("~r~[FEHLER]~s~ Dieses Fahrzeug existiert nicht."); - return; - } - else - { - vehHash = (uint)realHash; - } + player.SendChatMessage("~r~[FEHLER]~s~ Dieses Fahrzeug existiert nicht."); + return; } - Vehicle v = NAPI.Vehicle.CreateVehicle(vehHash, player.Position, player.Rotation.Z, color1, color2); - + Vehicle v = NAPI.Vehicle.CreateVehicle(uHash, player.Position, player.Rotation.Z, color1, color2); player.SetIntoVehicle(v.Handle, -1); } diff --git a/Server/Managers/VehicleManager.cs b/Server/Managers/VehicleManager.cs index d449561e..d03ae2eb 100644 --- a/Server/Managers/VehicleManager.cs +++ b/Server/Managers/VehicleManager.cs @@ -9,6 +9,11 @@ namespace reallife_gamemode.Server.Managers { public class VehicleManager { + private static readonly List _enabledMods = new List() + { + + }; + private static Dictionary _serverVehicles = new Dictionary(); public static void AddVehicle(ServerVehicle serverVehicle, Vehicle vehicle) @@ -71,5 +76,20 @@ namespace reallife_gamemode.Server.Managers return null; } + + public static bool IsValidHash(uint hash) + { + foreach(VehicleHash vh in Enum.GetValues(typeof(VehicleHash))) + { + if ((uint)vh == hash) return true; + } + + foreach(string mod in _enabledMods) + { + if (NAPI.Util.GetHashKey(mod) == hash) return true; + } + + return false; + } } } diff --git a/reallife-gamemode.csproj b/reallife-gamemode.csproj index 8019dc4d..c1c40cc7 100644 --- a/reallife-gamemode.csproj +++ b/reallife-gamemode.csproj @@ -26,6 +26,6 @@ - + \ No newline at end of file From d3f026630a62613b9961c1d88142bbfb95c512e5 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 8 Dec 2018 15:13:17 +0100 Subject: [PATCH 28/30] Changed duty medic update, added command to change vehicle livery (/vlivery) --- Client/Gui/deathscreen.js | 9 +------- Server/Commands/Admin.cs | 48 +++++++++++++++++++++++++++------------ Server/Events/Key.cs | 10 +++++++- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/Client/Gui/deathscreen.js b/Client/Gui/deathscreen.js index 682dcb4f..b25bf574 100644 --- a/Client/Gui/deathscreen.js +++ b/Client/Gui/deathscreen.js @@ -49,14 +49,7 @@ mp.events.add("respawnDeathPlayer", () => { }); mp.events.add("updateDutyMedics", (count) => { - if (count === true) - { - dutyMedics++; - } - else - { - dutyMedics--; - } + dutyMedics = count; }); diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index e4595b99..9f789bcf 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -838,7 +838,7 @@ namespace reallife_gamemode.Server.Commands return; } - if (!player.IsInVehicle) // Man darf keine Autos erstellen, wenn man selbst in einem sitzt (verhindert Bugs) + if (!player.IsInVehicle) { player.SendChatMessage("~r~[FEHLER]~s~ Du sitzt momentan nicht in einem Fahrzeug."); return; @@ -856,6 +856,26 @@ namespace reallife_gamemode.Server.Commands VehicleManager.DeleteVehicle(playerVeh); } + [Command("vlivery", "~m~Benutzung: ~s~/vlivery [Livery]")] + public void CmdAdminVlivery(Client player, int livery) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN3) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + if (!player.IsInVehicle) + { + player.SendChatMessage("~r~[FEHLER]~s~ Du sitzt momentan nicht in einem Fahrzeug."); + return; + } + + Vehicle playerVeh = player.Vehicle; + + playerVeh.Livery = livery; + } + [Command("vcolor", "~m~Benutzung: ~s~/vcolor [Farb-ID1] [Farb-ID2]")] public void CmdAdminColor(Client player, int color1, int color2) { @@ -1113,35 +1133,35 @@ namespace reallife_gamemode.Server.Commands } [Command("freekh", "~m~Benutzung: ~s~/freekh (Radius)")] - public void CmdAdminFreekh(Client player, float radius = 999999999) + public void CmdAdminFreekh(Client player, float radius = -1) { if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) { ChatService.NotAuthorized(player); return; } - var peopleInRange = NAPI.Player.GetPlayersInRadiusOfPlayer(radius, player); + var peopleInRange = radius == -1 ? NAPI.Pools.GetAllPlayers() : NAPI.Player.GetPlayersInRadiusOfPlayer(radius, player); + int playerRevided = 0; + + string toPlayerChat = "~b~Admin " + player.Name + " hat alle Spieler wiederbelebt"; + string toPlayerNotification = "Du wurdest von Admin ~y~" + player.Name + "~s~ wiederbelebt."; foreach (var managedClient in peopleInRange) { if (!managedClient.IsLoggedIn()) return; - if (radius == 999999999) - { - managedClient.SendChatMessage("~b~Admin " + player.Name + " hat alle Spieler wiederbelebt"); - player.SendChatMessage("~b~Du hast " + peopleInRange.Count + " Spieler wiederbelebt"); - } - else - { - managedClient.SendChatMessage("~b~Admin " + player.Name + " hat im Radius von " + radius + " alle Spieler wiederbelebt"); - player.SendChatMessage("~b~Du hast " + peopleInRange.Count + " Spieler wiederbelebt"); - } if (!managedClient.HasData("isDead") || managedClient.GetData("isDead") == false) continue; + playerRevided++; + managedClient.TriggerEvent("onPlayerRevived"); - managedClient.SendNotification("Du wurdest von Admin ~y~" + player.Name + "~s~ wiederbelebt."); managedClient.SetData("isDead", false); + managedClient.SendNotification(toPlayerNotification); + managedClient.SendChatMessage(toPlayerChat); + NAPI.Player.SpawnPlayer(managedClient, managedClient.Position); managedClient.Health = 100; } + + player.SendChatMessage("~b~Du hast " + playerRevided + " Spieler wiederbelebt."); } [Command("rsetarmor", "~m~Benutzung: ~s~/rsetarmor [Radius] (Armor)")] diff --git a/Server/Events/Key.cs b/Server/Events/Key.cs index 7d3a56c6..b27b7a84 100644 --- a/Server/Events/Key.cs +++ b/Server/Events/Key.cs @@ -51,7 +51,15 @@ namespace reallife_gamemode.Server.Events player.SendNotification("Du bist nun ~g~im Dienst."); if (player.GetUser().FactionId == 2) //Fire Department { - NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", true); + int medicCount = 0; + foreach(Client c in NAPI.Pools.GetAllPlayers()) + { + if((c.GetUser()?.GetFaction().Id ?? 0) == 2) + { + medicCount++; + } + } + NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", medicCount); } switch (factionId) { From ee183d8d2ddf91842ac758945ae82ae64b6ea329 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 8 Dec 2018 21:48:58 +0100 Subject: [PATCH 29/30] Added map improvements, begin tuning sync for turbo and headlights, fix error on disconnect when crash --- .gitattributes | 1 + Client/Tuning/sync.js | 4 ++++ Client/dlcpacks/map_improvement/dlc.rpf | 3 +++ Client/index.js | 1 + Server/Commands/Admin.cs | 3 +-- Server/Events/Disconnect.cs | 18 ++++++++---------- Server/Managers/LoadManager.cs | 2 -- Server/Managers/VehicleManager.cs | 2 +- 8 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 .gitattributes create mode 100644 Client/Tuning/sync.js create mode 100644 Client/dlcpacks/map_improvement/dlc.rpf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..3c3559de --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.rpf filter=lfs diff=lfs merge=lfs -text diff --git a/Client/Tuning/sync.js b/Client/Tuning/sync.js new file mode 100644 index 00000000..24baf472 --- /dev/null +++ b/Client/Tuning/sync.js @@ -0,0 +1,4 @@ +mp.events.add('entityStreamIn', (entity) => { + mp.gui.chat.push("streamed in:"); + mp.gui.chat.push(entity.Model); +}); \ No newline at end of file diff --git a/Client/dlcpacks/map_improvement/dlc.rpf b/Client/dlcpacks/map_improvement/dlc.rpf new file mode 100644 index 00000000..2226f873 --- /dev/null +++ b/Client/dlcpacks/map_improvement/dlc.rpf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4583d08eb98355d8640aac132b305e16504c9886fbd319aa44f10c3b7b099987 +size 13824 diff --git a/Client/index.js b/Client/index.js index cf5f0946..7a5fa58a 100644 --- a/Client/index.js +++ b/Client/index.js @@ -34,5 +34,6 @@ require('./Save/main.js'); require('./Speedometer/index.js'); require('./Tuning/main.js'); +require('./Tuning/sync.js'); require('./Business/main.js'); diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 9f789bcf..0b425734 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1043,8 +1043,7 @@ namespace reallife_gamemode.Server.Commands return; } - if (mod == -1) player.Vehicle.RemoveMod(slot); - else player.Vehicle.SetMod(slot, mod); + player.Vehicle.SetMod(slot, mod); } [Command("aneon", "~m~Benutzung: ~s~/aneon [R][G][B]")] diff --git a/Server/Events/Disconnect.cs b/Server/Events/Disconnect.cs index 1811d970..c200b6b9 100644 --- a/Server/Events/Disconnect.cs +++ b/Server/Events/Disconnect.cs @@ -36,19 +36,17 @@ namespace reallife_gamemode.Server.Events using (var saveUser = new Model.DatabaseContext()) { var user = player.GetUser(saveUser); + Vector3 pos = player.Position; - if(user == null) + if(!float.IsNaN(pos.X) && !float.IsNaN(pos.Y) && !float.IsNaN(pos.Z)) { - return; - } - else - { - user.PositionX = player.Position.X; - user.PositionY = player.Position.Y; - user.PositionZ = player.Position.Z; - user.Dead = player.GetData("isDead"); + user.PositionX = pos.X; + user.PositionY = pos.Y; + user.PositionZ = pos.Z; saveUser.SaveChanges(); - } + } + + user.Dead = player.HasData("isDead") ? player.GetData("isDead") : false; } player.SetData("isLoggedIn", false); } diff --git a/Server/Managers/LoadManager.cs b/Server/Managers/LoadManager.cs index 7d7737e6..651d34c6 100644 --- a/Server/Managers/LoadManager.cs +++ b/Server/Managers/LoadManager.cs @@ -46,8 +46,6 @@ namespace reallife_gamemode.Server.Managers tLabel.AttachTo(current, "chassis", new Vector3(0, 0, 1.5), new Vector3(0, 0, 0)); } } - - } } } diff --git a/Server/Managers/VehicleManager.cs b/Server/Managers/VehicleManager.cs index d03ae2eb..6359dbd3 100644 --- a/Server/Managers/VehicleManager.cs +++ b/Server/Managers/VehicleManager.cs @@ -11,7 +11,7 @@ namespace reallife_gamemode.Server.Managers { private static readonly List _enabledMods = new List() { - + "polamggtr" }; private static Dictionary _serverVehicles = new Dictionary(); From 64c80d0f35e002c033f0edfb5ecd38935e2b2e98 Mon Sep 17 00:00:00 2001 From: hydrant Date: Sat, 8 Dec 2018 22:07:16 +0100 Subject: [PATCH 30/30] Added first car mod (polamggtr) --- Client/dlcpacks/polamggtr/dlc.rpf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Client/dlcpacks/polamggtr/dlc.rpf diff --git a/Client/dlcpacks/polamggtr/dlc.rpf b/Client/dlcpacks/polamggtr/dlc.rpf new file mode 100644 index 00000000..44e46693 --- /dev/null +++ b/Client/dlcpacks/polamggtr/dlc.rpf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b0c2b1815e1add21f0cae50c575fe2232dc5e875321462bd092a5e0957303e9 +size 41567232