diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index 0095bf58..6890b675 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -358,28 +358,60 @@ export default function (globalData: IGlobalData) { var groupMenu = new NativeUI.Menu("Gruppe", group, new Point(0, screenRes.y / 3), null, null); groupMenu.AddItem(new UIMenuItem("Spieler einladen")); groupMenu.AddItem(new UIMenuItem("Spieler rauswerfen")); + groupMenu.AddItem(new UIMenuItem("Mitglieder anzeigen")); + groupMenu.AddItem(new UIMenuItem("Leiter bestimmen")); + groupMenu.AddItem(new UIMenuItem("Gruppe verlassen")); + groupMenu.AddItem(new UIMenuItem("Gruppe löschen")); groupMenu.Visible = false; mp.gui.chat.show(false); groupMenu.ItemSelect.on((item, index) => { - if (index === 0) { // Inviten - globalData.InInput = true; - var input = new InputHelper("Welchen Spieler möchtest du inviten (Name / ID)?", globalData); - input.show(); - input.getValue(name => { - mp.events.callRemote("CLIENT:InteractionMenu_Invite", "Gruppe", name); - parentMenu.Close(); - globalData.InInput = false; - }); - } else if (index === 1) { // Uninviten - globalData.InInput == true; - var input = new InputHelper("Welchen Spieler möchtest du uninviten (Name / ID)?", globalData); - input.show(); - input.getValue(name => { - mp.events.callRemote("CLIENT:InteractionMenu_Uninvite", "Gruppe", name); - parentMenu.Close(); - globalData.InInput = false; - }); + switch (index) { + case 0: //Spieler inviten + globalData.InInput = true; + var input = new InputHelper("Welchen Spieler möchtest du inviten (Name / ID)?", globalData); + input.show(); + input.getValue(name => { + mp.events.callRemote("CLIENT:InteractionMenu_Invite", "Gruppe", name); + parentMenu.Close(); + globalData.InInput = false; + }); + break; + + case 1: //Spieler uninviten + globalData.InInput == true; + var input = new InputHelper("Welchen Spieler möchtest du uninviten (Name / ID)?", globalData); + input.show(); + input.getValue(name => { + mp.events.callRemote("CLIENT:InteractionMenu_Uninvite", "Gruppe", name); + parentMenu.Close(); + globalData.InInput = false; + }); + break; + + case 2: //Gruppenmitglieder anzeigen + mp.events.callRemote("CLIENT:InteractionMenu_MemberList", "Gruppe"); + break; + + case 3: //Neuen (zusätzlichen) Gruppenleiter bestimmen + globalData.InInput = true; + var input = new InputHelper("Welchen Spieler möchtest du zum Leiter ernennen (Name) ? ", globalData); + input.show(); + input.getValue(name => { + mp.events.callRemote("CLIENT:InteractionMenu_MakeLeader", "Gruppe", name); + parentMenu.Close(); + globalData.InInput = false; + }); + break; + + case 4: //Gruppe verlassen (bestimmt zufällig neuen Leiter) + mp.events.callRemote("CLIENT:InteractionMenu_LeaveGroup", "Gruppe"); + break; + + case 5: //Gruppe löschen (als Leiter) + mp.events.callRemote("CLIENT:InteractionMenu_DeleteGroup", "Gruppe"); + break; } + }); return groupMenu; diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 50be05ae..cb060f1d 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -297,7 +297,7 @@ namespace ReallifeGamemode.Server.Managers if (targetUser?.Group.Id != playerUser?.Group.Id) { - ChatService.ErrorMessage(player, "Dieser Spieler ist nicht in deiner Fraktion"); + ChatService.ErrorMessage(player, "Dieser Spieler ist nicht in deiner Gruppe"); return; } @@ -326,7 +326,118 @@ namespace ReallifeGamemode.Server.Managers } } - [RemoteEvent("CLIENT:InteractionMenu_CallService_Taxi")] + [RemoteEvent("CLIENT:InteractionMenu_MemberList")] + public void InteractionMenuGroupMemberList(Player player, string type, string name) + { + + } + + [RemoteEvent("CLIENT:InteractionMenu_MakeLeader")] + public void InteractionMenuGroupMakeLeader(Player player, string type, string name) + { + if (type == "Gruppe") + { + using (var dbContext = new DatabaseContext()) + { + User targetUser = dbContext.Users.FirstOrDefault(u => u.Name == name); + User playerUser = player.GetUser(); + + if (playerUser?.Group == null || playerUser.GroupRank < GroupRank.OWNER) + { + ChatService.NotAuthorized(player); + return; + } + + if (targetUser?.Group.Id != playerUser?.Group.Id) + { + ChatService.ErrorMessage(player, "Dieser Spieler ist nicht in deiner Gruppe"); + return; + } + + if (player.Name == name) + { + ChatService.ErrorMessage(player, "Du bist schon Leader! Was willst du noch?"); + return; + } + + ChatService.BroadcastGroup("~y~" + targetUser.Name + " ~s~ist jetzt neuer Gruppen-Manager.", playerUser.Group); + ChatService.SendMessage(targetUser.Player, "~y~Du bist jetzt Manager deiner Gruppe."); + targetUser.GroupRank = GroupRank.MANAGER; + + dbContext.SaveChanges(); + } + } + } + + [RemoteEvent("CLIENT:InteractionMenu_LeaveGroup")] + public void InteractionMenuGroupLeageGroup(Player player, string type) + { + if (type == "Gruppe") + { + using (var dbContext = new DatabaseContext()) + { + User playerUser = player.GetUser(); + + if (playerUser?.Group == null) + { + ChatService.NotAuthorized(player); + return; + } + + if(dbContext.Users.Count(c => c.Group == playerUser.Group) == 1) + { + InteractionMenuGroupDeleteGroup(player,"Gruppe"); + return; + } + + if(playerUser.GroupRank == GroupRank.OWNER) + { + var memberList = dbContext.Users.ToList().Where(u => u.Group == playerUser.Group && u.GroupRank < GroupRank.OWNER); + var newOwner = dbContext.Users.GroupBy(x => x.GroupRank).Select(g => g.OrderByDescending(x => x.GroupRank).FirstOrDefault()); + + newOwner.FirstOrDefault().GroupRank = GroupRank.OWNER; + ChatService.BroadcastGroup("~y~" + player.Name + "~s~ wurde zum neuen Owner ernannt.", playerUser.Group); + } + ChatService.BroadcastGroup("~y~" + player.Name + "~s~ hat die Gruppe verlassen.",playerUser.Group); + playerUser.Group = null; + playerUser.GroupRank = GroupRank.NONE; + dbContext.SaveChanges(); + } + } + } + + [RemoteEvent("CLIENT:InteractionMenu_DeleteGroup")] + public void InteractionMenuGroupDeleteGroup(Player player, string type) + { + if (type == "Gruppe") + { + using (var dbContext = new DatabaseContext()) + { + User playerUser = player.GetUser(); + + if (playerUser?.Group == null || playerUser.GroupRank < GroupRank.OWNER) + { + ChatService.NotAuthorized(player); + return; + } + + var memberList = dbContext.Users.ToList().Where(u => u.Group == playerUser.Group); + var deletedGroup = dbContext.Groups.FirstOrDefault(g => g.Id == playerUser.Group.Id); + foreach (var user in memberList) + { + var groupName = dbContext.Groups.FirstOrDefault(g => g.Id == playerUser.Group.Id); + user.Group = null; + user.GroupRank = GroupRank.NONE; + ChatService.SendMessage(user.Player, "Die Gruppe ~y~" + groupName + "~s~ wurde aufgelöst"); + } + + dbContext.Remove(deletedGroup); + dbContext.SaveChanges(); + } + } + } + + [RemoteEvent("CLIENT:InteractionMenu_CallService_Taxi")] public void CallServiceTaxi(Player player, string street, string zone) { var taxiJob = JobManager.GetJob();