From d057140c328e961916ad6b74c59c7f28aa211452 Mon Sep 17 00:00:00 2001 From: hydrant Date: Fri, 28 Sep 2018 17:40:29 +0200 Subject: [PATCH] Finished faction system, slightly changed client files --- Client/Dependences/jquery.gettable.js | 1 + Client/FactionManagement/Ranks/index.html | 5 +- Client/FactionManagement/Ranks/script.js | 51 ++++++++------ Client/FactionManagement/Ranks/style.css | 39 +++++++++-- Client/FactionManagement/main.js | 34 ++++++++- Client/Login/login.html | 2 +- Client/Save/jquery-3.3.1.min.js | 2 - Client/Save/save.html | 1 - Server/Commands/Admin.cs | 85 +++++++++++++++++++++++ Server/Commands/Faction.cs | 26 ++----- Server/Entities/User.cs | 18 ++++- Server/Events/Faction.cs | 73 +++++++++++++++++++ Server/Util/FactionRankHelper.cs | 18 +++++ 13 files changed, 299 insertions(+), 56 deletions(-) create mode 100644 Client/Dependences/jquery.gettable.js delete mode 100644 Client/Save/jquery-3.3.1.min.js create mode 100644 Server/Events/Faction.cs create mode 100644 Server/Util/FactionRankHelper.cs 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("IDFraktions-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; } + } +}