diff --git a/Client/Login/login.html b/Client/Login/login.html
index ac486575..0bfe5b52 100644
--- a/Client/Login/login.html
+++ b/Client/Login/login.html
@@ -1,4 +1,9 @@
-
+
+
diff --git a/Client/Login/login.js b/Client/Login/login.js
index 80ec311d..2e07b8fa 100644
--- a/Client/Login/login.js
+++ b/Client/Login/login.js
@@ -1,4 +1,10 @@
-$('#loginBtn').click(() => {
+/**
+ * @overview Life of German Reallife - Login Login login.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+$('#loginBtn').click(() => {
$('.alert').remove(); //Remove any alerts when we attempt to login/register
mp.trigger('loginInformationToServer', $('#usernameInputLogin').val(), $('#passwordInputLogin').val());
});
diff --git a/Client/Login/main.js b/Client/Login/main.js
index 53e3b780..23f69481 100644
--- a/Client/Login/main.js
+++ b/Client/Login/main.js
@@ -1,4 +1,9 @@
-var loginBrowser = mp.browsers.new('package://Login/login.html');
+/**
+ * @overview Life of German Reallife - Login Main main.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+var loginBrowser = mp.browsers.new('package://Login/login.html');
mp.gui.cursor.show(true, true);
mp.events.add('loginInformationToServer', (username, password) => {
diff --git a/Client/Login/style.css b/Client/Login/style.css
index 2916f236..2405799c 100644
--- a/Client/Login/style.css
+++ b/Client/Login/style.css
@@ -1,4 +1,10 @@
-.login-page {
+/**
+ * @overview Life of German Reallife - Login CSS style.css
+ * @author Orangebox
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+.login-page {
width: 360px;
margin: auto;
}
diff --git a/Client/index.js b/Client/index.js
index e7a9b22d..51689880 100644
--- a/Client/index.js
+++ b/Client/index.js
@@ -1 +1,7 @@
+/**
+ * @overview Life of German Reallife - Login index.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
require('./Login/main.js');
\ No newline at end of file
diff --git a/Main.cs b/Main.cs
index 8d56a939..f9e29611 100644
--- a/Main.cs
+++ b/Main.cs
@@ -1,13 +1,22 @@
using System;
using GTANetworkAPI;
+/**
+* @overview Life of German Reallife - Main Class (Main.cs)
+* @author VegaZ, hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
namespace reallife_gamemode
{
public class Main : Script
{
+
+
[ServerEvent(Event.ResourceStart)]
public void OnResourceStart()
{
+ NAPI.Server.SetCommandErrorMessage("~r~[FEHLER]~s~ Dieser Command existiert nicht.");
NAPI.Util.ConsoleOutput("reallife-gamemode resource loaded!");
}
}
diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs
index 07cc415e..296b503a 100644
--- a/Model/DatabaseContext.cs
+++ b/Model/DatabaseContext.cs
@@ -1,15 +1,15 @@
-/**
- * @overview Life of German Reallife - DatabaseContext.cs
- * @author VegaZ
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-using System;
+using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
+/**
+ * @overview Life of German Reallife - DatabaseContext.cs
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
namespace reallife_gamemode.Model
{
public partial class DatabaseContext : DbContext
@@ -35,6 +35,5 @@ namespace reallife_gamemode.Model
}
public DbSet Users { get; set; }
- public DbSet Characters { get; set; }
}
}
diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs
index b0af4954..852fb227 100644
--- a/Server/Commands/Admin.cs
+++ b/Server/Commands/Admin.cs
@@ -2,15 +2,202 @@
using System.Collections.Generic;
using System.Text;
using GTANetworkAPI;
+using reallife_gamemode.Server.Extensions;
+using reallife_gamemode.Server.Services;
+using reallife_gamemode.Server.Util;
-namespace reallife_gamemode.Server.Command
+/**
+* @overview Life of German Reallife - Admin Commands (Admin.cs)
+* @author VegaZ, hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
+namespace reallife_gamemode.Server.Commands
{
public class Admin : Script
{
- [Command("o")]
- public void sendOChat(Client player, string message)
+ [Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)]
+ public void CmdAdminO(Client player, string message)
{
- NAPI.Chat.SendChatMessageToAll("~r~" + player.Name + " sagt:~w~ " + message);
+ if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ string publicMessage = "~b~(( " + player.Name + ": " + message + " ))";
+ NAPI.Chat.SendChatMessageToAll(publicMessage);
+ }
+
+ [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 (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ if (player.IsInVehicle) // Man darf keine Autos erstellen, wenn man selbst in einem sitzt (verhindert Bugs)
+ {
+ 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);
+ }
+
+ [Command("fixveh")]
+ public void CmdAdminFixveh(Client player)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ if (!player.IsInVehicle) // Man darf keine Autos erstellen, wenn man selbst in einem sitzt (verhindert Bugs)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Du sitzt momentan nicht in einem Fahrzeug.");
+ return;
+ }
+
+ player.Vehicle.Repair();
+ }
+
+ [Command("delveh")]
+ public void CmdAdminDelveh(Client player)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ if (!player.IsInVehicle) // Man darf keine Autos erstellen, wenn man selbst in einem sitzt (verhindert Bugs)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Du sitzt momentan nicht in einem Fahrzeug.");
+ return;
+ }
+
+ /* TODO: Checken, ob das Fahrzeug in einem System genutzt wird (Fraktions-Autos / Spieler-Auto)
+ * Wenn Ja: Abbrechen und mitteilen, dass man den System-spezifischen Befehl zu nutzen hat */
+
+ player.Vehicle.Delete();
+ }
+
+ [Command("goto", "~m~Benutzung: ~s~/goto [Name]")]
+ public void CmdAdminGoto(Client player, string name)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ Client target = ClientService.GetClientByName(name);
+
+ if(target == null)
+ {
+ ChatService.PlayerNotFound(player);
+ return;
+ }
+
+ player.Position = target.Position;
+ }
+
+ [Command("gotoxyz", "~m~Benutzung: ~s~/gotoxyz [X] [Y] [Z]")]
+ public void CmdAdminGotoxyz(Client player, float x, float y, float z)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ player.Position = new Vector3(x, y, z);
+ }
+
+ [Command("gethere", "~m~Benutzung: ~s~/goto [Name]")]
+ public void CmdAdminGethere(Client player, string name)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ Client target = ClientService.GetClientByName(name);
+
+ if (target == null)
+ {
+ ChatService.PlayerNotFound(player);
+ return;
+ }
+
+ target.Position = player.Position;
+ }
+
+ [Command("ipl", "~m~Benutzung: ~s~/ipl [Load / Remove] [Name]")]
+ public void CmdAdminIpl(Client player, string option, string name)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ option = option.ToLower();
+
+ if(option == "load")
+ {
+ NAPI.World.RequestIpl(name);
+ player.SendChatMessage("~g~Das IPL ~s~" + name + " ~g~wurde erfolgreich geladen");
+ }
+ else if(option == "remove")
+ {
+ NAPI.World.RemoveIpl(name);
+ player.SendChatMessage("~g~Das IPL ~s~" + name + " ~g~wurde erfolgreich entladen");
+ }
+ else
+ {
+ player.SendChatMessage("~m~Benutzung: ~s~/ipl [Load / Remove] [Name]");
+ }
+ }
+
+ [Command("giveweapon", "~m~Benutzung: ~s~/giveweapon [Spieler] [Waffe] [Munition]")]
+ public void CmdAdminGiveweapon(Client player, string name, string weapon, int ammo)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ if (ammo <= 0)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Es muss mindestens 1 Munition vergeben werden.");
+ return;
+ }
+
+ Client target = ClientService.GetClientByName(name);
+ if (target == null)
+ {
+ ChatService.PlayerNotFound(target);
+ return;
+ }
+
+ WeaponHash wHash = NAPI.Util.WeaponNameToModel(weapon);
+
+ if(wHash == default(WeaponHash))
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Diese Waffe existiert nicht.");
+ return;
+ }
+
+ target.GiveWeapon(wHash, ammo);
}
}
}
diff --git a/Server/Entities/Character.cs b/Server/Entities/Character.cs
deleted file mode 100644
index f5dd13f3..00000000
--- a/Server/Entities/Character.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Text;
-
-namespace reallife_gamemode.Server.Entities
-{
- public class Character
- {
- [Key]
- public int Id { get; set; }
- public int UserId { get; set; }
- public string Name { get; set; }
- public byte Gender { get; set; }
- }
-}
diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs
index 2cea4e39..1f0a934d 100644
--- a/Server/Entities/User.cs
+++ b/Server/Entities/User.cs
@@ -1,9 +1,16 @@
-using System;
+using reallife_gamemode.Server.Util;
+using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
+/**
+* @overview Life of German Reallife - Entities User (User.cs)
+* @author VegaZ, hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
namespace reallife_gamemode.Server.Entities
{
public class User
@@ -22,5 +29,8 @@ namespace reallife_gamemode.Server.Entities
[EmailAddress]
[StringLength(64)]
public string Email { get; set; }
+ public AdminLevel AdminLevel { get; set; }
+
+ public bool IsAdmin(AdminLevel level) => AdminLevel >= level;
}
}
diff --git a/Server/Events/Connect.cs b/Server/Events/Connect.cs
index b1b581f1..caa7ea4b 100644
--- a/Server/Events/Connect.cs
+++ b/Server/Events/Connect.cs
@@ -7,6 +7,12 @@ using Microsoft.EntityFrameworkCore;
using reallife_gamemode.Model;
using reallife_gamemode.Server.Entities;
+/**
+* @overview Life of German Reallife - Event Login (Login.cs)
+* @author VegaZ
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
namespace reallife_gamemode.Server.Events
{
class Connect : Script
diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs
index 5072e393..04ebb9b0 100644
--- a/Server/Events/Login.cs
+++ b/Server/Events/Login.cs
@@ -3,6 +3,12 @@ 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
{
public class Login : Script
diff --git a/Server/Events/Spawn.cs b/Server/Events/Spawn.cs
index 1dfb2817..a11c5da6 100644
--- a/Server/Events/Spawn.cs
+++ b/Server/Events/Spawn.cs
@@ -6,6 +6,12 @@ using GTANetworkAPI;
using GTANetworkMethods;
using reallife_gamemode.Model;
+/**
+* @overview Life of German Reallife - Event Spawn (Spawn.cs)
+* @author VegaZ
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
namespace reallife_gamemode.Server.Event
{
public class Spawn : Script
diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs
new file mode 100644
index 00000000..38aed1ac
--- /dev/null
+++ b/Server/Extensions/ClientExtension.cs
@@ -0,0 +1,27 @@
+using GTANetworkAPI;
+using reallife_gamemode.Model;
+using reallife_gamemode.Server.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+/**
+* @overview Life of German Reallife - Client Extension (ClientExtension.cs)
+* @author VegaZ, hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
+namespace reallife_gamemode.Server.Extensions
+{
+ public static class ClientExtension
+ {
+ public static User GetUser(this Client client)
+ {
+ using(DatabaseContext dbContext = new DatabaseContext())
+ {
+ return dbContext.Users.FirstOrDefault(u => u.Name == client.Name);
+ }
+ }
+ }
+}
diff --git a/Server/Managers/.gitkeep b/Server/Managers/.gitkeep
new file mode 100644
index 00000000..d66872d0
--- /dev/null
+++ b/Server/Managers/.gitkeep
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace reallife_gamemode.Server.Managers
+{
+ class _
+ {
+ }
+}
diff --git a/Server/Services/ChatService.cs b/Server/Services/ChatService.cs
new file mode 100644
index 00000000..0ccdfe1f
--- /dev/null
+++ b/Server/Services/ChatService.cs
@@ -0,0 +1,26 @@
+using GTANetworkAPI;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+/**
+* @overview Life of German Reallife - Chat Service (ChatService.cs)
+* @author hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
+namespace reallife_gamemode.Server.Services
+{
+ class ChatService
+ {
+ public static void NotAuthorized(Client player)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Du kannst diesen Befehl nicht ausführen.");
+ }
+
+ internal static void PlayerNotFound(Client player)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Der Spieler wurde nicht gefunden.");
+ }
+ }
+}
diff --git a/Server/Services/ClientService.cs b/Server/Services/ClientService.cs
new file mode 100644
index 00000000..6959b3fa
--- /dev/null
+++ b/Server/Services/ClientService.cs
@@ -0,0 +1,36 @@
+using GTANetworkAPI;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+/**
+* @overview Life of German Reallife - Client Service (ClientService.cs)
+* @author hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
+namespace reallife_gamemode.Server.Services
+{
+ class ClientService
+ {
+ public static Client GetClientByName(string name)
+ {
+ /* Funktionsaufbau: Prüft erst, ob ein Spieler mit exakt diesem Namen online ist
+ * Wenn Ja: Wird dieser zurückgegeben
+ * Wenn Nein: Wird der erste Spieler zurückgegeben, dessen Namen mit dem eingegebenen Parameter übereinstimmt
+ * Gibt "null" zurück, falls kein Client gefunden wurde
+ */
+ Client toReturn = null;
+
+ List playerList = NAPI.Pools.GetAllPlayers();
+ toReturn = playerList.Find(p => p.Name == name);
+
+ if(toReturn == null)
+ {
+ toReturn = playerList.Find(p => p.Name.StartsWith(name));
+ }
+
+ return toReturn;
+ }
+ }
+}
diff --git a/Server/Util/AdminLevel.cs b/Server/Util/AdminLevel.cs
new file mode 100644
index 00000000..8e201b63
--- /dev/null
+++ b/Server/Util/AdminLevel.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+/**
+* @overview Life of German Reallife - Admin Levels (AdminLevel.cs)
+* @author VegaZ, hydrant
+* @copyright (c) 2008 - 2018 Life of German
+*/
+
+namespace reallife_gamemode.Server.Util
+{
+ public enum AdminLevel : int
+ {
+
+
+ PLAYER,
+ SUPPORTER,
+ ADMIN
+ }
+}