diff --git a/Client/Dependences/jquery.gettable.js b/Client/Dependences/jquery.gettable.js
new file mode 100644
index 00000000..21dd3a62
--- /dev/null
+++ b/Client/Dependences/jquery.gettable.js
@@ -0,0 +1 @@
+!function (n) { "use strict"; function e(e, t) { n.each(t, function (t, o) { n.inArray(o, e) < 0 && e.push(o) }) } function t(t, o) { function r(n) { var e; if (!c.rows[n]) for (e = 0; n >= e; e++)c.rows[e] = c.rows[e] || { cells: [], table: c }; return c.rows[n] } function l(n) { var e; if (!c.cols[n]) for (e = 0; n >= e; e++)c.cols[e] = c.cols[e] || { cells: [], table: c }; return c.cols[n] } var c = { rows: [], cols: [], cells: [] }, s = "number" == typeof o ? o : y.length, u = -1, a = {}, i = "table" === t.get(0).nodeName.toLowerCase() ? t.get(0) : function () { var n = t.closest("table"); return n.length ? n.get(0) : void 0 }(); return i ? (c.elm = i, n(i).data(N, "table:" + s), n.each(i.rows, function (e, t) { var o, i, f, h, w, v, g, m, b, d = 0; for (n(t).data(N, "table:" + s + ",row:" + e), function () { var e = 0; n.each(t.cells, function (n, t) { e += +t.colSpan || 1 }), e - 1 > u && (u = e - 1) }(), h = 0; u >= h; h++)if ((!a[e] || !a[e][h]) && (w = t.cells[d++])) { for (n(w).data(N, "table:" + s + ",cell:" + c.cells.length), f = { elm: w, rows: [], cols: [], table: c, iRow: e, iCol: h }, v = (+w.rowSpan || 1) - 1, g = (+w.colSpan || 1) - 1, m = 0; v >= m; m++)o = r(e + m), f.rows.push(o), o.cells.push(f); for (m = 0; g >= m; m++)i = l(h + m), f.cols.push(i), i.cells.push(f); for (m = 1; v >= m; m++)for (a[e + m] = a[e + m] || {}, b = 0; g >= b; b++)a[e + m][h + b] = !0; h += g, c.cells.push(f) } }), n.each(c.cells, function (t, o) { var r = [o]; n.each(o.rows.concat(o.cols), function (n, t) { e(r, t.cells) }), o.xCells = r }), n.each(c.rows, function (n, e) { e.cells.sort(function (n, e) { return n.iCol - e.iCol }) }), n.each(c.cols, function (n, e) { e.cells.sort(function (n, e) { return n.iRow - e.iRow }) }), y[s] = c, c) : null } function o(n) { for (var e, t = {}, o = n.data(N) || "", r = /\b(\w+):(\d+)/g; null !== (e = r.exec(o));)t[e[1]] = +e[2]; return t } function r(n, e) { var r = o(n).table; return e || "number" != typeof r || !y[r] ? t(n, r) : y[r] } function l(n) { return "table" === n } function c(n) { return "tr" === n } function s(n) { return "td" === n || "th" === n } function u(n) { return "thead" === n || "tfoot" === n || "tbody" === n } function a(n) { return l(n) || c(n) || s(n) || u(n) } function i(e) { return n.map(e, function (n) { return n.elm }) } function f(e) { return n(i(e)) } function h(t) { var a = []; return t.each(function () { var t, f = n(this), h = f.get(0).nodeName.toLowerCase(); l(h) && (t = r(f)) ? e(a, i(t.cells)) : c(h) && (t = r(f)) ? e(a, i(t.rows[o(f).row].cells)) : s(h) && (t = r(f)) ? e(a, [t.cells[o(f).cell].elm]) : u(h) && (t = r(f)) && n.each(f.get(0).rows, function (r, l) { e(a, i(t.rows[o(n(l)).row].cells)) }) }), n(a.length ? a : null) } function w(t) { var l = []; return t.each(function () { var t, c = n(this), u = c.get(0).nodeName.toLowerCase(); s(u) && (t = r(c)) && e(l, i(t.cells[o(c).cell].xCells)) }), n(l.length ? l : null) } function v(t) { var a = []; return t.each(function () { var t, i = n(this), f = i.get(0).nodeName.toLowerCase(); l(f) && (t = r(i)) ? e(a, t.rows) : c(f) && (t = r(i)) ? e(a, [t.rows[o(i).row]]) : s(f) && (t = r(i)) ? e(a, t.cells[o(i).cell].rows) : u(f) && (t = r(i)) && e(a, n.map(i.get(0).rows, function (e) { return t.rows[o(n(e)).row] })) }), a } function g(t) { var a = []; return t.each(function () { var t, i = n(this), f = i.get(0).nodeName.toLowerCase(); (l(f) || c(f) || u(f)) && (t = r(i)) ? e(a, t.cols) : s(f) && (t = r(i)) && e(a, t.cells[o(i).cell].cols) }), a } function m(e) { return n.map(v(e), function (n) { return f(n.cells) }) } function b(t) { var o = []; return n.each(v(t), function (n, t) { e(o, i(t.cells)) }), n(o.length ? o : null) } function d(e) { return n.map(g(e), function (n) { return f(n.cells) }) } function p(t) { var o = []; return n.each(g(t), function (n, t) { e(o, i(t.cells)) }), n(o.length ? o : null) } function C(t) { var o = []; return t.each(function () { var t, l = n(this), c = l.get(0).nodeName.toLowerCase(); a(c) && (t = r(l)) && e(o, [t.elm]) }), n(o.length ? o : null) } function L(e) { return e.each(function () { var e = n(this), t = e.get(0).nodeName.toLowerCase(); a(t) && r(e, !0) }) } var N = "getTable", y = []; n.fn[N] = function (n) { return "cells" === n ? h(this) : "xCells" === n ? w(this) : "rows" === n ? m(this) : "rowsCells" === n ? b(this) : "cols" === n ? d(this) : "colsCells" === n ? p(this) : "table" === n ? C(this) : L(this) } }(jQuery);
\ No newline at end of file
diff --git a/Client/FactionManagement/Ranks/index.html b/Client/FactionManagement/Ranks/index.html
index 577cc0c4..d650b0e8 100644
--- a/Client/FactionManagement/Ranks/index.html
+++ b/Client/FactionManagement/Ranks/index.html
@@ -12,9 +12,12 @@
-
diff --git a/Client/FactionManagement/Ranks/script.js b/Client/FactionManagement/Ranks/script.js
index ed708cf7..5903bb67 100644
--- a/Client/FactionManagement/Ranks/script.js
+++ b/Client/FactionManagement/Ranks/script.js
@@ -4,49 +4,60 @@
* @copyright (c) 2008 - 2018 Life of German
*/
+var dndConfig = {
+ onDragClass: "rankDnD"
+};
+
$(document).ready(function () {
mp.trigger("onManageFactionRanksLoaded");
+ $("table#rank-table").on("click", "tr td span", function () {
+ $(this).parent().parent().remove();
+ $("table#rank-table").tableDnD(dndConfig);
+ });
+
+ $("#btn-add-new-rank").click(function () {
+ var toAdd = $("input#input-new-rank").val();
+ if (toAdd.length === 0) return;
+ $("input#input-new-rank").val("");
+ $("table#rank-table").append(" | | X |
");
+ $("table#rank-table").tableDnD(dndConfig);
+ });
+
$(".save-btn").click(function () {
var rows = $("table#rank-table tr");
- console.log(rows);
- rows.shift();
- console.log(rows);
+ rows = rows.slice(1);
- if (rows.length == 0) {
+ if (rows.length === 0) {
alert("Es muss mindestens ein Rang angegeben werden!");
return;
}
var rankArray = new Array();
+ rows.each(function () {
+ var id = $(this).find("input.input-id")[0].value;
+ var name = $(this).find("input.input-rankname")[0].value;
- rows.forEach(function (row) {
- var tdId = row[0];
- var tdName = row[1];
+ var rank = new Object();
+ rank.Id = parseInt(id);
+ rank.Name = name;
- var id = tdId.children[0].value;
- var name = tdName.children[0].value;
-
- var rank = [id, name];
- console.log(rank);
rankArray.push(rank);
});
- console.log(rankArray);
- //mp.trigger('saveFactionRankData');
+ var json = JSON.stringify(rankArray);
+
+ mp.trigger('saveFactionRankData', json);
});
});
function loadData(rankData) {
$("table#rank-table tr").remove();
$("table#rank-table").append("| ID | Fraktions-Ränge |
");
-
- console.log(rankData);
+
rankData.forEach(function (rank) {
- $("table#rank-table").append(" | |
");
+ $("table#rank-table").append(" | | X |
");
});
- $("table#rank-table").tableDnD({
- onDragClass: "rankDnD"
- });
+ $("table#rank-table").tableDnD(dndConfig);
}
\ No newline at end of file
diff --git a/Client/FactionManagement/Ranks/style.css b/Client/FactionManagement/Ranks/style.css
index f775a20a..06f18745 100644
--- a/Client/FactionManagement/Ranks/style.css
+++ b/Client/FactionManagement/Ranks/style.css
@@ -5,17 +5,24 @@
}
.table {
- background-color: white;
+ background-color: rgba(255, 255, 255, .8);
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
width: 350px;
margin: auto;
+ margin-top: 5%;
+ padding: 0px 20px 20px 20px;
}
.rankDnD {
- background-color: lightgray;
+ background-color: dimgrey;
+ cursor: move;
}
.save-btn {
+ display:inline-block;
+ margin-top: 10px;
+ width: 100%;
+ border-radius: 5px;
background-color: forestgreen;
color: white;
outline: 0;
@@ -28,9 +35,31 @@
}
#rank-table {
+ margin-left: 50%;
+ transform: translateX(-50%);
width: 100%;
}
+#rank-table tr {
+ width: 100%;
+}
+
+.input-rankname {
+ display: inline-block;
+ margin-left: 50%;
+ transform: translateX(-50%);
+}
+
+.delete-rank {
+ background-color: orangered;
+ color: white;
+ padding: 3px;
+}
+
+.delete-rank:hover, .delete-rank:focus, .delete-rank:active {
+ background-color: #ff0223 !important;
+}
+
#rank-table tr td {
border-bottom: 1px solid black;
padding: 5px 15px;
@@ -40,7 +69,7 @@
border-bottom: none;
}
-
#rank-table > tr:not(:first-child):hover {
- background-color: lightgray;
-}
\ No newline at end of file
+ background-color: dimgrey;
+ cursor: move;
+}
diff --git a/Client/FactionManagement/main.js b/Client/FactionManagement/main.js
index fd76015d..a3168947 100644
--- a/Client/FactionManagement/main.js
+++ b/Client/FactionManagement/main.js
@@ -10,21 +10,49 @@ var rankData = null;
mp.events.add('manageFactionRanks', (ranks) => {
if (manageFactionRanksBrowser !== null) return;
manageFactionRanksBrowser = mp.browsers.new('package://FactionManagement/Ranks/index.html');
+
+ //var testRanks = {
+ // FactionId: 3,
+ // Ranks: [
+ // {
+ // Id: 5,
+ // Name: "Officer"
+ // },
+ // {
+ // Id: 6,
+ // Name: "Sergeant"
+ // }
+ // ]
+ //};
+
+ //var json = JSON.stringify(testRanks);
+
+ //mp.events.callRemote('OnFactionRanksEdit', json);
+
mp.gui.chat.activate(false);
- rankData = ranks;
+ rankData = JSON.parse(ranks);
});
mp.events.add('onManageFactionRanksLoaded', () => {
if (manageFactionRanksBrowser !== null) {
- manageFactionRanksBrowser.execute(`loadData(` + rankData + `)`);
+
+ manageFactionRanksBrowser.execute(`loadData(` + JSON.stringify(rankData.Ranks) + `)`);
mp.gui.cursor.show(true, true);
}
});
-mp.events.add('saveFactionRankData', function () {
+mp.events.add('saveFactionRankData', function (data) {
if (manageFactionRanksBrowser !== null) {
manageFactionRanksBrowser.destroy();
mp.gui.cursor.show(false, false);
mp.gui.chat.activate(true);
+
+ var obj = new Object();
+ obj.FactionId = rankData.FactionId;
+ obj.Ranks = JSON.parse(data);
+
+ mp.events.callRemote('OnFactionRanksEdit', JSON.stringify(obj));
+
+ manageFactionRanksBrowser = null;
}
});
\ No newline at end of file
diff --git a/Client/Login/login.html b/Client/Login/login.html
index 03edc5c2..5306cfdd 100644
--- a/Client/Login/login.html
+++ b/Client/Login/login.html
@@ -7,7 +7,6 @@
-
@@ -33,6 +32,7 @@
+
diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs
index 7d74337b..d7e64835 100644
--- a/Server/Commands/Admin.cs
+++ b/Server/Commands/Admin.cs
@@ -1,6 +1,8 @@
using System;
+using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
+using Newtonsoft.Json;
using reallife_gamemode.Model;
using reallife_gamemode.Server.Entities;
using reallife_gamemode.Server.Events;
@@ -265,6 +267,48 @@ namespace reallife_gamemode.Server.Commands
player.SendChatMessage("~b~[ADMIN]~s~ Du hast hast den Spieler ~y~" + target.Name + "~s~ administrativ aus seiner Fraktion geworfen.");
target.SendChatMessage("~b~[ADMIN]~s~ Du wurdest von ~y~" + player.Name + "~s~ administrativ aus deiner Fraktion geworfen.");
}
+
+ u.FactionLeader = false;
+
+ dbContext.SaveChanges();
+ }
+ }
+
+ [Command("makeleader", "~m~Benutzung: ~s~/makeleader [Name] [Fraktion]")]
+ public void CmdAdminMakeleader(Client player, string name, int faction)
+ {
+ if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ Client target = ClientService.GetClientByName(name);
+ if (target == null)
+ {
+ ChatService.PlayerNotFound(player);
+ return;
+ }
+
+ using (var dbContext = new DatabaseContext())
+ {
+ Entities.Faction f = dbContext.Factions.FirstOrDefault(x => x.Id == faction);
+ if (f == null)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Diese Fraktion existiert nicht (Liste: ~m~/factionlist).");
+ return;
+ }
+
+ User u = dbContext.Users.SingleOrDefault(x => x.Name == target.Name);
+
+ u.FactionId = f.Id;
+ u.FactionRankId = dbContext.FactionRanks.
+ OrderByDescending(x => x.Order)
+ .FirstOrDefault(r => r.FactionId == f.Id)?.Id ?? null;
+ u.FactionLeader = true;
+
+ player.SendChatMessage("~b~[ADMIN]~s~ Du hast hast den Spieler ~y~" + target.Name + "~s~ zum Leader der Fraktion Fraktion ~o~" + f.Name + "~s~ ernannt.");
+ target.SendChatMessage("~b~[ADMIN]~s~ Du wurdest von ~y~" + player.Name + "~s~ zum Leader der Fraktion ~o~" + f.Name + "~s~ ernannt.");
dbContext.SaveChanges();
}
@@ -292,5 +336,46 @@ namespace reallife_gamemode.Server.Commands
break;
}
}
+
+ [Command("managefactionranks", "~m~Benutzung: ~s~/managefactionranks [Fraktions-ID]")]
+ public void CmdFactionManageFactionRanks(Client player, int factionID)
+ {
+ if(!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
+ {
+ ChatService.NotAuthorized(player);
+ return;
+ }
+
+ using (var context = new DatabaseContext())
+ {
+ Entities.Faction f = context.Factions.FirstOrDefault(id => id.Id == factionID);
+ if (f == null)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Diese Fraktion existiert nicht (Liste: ~m~/factionlist).");
+ return;
+ }
+
+ List factionRanks = context.FactionRanks.ToList().FindAll(r => r.FactionId == f.Id).OrderByDescending(o => o.Order).ToList();
+ List rankList = new List();
+
+ factionRanks.ForEach(r =>
+ {
+ rankList.Add(new Rank
+ {
+ Id = r.Id,
+ Name = r.RankName
+ });
+ });
+
+ FactionRankHelper helper = new FactionRankHelper
+ {
+ FactionId = f.Id,
+ Ranks = rankList
+ };
+ string json = JsonConvert.SerializeObject(helper, Formatting.None);
+ Console.WriteLine(json);
+ player.TriggerEvent("manageFactionRanks", json);
+ }
+ }
}
}
diff --git a/Server/Commands/Faction.cs b/Server/Commands/Faction.cs
index ba28a209..e0a58a65 100644
--- a/Server/Commands/Faction.cs
+++ b/Server/Commands/Faction.cs
@@ -4,6 +4,7 @@ using reallife_gamemode.Model;
using reallife_gamemode.Server.Entities;
using reallife_gamemode.Server.Extensions;
using reallife_gamemode.Server.Services;
+using reallife_gamemode.Server.Util;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -29,7 +30,7 @@ namespace reallife_gamemode.Server.Commands
return;
}
- string broadcastMessage = "!{02FCFF}** " + player.Name + ": " + message + " )) **";
+ string broadcastMessage = "!{02FCFF}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + " )) **";
ChatService.BroadcastFaction(broadcastMessage, f);
}
@@ -43,7 +44,7 @@ namespace reallife_gamemode.Server.Commands
return;
}
- string broadcastMessage = "!{33AA33}** " + player.Name + ": " + message + ", over **";
+ string broadcastMessage = "!{33AA33}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **";
ChatService.BroadcastFaction(broadcastMessage, f);
}
@@ -57,30 +58,11 @@ namespace reallife_gamemode.Server.Commands
return;
}
- string broadcastMessage = "!{CC3333}** " + player.Name + ": " + message + ", over **";
+ string broadcastMessage = "!{CC3333}** " + player.GetUser().GetFactionRank().RankName + " " + player.Name + ": " + message + ", over **";
using(var context = new DatabaseContext())
{
ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.StateOwned));
}
}
-
- [Command("managefactionranks")]
- public void CmdFactionManageFactionRanks(Client player)
- {
- Entities.Faction f = player.GetFaction();
- if (f == null)
- {
- ChatService.NotAuthorized(player);
- return;
- }
-
- using(var context = new DatabaseContext())
- {
- List factionRanks = context.FactionRanks.ToList().FindAll(r => r.FactionId == f.Id).OrderByDescending(o => o.Order).ToList();
- string json = JsonConvert.SerializeObject(factionRanks, Formatting.None);
- player.TriggerEvent("manageFactionRanks", json);
- }
- }
-
}
}
diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs
index 7f272321..0c915770 100644
--- a/Server/Entities/User.cs
+++ b/Server/Entities/User.cs
@@ -36,6 +36,8 @@ namespace reallife_gamemode.Server.Entities
public int? FactionId { get; set; }
public Faction Faction { get; set; }
+
+ public bool FactionLeader { get; set; }
public int? FactionRankId { get; set; }
public FactionRank FactionRank { get;set; }
@@ -52,7 +54,21 @@ namespace reallife_gamemode.Server.Entities
{
using (var context = new DatabaseContext())
{
- return context.FactionRanks.FirstOrDefault(fR => fR.Id == FactionRankId);
+ FactionRank toReturn = context.FactionRanks.FirstOrDefault(fR => fR.Id == FactionRankId);
+ if(toReturn == null)
+ {
+ toReturn = context.FactionRanks.OrderBy(f => f.Order).FirstOrDefault(f => f.FactionId == FactionId);
+ }
+
+ if(toReturn == null)
+ {
+ toReturn = new FactionRank
+ {
+ RankName = "Rang-Fehler"
+ };
+ }
+
+ return toReturn;
}
}
diff --git a/Server/Events/Faction.cs b/Server/Events/Faction.cs
new file mode 100644
index 00000000..50eef648
--- /dev/null
+++ b/Server/Events/Faction.cs
@@ -0,0 +1,73 @@
+using GTANetworkAPI;
+using Newtonsoft.Json;
+using reallife_gamemode.Model;
+using reallife_gamemode.Server.Entities;
+using reallife_gamemode.Server.Util;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace reallife_gamemode.Server.Events
+{
+ class Faction : Script
+ {
+ [RemoteEvent("OnFactionRanksEdit")]
+ public void OnFactionRanksEdit(Client player, string jsonData)
+ {
+ Console.WriteLine(jsonData);
+ FactionRankHelper helper = JsonConvert.DeserializeObject(jsonData);
+ using(var context = new DatabaseContext())
+ {
+ Entities.Faction f = context.Factions.FirstOrDefault(x => x.Id == helper.FactionId);
+ if (f == null)
+ {
+ player.SendChatMessage("~r~[FEHLER]~s~ Bei der Bearbeitung der Ränge ist ein Fehler aufgetreten: Die Fraktion existiert nicht.");
+ return;
+ }
+
+ List ranks = helper.Ranks;
+ int length = ranks.Count;
+
+ List factionRanks = context.FactionRanks.ToList().FindAll(fR => fR.FactionId == f.Id);
+
+ List found = new List();
+
+ for(int i = 0; i < ranks.Count; i++)
+ {
+ Rank newRank = ranks[i];
+ if(newRank.Id == 0)
+ {
+ Console.WriteLine("Neuer Rang: " + newRank.Name);
+ context.FactionRanks.Add(new FactionRank
+ {
+ RankName = newRank.Name,
+ FactionId = f.Id,
+ Order = length - i
+ });
+ }
+ else
+ {
+ FactionRank factionRank = factionRanks.Find(r => r.Id == newRank.Id);
+ Console.WriteLine($"Edited Rang: {factionRank.RankName} -> {newRank.Name}");
+ factionRank.RankName = newRank.Name;
+ factionRank.Order = length - i;
+ found.Add(factionRank.Id);
+ }
+ }
+
+ for(int i = 0; i < factionRanks.Count; i++)
+ {
+ if(!found.Contains(factionRanks[i].Id))
+ {
+ Console.WriteLine("removed: " + factionRanks[i].RankName);
+ context.FactionRanks.Remove(factionRanks[i]);
+ }
+ }
+
+ player.SendChatMessage("~g~Die Ränge wurden erfolgreich gespeichert.");
+ context.SaveChanges();
+ }
+ }
+ }
+}
diff --git a/Server/Util/FactionRankHelper.cs b/Server/Util/FactionRankHelper.cs
new file mode 100644
index 00000000..5d457bf7
--- /dev/null
+++ b/Server/Util/FactionRankHelper.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace reallife_gamemode.Server.Util
+{
+ class FactionRankHelper
+ {
+ public int FactionId { get; set; }
+ public List Ranks { get; set; }
+ }
+
+ class Rank
+ {
+ public int Id { get; set; }
+ public string Name { get; set; }
+ }
+}