diff --git a/Client/Player/dutycloth.js b/Client/Player/dutycloth.js new file mode 100644 index 00000000..ca12eae2 --- /dev/null +++ b/Client/Player/dutycloth.js @@ -0,0 +1,44 @@ +/** + * @overview Life of German Reallife - Player DutyClothes dutyclothes.js + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +const NativeUI = require("nativeui"); +const Menu = NativeUI.Menu; +const UIMenuItem = NativeUI.UIMenuItem; +const UIMenuListItem = NativeUI.UIMenuListItem; +const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem; +const BadgeStyle = NativeUI.BadgeStyle; +const Point = NativeUI.Point; +const ItemsCollection = NativeUI.ItemsCollection; +const Color = NativeUI.Color; + +var hats; +var tops; +var legs; +var shoes; + +var dutyMenu; +let saveItem = new UIMenuItem("Speichern", "Speichert deine Dienstkleidung"); +saveItem.BackColor = new Color(13, 71, 161); +saveItem.HighlightedBackColor = new Color(25, 118, 210); +//Cloth Menu + +mp.events.add('showDutyClothMenu', (hatsArr, topsArr, legsArr, shoesArr) => { + + mp.gui.chat.activate(false); + hats = hatsArr; + tops = topsArr; + legs = legsArr; + shoes = shoesArr; + + dutyMenu = new Menu("Dienstkleidung", "Stelle deine Dienstkleidung zusammen", new Point(50, 50)); + + dutyMenu.AddItem(new UIMenuListItem("Hut", "", new ItemsCollection(hats))); + dutyMenu.AddItem(new UIMenuListItem("Top", "", new ItemsCollection(tops))); + dutyMenu.AddItem(new UIMenuListItem("Hose", "", new ItemsCollection(legs))); + dutyMenu.AddItem(new UIMenuListItem("Schuhe", "", new ItemsCollection(shoes))); + dutyMenu.AddItem(saveItem); + dutyMenu.Visible = true; +}); \ No newline at end of file diff --git a/Client/Player/keys.js b/Client/Player/keys.js index 9c559c73..d6a20aa7 100644 --- a/Client/Player/keys.js +++ b/Client/Player/keys.js @@ -17,7 +17,7 @@ mp.keys.bind(0x0D, false, function () { }); -//F7 +//F7 //Unshowalles mp.keys.bind(0x76, false, function () { if (showGui === true) { showGui = false; @@ -28,13 +28,20 @@ mp.keys.bind(0x76, false, function () { } }); -//NUM2 +//NUM2 //Save Blips in Edit Mode mp.keys.bind(0x62, false, function () { mp.events.callRemote("keyPress:NUM2"); }); +//E +mp.keys.bind(0x45, false, function () { + if (!chat) { + mp.events.callRemote("keyPress:E"); + } +}); -//I + +//I //Spielerliste mp.keys.bind(0x49, false, function () { if (!chat) { mp.events.callRemote("keyPress:I"); @@ -42,12 +49,21 @@ mp.keys.bind(0x49, false, function () { } }); -//L -mp.keys.bind(0x4C, false, function () { - mp.events.callRemote("ChangeDoorState"); +//K //Dienstkleidung +mp.keys.bind(0x4B, false, function () { + if (!chat) { + mp.events.callRemote("keyPress:K"); + } }); -//N +//L //Türen auf / zuschließen +mp.keys.bind(0x4C, false, function () { + if (!chat) { + mp.events.callRemote("keyPress:L"); + } +}); + +//N //Motor Starten mp.keys.bind(0x4E, false, function () { if (!chat) { mp.events.callRemote("keyPress:N"); @@ -61,9 +77,10 @@ mp.keys.bind(0x54, false, function () { } }); -//X +//X //Anschnallen mp.keys.bind(0x58, false, function () { if (!chat) { mp.events.callRemote("keyPress:X"); } }); + diff --git a/Client/index.js b/Client/index.js index 825cc7c1..a96d3b88 100644 --- a/Client/index.js +++ b/Client/index.js @@ -12,6 +12,7 @@ let globalData = { require('./CharCreator/index.js'); require('./FactionManagement/main.js'); +require('./FactionManagement/duty.js'); require('./DoorManager/doormanager.js'); @@ -22,6 +23,7 @@ require('./Gui/playerlist.js'); require('./Login/main.js'); +require('./Player/dutycloth.js'); require('./Player/keys.js'); require('./Save/main.js'); diff --git a/Main.cs b/Main.cs index 4f19f29f..0aae6bbc 100644 --- a/Main.cs +++ b/Main.cs @@ -30,14 +30,12 @@ namespace reallife_gamemode NAPI.Server.SetAutoSpawnOnConnect(false); NAPI.Server.SetAutoRespawnAfterDeath(false); NAPI.Data.SetWorldData("playerCreatorDimension", 0); - NAPI.Data.SetWorldData("policeDoors", false); TuningManager.AddTuningGarage(new Vector3(-341, -134, 38.5)); using (var context = new DatabaseContext()) { context.Bans.FirstOrDefault(); - context.Factions.FirstOrDefault(); context.Users.FirstOrDefault(); context.SaveChanges(); diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 828b051e..5ca62f0a 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -1,10 +1,4 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Configuration; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.Extensions.Configuration; +using Microsoft.EntityFrameworkCore; /** * @overview Life of German Reallife - DatabaseContext.cs @@ -37,11 +31,16 @@ namespace reallife_gamemode.Model } //User + public DbSet Bans { get; set; } + public DbSet Characters { get; set; } + public DbSet CharacterClothes { get; set; } + public DbSet CharacterProps { get; set; } + public DbSet DutyClothes { get; set; } + public DbSet DutyProps { get; set; } public DbSet Users { get; set; } public DbSet UserVehicles { get; set; } public DbSet UserBankAccounts { get; set; } - public DbSet Bans { get; set; } - public DbSet Characters { get; set; } + //Faction public DbSet Factions { get; set; } diff --git a/Server/Commands/Faction.cs b/Server/Commands/Faction.cs index 298b28ee..b4a4e937 100644 --- a/Server/Commands/Faction.cs +++ b/Server/Commands/Faction.cs @@ -239,27 +239,7 @@ namespace reallife_gamemode.Server.Commands [Command("duty", "~m~Benutzung: ~s~/duty")] public void CmdFactionDuty(Client player) { - if (player.GetUser()?.FactionId == null) - { - ChatService.NotAuthorized(player); - return; - } - - if(player.GetData("duty") != true) - { - player.SetData("duty", true); - player.SendNotification("Du bist nun ~g~im Dienst."); - if(player.GetUser().FactionId == 2) - { - NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", true); - } - } - else - { - player.SetData("duty", false); - player.SendNotification("Du bist nun ~r~außer Dienst."); - NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", false); - } + } #endregion } diff --git a/Server/Entities/CharacterCloth.cs b/Server/Entities/CharacterCloth.cs new file mode 100644 index 00000000..8073bfd0 --- /dev/null +++ b/Server/Entities/CharacterCloth.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Entities CharacterCloth CharacterCloth.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Entities +{ + public class CharacterCloth + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("User")] + public int UserId { get; set; } + public User User { get; set; } + + public int ComponentId { get; set; } + public int? Drawable { get; set; } + } +} diff --git a/Server/Entities/CharacterProp.cs b/Server/Entities/CharacterProp.cs new file mode 100644 index 00000000..38385649 --- /dev/null +++ b/Server/Entities/CharacterProp.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Entities CharacterProp CharacterProp.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Entities +{ + public class CharacterProp + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("User")] + public int UserId { get; set; } + public User User { get; set; } + + public int PropId { get; set; } + public int? Drawable { get; set; } + } +} diff --git a/Server/Entities/DutyCloth.cs b/Server/Entities/DutyCloth.cs new file mode 100644 index 00000000..2f391875 --- /dev/null +++ b/Server/Entities/DutyCloth.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** + * @overview Life of German Reallife - Entities DutyCloth DutyCloth.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Entities +{ + public class DutyCloth + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("Faction")] + public int FactionId { get; set; } + public Faction Faction { get; set; } + + public int ComponentId { get; set; } + public int Drawable { get; set; } + } +} diff --git a/Server/Entities/DutyProp.cs b/Server/Entities/DutyProp.cs new file mode 100644 index 00000000..0de732c3 --- /dev/null +++ b/Server/Entities/DutyProp.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** + * @overview Life of German Reallife - Entities DutyProp DutyProp.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Entities +{ + public class DutyProp + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("Faction")] + public int FactionId { get; set; } + public Faction Faction { get; set; } + + public int PropId { get; set; } + public int Drawable { get; set; } + } +} diff --git a/Server/Events/Key.cs b/Server/Events/Key.cs index 5a87a04b..66eeb3fa 100644 --- a/Server/Events/Key.cs +++ b/Server/Events/Key.cs @@ -4,7 +4,9 @@ using System.Text; using GTANetworkAPI; using Newtonsoft.Json; using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Server.Managers; using reallife_gamemode.Server.Saves; +using reallife_gamemode.Server.Services; using reallife_gamemode.Server.Util; /** * @overview Life of German Reallife - Event Key (Key.cs) @@ -27,7 +29,46 @@ namespace reallife_gamemode.Server.Events player.SendNotification("~y~Blip~s~ erstellt!", false); } } + [RemoteEvent("keyPress:E")] + public void KeyPressE(Client player) + { + var user = player.GetUser(); + if (user?.FactionId != null) + { + DutyPoint nearest = PositionManager.DutyPoints.Find(d => d.Position.DistanceTo(player.Position) <= 1.5); + if (nearest == null) return; + if (player.Position.DistanceTo(nearest.Position) <= 1.5 && nearest.FactionId == user.FactionId) + { + var nameTagColor = new Color(0, 0, 0); + var factionId = user.FactionId; + if (player.GetData("duty") == false) + { + player.SetData("duty", true); + player.SendNotification("Du bist nun ~g~im Dienst."); + if (player.GetUser().FactionId == 2) //Fire Department + { + NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", true); + } + switch (factionId) + { + //LSPD + case 1: + nameTagColor = new Color(28, 134, 238); + break; + } + player.NametagColor = nameTagColor; + } + else + { + player.SetData("duty", false); + player.SendNotification("Du bist nun ~r~außer Dienst."); + NAPI.ClientEvent.TriggerClientEventForAll("updateDutyMedics", false); + player.NametagColor = new Color(255, 255, 255); + } + } + } + } [RemoteEvent("keyPress:I")] public void KeyPressI(Client player) { @@ -45,6 +86,46 @@ namespace reallife_gamemode.Server.Events } player.TriggerEvent("fetchPlayerList", JsonConvert.SerializeObject(ListPlayers)); } + [RemoteEvent("keyPress:K")] + public void KeyPressK(Client player) + { + var user = player.GetUser(); + if (user?.FactionId != null) + { + DutyPoint nearest = PositionManager.DutyPoints.Find(d => d.Position.DistanceTo(player.Position) <= 1.5); + if (nearest == null) return; + if (player.Position.DistanceTo(nearest.Position) <= 1.5 && nearest.FactionId == user.FactionId) + { + int[] hats; + int[] tops; + int[] legs; + int[] shoes; + + if(user.GetCharacter().Gender == false) //Wenn männlich + { + hats = new int[] { -1, 5, 12, 39, 46, 123, 124, 125}; + tops = new int[] { -1, 55, 26}; + legs = new int[] { -1, 24, 28 }; + shoes = new int[] { -1, 24, 25}; + } + else + { + hats = new int[] { -1, 12, 38, 45, 122, 123, 124 }; + tops = new int[] { -1, 48, 43 }; + legs = new int[] { -1, 34, 37, 102 }; + shoes = new int[] { -1, 24, 25 }; + } + + player.TriggerEvent("showDutyClothMenu", hats, tops, legs, shoes); + } + } + + } + [RemoteEvent("keyPress:L")] + public void KeyPressL(Client player) + { + DoorManager.ChangeDoorState(player); + } [RemoteEvent("keyPress:N")] public void KeyPressN(Client player) { @@ -60,6 +141,6 @@ namespace reallife_gamemode.Server.Events { player.Seatbelt = !player.Seatbelt; } - } + } } } diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index 4bddf271..a7334ff6 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -42,6 +42,21 @@ namespace reallife_gamemode.Server.Extensions } } + public static Character GetCharacter(this User user, DatabaseContext context = null) + { + if (context == null) + { + using (context = new DatabaseContext()) + { + return context.Characters.FirstOrDefault(u => u.UserId == user.Id); + } + } + else + { + return context.Characters.FirstOrDefault(u => u.UserId == user.Id); + } + } + /// /// Gibt zurück, ob ein Client eingeloggt ist /// diff --git a/Server/Managers/DoorManager.cs b/Server/Managers/DoorManager.cs index 2ad33b5e..4fe0f3fb 100644 --- a/Server/Managers/DoorManager.cs +++ b/Server/Managers/DoorManager.cs @@ -17,8 +17,7 @@ namespace reallife_gamemode.Server.Managers { public class DoorManager : Script { - [RemoteEvent("ChangeDoorState")] - public void ChangeDoorState(Client player) + public static void ChangeDoorState(Client player) { List NearDoors = new List(); var user = player.GetUser(); diff --git a/Server/Managers/PositionManager.cs b/Server/Managers/PositionManager.cs new file mode 100644 index 00000000..b319eee0 --- /dev/null +++ b/Server/Managers/PositionManager.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using reallife_gamemode.Server.Entities; + +namespace reallife_gamemode.Server.Managers +{ + public class PositionManager : Script + { + public static List DutyPoints = new List(); + public static List DutyColShapes = new List(); + + [ServerEvent(Event.ResourceStart)] + public void OnResourceStart() + { + DutyPoint dutyPointLSPD = new DutyPoint() + { + Position = new Vector3(458.24, -990.86, 30.68), + FactionId = 1 + }; + + DutyPoints.Add(dutyPointLSPD); + + foreach (DutyPoint d in DutyPoints) + { + NAPI.Marker.CreateMarker(1, new Vector3(d.Position.X, d.Position.Y, d.Position.Z - 2), new Vector3(d.Position.X, d.Position.Y, d.Position.Z + 1), + new Vector3(0,0,0), 3, new Color(255, 255, 255, 50), false, 0); + NAPI.TextLabel.CreateTextLabel("Stempeluhr - Dr\u00fccke ~y~E\n~s~Dienstkleidung - Dr\u00fccke ~y~K", d.Position, 7, 1, 0, new Color(255, 255, 255), false, 0); + } + } + } + + public class DutyPoint + { + public Vector3 Position { get; set; } + public int FactionId { get; set; } + } + +} + diff --git a/Server/Managers/TuningManager.cs b/Server/Managers/TuningManager.cs index 4c319978..7d209b9b 100644 --- a/Server/Managers/TuningManager.cs +++ b/Server/Managers/TuningManager.cs @@ -19,7 +19,7 @@ namespace reallife_gamemode.Server.Managers { if(c.IsInVehicle) { - c.TriggerEvent("showTuningInfo"); + c.TriggerEvent("showTuningInfo", c.GetData("duty")); } }; diff --git a/Server/Util/Converter.cs b/Server/Util/Converter.cs new file mode 100644 index 00000000..6bc4d355 --- /dev/null +++ b/Server/Util/Converter.cs @@ -0,0 +1,40 @@ +using GTANetworkAPI; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace reallife_gamemode.Server.Util +{ + public class Converter + { + public static Color HexToColor(string hexColor) + { + //Remove # if present + if (hexColor.IndexOf('#') != -1) + hexColor = hexColor.Replace("#", ""); + + int red = 0; + int green = 0; + int blue = 0; + + if (hexColor.Length == 6) + { + //#RRGGBB + red = int.Parse(hexColor.Substring(0, 2), NumberStyles.AllowHexSpecifier); + green = int.Parse(hexColor.Substring(2, 2), NumberStyles.AllowHexSpecifier); + blue = int.Parse(hexColor.Substring(4, 2), NumberStyles.AllowHexSpecifier); + } + else if (hexColor.Length == 3) + { + //#RGB + red = int.Parse(hexColor[0].ToString() + hexColor[0].ToString(), NumberStyles.AllowHexSpecifier); + green = int.Parse(hexColor[1].ToString() + hexColor[1].ToString(), NumberStyles.AllowHexSpecifier); + blue = int.Parse(hexColor[2].ToString() + hexColor[2].ToString(), NumberStyles.AllowHexSpecifier); + } + + Color returnColor = new Color(red, green, blue); + return returnColor; + } + } +} diff --git a/reallife-gamemode.csproj b/reallife-gamemode.csproj index fa280875..c0328bec 100644 --- a/reallife-gamemode.csproj +++ b/reallife-gamemode.csproj @@ -11,7 +11,11 @@ - + + + + ..\..\bridge\runtime\Bootstrapper.dll +