From 9ec0a30988557364ea189cd895df98ad5a9e2524 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 19 Sep 2018 19:53:31 +0200 Subject: [PATCH 01/28] Add unfinished Login-System --- Client/Login/login.html | 4 +--- Client/Login/login.js | 10 ++++++-- Client/Login/main.js | 24 +++++++++++++++++-- Server/Entities/User.cs | 3 ++- Server/Events/Login.cs | 42 ++++++++++++++++++++++++++++++---- Server/Services/HashService.cs | 18 +++++++++++++++ 6 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 Server/Services/HashService.cs diff --git a/Client/Login/login.html b/Client/Login/login.html index 0bfe5b52..c8aa0a1c 100644 --- a/Client/Login/login.html +++ b/Client/Login/login.html @@ -20,7 +20,6 @@ ERROR TEXT
-

@@ -28,7 +27,6 @@

Bereits registriert? Logg dich ein

-

@@ -61,7 +59,7 @@ return; } - if (password.length < 8) { + if (password.length < 8 || passwordRepeat.length < 8) { showError("Das Passwort muss mindestens 8 Zeichen lang sein"); return; } diff --git a/Client/Login/login.js b/Client/Login/login.js index 2e07b8fa..69670ba6 100644 --- a/Client/Login/login.js +++ b/Client/Login/login.js @@ -6,10 +6,16 @@ $('#loginBtn').click(() => { $('.alert').remove(); //Remove any alerts when we attempt to login/register - mp.trigger('loginInformationToServer', $('#usernameInputLogin').val(), $('#passwordInputLogin').val()); + mp.trigger('loginInformationToServer', $('#passwordInputLogin').val()); }); $('#registerBtn').click(() => { $('.alert').remove(); //Remove any alerts when we attempt to login/register - mp.trigger('registerInformationToServer', $('#usernameInputRegister').val(), $('#passwordInputRegister').val()); + if ($('#passwordInputRegister').val().length < 8) { + return; + } + else { + mp.trigger('registerInformationToServer', $('#passwordInputRegister').val()); + } + }); \ No newline at end of file diff --git a/Client/Login/main.js b/Client/Login/main.js index 23f69481..fd346614 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -3,8 +3,8 @@ * @author VegaZ * @copyright (c) 2008 - 2018 Life of German */ -var loginBrowser = mp.browsers.new('package://Login/login.html'); -mp.gui.cursor.show(true, true); + +let loginBrowser; mp.events.add('loginInformationToServer', (username, password) => { @@ -17,3 +17,23 @@ mp.events.add('registerInformationToServer', (username, password) => { mp.events.callRemote('OnPlayerRegister', username, password); }); + +/* +mp.events.add('browserCreated', (browser) => { + mp.gui.chat.push("Browser created"); + mp.gui.chat.activate(false); + mp.gui.cursor.show(true); +}); +*/ +mp.events.add('showLogin', (player) => { + mp.gui.chat.push("show login"); + loginBrowser = mp.browsers.new('package://Login/login.html'); +}); + +mp.events.add('registerSuccess', (player) => { + + loginBrowser.destroy(); + mp.gui.chat.activate(true); + player.outputChatBox("Erfolgreich registriert"); + +}); diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs index 1f0a934d..5f8532e1 100644 --- a/Server/Entities/User.cs +++ b/Server/Entities/User.cs @@ -25,7 +25,8 @@ namespace reallife_gamemode.Server.Entities [StringLength(64)] public string Password { get; set; } public int LogUserId { get; set; } - public DateTime RegistrationDate { get; set; } + [Timestamp] + public byte[] RegistrationDate { get; set; } [EmailAddress] [StringLength(64)] public string Email { get; set; } diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 04ebb9b0..c4db02ee 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using GTANetworkAPI; +using System.Security.Cryptography; /** * @overview Life of German Reallife - Event Login (Login.cs) @@ -14,15 +15,46 @@ namespace reallife_gamemode.Server.Events public class Login : Script { [RemoteEvent("OnPlayerLogin")] - public void OnPlayerLogin(Client player, string username, string password) + public void OnPlayerLogin(Client player, string password) { } - - [RemoteEvent("OnPlayerRegister")] - public void OnPlayerRegister(Client player, string username, string password) + [Command("login")] + public void CmdLogin(Client player) { - + player.Freeze(true); + player.TriggerEvent("showLogin",player); + } + [RemoteEvent("OnPlayerRegister")] + public void OnPlayerRegister(Client player, string password) + { + + using (var loginContext = new Model.DatabaseContext()) + { + var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = ComputeSha256Hash(password) }; + loginContext.Users.Add(user); + loginContext.SaveChanges(); + } + NAPI.Chat.SendChatMessageToPlayer(player, "Registriert, GZ"); + player.TriggerEvent("registerSuccess"); + } + + static string ComputeSha256Hash(string rawData) + { + // Create a SHA256 + using (SHA256 sha256Hash = SHA256.Create()) + { + // ComputeHash - returns byte array + byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData)); + + // Convert byte array to a string + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < bytes.Length; i++) + { + builder.Append(bytes[i].ToString("x2")); + } + return builder.ToString(); + } } } } diff --git a/Server/Services/HashService.cs b/Server/Services/HashService.cs new file mode 100644 index 00000000..ae5c3a09 --- /dev/null +++ b/Server/Services/HashService.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Security.Cryptography; + +/** +* @overview Life of German Reallife - Event Login (Login.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Services +{ + class HashService + { + + } +} From 3da8e4ec3a5e68d37ebb5fe2dcf9a5bc7a6fcf9c Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 19 Sep 2018 21:20:45 +0200 Subject: [PATCH 02/28] Modify Login-Register-System --- Client/Login/login.html | 67 +++------------------------------- Client/Login/login.js | 57 ++++++++++++++++++++++++----- Client/Login/main.js | 25 +++++-------- Server/Events/Login.cs | 27 ++------------ Server/Services/HashService.cs | 18 --------- 5 files changed, 66 insertions(+), 128 deletions(-) delete mode 100644 Server/Services/HashService.cs diff --git a/Client/Login/login.html b/Client/Login/login.html index c8aa0a1c..104e6d8e 100644 --- a/Client/Login/login.html +++ b/Client/Login/login.html @@ -1,15 +1,13 @@  - - - + @@ -22,7 +20,7 @@
-

+

Bereits registriert? Logg dich ein

@@ -34,63 +32,8 @@
- - + + \ No newline at end of file diff --git a/Client/Login/login.js b/Client/Login/login.js index 69670ba6..9069a093 100644 --- a/Client/Login/login.js +++ b/Client/Login/login.js @@ -4,18 +4,57 @@ * @copyright (c) 2008 - 2018 Life of German */ -$('#loginBtn').click(() => { - $('.alert').remove(); //Remove any alerts when we attempt to login/register - mp.trigger('loginInformationToServer', $('#passwordInputLogin').val()); + +$('.message a').click(function () { + $('.form-l').animate({ height: "toggle", opacity: "toggle" }, "slow"); }); -$('#registerBtn').click(() => { - $('.alert').remove(); //Remove any alerts when we attempt to login/register - if ($('#passwordInputRegister').val().length < 8) { +$('#registerBtn').click(function () { + + var password = $('#passwordInputRegister').val(); + var passwordRepeat = $('#passwordRepeatInputRegister').val(); + mp.gui.chat.push(password.length); + if (password === "" || passwordRepeat === "") { + showError("Mindestens ein Passwort Feld ist leer!"); return; } - else { - mp.trigger('registerInformationToServer', $('#passwordInputRegister').val()); + + if (password !== passwordRepeat) { + showError("Die beiden Passwörter stimmen nicht überein!") + return; } -}); \ No newline at end of file + if (password.length < 8) { + showError("Das Passwort muss mindestens 8 Zeichen lang sein"); + return; + } + + mp.gui.chat.push(password.length); + mp.trigger('registerInformationToServer', password); +}); + +$('#loginBtn').click(function () { + + var password = $('#passwordInputLogin').val(); + + if (password === "") { + showError("Du musst ein Passwort angeben!"); + return; + } + + mp.trigger('loginInformationToServer', password); + +}); + +$('.quitBtn').click(function () { + resourceCall("Quit"); +}); + +function showError(error) { + $('.isa_error').html(error); + $('.isa_error').slideDown(); +} + +function SendDisplayname(name) { + $("h2#playerName").text(name); +} \ No newline at end of file diff --git a/Client/Login/main.js b/Client/Login/main.js index fd346614..01a7c4fe 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -6,34 +6,29 @@ let loginBrowser; -mp.events.add('loginInformationToServer', (username, password) => { +mp.events.add('loginInformationToServer', (password) => { - mp.events.callRemote('OnPlayerLogin', username, password); + mp.events.callRemote('OnPlayerLogin', password); }); -mp.events.add('registerInformationToServer', (username, password) => { - - mp.events.callRemote('OnPlayerRegister', username, password); +mp.events.add('registerInformationToServer', (password) => { + mp.gui.chat.push("registerInformationToServer called"); + mp.events.callRemote('OnPlayerRegister', password); }); -/* -mp.events.add('browserCreated', (browser) => { - mp.gui.chat.push("Browser created"); - mp.gui.chat.activate(false); - mp.gui.cursor.show(true); -}); -*/ mp.events.add('showLogin', (player) => { - mp.gui.chat.push("show login"); loginBrowser = mp.browsers.new('package://Login/login.html'); + mp.gui.cursor.show(true); + mp.gui.cursor.visible = true; }); mp.events.add('registerSuccess', (player) => { - loginBrowser.destroy(); mp.gui.chat.activate(true); - player.outputChatBox("Erfolgreich registriert"); + mp.gui.cursor.show(false); + mp.gui.cursor.visible = false; + mp.gui.chat.push("Erfolgreich registriert."); }); diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index c4db02ee..cf3362f2 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Text; using GTANetworkAPI; -using System.Security.Cryptography; /** * @overview Life of German Reallife - Event Login (Login.cs) @@ -22,39 +21,19 @@ namespace reallife_gamemode.Server.Events [Command("login")] public void CmdLogin(Client player) { - player.Freeze(true); player.TriggerEvent("showLogin",player); } [RemoteEvent("OnPlayerRegister")] public void OnPlayerRegister(Client player, string password) { - + using (var loginContext = new Model.DatabaseContext()) { - var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = ComputeSha256Hash(password) }; + var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = NAPI.Util.GetHashSha256(password) }; loginContext.Users.Add(user); loginContext.SaveChanges(); } - NAPI.Chat.SendChatMessageToPlayer(player, "Registriert, GZ"); player.TriggerEvent("registerSuccess"); - } - - static string ComputeSha256Hash(string rawData) - { - // Create a SHA256 - using (SHA256 sha256Hash = SHA256.Create()) - { - // ComputeHash - returns byte array - byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData)); - - // Convert byte array to a string - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < bytes.Length; i++) - { - builder.Append(bytes[i].ToString("x2")); - } - return builder.ToString(); - } - } + } } } diff --git a/Server/Services/HashService.cs b/Server/Services/HashService.cs deleted file mode 100644 index ae5c3a09..00000000 --- a/Server/Services/HashService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Security.Cryptography; - -/** -* @overview Life of German Reallife - Event Login (Login.cs) -* @author VegaZ -* @copyright (c) 2008 - 2018 Life of German -*/ - -namespace reallife_gamemode.Server.Services -{ - class HashService - { - - } -} From 21d597ae5ef0d74a4aca0f1e6f8271b2c1730ef8 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Thu, 20 Sep 2018 18:35:50 +0200 Subject: [PATCH 03/28] Modify Login/Register-System (almost working) --- Client/Login/login.html | 30 ++++++++++++++++++++++----- Client/Login/login.js | 46 ++++++++++++----------------------------- Client/Login/main.js | 40 ++++++++++++++++++++++++++--------- Server/Events/Login.cs | 31 ++++++++++++++++++++++----- 4 files changed, 94 insertions(+), 53 deletions(-) diff --git a/Client/Login/login.html b/Client/Login/login.html index 104e6d8e..61d492e1 100644 --- a/Client/Login/login.html +++ b/Client/Login/login.html @@ -7,7 +7,11 @@ - + + + + + @@ -20,20 +24,36 @@
-

+

Bereits registriert? Logg dich ein

- - + \ No newline at end of file diff --git a/Client/Login/login.js b/Client/Login/login.js index 9069a093..8ef7bf0c 100644 --- a/Client/Login/login.js +++ b/Client/Login/login.js @@ -4,17 +4,12 @@ * @copyright (c) 2008 - 2018 Life of German */ +function registerPlayer() { + + var password = document.getElementById("passwordInputRegister"); + var passwordRepeat = document.getElementById("passwordRepeatInputRegister"); -$('.message a').click(function () { - $('.form-l').animate({ height: "toggle", opacity: "toggle" }, "slow"); -}); - -$('#registerBtn').click(function () { - - var password = $('#passwordInputRegister').val(); - var passwordRepeat = $('#passwordRepeatInputRegister').val(); - mp.gui.chat.push(password.length); - if (password === "" || passwordRepeat === "") { + if(password === "" || passwordRepeat === "") { showError("Mindestens ein Passwort Feld ist leer!"); return; } @@ -23,38 +18,23 @@ $('#registerBtn').click(function () { showError("Die beiden Passwörter stimmen nicht überein!") return; } - + if (password.length < 8) { showError("Das Passwort muss mindestens 8 Zeichen lang sein"); return; } + $('.isa_error').hide(); + mp.trigger("registerInformationToServer", password); +} - mp.gui.chat.push(password.length); - mp.trigger('registerInformationToServer', password); -}); - -$('#loginBtn').click(function () { +function loginPlayer() { - var password = $('#passwordInputLogin').val(); + let password = document.getElementById("passwordInputLogin"); if (password === "") { showError("Du musst ein Passwort angeben!"); return; } - - mp.trigger('loginInformationToServer', password); - -}); - -$('.quitBtn').click(function () { - resourceCall("Quit"); -}); - -function showError(error) { - $('.isa_error').html(error); - $('.isa_error').slideDown(); -} - -function SendDisplayname(name) { - $("h2#playerName").text(name); + $('.isa_error').hide(); + mp.trigger("loginInformationToServer", password); } \ No newline at end of file diff --git a/Client/Login/main.js b/Client/Login/main.js index 01a7c4fe..03ea055c 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -4,7 +4,11 @@ * @copyright (c) 2008 - 2018 Life of German */ -let loginBrowser; +var loginBrowser; +loginBrowser = mp.browsers.new('package://Login/login.html'); +mp.gui.chat.activate(false); +mp.gui.cursor.show(true); + mp.events.add('loginInformationToServer', (password) => { @@ -13,22 +17,38 @@ mp.events.add('loginInformationToServer', (password) => { }); mp.events.add('registerInformationToServer', (password) => { - mp.gui.chat.push("registerInformationToServer called"); mp.events.callRemote('OnPlayerRegister', password); }); -mp.events.add('showLogin', (player) => { - loginBrowser = mp.browsers.new('package://Login/login.html'); +mp.events.add('showLogin',() => { + loginBrowser = mp.browsers.new('package://Login/login.html'); mp.gui.cursor.show(true); - mp.gui.cursor.visible = true; }); -mp.events.add('registerSuccess', (player) => { - loginBrowser.destroy(); - mp.gui.chat.activate(true); +mp.events.add('registerSuccess', () => { + mp.gui.chat.push("Erfolgreich registriert!") + if (loginBrowser) + { + loginBrowser.destroy(); + } mp.gui.cursor.show(false); - mp.gui.cursor.visible = false; - mp.gui.chat.push("Erfolgreich registriert."); + mp.gui.chat.activate(true); + +}); +mp.events.add('loginSuccess', () => { + mp.gui.chat.push("Erfolgreich eingeloggt!") + if (loginBrowser) + { + loginBrowser.destroy(); + } + mp.gui.cursor.show(false); + mp.gui.chat.activate(true); + +}); + +mp.events.add('loginFail', (reason) => { + + mp.gui.chat.push(reason); }); diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index cf3362f2..ec749d05 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using GTANetworkAPI; @@ -16,7 +17,27 @@ namespace reallife_gamemode.Server.Events [RemoteEvent("OnPlayerLogin")] public void OnPlayerLogin(Client player, string password) { - + var checkPassword = ""; + using (var loginContext = new Model.DatabaseContext()) + { + var user = loginContext.Users.SingleOrDefault(b => b.Name == player.Name); + if(user.Password == null) + { + player.TriggerEvent("loginFail", "Benutzer existiert nicht! Registriere dich zuerst!"); + } + else + { + checkPassword = user.Password; + } + } + if(checkPassword == NAPI.Util.GetHashSha256(password)) + { + player.TriggerEvent("loginSuccess"); + } + else + { + player.TriggerEvent("loginFail","Passwort inkorrekt!"); + } } [Command("login")] public void CmdLogin(Client player) @@ -27,13 +48,13 @@ namespace reallife_gamemode.Server.Events public void OnPlayerRegister(Client player, string password) { - using (var loginContext = new Model.DatabaseContext()) + using (var registerContext = new Model.DatabaseContext()) { var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = NAPI.Util.GetHashSha256(password) }; - loginContext.Users.Add(user); - loginContext.SaveChanges(); + registerContext.Users.Add(user); + registerContext.SaveChanges(); } player.TriggerEvent("registerSuccess"); } - } + } } From 5bd2fa0522e29a6f23b6ea0298cb1b441f194366 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Thu, 20 Sep 2018 18:54:30 +0200 Subject: [PATCH 04/28] Almost finish login-register-system --- Client/Login/login.js | 6 +++--- Server/Events/Login.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Client/Login/login.js b/Client/Login/login.js index 8ef7bf0c..fa38798c 100644 --- a/Client/Login/login.js +++ b/Client/Login/login.js @@ -6,8 +6,8 @@ function registerPlayer() { - var password = document.getElementById("passwordInputRegister"); - var passwordRepeat = document.getElementById("passwordRepeatInputRegister"); + var password = document.getElementById("passwordInputRegister").value; + var passwordRepeat = document.getElementById("passwordRepeatInputRegister").value; if(password === "" || passwordRepeat === "") { showError("Mindestens ein Passwort Feld ist leer!"); @@ -29,7 +29,7 @@ function registerPlayer() { function loginPlayer() { - let password = document.getElementById("passwordInputLogin"); + let password = document.getElementById("passwordInputLogin").value; if (password === "") { showError("Du musst ein Passwort angeben!"); diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index ec749d05..0400150f 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -17,7 +17,7 @@ namespace reallife_gamemode.Server.Events [RemoteEvent("OnPlayerLogin")] public void OnPlayerLogin(Client player, string password) { - var checkPassword = ""; + string checkPassword = null; using (var loginContext = new Model.DatabaseContext()) { var user = loginContext.Users.SingleOrDefault(b => b.Name == player.Name); From 08adf8d7527e0b8bf0f7440c43713022be33cc4c Mon Sep 17 00:00:00 2001 From: VegaZ Date: Thu, 20 Sep 2018 20:20:44 +0200 Subject: [PATCH 05/28] Finish login-register-system --- Client/Login/main.js | 22 ++++++++++---- Server/Events/Login.cs | 69 +++++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/Client/Login/main.js b/Client/Login/main.js index 03ea055c..b10cf16e 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -9,7 +9,6 @@ loginBrowser = mp.browsers.new('package://Login/login.html'); mp.gui.chat.activate(false); mp.gui.cursor.show(true); - mp.events.add('loginInformationToServer', (password) => { mp.events.callRemote('OnPlayerLogin', password); @@ -21,11 +20,6 @@ mp.events.add('registerInformationToServer', (password) => { }); -mp.events.add('showLogin',() => { - loginBrowser = mp.browsers.new('package://Login/login.html'); - mp.gui.cursor.show(true); -}); - mp.events.add('registerSuccess', () => { mp.gui.chat.push("Erfolgreich registriert!") if (loginBrowser) @@ -52,3 +46,19 @@ mp.events.add('loginFail', (reason) => { mp.gui.chat.push(reason); }); + +mp.events.add('loginDeny', (reason) => { + if (loginBrowser) { + loginBrowser.destroy(); + } + mp.gui.cursor.show(false); + mp.gui.chat.activate(true); + mp.gui.chat.push(reason); + +}); + +mp.events.add('registerFail', (reason) => { + + mp.gui.chat.push(reason); + +}); diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 0400150f..5877a0b3 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -17,44 +17,59 @@ namespace reallife_gamemode.Server.Events [RemoteEvent("OnPlayerLogin")] public void OnPlayerLogin(Client player, string password) { - string checkPassword = null; - using (var loginContext = new Model.DatabaseContext()) + using (var loginUser = new Model.DatabaseContext()) { - var user = loginContext.Users.SingleOrDefault(b => b.Name == player.Name); - if(user.Password == null) + var user = loginUser.Users.SingleOrDefault(b => b.Name == player.Name); + + if(user == null) { player.TriggerEvent("loginFail", "Benutzer existiert nicht! Registriere dich zuerst!"); } else { - checkPassword = user.Password; - } - } - if(checkPassword == NAPI.Util.GetHashSha256(password)) - { - player.TriggerEvent("loginSuccess"); - } - else - { - player.TriggerEvent("loginFail","Passwort inkorrekt!"); - } - } - [Command("login")] - public void CmdLogin(Client player) - { - player.TriggerEvent("showLogin",player); + if (user.SocialClubName != player.SocialClubName && user.Password == NAPI.Util.GetHashSha256(password)) + { + player.TriggerEvent("loginDeny", "Dieser Benutzer gehört dir nicht!"); + //Log einbauen für den bösen Bub. + player.Kick(); + } + if (user.Password != NAPI.Util.GetHashSha256(password)) + { + player.TriggerEvent("loginFail", "Passwort inkorrekt!"); + } + else + { + player.TriggerEvent("loginSuccess"); + } + } + } } + [RemoteEvent("OnPlayerRegister")] public void OnPlayerRegister(Client player, string password) { - - using (var registerContext = new Model.DatabaseContext()) + using (var checkUser = new Model.DatabaseContext()) { - var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = NAPI.Util.GetHashSha256(password) }; - registerContext.Users.Add(user); - registerContext.SaveChanges(); - } - player.TriggerEvent("registerSuccess"); + var checkedUser = checkUser.Users.SingleOrDefault(b => b.Name == player.Name); + if(checkedUser == null) + { + using (var registerUser = new Model.DatabaseContext()) + { + var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = NAPI.Util.GetHashSha256(password) }; + registerUser.Users.Add(user); + registerUser.SaveChanges(); + } + player.TriggerEvent("registerSuccess"); + } + else if (player.SocialClubName == checkedUser.SocialClubName) + { + player.TriggerEvent("registerFail", "Dieser SocialClubAccount ist schon registriert!"); + } + else if (checkedUser.Name == player.Name) + { + player.TriggerEvent("registerFail", "Benutzername existiert schon!"); + } + } } } } From 978d9ef2952fab6387055eaab19696d3916585d3 Mon Sep 17 00:00:00 2001 From: Lennart Kampshoff Date: Thu, 20 Sep 2018 21:08:47 +0200 Subject: [PATCH 06/28] Removed unneccessary lines --- Server/Util/AdminLevel.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Server/Util/AdminLevel.cs b/Server/Util/AdminLevel.cs index 8e201b63..37be0ba7 100644 --- a/Server/Util/AdminLevel.cs +++ b/Server/Util/AdminLevel.cs @@ -12,8 +12,6 @@ namespace reallife_gamemode.Server.Util { public enum AdminLevel : int { - - PLAYER, SUPPORTER, ADMIN From ecb227be5c7bb681c719b1aaf38e36e366a45217 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Fri, 21 Sep 2018 16:13:13 +0200 Subject: [PATCH 07/28] Split Login / Register in seperate files --- Server/Events/Login.cs | 29 +------------------------- Server/Events/Register.cs | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 Server/Events/Register.cs diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 5877a0b3..06d3ca9d 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -43,33 +43,6 @@ namespace reallife_gamemode.Server.Events } } } - } - - [RemoteEvent("OnPlayerRegister")] - public void OnPlayerRegister(Client player, string password) - { - using (var checkUser = new Model.DatabaseContext()) - { - var checkedUser = checkUser.Users.SingleOrDefault(b => b.Name == player.Name); - if(checkedUser == null) - { - using (var registerUser = new Model.DatabaseContext()) - { - var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = NAPI.Util.GetHashSha256(password) }; - registerUser.Users.Add(user); - registerUser.SaveChanges(); - } - player.TriggerEvent("registerSuccess"); - } - else if (player.SocialClubName == checkedUser.SocialClubName) - { - player.TriggerEvent("registerFail", "Dieser SocialClubAccount ist schon registriert!"); - } - else if (checkedUser.Name == player.Name) - { - player.TriggerEvent("registerFail", "Benutzername existiert schon!"); - } - } - } + } } } diff --git a/Server/Events/Register.cs b/Server/Events/Register.cs new file mode 100644 index 00000000..9aef1742 --- /dev/null +++ b/Server/Events/Register.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using GTANetworkAPI; + +/** +* @overview Life of German Reallife - Event Register (Register.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Events +{ + class Register : Script + { + [RemoteEvent("OnPlayerRegister")] + public void OnPlayerRegister(Client player, string password) + { + using (var checkUser = new Model.DatabaseContext()) + { + var checkedUser = checkUser.Users.SingleOrDefault(b => b.Name == player.Name); + if (checkedUser == null) + { + using (var registerUser = new Model.DatabaseContext()) + { + var user = new Entities.User { Name = player.Name, SocialClubName = player.SocialClubName, Password = NAPI.Util.GetHashSha256(password) }; + registerUser.Users.Add(user); + registerUser.SaveChanges(); + } + player.TriggerEvent("registerSuccess"); + } + else if (player.SocialClubName == checkedUser.SocialClubName) + { + player.TriggerEvent("registerFail", "Dieser SocialClubAccount ist schon registriert!"); + } + else if (checkedUser.Name == player.Name) + { + player.TriggerEvent("registerFail", "Benutzername existiert schon!"); + } + } + } + } +} From 24a8c975cf4451108698f856a8d3d11c95bb3f78 Mon Sep 17 00:00:00 2001 From: Lennart Kampshoff Date: Fri, 21 Sep 2018 23:14:43 +0200 Subject: [PATCH 08/28] Moved error display from chat to cef, cleaned up css code --- Client/Login/login.html | 5 +--- Client/Login/main.js | 24 ++++++++------- Client/Login/style.css | 65 ++++++++++++++++++++--------------------- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/Client/Login/login.html b/Client/Login/login.html index 61d492e1..35d14c3f 100644 --- a/Client/Login/login.html +++ b/Client/Login/login.html @@ -7,10 +7,7 @@ - - - - + diff --git a/Client/Login/main.js b/Client/Login/main.js index b10cf16e..abd8c73c 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -1,13 +1,13 @@ /** * @overview Life of German Reallife - Login Main main.js - * @author VegaZ + * @author VegaZ, hydrant * @copyright (c) 2008 - 2018 Life of German */ var loginBrowser; loginBrowser = mp.browsers.new('package://Login/login.html'); mp.gui.chat.activate(false); -mp.gui.cursor.show(true); +mp.gui.cursor.show(true, true); mp.events.add('loginInformationToServer', (password) => { @@ -21,12 +21,12 @@ mp.events.add('registerInformationToServer', (password) => { }); mp.events.add('registerSuccess', () => { - mp.gui.chat.push("Erfolgreich registriert!") + if (loginBrowser) { loginBrowser.destroy(); } - mp.gui.cursor.show(false); + mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); }); @@ -36,14 +36,14 @@ mp.events.add('loginSuccess', () => { { loginBrowser.destroy(); } - mp.gui.cursor.show(false); + mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); }); mp.events.add('loginFail', (reason) => { - mp.gui.chat.push(reason); + showCefError(reason); }); @@ -51,14 +51,16 @@ mp.events.add('loginDeny', (reason) => { if (loginBrowser) { loginBrowser.destroy(); } - mp.gui.cursor.show(false); + mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); - mp.gui.chat.push(reason); + showCefError(reason); }); mp.events.add('registerFail', (reason) => { - - mp.gui.chat.push(reason); - + showCefError(reason); }); + +function showCefError(error) { + loginBrowser.execute(`showError(\`` + error + `\`)`); +} diff --git a/Client/Login/style.css b/Client/Login/style.css index 2405799c..9148ee72 100644 --- a/Client/Login/style.css +++ b/Client/Login/style.css @@ -1,6 +1,6 @@ /** * @overview Life of German Reallife - Login CSS style.css - * @author Orangebox + * @author Orangebox, hydrant * @copyright (c) 2008 - 2018 Life of German */ @@ -35,11 +35,11 @@ background-color: #FFBABA; } - .isa_info i, .isa_success i, .isa_warning i, .isa_error i { - margin: 10px 22px; - font-size: 2em; - vertical-align: middle; - } +.isa_info i, .isa_success i, .isa_warning i, .isa_error i { + margin: 10px 22px; + font-size: 2em; + vertical-align: middle; +} .form { position: relative; @@ -78,27 +78,27 @@ button { cursor: pointer; } - button:hover, .form button:active, .form button:focus { - background: #002574; - } +button:hover, .form button:active, .form button:focus { + background: #002574; +} .quitBtn { background-color: orangered; } - .quitBtn:hover, .quitBtn:focus, .quitBtn:active { - background-color: #cc3700 !important; - } +.quitBtn:hover, .quitBtn:focus, .quitBtn:active { + background-color: #cc3700 !important; +} .message { margin: 15px 0 0; font-size: 12px; } - .message a { - color: #0035A5; - text-decoration: none; - } +.message a { + color: #0035A5; + text-decoration: none; +} .register-form { display: none; @@ -111,16 +111,16 @@ button { margin: 0 auto; } - .container:before, .container:after { - content: ""; - display: block; - clear: both; - } +.container:before, .container:after { + content: ""; + display: block; + clear: both; +} - .container .info { - margin: 50px auto; - text-align: center; - } +.container .info { + margin: 50px auto; + text-align: center; +} .info h1 { margin: 0 0 15px; @@ -135,17 +135,16 @@ button { font-size: 12px; } - .info span a { - color: #000000; - text-decoration: none; - } +.info span a { + color: #000000; + text-decoration: none; +} - .info span .fa { - color: #EF3B3A; - } +.info span .fa { + color: #EF3B3A; +} body { - background: url(bg_gta_cnr.png); font-family: "Roboto", sans-serif; -webkit-font-smoothing: antialiased; } From 12a5ba79ad5cbae0b16f4892e3246213ac629d09 Mon Sep 17 00:00:00 2001 From: Lennart Kampshoff Date: Sat, 22 Sep 2018 00:14:38 +0200 Subject: [PATCH 09/28] Add camera position on login --- Client/Login/main.js | 14 ++++++++++++-- Main.cs | 6 +++++- Server/Events/Connect.cs | 3 ++- Server/Events/Login.cs | 1 + Server/Events/Register.cs | 1 + 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Client/Login/main.js b/Client/Login/main.js index abd8c73c..b0b3789c 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -8,6 +8,12 @@ var loginBrowser; loginBrowser = mp.browsers.new('package://Login/login.html'); mp.gui.chat.activate(false); mp.gui.cursor.show(true, true); +mp.game.ui.displayHud(false); +mp.game.ui.displayRadar(false); + +var loginCam = mp.cameras.new('login', new mp.Vector3(-1883.736, -781.4911, 78.27616), new mp.Vector3(3.185999, 0, -79.59519), 40); +loginCam.setActive(true); +mp.game.cam.renderScriptCams(true, false, 0, true, false); mp.events.add('loginInformationToServer', (password) => { @@ -28,7 +34,9 @@ mp.events.add('registerSuccess', () => { } mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); - + loginCam.setActive(false); + mp.game.cam.renderScriptCams(false, false, 0, true, false); + mp.game.ui.displayRadar(true); }); mp.events.add('loginSuccess', () => { mp.gui.chat.push("Erfolgreich eingeloggt!") @@ -38,7 +46,9 @@ mp.events.add('loginSuccess', () => { } mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); - + loginCam.setActive(false); + mp.game.cam.renderScriptCams(false, false, 0, true, false); + mp.game.ui.displayRadar(true); }); mp.events.add('loginFail', (reason) => { diff --git a/Main.cs b/Main.cs index e1aea960..b28102a7 100644 --- a/Main.cs +++ b/Main.cs @@ -11,11 +11,15 @@ namespace reallife_gamemode { public class Main : Script { + public static readonly Vector3 DEFAULT_SPAWN_POSITION = new Vector3(-427.5189, 1116.453, 326.7829); + public static readonly float DEFAULT_SPAWN_HEADING = 340.8f; + [ServerEvent(Event.ResourceStart)] public void OnResourceStart() { NAPI.Server.SetCommandErrorMessage("~r~[FEHLER]~s~ Dieser Command existiert nicht."); - NAPI.Util.ConsoleOutput("reallife-gamemode resource loaded!"); + NAPI.Server.SetDefaultSpawnLocation(DEFAULT_SPAWN_POSITION, DEFAULT_SPAWN_HEADING); + NAPI.Server.SetAutoSpawnOnConnect(false); } } } \ No newline at end of file diff --git a/Server/Events/Connect.cs b/Server/Events/Connect.cs index 59167107..45e95404 100644 --- a/Server/Events/Connect.cs +++ b/Server/Events/Connect.cs @@ -20,7 +20,8 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerConnected)] public void OnPlayerConnected(Client player) { - + player.Position = new Vector3(-1883.736, -781.4911, -10); + player.FreezePosition = true; } } diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 06d3ca9d..1c40ec6c 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -40,6 +40,7 @@ namespace reallife_gamemode.Server.Events else { player.TriggerEvent("loginSuccess"); + NAPI.Player.SpawnPlayer(player, Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING); } } } diff --git a/Server/Events/Register.cs b/Server/Events/Register.cs index 9aef1742..fbc45ecf 100644 --- a/Server/Events/Register.cs +++ b/Server/Events/Register.cs @@ -29,6 +29,7 @@ namespace reallife_gamemode.Server.Events registerUser.SaveChanges(); } player.TriggerEvent("registerSuccess"); + NAPI.Player.SpawnPlayer(player, Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING); } else if (player.SocialClubName == checkedUser.SocialClubName) { From 3d7ab55b280a4137a3b8024106526c555d843302 Mon Sep 17 00:00:00 2001 From: Lennart Kampshoff Date: Sat, 22 Sep 2018 00:27:14 +0200 Subject: [PATCH 10/28] Added one load and one save to db, so that the EF doesnt need to initialize on first load / save --- Main.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Main.cs b/Main.cs index b28102a7..3f6166a1 100644 --- a/Main.cs +++ b/Main.cs @@ -1,5 +1,7 @@ using System; +using System.Linq; using GTANetworkAPI; +using reallife_gamemode.Model; /** * @overview Life of German Reallife - Main Class (Main.cs) @@ -20,6 +22,12 @@ namespace reallife_gamemode NAPI.Server.SetCommandErrorMessage("~r~[FEHLER]~s~ Dieser Command existiert nicht."); NAPI.Server.SetDefaultSpawnLocation(DEFAULT_SPAWN_POSITION, DEFAULT_SPAWN_HEADING); NAPI.Server.SetAutoSpawnOnConnect(false); + + using (var context = new DatabaseContext()) + { + context.Users.FirstOrDefault(); + context.SaveChanges(); + } } } } \ No newline at end of file From 61e21361b82b2d7bd2a73c4ca7f289ff51142db8 Mon Sep 17 00:00:00 2001 From: Lennart Kampshoff Date: Sat, 22 Sep 2018 15:58:48 +0200 Subject: [PATCH 11/28] Fixed hud display --- Client/Login/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Client/Login/main.js b/Client/Login/main.js index b0b3789c..ee786ad7 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -37,6 +37,7 @@ mp.events.add('registerSuccess', () => { loginCam.setActive(false); mp.game.cam.renderScriptCams(false, false, 0, true, false); mp.game.ui.displayRadar(true); + mp.game.ui.displayHud(true); }); mp.events.add('loginSuccess', () => { mp.gui.chat.push("Erfolgreich eingeloggt!") @@ -49,6 +50,7 @@ mp.events.add('loginSuccess', () => { loginCam.setActive(false); mp.game.cam.renderScriptCams(false, false, 0, true, false); mp.game.ui.displayRadar(true); + mp.game.ui.displayHud(true); }); mp.events.add('loginFail', (reason) => { From a51e71a902171dd8eaa392f24f79574115e8fe92 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 22 Sep 2018 23:14:44 +0200 Subject: [PATCH 12/28] Feature/save system --- .../bootstrap-3.3.7/css/bootstrap-theme.css | 0 .../css/bootstrap-theme.css.map | 0 .../css/bootstrap-theme.min.css | 0 .../css/bootstrap-theme.min.css.map | 0 .../bootstrap-3.3.7/css/bootstrap.css | 0 .../bootstrap-3.3.7/css/bootstrap.css.map | 0 .../bootstrap-3.3.7/css/bootstrap.min.css | 0 .../bootstrap-3.3.7/css/bootstrap.min.css.map | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../fonts/glyphicons-halflings-regular.woff2 | Bin .../bootstrap-3.3.7/js/bootstrap.js | 0 .../bootstrap-3.3.7/js/bootstrap.min.js | 0 .../Dependences/bootstrap-3.3.7/js/npm.js | 0 .../Dependences/jquery-3.3.1.min.js | 0 Client/Login/login.html | 4 +- Client/Save/main.js | 33 ++++ Client/Save/save.html | 72 +++++++ Client/Save/save.js | 28 +++ Client/Save/style.css | 184 ++++++++++++++++++ Client/index.js | 4 +- Model/DatabaseContext.cs | 9 + Server/Commands/Admin.cs | 38 +++- Server/Events/SaveData.cs | 78 ++++++++ Server/Managers/LoadManager.cs | 47 +++++ Server/Saves/SavedBlip.cs | 38 ++++ Server/Saves/SavedMarker.cs | 39 ++++ Server/Saves/SavedPed.cs | 28 +++ Server/Saves/SavedPickup.cs | 32 +++ Server/Saves/SavedTextLabel.cs | 38 ++++ Server/Saves/SavedVehicle.cs | 36 ++++ 33 files changed, 699 insertions(+), 9 deletions(-) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css.map (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css.map (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap.css (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap.css.map (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap.min.css (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/css/bootstrap.min.css.map (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/js/bootstrap.js (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/js/bootstrap.min.js (100%) rename Client/{Login => }/Dependences/bootstrap-3.3.7/js/npm.js (100%) rename Client/{Login => }/Dependences/jquery-3.3.1.min.js (100%) create mode 100644 Client/Save/main.js create mode 100644 Client/Save/save.html create mode 100644 Client/Save/save.js create mode 100644 Client/Save/style.css create mode 100644 Server/Events/SaveData.cs create mode 100644 Server/Managers/LoadManager.cs create mode 100644 Server/Saves/SavedBlip.cs create mode 100644 Server/Saves/SavedMarker.cs create mode 100644 Server/Saves/SavedPed.cs create mode 100644 Server/Saves/SavedPickup.cs create mode 100644 Server/Saves/SavedTextLabel.cs create mode 100644 Server/Saves/SavedVehicle.cs diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css b/Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css.map b/Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css.map similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css.map rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.css.map diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css b/Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css.map b/Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css.map similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css.map rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap-theme.min.css.map diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.css b/Client/Dependences/bootstrap-3.3.7/css/bootstrap.css similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.css rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap.css diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.css.map b/Client/Dependences/bootstrap-3.3.7/css/bootstrap.css.map similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.css.map rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap.css.map diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.min.css b/Client/Dependences/bootstrap-3.3.7/css/bootstrap.min.css similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.min.css rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap.min.css diff --git a/Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.min.css.map b/Client/Dependences/bootstrap-3.3.7/css/bootstrap.min.css.map similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/css/bootstrap.min.css.map rename to Client/Dependences/bootstrap-3.3.7/css/bootstrap.min.css.map diff --git a/Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot b/Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot rename to Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot diff --git a/Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg b/Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg rename to Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.svg diff --git a/Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf b/Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf rename to Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf diff --git a/Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff b/Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff rename to Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff diff --git a/Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 b/Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 rename to Client/Dependences/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 diff --git a/Client/Login/Dependences/bootstrap-3.3.7/js/bootstrap.js b/Client/Dependences/bootstrap-3.3.7/js/bootstrap.js similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/js/bootstrap.js rename to Client/Dependences/bootstrap-3.3.7/js/bootstrap.js diff --git a/Client/Login/Dependences/bootstrap-3.3.7/js/bootstrap.min.js b/Client/Dependences/bootstrap-3.3.7/js/bootstrap.min.js similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/js/bootstrap.min.js rename to Client/Dependences/bootstrap-3.3.7/js/bootstrap.min.js diff --git a/Client/Login/Dependences/bootstrap-3.3.7/js/npm.js b/Client/Dependences/bootstrap-3.3.7/js/npm.js similarity index 100% rename from Client/Login/Dependences/bootstrap-3.3.7/js/npm.js rename to Client/Dependences/bootstrap-3.3.7/js/npm.js diff --git a/Client/Login/Dependences/jquery-3.3.1.min.js b/Client/Dependences/jquery-3.3.1.min.js similarity index 100% rename from Client/Login/Dependences/jquery-3.3.1.min.js rename to Client/Dependences/jquery-3.3.1.min.js diff --git a/Client/Login/login.html b/Client/Login/login.html index 35d14c3f..03edc5c2 100644 --- a/Client/Login/login.html +++ b/Client/Login/login.html @@ -1,5 +1,5 @@  @@ -7,7 +7,7 @@ - + diff --git a/Client/Save/main.js b/Client/Save/main.js new file mode 100644 index 00000000..b40e649f --- /dev/null +++ b/Client/Save/main.js @@ -0,0 +1,33 @@ +/** + * @overview Life of German Reallife - Save Main main.js + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ +var saveBrowser; + +mp.events.add('saveBlip', () => { + + saveBrowser = mp.browsers.new('package://Save/save.html'); + mp.gui.chat.activate(false); + mp.gui.cursor.show(true, true); +}); + +mp.events.add('saveData', (blipSprite, blipName, blipScale, blipColor, blipAlpha, blipDrawDistance, blipShortRange, blipRotation, blipDimension) => { + if (saveBrowser) { + saveBrowser.destroy(); + } + + mp.events.callRemote('OnSaveBlipData', blipSprite, blipName, blipScale, blipColor, blipAlpha, + blipDrawDistance, blipShortRange, blipRotation, blipDimension); + mp.gui.chat.push(blipShortRange); + mp.gui.cursor.show(false, false); + mp.gui.chat.activate(true); +}); + +mp.events.add('cancelData', () => { + if (saveBrowser) { + saveBrowser.destroy(); + } + mp.gui.cursor.show(false, false); + mp.gui.chat.activate(true); +}); \ No newline at end of file diff --git a/Client/Save/save.html b/Client/Save/save.html new file mode 100644 index 00000000..b6122bcb --- /dev/null +++ b/Client/Save/save.html @@ -0,0 +1,72 @@ + + + + + + + + + + +
+
+
+

Blip speichern, bitte fülle die Tabelle aus:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model ID:
Name:
Skalierung:
Farbe:
Transparenz:
Draw Distance:
Short Range: + Zeigt das Blip nur innerhalb der Minimap +
Rotation:
Dimension:
+

+ +
+
+
+ + + \ No newline at end of file diff --git a/Client/Save/save.js b/Client/Save/save.js new file mode 100644 index 00000000..33a1ed72 --- /dev/null +++ b/Client/Save/save.js @@ -0,0 +1,28 @@ +/** + * @overview Life of German Reallife - Login Login login.js + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +function saveData() { + let blipSprite = document.getElementById("blipSprite").value; + let blipName = document.getElementById("blipName").value; + let blipScale = document.getElementById("blipScale").value; + let blipColor = document.getElementById("blipColor").value; + let blipAlpha = document.getElementById("blipAlpha").value; + let blipDrawDistance = document.getElementById("blipSprite").value; + let blipShortRange = document.getElementById("blipShortRange").checked; + let blipRotation = document.getElementById("blipRotation").value; + let blipDimension = document.getElementById("blipDimension").value; + + mp.trigger("saveData", blipSprite, blipName, blipScale, blipColor, blipAlpha, blipDrawDistance, blipShortRange, blipRotation, blipDimension); +} + +function cancelData() { + mp.trigger("cancelData"); +} + +function getType() { + mp.gui.chat.push("getType"); + return typ; +} \ No newline at end of file diff --git a/Client/Save/style.css b/Client/Save/style.css new file mode 100644 index 00000000..e295d68d --- /dev/null +++ b/Client/Save/style.css @@ -0,0 +1,184 @@ +/** + * @overview Life of German Reallife - Save CSS style.css + * @author Orangebox, hydrant, VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +.save-page { + margin: auto; +} + +.isa_info, .isa_success, .isa_warning, .isa_error { + margin: 10px 0px; + padding: 12px; + display: none; +} + +.isa_info { + color: #00529B; + background-color: #BDE5F8; +} + +.isa_success { + color: #4F8A10; + background-color: #DFF2BF; +} + +.isa_warning { + color: #9F6000; + background-color: #FEEFB3; +} + +.isa_error { + color: #D8000C; + background-color: #FFBABA; +} + +.isa_info i, .isa_success i, .isa_warning i, .isa_error i { + margin: 10px 22px; + font-size: 2em; + vertical-align: middle; +} + +.form { + margin-left: 36%; + position: absolute; + z-index: 1; + background: rgba(255, 255, 255, .85); + padding: 20px; + text-align: center; + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24); +} + +input { + font-family: "Roboto", sans-serif; + outline: 0; + background: #f2f2f2; + width: 100%; + border: 0; + margin: 5px 0 5px 0; + padding: 12px; + box-sizing: border-box; + font-size: 12px; +} + input.colorPicker { + font-family: "Roboto", sans-serif; + outline: 0; + background: #f2f2f2; + width: 100%; + border: 0; + margin: 5px 0 5px 0; + padding: 0px; + box-sizing: border-box; + font-size: 12px; + } + + input#blipShortRange { + margin: 10px 0 10px 0; + } + +button { + font-family: "Roboto", sans-serif; + text-transform: uppercase; + outline: 0; + background: #31c474; + width: 40%; + border: 0; + padding: 15px; + color: #FFFFFF; + font-size: 14px; + -webkit-transition: all 0.3s ease; + transition: all 0.3s ease; + cursor: pointer; +} + + button:hover, .form button:active, .form button:focus { + background: #31bd40; + } + +.cancelBtn { + background-color: orangered; +} + +.cancelBtn:hover, .cancelBtn:focus, .cancelBtn:active { + background-color: #ff0223 !important; +} + +table { + align-self: center; +} +.message { + margin: 15px 0 0; + font-size: 12px; +} + +.message a { + color: #0035A5; + text-decoration: none; +} + +.register-form { + display: none; +} + + +.container { + position: relative; + z-index: 1; + max-width: 300px; + margin: 0 auto; +} + +.container:before, .container:after { + content: ""; + display: block; + clear: both; +} + +.container .info { + margin: 50px auto; + text-align: center; +} + +.info h1 { + margin: 0 0 15px; + padding: 0; + font-size: 36px; + font-weight: 300; + color: #1a1a1a; +} + +.info span { + color: #4d4d4d; + font-size: 12px; +} + +.info span a { + color: #000000; + text-decoration: none; +} + +.info span .fa { + color: #EF3B3A; +} + +body { + font-family: "Roboto", sans-serif; + -webkit-font-smoothing: antialiased; + overflow: hidden; +} +tr{ + +} +td { + align-content: stretch; + padding-left: 10px; + padding-right: 10px; + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 0 0 0 rgba(0, 0, 0, 0.24); + border-top: 2px double gray; + border-bottom: 2px double gray; + border-width: 0.5px; +} +table{ + margin-bottom: 20px; +} \ No newline at end of file diff --git a/Client/index.js b/Client/index.js index 51689880..6545bd99 100644 --- a/Client/index.js +++ b/Client/index.js @@ -4,4 +4,6 @@ * @copyright (c) 2008 - 2018 Life of German */ -require('./Login/main.js'); \ No newline at end of file +require('./Login/main.js'); +require('./Save/main.js'); +require('./Save/save.js'); \ No newline at end of file diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 296b503a..6b60c4b8 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -1,8 +1,10 @@ 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; /** * @overview Life of German Reallife - DatabaseContext.cs @@ -35,5 +37,12 @@ namespace reallife_gamemode.Model } public DbSet Users { get; set; } + + public DbSet Blips { get; set; } + public DbSet Markers { get; set; } + public DbSet Peds { get; set; } + public DbSet Pickups { get; set; } + public DbSet TextLabels { get; set; } + public DbSet Vehicles { get; set; } } } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 852fb227..5c615bc2 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using GTANetworkAPI; +using reallife_gamemode.Server.Events; using reallife_gamemode.Server.Extensions; using reallife_gamemode.Server.Services; using reallife_gamemode.Server.Util; @@ -43,7 +44,7 @@ namespace reallife_gamemode.Server.Commands player.SendChatMessage("~r~[FEHLER]~s~ Du sitzt momentan schon in einem Fahrzeug."); return; } - + Vehicle v = NAPI.Vehicle.CreateVehicle(hash, player.Position, player.Rotation.Z, color1, color2); player.SetIntoVehicle(v.Handle, -1); @@ -99,7 +100,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); - if(target == null) + if (target == null) { ChatService.PlayerNotFound(player); return; @@ -150,13 +151,13 @@ namespace reallife_gamemode.Server.Commands } option = option.ToLower(); - - if(option == "load") + + if (option == "load") { NAPI.World.RequestIpl(name); player.SendChatMessage("~g~Das IPL ~s~" + name + " ~g~wurde erfolgreich geladen"); } - else if(option == "remove") + else if (option == "remove") { NAPI.World.RemoveIpl(name); player.SendChatMessage("~g~Das IPL ~s~" + name + " ~g~wurde erfolgreich entladen"); @@ -191,7 +192,7 @@ namespace reallife_gamemode.Server.Commands WeaponHash wHash = NAPI.Util.WeaponNameToModel(weapon); - if(wHash == default(WeaponHash)) + if (wHash == default(WeaponHash)) { player.SendChatMessage("~r~[FEHLER]~s~ Diese Waffe existiert nicht."); return; @@ -199,5 +200,30 @@ namespace reallife_gamemode.Server.Commands target.GiveWeapon(wHash, ammo); } + + [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle")] + public void CmdAdminSave(Client player, string typ) + { + switch (typ) + { + case "Blip": + player.TriggerEvent("saveBlip"); + break; + case "Ped": + + break; + case "Vehicle": + if (player.IsInVehicle) + { + Vehicle vehicle = player.Vehicle; + SaveData.SaveVehicleData((VehicleHash) vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, + Convert.ToByte(vehicle.PrimaryColor), Convert.ToByte(vehicle.SecondaryColor), vehicle.Locked, vehicle.EngineStatus, Convert.ToByte(vehicle.Dimension)); + } + else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); + break; + + } + + } } } diff --git a/Server/Events/SaveData.cs b/Server/Events/SaveData.cs new file mode 100644 index 00000000..01d32054 --- /dev/null +++ b/Server/Events/SaveData.cs @@ -0,0 +1,78 @@ +using GTANetworkAPI; +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Events +{ + public class SaveData : Script + { + [RemoteEvent("OnSaveBlipData")] + public void OnSaveBlipData(Client player, string blipSprite, string blipName, string blipScale, string blipColor, + string blipAlpha, string blipDrawDistance, string blipShortRange, string blipRotation, string blipDimension) + { + float x = player.Position.X; + float y = player.Position.Y; + float z = player.Position.Z; + short sprite = short.Parse(blipSprite); + string name = blipName; + float scale = float.Parse(blipScale); + byte color = Convert.ToByte(blipColor); + byte alpha = Convert.ToByte(blipAlpha); + float drawDistance = float.Parse(blipDrawDistance); + bool shortRange = bool.Parse(blipShortRange); + float rotation = float.Parse(blipRotation); + byte dimension = Convert.ToByte(blipDimension); + + NAPI.Blip.CreateBlip(uint.Parse(blipSprite), new Vector3(x,y,z), scale, color, name, alpha, drawDistance, shortRange, short.Parse(blipRotation), dimension); + + using (var saveData = new Model.DatabaseContext()) + { + var dataSet = new Server.Saves.SavedBlip + { + Sprite = sprite, + PositionX = x, + PositionY = y, + PositionZ = z, + Name = blipName, + Scale = scale, + Color = color, + Alpha = alpha, + DrawDistance = drawDistance, + ShortRange = shortRange, + Rotation = rotation, + Dimension = dimension, + Active = true + }; + saveData.Blips.Add(dataSet); + saveData.SaveChanges(); + } + } + + public static void SaveVehicleData(VehicleHash vehicleModel, Vector3 vehiclePosition, float vehicleHeading, + string vehicleNumberPlate, byte vehiclePrimaryColor, byte vehicleSecondaryColor, bool vehicleLocked, bool vehicleEngine, byte vehicleDimension) + { + using (var saveData = new Model.DatabaseContext()) + { + var dataSet = new Server.Saves.SavedVehicle + { + Model = vehicleModel, + PositionX = vehiclePosition.X, + PositionY = vehiclePosition.Y, + PositionZ = vehiclePosition.Z, + Heading = vehicleHeading, + NumberPlate = vehicleNumberPlate, + PrimaryColor = vehiclePrimaryColor, + SecondaryColor = vehicleSecondaryColor, + Locked = vehicleLocked, + Engine = vehicleEngine, + Dimension = vehicleDimension, + Active = true + }; + saveData.Vehicles.Add(dataSet); + saveData.SaveChanges(); + } + } + + } +} diff --git a/Server/Managers/LoadManager.cs b/Server/Managers/LoadManager.cs new file mode 100644 index 00000000..249b852a --- /dev/null +++ b/Server/Managers/LoadManager.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using reallife_gamemode.Model; +using reallife_gamemode.Server.Entities; + +/** +* @overview Life of German Reallife - Managers LoadManager (LoadManager.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Managers +{ + public class LoadManager : Script + { + [ServerEvent(Event.ResourceStart)] + public void OnResourceStart() + { + //LOAD ALL BLIPS + using (var loadBlips = new DatabaseContext()) + { + foreach (Saves.SavedBlip b in loadBlips.Blips) + { + if(b.Active == true) + { + NAPI.Blip.CreateBlip((uint) b.Sprite, new Vector3(b.PositionX, b.PositionY, b.PositionZ), b.Scale, + b.Color, b.Name, b.Alpha, b.DrawDistance, b.ShortRange, (short) b.Rotation, b.Dimension); + } + } + } + //LOAD ALL VEHICLES + using (var loadVehicles = new DatabaseContext()) + { + foreach (Saves.SavedVehicle v in loadVehicles.Vehicles) + { + if (v.Active == true) + { + NAPI.Vehicle.CreateVehicle((uint) v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (int)(v.PrimaryColor), + v.SecondaryColor, v.NumberPlate, v.Alpha, v.Locked, v.Engine = false, v.Dimension); + } + } + } + } + } +} diff --git a/Server/Saves/SavedBlip.cs b/Server/Saves/SavedBlip.cs new file mode 100644 index 00000000..f7b14343 --- /dev/null +++ b/Server/Saves/SavedBlip.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Saves SavedBlip.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Saves +{ + public class SavedBlip + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + [Required] + public short Sprite { get; set; } + [Required] + public float PositionX { get; set; } + [Required] + public float PositionY { get; set; } + [Required] + public float PositionZ { get; set; } + public string Name { get; set; } + public float Scale { get; set; } + public byte Color { get; set; } + public byte Alpha { get; set; } + public float DrawDistance { get; set; } + public bool ShortRange { get; set; } + public float Rotation { get; set; } + public byte Dimension { get; set; } + public bool Active { get; set; } + } +} diff --git a/Server/Saves/SavedMarker.cs b/Server/Saves/SavedMarker.cs new file mode 100644 index 00000000..5670d0f7 --- /dev/null +++ b/Server/Saves/SavedMarker.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Saves SavedMarker.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Saves +{ + public class SavedMarker + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public byte Type { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + public float Scale { get; set; } + public float DirectionX { get; set; } + public float DirectionY { get; set; } + public float DirectionZ { get; set; } + public float RotationX { get; set; } + public float RotationY { get; set; } + public float RotationZ { get; set; } + public byte ColorR { get; set; } + public byte ColorG { get; set; } + public byte ColorB { get; set; } + public byte ColorA { get; set; } + public bool Visible { get; set; } + public byte Dimension { get; set; } + public bool Active { get; set; } + } +} diff --git a/Server/Saves/SavedPed.cs b/Server/Saves/SavedPed.cs new file mode 100644 index 00000000..627ec516 --- /dev/null +++ b/Server/Saves/SavedPed.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Saves SavedPed.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Saves +{ + public class SavedPed + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public string HashModel { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + public float Heading { get; set; } + public byte Dimension { get; set; } + public bool Active { get; set; } + } +} diff --git a/Server/Saves/SavedPickup.cs b/Server/Saves/SavedPickup.cs new file mode 100644 index 00000000..5c518de5 --- /dev/null +++ b/Server/Saves/SavedPickup.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Saves SavedPickup.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Saves +{ + public class SavedPickup + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + [StringLength(128)] + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + public float RotationX { get; set; } + public float RotationY { get; set; } + public float RotationZ { get; set; } + public bool Vehicle { get; set; } + public int RespawnTime { get; set; } + public byte Dimension { get; set; } + public bool Active { get; set; } + } +} diff --git a/Server/Saves/SavedTextLabel.cs b/Server/Saves/SavedTextLabel.cs new file mode 100644 index 00000000..d367bfbf --- /dev/null +++ b/Server/Saves/SavedTextLabel.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +/** + * @overview Life of German Reallife - Saves SavedTextLabel.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Saves +{ + public class SavedTextLabel + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + [Required] + public string Text { get; set; } + [Required] + public float PositionX { get; set; } + [Required] + public float PositionY { get; set; } + [Required] + public float PositionZ { get; set; } + public bool LOS { get; set; } + public byte Font { get; set; } + public float DrawDistance { get; set; } + public byte ColorR { get; set; } + public byte ColorG { get; set; } + public byte ColorB { get; set; } + public byte ColorA { get; set; } + public byte Dimension { get; set; } + public bool Active { get; set; } + } +} diff --git a/Server/Saves/SavedVehicle.cs b/Server/Saves/SavedVehicle.cs new file mode 100644 index 00000000..7653474c --- /dev/null +++ b/Server/Saves/SavedVehicle.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using GTANetworkAPI; + +/** + * @overview Life of German Reallife - Saves SavedVehicle.cs + * @author VegaZ + * @copyright (c) 2008 - 2018 Life of German + */ + +namespace reallife_gamemode.Server.Saves +{ + public class SavedVehicle + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public VehicleHash Model { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + public float Heading { get; set; } + [StringLength(8)] + public string NumberPlate { get; set; } + public byte Alpha { get; set; } + public byte PrimaryColor { get; set; } + public byte SecondaryColor { get; set; } + public bool Locked { get; set; } + public bool Engine { get; set; } + public byte Dimension { get; set; } + public bool Active { get; set; } + } +} From 48535a1fd57c46c7812b474f79d9b82a6d157b02 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sat, 22 Sep 2018 23:29:34 +0200 Subject: [PATCH 13/28] Modify meta.xml --- meta.xml | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/meta.xml b/meta.xml index 3bcdf84f..b9b3f607 100644 --- a/meta.xml +++ b/meta.xml @@ -2,4 +2,71 @@ + @@ -51,6 +51,6 @@ $("h2#playerName").text(name); } - + \ No newline at end of file diff --git a/Client/Save/save.html b/Client/Save/save.html index b6122bcb..f3a8fd90 100644 --- a/Client/Save/save.html +++ b/Client/Save/save.html @@ -7,7 +7,7 @@ - + @@ -67,6 +67,6 @@ - + \ No newline at end of file diff --git a/Client/index.js b/Client/index.js index 6545bd99..1ece4ca7 100644 --- a/Client/index.js +++ b/Client/index.js @@ -4,6 +4,7 @@ * @copyright (c) 2008 - 2018 Life of German */ +require('./Gui/infobox.js'); require('./Login/main.js'); require('./Save/main.js'); -require('./Save/save.js'); \ No newline at end of file +require('./Save/save.js'); diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 1c40ec6c..97f8e40d 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -39,8 +39,9 @@ namespace reallife_gamemode.Server.Events } else { - player.TriggerEvent("loginSuccess"); + player.TriggerEvent("loginSuccess"); NAPI.Player.SpawnPlayer(player, Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING); + player.TriggerEvent("draw"); } } } diff --git a/meta.xml b/meta.xml index 0ced7911..493c28f3 100644 --- a/meta.xml +++ b/meta.xml @@ -6,42 +6,42 @@ - + @@ -51,6 +51,6 @@ $("h2#playerName").text(name); } - + \ No newline at end of file From 7e843cca60ec11b4dab4e35971ba2699d966128c Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Sep 2018 03:27:06 +0200 Subject: [PATCH 22/28] Update save.html --- Client/Save/save.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/Save/save.html b/Client/Save/save.html index f3a8fd90..b6122bcb 100644 --- a/Client/Save/save.html +++ b/Client/Save/save.html @@ -7,7 +7,7 @@ - + @@ -67,6 +67,6 @@ - + \ No newline at end of file From 1d500a01695a16ca1eda9105f12b1229874dbbb1 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Sep 2018 12:16:40 +0200 Subject: [PATCH 23/28] Add Login Security --- Server/Commands/Admin.cs | 18 +++++++++++++++--- Server/Events/Connect.cs | 1 + Server/Events/Disconnect.cs | 23 +++++++++++++++++++++++ Server/Events/Login.cs | 1 + Server/Services/ChatService.cs | 6 ++++++ 5 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 Server/Events/Disconnect.cs diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 5c615bc2..a45e4e18 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -20,6 +20,7 @@ namespace reallife_gamemode.Server.Commands [Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)] public void CmdAdminO(Client player, string message) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); @@ -33,6 +34,7 @@ namespace reallife_gamemode.Server.Commands [Command("veh", "~m~Benutzung: ~s~/veh [Fahrzeug] (Farbe 1) (Farbe 2)")] public void CmdAdminVeh(Client player, VehicleHash hash, int color1 = 111, int color2 = 111) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -53,6 +55,7 @@ namespace reallife_gamemode.Server.Commands [Command("fixveh")] public void CmdAdminFixveh(Client player) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -71,6 +74,7 @@ namespace reallife_gamemode.Server.Commands [Command("delveh")] public void CmdAdminDelveh(Client player) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -92,6 +96,7 @@ namespace reallife_gamemode.Server.Commands [Command("goto", "~m~Benutzung: ~s~/goto [Name]")] public void CmdAdminGoto(Client player, string name) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); @@ -112,6 +117,7 @@ namespace reallife_gamemode.Server.Commands [Command("gotoxyz", "~m~Benutzung: ~s~/gotoxyz [X] [Y] [Z]")] public void CmdAdminGotoxyz(Client player, float x, float y, float z) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -124,6 +130,7 @@ namespace reallife_gamemode.Server.Commands [Command("gethere", "~m~Benutzung: ~s~/goto [Name]")] public void CmdAdminGethere(Client player, string name) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); @@ -144,6 +151,7 @@ namespace reallife_gamemode.Server.Commands [Command("ipl", "~m~Benutzung: ~s~/ipl [Load / Remove] [Name]")] public void CmdAdminIpl(Client player, string option, string name) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -171,6 +179,7 @@ namespace reallife_gamemode.Server.Commands [Command("giveweapon", "~m~Benutzung: ~s~/giveweapon [Spieler] [Waffe] [Munition]")] public void CmdAdminGiveweapon(Client player, string name, string weapon, int ammo) { + if (ChatService.PlayerLoggedIn(player) == false) return; if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -204,13 +213,16 @@ namespace reallife_gamemode.Server.Commands [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle")] public void CmdAdminSave(Client player, string typ) { + if (ChatService.PlayerLoggedIn(player) == false) return; + if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) + { + ChatService.NotAuthorized(player); + return; + } switch (typ) { case "Blip": player.TriggerEvent("saveBlip"); - break; - case "Ped": - break; case "Vehicle": if (player.IsInVehicle) diff --git a/Server/Events/Connect.cs b/Server/Events/Connect.cs index 45e95404..69e1552b 100644 --- a/Server/Events/Connect.cs +++ b/Server/Events/Connect.cs @@ -20,6 +20,7 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerConnected)] public void OnPlayerConnected(Client player) { + player.SetData("isLoggedIn", false); player.Position = new Vector3(-1883.736, -781.4911, -10); player.FreezePosition = true; } diff --git a/Server/Events/Disconnect.cs b/Server/Events/Disconnect.cs new file mode 100644 index 00000000..defec9b7 --- /dev/null +++ b/Server/Events/Disconnect.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; + +/** +* @overview Life of German Reallife - Event Login (Login.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Events +{ + class Disconnect : Script + { + [ServerEvent(Event.PlayerDisconnected)] + public void OnPlayerDisconnected(Client player) + { + player.SetData("isLoggedIn", false); + } + + } +} \ No newline at end of file diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 1c40ec6c..701f8b2e 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -41,6 +41,7 @@ namespace reallife_gamemode.Server.Events { player.TriggerEvent("loginSuccess"); NAPI.Player.SpawnPlayer(player, Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING); + player.SetData("isLoggedIn", true); } } } diff --git a/Server/Services/ChatService.cs b/Server/Services/ChatService.cs index 0ccdfe1f..450105a3 100644 --- a/Server/Services/ChatService.cs +++ b/Server/Services/ChatService.cs @@ -22,5 +22,11 @@ namespace reallife_gamemode.Server.Services { player.SendChatMessage("~r~[FEHLER]~s~ Der Spieler wurde nicht gefunden."); } + + public static bool PlayerLoggedIn(Client player) + { + if(player.GetData("isLoggedIn") == false) player.SendChatMessage("~r~[FEHLER]~s~ Du bist nicht eingeloggt."); + return player.GetData("isLoggedIn"); + } } } From 5ed81d4d1ed1b3bf4c878dabf929efa8d4eed19e Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Sep 2018 15:29:11 +0200 Subject: [PATCH 24/28] Made small changes for Admin Commands --- Server/Commands/Admin.cs | 60 +++++++++++++++++++++++----- Server/Extensions/ClientExtension.cs | 5 +++ Server/Services/ChatService.cs | 5 +-- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index a45e4e18..9f558bee 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -20,7 +20,11 @@ namespace reallife_gamemode.Server.Commands [Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)] public void CmdAdminO(Client player, string message) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); @@ -34,7 +38,11 @@ namespace reallife_gamemode.Server.Commands [Command("veh", "~m~Benutzung: ~s~/veh [Fahrzeug] (Farbe 1) (Farbe 2)")] public void CmdAdminVeh(Client player, VehicleHash hash, int color1 = 111, int color2 = 111) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -55,7 +63,11 @@ namespace reallife_gamemode.Server.Commands [Command("fixveh")] public void CmdAdminFixveh(Client player) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -74,7 +86,11 @@ namespace reallife_gamemode.Server.Commands [Command("delveh")] public void CmdAdminDelveh(Client player) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -96,7 +112,11 @@ namespace reallife_gamemode.Server.Commands [Command("goto", "~m~Benutzung: ~s~/goto [Name]")] public void CmdAdminGoto(Client player, string name) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); @@ -117,7 +137,11 @@ namespace reallife_gamemode.Server.Commands [Command("gotoxyz", "~m~Benutzung: ~s~/gotoxyz [X] [Y] [Z]")] public void CmdAdminGotoxyz(Client player, float x, float y, float z) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -130,7 +154,11 @@ namespace reallife_gamemode.Server.Commands [Command("gethere", "~m~Benutzung: ~s~/goto [Name]")] public void CmdAdminGethere(Client player, string name) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); @@ -151,7 +179,11 @@ namespace reallife_gamemode.Server.Commands [Command("ipl", "~m~Benutzung: ~s~/ipl [Load / Remove] [Name]")] public void CmdAdminIpl(Client player, string option, string name) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -179,7 +211,11 @@ namespace reallife_gamemode.Server.Commands [Command("giveweapon", "~m~Benutzung: ~s~/giveweapon [Spieler] [Waffe] [Munition]")] public void CmdAdminGiveweapon(Client player, string name, string weapon, int ammo) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) { ChatService.NotAuthorized(player); @@ -213,7 +249,11 @@ namespace reallife_gamemode.Server.Commands [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle")] public void CmdAdminSave(Client player, string typ) { - if (ChatService.PlayerLoggedIn(player) == false) return; + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true) { ChatService.NotAuthorized(player); diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index 38aed1ac..d45bede9 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -23,5 +23,10 @@ namespace reallife_gamemode.Server.Extensions return dbContext.Users.FirstOrDefault(u => u.Name == client.Name); } } + + public static bool IsLoggedIn(Client player) + { + return player.GetData("isLoggedIn"); + } } } diff --git a/Server/Services/ChatService.cs b/Server/Services/ChatService.cs index 450105a3..ed7e1d4c 100644 --- a/Server/Services/ChatService.cs +++ b/Server/Services/ChatService.cs @@ -23,10 +23,9 @@ namespace reallife_gamemode.Server.Services player.SendChatMessage("~r~[FEHLER]~s~ Der Spieler wurde nicht gefunden."); } - public static bool PlayerLoggedIn(Client player) + public static void PlayerNotLoggedIn(Client player) { - if(player.GetData("isLoggedIn") == false) player.SendChatMessage("~r~[FEHLER]~s~ Du bist nicht eingeloggt."); - return player.GetData("isLoggedIn"); + player.SendChatMessage("~r~[FEHLER]~s~ Du bist nicht eingeloggt."); } } } From e3bd609d7195ae9847fbca3c1fb85951a7cfffef Mon Sep 17 00:00:00 2001 From: xSprite Date: Mon, 24 Sep 2018 14:52:32 +0200 Subject: [PATCH 25/28] Add some Admin Commands --- Server/Commands/Admin.cs | 287 ++++++++++++++++++++++++++++++++- Server/Events/Spawn.cs | 1 - Server/Services/ChatService.cs | 6 +- 3 files changed, 285 insertions(+), 9 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 9f558bee..5dec4f06 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -9,7 +9,7 @@ using reallife_gamemode.Server.Util; /** * @overview Life of German Reallife - Admin Commands (Admin.cs) -* @author VegaZ, hydrant +* @author VegaZ, hydrant, xSprite * @copyright (c) 2008 - 2018 Life of German */ @@ -58,9 +58,10 @@ namespace reallife_gamemode.Server.Commands Vehicle v = NAPI.Vehicle.CreateVehicle(hash, player.Position, player.Rotation.Z, color1, color2); player.SetIntoVehicle(v.Handle, -1); + player.SendChatMessage("Maxspeed: + " +player.Vehicle.MaxSpeed + ""); } - [Command("fixveh")] + [Command("fv")] public void CmdAdminFixveh(Client player) { if (ClientExtension.IsLoggedIn(player) == false) @@ -74,7 +75,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; @@ -83,7 +84,7 @@ namespace reallife_gamemode.Server.Commands player.Vehicle.Repair(); } - [Command("delveh")] + [Command("vdestroy")] public void CmdAdminDelveh(Client player) { if (ClientExtension.IsLoggedIn(player) == false) @@ -109,7 +110,7 @@ namespace reallife_gamemode.Server.Commands player.Vehicle.Delete(); } - [Command("goto", "~m~Benutzung: ~s~/goto [Name]")] + [Command("to", "~m~Benutzung: ~s~/to [Name]")] public void CmdAdminGoto(Client player, string name) { if (ClientExtension.IsLoggedIn(player) == false) @@ -134,7 +135,24 @@ namespace reallife_gamemode.Server.Commands player.Position = target.Position; } - [Command("gotoxyz", "~m~Benutzung: ~s~/gotoxyz [X] [Y] [Z]")] + [Command("position")] + public void CmdAdminShowPos(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + player.SendChatMessage("Position: X Y Z: " + player.Position + ""); + } + + [Command("gotox", "~m~Benutzung: ~s~/gotox [X] [Y] [Z]")] public void CmdAdminGotoxyz(Client player, float x, float y, float z) { if (ClientExtension.IsLoggedIn(player) == false) @@ -151,7 +169,7 @@ namespace reallife_gamemode.Server.Commands player.Position = new Vector3(x, y, z); } - [Command("gethere", "~m~Benutzung: ~s~/goto [Name]")] + [Command("gh", "~m~Benutzung: ~s~/gh [Name]")] public void CmdAdminGethere(Client player, string name) { if (ClientExtension.IsLoggedIn(player) == false) @@ -174,6 +192,7 @@ namespace reallife_gamemode.Server.Commands } target.Position = player.Position; + target.SendChatMessage("Du wurdest von " + player.Name + " teleportiert."); } [Command("ipl", "~m~Benutzung: ~s~/ipl [Load / Remove] [Name]")] @@ -244,6 +263,260 @@ namespace reallife_gamemode.Server.Commands } target.GiveWeapon(wHash, ammo); + target.SendChatMessage("~b~Du hast von " +player.Name +" eine/n " + wHash + " mit einer Munition von " +ammo + " erhalten."); + player.SendChatMessage("~b~Du hast " + target.Name + " eine/n " + wHash + " mit einer Munition von " + ammo + " gegeben."); + } + + [Command("sethp", "~m~Benutzung: ~s~/sethp [Spieler] (Leben)")] + public void CmdAdminSetHp(Client player, string name, int hp = 100) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + Client target = ClientService.GetClientByName(name); + if (target == null) + { + ChatService.PlayerNotFound(target); + return; + } + + target.Health = hp; + target.SendChatMessage("~b~Dein Leben wurde von " + player.Name + " auf " + hp + " gesetzt."); + player.SendChatMessage("~b~Du hast das Leben von " + target.Name + " auf " + hp + " gesetzt."); + } + + [Command("setarmor", "~m~Benutzung: ~s~/setarmor [Spieler] (Armor)")] + public void CmdAdminSetArmor(Client player, string name, int armor = 100) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + Client target = ClientService.GetClientByName(name); + if (target == null) + { + ChatService.PlayerNotFound(target); + return; + } + + target.Armor = armor; + target.SendChatMessage("~b~Deine Rüstung wurde von " + player.Name + " auf " + armor + " gesetzt."); + player.SendChatMessage("~b~Du hast die Rüstung von " + target.Name + " auf " + armor + " gesetzt."); + } + + [Command("setskin", "~m~Benutzung: ~s~/setskin [Spieler] [Skin]")] + public void CmdAdminSetHp(Client player, string name, string Skin) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + Client target = ClientService.GetClientByName(name); + if (target == null) + { + ChatService.PlayerNotFound(target); + return; + } + + var skin = NAPI.Util.PedNameToModel(Skin); + target.SendChatMessage("~b~Dein Skin wurde von " + player.Name + " zu " + skin + " gesetzt."); + player.SendChatMessage("~b~Du hast den Skin von " + target.Name + " zu " + skin + " gesetzt."); + target.SetSkin(NAPI.Util.PedNameToModel(Skin)); + } + + [Command("vcolor", "~m~Benutzung: ~s~/vcolor [Farb-ID1] [Farb-ID2]")] + public void CmdAdminColor(Client player, int color1, int color2) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + if (!player.IsInVehicle) + { + player.SendChatMessage("~r~[FEHLER]~s~ Du sitzt momentan in keinem Fahrzeug!"); + return; + } + + player.Vehicle.PrimaryColor = color1; + player.Vehicle.SecondaryColor = color2; + player.SendChatMessage("Farb-ID1 " + color1 + ", Farb-ID2 " + color2 + ""); + } + + [Command("aw", "~m~Benutzung: ~s~/aw [Spieler] [Nachricht]")] + public void CmdAdminColor(Client player, string name, string msg) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Client target = ClientService.GetClientByName(name); + if (target == null) + { + ChatService.PlayerNotFound(target); + return; + } + if (target == player) + { + ChatService.ErrorMsg(player); + return; + } + target.SendChatMessage("~y~PM von "+ player.Name + ": " + msg +" "); + player.SendChatMessage("~y~PM an "+ target.Name + ": " + msg + " "); + } + + [Command("takeweapon", "~m~Benutzung: ~s~/takeweapon [Spieler]")] + public void CmdAdminTakeWeapon(Client player, string name) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Client target = ClientService.GetClientByName(name); + if (target == null) + { + ChatService.PlayerNotFound(target); + return; + } + player.RemoveAllWeapons(); + 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("rsethp", "~m~Benutzung: ~s~/rsethp [Radius] (Leben)")] + public void CmdAdminRangeSetHP(Client player, float radius, int hp = 100) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + var peopleInRange = NAPI.Player.GetPlayersInRadiusOfPlayer(radius, player); + + foreach (var managedClient in peopleInRange) + { + managedClient.Health = hp; + player.SendChatMessage("~b~Admin "+ player.Name + " hat im Radius von " + radius + " die HP auf " + hp + " gesetzt."); + } + player.SendChatMessage("~b~Das Leben von " + peopleInRange.Count + " Spielern wurde auf "+ hp + " gesetzt."); + } + + [Command("rsetarmor", "~m~Benutzung: ~s~/rsetarmor [Radius] (Armor)")] + public void CmdAdminRangeSetArmor(Client player, float radius, int Armor = 100) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + var peopleInRange = NAPI.Player.GetPlayersInRadiusOfPlayer(radius, player); + + foreach (var managedClient in peopleInRange) + { + managedClient.Health = Armor; + player.SendChatMessage("~b~Admin " + player.Name + " hat im Radius von " + radius + " die Rüstung auf " + Armor + " gesetzt."); + } + player.SendChatMessage("~b~Die Rüstung von " + peopleInRange.Count + " Spielern wurde auf " + Armor + " gesetzt."); + } + + [Command("time", "~m~Benutzung: ~s~/time [Stunde] (Minuten) (Sekunden)")] + public void CmdAdminSetTime(Client player, int hour, int min = 0, int sec = 0) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + NAPI.World.SetTime(hour, min, sec); + NAPI.Chat.SendChatMessageToAll("Serverzeit auf " + hour + ":" + min + ":" + sec + " gestellt"); + + } + + [Command("rgiveweapon", "~m~Benutzung: ~s~/rgiveweapon [Radius] [Waffe] [Munition]")] + public void CmdAdminRangeGiveWeapon(Client player, float radius, string weapon, int munition) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + WeaponHash wHash = NAPI.Util.WeaponNameToModel(weapon); + + if (wHash == default(WeaponHash)) + { + player.SendChatMessage("~r~[FEHLER]~s~ Diese Waffe existiert nicht."); + return; + } + + var peopleInRange = NAPI.Player.GetPlayersInRadiusOfPlayer(radius, player); + + foreach (var managedClient in peopleInRange) + { + managedClient.GiveWeapon(wHash, munition); + player.SendChatMessage("~b~Admin " +player.Name + " hat im Radius von " + radius + " eine/n " + weapon +" mit " + munition +" Munition vergeben."); + } + player.SendChatMessage("~b~Du hast " + peopleInRange.Count +" Spielern eine " + weapon + " mit " + munition + "Munition gegeben"); } [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle")] diff --git a/Server/Events/Spawn.cs b/Server/Events/Spawn.cs index 02d3d38a..518a76a5 100644 --- a/Server/Events/Spawn.cs +++ b/Server/Events/Spawn.cs @@ -20,7 +20,6 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerSpawn)] public void OnPlayerSpawn(Client player) { - } } } diff --git a/Server/Services/ChatService.cs b/Server/Services/ChatService.cs index ed7e1d4c..04a41d6b 100644 --- a/Server/Services/ChatService.cs +++ b/Server/Services/ChatService.cs @@ -5,7 +5,7 @@ using System.Text; /** * @overview Life of German Reallife - Chat Service (ChatService.cs) -* @author hydrant +* @author hydrant, xSprite * @copyright (c) 2008 - 2018 Life of German */ @@ -27,5 +27,9 @@ namespace reallife_gamemode.Server.Services { player.SendChatMessage("~r~[FEHLER]~s~ Du bist nicht eingeloggt."); } + public static void ErrorMsg(Client player) + { + player.SendChatMessage("~r~[FEHLER]~s~ Die Aktion wurde nicht ausgeführt."); + } } } From d11affc30acee734db6fc28f02ffac9648c24a4f Mon Sep 17 00:00:00 2001 From: xSprite Date: Mon, 24 Sep 2018 14:57:10 +0200 Subject: [PATCH 26/28] Fix setskin, aw --- Server/Commands/Admin.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 5dec4f06..963a2446 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -320,7 +320,7 @@ namespace reallife_gamemode.Server.Commands } [Command("setskin", "~m~Benutzung: ~s~/setskin [Spieler] [Skin]")] - public void CmdAdminSetHp(Client player, string name, string Skin) + public void CmdAdminSetSkin(Client player, string name, string Skin) { if (ClientExtension.IsLoggedIn(player) == false) { @@ -372,7 +372,7 @@ namespace reallife_gamemode.Server.Commands } [Command("aw", "~m~Benutzung: ~s~/aw [Spieler] [Nachricht]")] - public void CmdAdminColor(Client player, string name, string msg) + public void CmdAdminMsg(Client player, string name, string msg) { if (ClientExtension.IsLoggedIn(player) == false) { From 71e08b5a037ae493a5dd1da998eb1af206a5e2b5 Mon Sep 17 00:00:00 2001 From: xSprite Date: Mon, 24 Sep 2018 15:06:44 +0200 Subject: [PATCH 27/28] fix radius Commands --- Server/Commands/Admin.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 963a2446..560d4bf6 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -441,7 +441,7 @@ namespace reallife_gamemode.Server.Commands foreach (var managedClient in peopleInRange) { managedClient.Health = hp; - player.SendChatMessage("~b~Admin "+ player.Name + " hat im Radius von " + radius + " die HP auf " + hp + " gesetzt."); + managedClient.SendChatMessage("~b~Admin "+ player.Name + " hat im Radius von " + radius + " die HP auf " + hp + " gesetzt."); } player.SendChatMessage("~b~Das Leben von " + peopleInRange.Count + " Spielern wurde auf "+ hp + " gesetzt."); } @@ -464,7 +464,7 @@ namespace reallife_gamemode.Server.Commands foreach (var managedClient in peopleInRange) { managedClient.Health = Armor; - player.SendChatMessage("~b~Admin " + player.Name + " hat im Radius von " + radius + " die Rüstung auf " + Armor + " gesetzt."); + managedClient.SendChatMessage("~b~Admin " + player.Name + " hat im Radius von " + radius + " die Rüstung auf " + Armor + " gesetzt."); } player.SendChatMessage("~b~Die Rüstung von " + peopleInRange.Count + " Spielern wurde auf " + Armor + " gesetzt."); } @@ -514,9 +514,9 @@ namespace reallife_gamemode.Server.Commands foreach (var managedClient in peopleInRange) { managedClient.GiveWeapon(wHash, munition); - player.SendChatMessage("~b~Admin " +player.Name + " hat im Radius von " + radius + " eine/n " + weapon +" mit " + munition +" Munition vergeben."); + managedClient.SendChatMessage("~b~Admin " +player.Name + " hat im Radius von " + radius + " eine/n " + weapon +" mit " + munition +" Munition vergeben."); } - player.SendChatMessage("~b~Du hast " + peopleInRange.Count +" Spielern eine " + weapon + " mit " + munition + "Munition gegeben"); + player.SendChatMessage("~b~Du hast " + peopleInRange.Count +" Spielern eine " + weapon + " mit " + munition + " Munition gegeben"); } [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip, ~r~Marker, Ped, Pickup, TextLabel, ~g~Vehicle")] From 5e0e0d82f2d05dda2954836a69347d4433839f85 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 24 Sep 2018 20:38:46 +0200 Subject: [PATCH 28/28] Fix target -> player --- Server/Commands/Admin.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 560d4bf6..403de063 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -250,7 +250,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); if (target == null) { - ChatService.PlayerNotFound(target); + ChatService.PlayerNotFound(player); return; } @@ -284,7 +284,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); if (target == null) { - ChatService.PlayerNotFound(target); + ChatService.PlayerNotFound(player); return; } @@ -310,7 +310,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); if (target == null) { - ChatService.PlayerNotFound(target); + ChatService.PlayerNotFound(player); return; } @@ -336,7 +336,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); if (target == null) { - ChatService.PlayerNotFound(target); + ChatService.PlayerNotFound(player); return; } @@ -387,7 +387,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); if (target == null) { - ChatService.PlayerNotFound(target); + ChatService.PlayerNotFound(player); return; } if (target == player) @@ -415,7 +415,7 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(name); if (target == null) { - ChatService.PlayerNotFound(target); + ChatService.PlayerNotFound(player); return; } player.RemoveAllWeapons(); @@ -487,7 +487,11 @@ namespace reallife_gamemode.Server.Commands NAPI.Chat.SendChatMessageToAll("Serverzeit auf " + hour + ":" + min + ":" + sec + " gestellt"); } - + [Command("val")] + public void Val(Client player) + { + NAPI.Chat.SendChatMessageToAll("Value of " + player.Name + ": " + player.Handle.Value); + } [Command("rgiveweapon", "~m~Benutzung: ~s~/rgiveweapon [Radius] [Waffe] [Munition]")] public void CmdAdminRangeGiveWeapon(Client player, float radius, string weapon, int munition) {