diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index d25fea1f..71682371 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -42,9 +42,10 @@ export default function (globalData: IGlobalData) { var groupRank = null; - mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, jobDataJson: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => { + mp.events.add("SERVER:InteractionMenu_OpenMenu", (accountDataJson: string, factionleader: string, members: string, jobDataJson: string, faction: string, group: string, factionInvite: boolean, groupInvite: boolean, ticket_boolean: boolean, ticket_amount, house: boolean) => { var accountData: AccountData = JSON.parse(accountDataJson); var jobData: JobData = JSON.parse(jobDataJson); + var memberList: FactionMember[] = JSON.parse(members) //var ticket_amount = JSON.parse(ticket_amountJson); var menu = getInteractionMenu(); @@ -70,12 +71,12 @@ export default function (globalData: IGlobalData) { if (faction && !factionleader) { factionItem.SetRightLabel(faction); menu.AddItem(factionItem); - menu.BindMenuToItem(getFactionMenu(faction, accountData.factionVehicles, accountData.stateFaction, menu), factionItem); + menu.BindMenuToItem(getFactionMenu(faction, accountData.factionVehicles, memberList, accountData.stateFaction, menu), factionItem); } if (faction && factionleader) { factionleaderItem.SetRightLabel(factionleader); menu.AddItem(factionleaderItem); - menu.BindMenuToItem(getFactionLeaderMenu(faction, accountData.factionVehicles, accountData.stateFaction, menu), factionleaderItem); + menu.BindMenuToItem(getFactionLeaderMenu(faction, accountData.factionVehicles, memberList, accountData.stateFaction, menu), factionleaderItem); } menu.AddItem(jobItem); menu.BindMenuToItem(getJobMenu(jobData, menu), jobItem); @@ -304,7 +305,7 @@ export default function (globalData: IGlobalData) { return licenseMenu; } - function getFactionMenu(faction: string, vehData: VehicleData[], stateFaction: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu { + function getFactionMenu(faction: string, vehData: VehicleData[], memberList: FactionMember[], stateFaction: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu { var factionMenu = new NativeUI.Menu("Fraktion", faction, new Point(0, screenRes.y / 3), null, null); factionMenu.Visible = false; @@ -315,13 +316,63 @@ export default function (globalData: IGlobalData) { factionMenu.BindMenuToItem(getVehiclesMenuFaction(vehData, "CLIENT:InteractionMenu_FactionVehicleInteraction", !stateFaction, parentMenu), factionVehicleItem); } + var memberListItem = new UIMenuItem("Mitgliederliste", "Mitgliederliste"); + factionMenu.AddItem(memberListItem); + factionMenu.BindMenuToItem(getMembersMenuFaction(faction, memberList, false, parentMenu),memberListItem); + return factionMenu; } - function getFactionLeaderMenu(faction: string, vehData: VehicleData[], stateFaction: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu { + + function getMembersMenuFaction(faction: string, memberList: FactionMember[], leader: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu { + + var memberListMenu = new NativeUI.Menu(faction, "Mitglieder", new Point(0, screenRes.y / 3), null, null); + memberListMenu.Visible = false; + memberList.forEach(member => { + var memberItem: NativeUI.UIMenuItem; + if (member.isOnline) { + memberItem = new UIMenuItem("~g~ " + member.username, ""); + } else { + if(leader) memberItem = new UIMenuItem("~r~ " + member.username, ""); + } + if (memberItem) { + if (member.isLeader) memberItem.SetLeftBadge(BadgeStyle.Star); + memberItem.SetRightLabel(member.factionRankName); + memberListMenu.AddItem(memberItem); + if (leader) memberListMenu.BindMenuToItem(manageFactionMember(member.username, member.factionRankName, parentMenu), memberItem); + } + }); + + return memberListMenu; + } + + function manageFactionMember(username: string, factionrank: string, parentMenu: NativeUI.Menu): NativeUI.Menu { + + var manageFactionMemberMenu = new NativeUI.Menu(username, factionrank + " " + username, new Point(0, screenRes.y / 3), null, null); + + manageFactionMemberMenu.Visible = false; + + var uninviteItem = new UIMenuItem("Spieler rauswerfen", ""); + manageFactionMemberMenu.AddItem(uninviteItem); + + manageFactionMemberMenu.ItemSelect.on((item) => { + switch (item) { + case uninviteItem: + manageFactionMemberMenu.Visible = false; + mp.gui.chat.activate(true); + globalData.InMenu = false; + mp.events.callRemote("CLIENT:InteractionMenu_Uninvite", "Fraktion", username); + manageFactionMemberMenu.Close(true); + } + }); + + return manageFactionMemberMenu; + } + + function getFactionLeaderMenu(faction: string, vehData: VehicleData[], memberList: FactionMember[], stateFaction: boolean, parentMenu: NativeUI.Menu): NativeUI.Menu { var factionMenu = new NativeUI.Menu("Fraktion", faction, new Point(0, screenRes.y / 3), null, null); factionMenu.AddItem(new UIMenuItem("Spieler einladen")); - factionMenu.AddItem(new UIMenuItem("Spieler rauswerfen")); + //factionMenu.AddItem(new UIMenuItem("Spieler rauswerfen")); factionMenu.Visible = false; mp.gui.chat.show(false); if (vehData.length > 0) { @@ -330,6 +381,10 @@ export default function (globalData: IGlobalData) { factionMenu.BindMenuToItem(getVehiclesMenu(vehData, "CLIENT:InteractionMenu_FactionVehicleInteraction", !stateFaction, parentMenu), factionVehicleItem); } + var memberListItem = new UIMenuItem("Mitgliederliste", "Mitgliederliste"); + factionMenu.AddItem(memberListItem); + factionMenu.BindMenuToItem(getMembersMenuFaction(faction, memberList, true, parentMenu), memberListItem); + factionMenu.ItemSelect.on((item, index) => { if (index === 0) { // Inviten globalData.InMenu = true; @@ -340,7 +395,7 @@ export default function (globalData: IGlobalData) { factionMenu.Close(); globalData.InMenu = false; }); - } else if (index === 1) { // Uninviten + } /*else if (index === 1) { // Uninviten globalData.InMenu == true; var input = new InputHelper("Welchen Spieler möchtest du uninviten (Name / ID)?", globalData); input.show(); @@ -349,7 +404,7 @@ export default function (globalData: IGlobalData) { factionMenu.Close(); globalData.InMenu = false; }); - } + }*/ }); return factionMenu; diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 118dc77c..2242dd17 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -64,6 +64,14 @@ declare type FactionRanks = { ranks: FactionRank[] } +declare type FactionMember = { + username: string; + factionRank: number; + factionRankName: string; + isLeader: boolean; + isOnline: boolean; +} + declare type FactionRank = { } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index ca1b6d59..2ad267b7 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -135,6 +135,7 @@ namespace ReallifeGamemode.Server.Events Price = f.BuyPrice }); + Paycheck paycheck = null; if (Economy.Paychecks.ContainsKey(u.Id)) paycheck = Economy.Paychecks[u.Id]; @@ -169,6 +170,15 @@ namespace ReallifeGamemode.Server.Events wage = u.Wage, }; + var memberList = dbContext.Users.Where(f => f.FactionId == u.FactionId && u.FactionId != 0).OrderByDescending(f => f.FactionRank.Order).ThenBy(f => f.Name).Select(m => new + { + username = m.Name, + factionRank = m.FactionRank.Order, + factionRankName = m.FactionRank.RankName, + isLeader = m.FactionLeader, + isOnline = m.Player.IsLoggedIn(), + }); + string faction = u.Faction?.Name ?? "Zivilist"; string factionleader = u.FactionLeader ? u.Faction.Name : null; string group = u.Group != null ? u.Group.Name : null; @@ -193,8 +203,7 @@ namespace ReallifeGamemode.Server.Events { pay_amount = player.GetData("pay_amount"); } - - player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, JsonConvert.SerializeObject(jobData), faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); + player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, JsonConvert.SerializeObject(memberList), JsonConvert.SerializeObject(jobData), faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house); } [RemoteEvent("keyPress:E")] diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index ce9c081a..8ba7ce71 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -215,16 +215,16 @@ namespace ReallifeGamemode.Server.Managers { if (type != "Fraktion" && type != "Gruppe") return; - Player target = PlayerService.GetPlayerByNameOrId(name); - if (target == null || !target.IsLoggedIn()) + using var dbContext = new DatabaseContext(); + User targetUser = dbContext.Users.FirstOrDefault(u => u.Name == name); + + if (targetUser == null) { ChatService.PlayerNotFound(player); return; } - using var dbContext = new DatabaseContext(); - - User targetUser = target.GetUser(dbContext); + Player targetPlayer = PlayerService.GetPlayerByNameOrId(name); User playerUser = player.GetUser(dbContext); if (type == "Fraktion") @@ -241,7 +241,7 @@ namespace ReallifeGamemode.Server.Managers return; } - if (player.Handle == target.Handle) + if (player.Name == targetUser.Name) { ChatService.ErrorMessage(player, "Du kannst dich nicht selber uninviten"); return; @@ -253,15 +253,19 @@ namespace ReallifeGamemode.Server.Managers return; } - target.SetData("duty", false); - target.TriggerEvent("toggleDutyMode", false); + if (targetPlayer != null) + { + targetPlayer.SetData("duty", false); + targetPlayer.TriggerEvent("toggleDutyMode", false); + UpdateCharacterCloth.LoadCharacterDefaults(targetPlayer); + ChatService.SendMessage(targetPlayer, "!{02FCFF}Du wurdest von " + player.Name + " aus der Fraktion geworfen."); + targetUser.SetBlipAndNametagColor(); + } Medic.UpdateDutyMedics(); - UpdateCharacterCloth.LoadCharacterDefaults(target); - target.GetUser(dbContext).FactionRankId = null; - target.GetUser(dbContext).FactionId = null; - ChatService.SendMessage(player, "!{02FCFF}Du hast " + target.Name + " aus der Fraktion geworfen."); - ChatService.SendMessage(target, "!{02FCFF}Du wurdest von " + player.Name + " aus der Fraktion geworfen."); - targetUser.SetBlipAndNametagColor(); + targetUser.FactionRankId = null; + targetUser.FactionId = null; + ChatService.SendMessage(player, "!{02FCFF}Du hast " + targetUser.Name + " aus der Fraktion geworfen."); + dbContext.SaveChanges(); } else if (type == "Gruppe") @@ -278,7 +282,7 @@ namespace ReallifeGamemode.Server.Managers return; } - if (player.Handle == target.Handle) + if (player.Handle == targetPlayer.Handle) { ChatService.ErrorMessage(player, "Du kannst dich nicht selber uninviten"); return; @@ -293,8 +297,8 @@ namespace ReallifeGamemode.Server.Managers targetUser.Group = null; targetUser.GroupRank = GroupRank.NONE; - ChatService.SendMessage(player, "!{02FCFF}Du hast " + target.Name + " aus der Gruppe geworfen."); - ChatService.SendMessage(target, "!{02FCFF}Du wurdest von " + player.Name + " aus der Gruppe geworfen."); + ChatService.SendMessage(player, "!{02FCFF}Du hast " + targetPlayer.Name + " aus der Gruppe geworfen."); + ChatService.SendMessage(targetPlayer, "!{02FCFF}Du wurdest von " + player.Name + " aus der Gruppe geworfen."); dbContext.SaveChanges(); }