diff --git a/Client/Gui/interiors.js b/Client/Gui/interiors.js new file mode 100644 index 00000000..1eedd52f --- /dev/null +++ b/Client/Gui/interiors.js @@ -0,0 +1,31 @@ +var keyBound = false; +var interiorId = -1; +var enterExit = undefined; + +mp.events.add('InteriorManager_ClearHelpText', () => { + mp.game.ui.clearHelp(true); + + enterExit = undefined; + + if (keyBound) { + mp.keys.unbind(0x45, false, keyPressHandler); + keyBound = false; + } +}); + +mp.events.add('InteriorManager_ShowHelpText', (interior, intId, entEx) => { + mp.game.ui.setTextComponentFormat('STRING'); + mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um ~b~' + interior + ' ~s~zu ' + (entEx === 0 ? 'betreten' : 'verlassen')); + mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1); + + interiorId = intId; + enterExit = entEx; + + mp.keys.bind(0x45, false, keyPressHandler); + keyBound = true; +}); + +function keyPressHandler() { + if (globalData.InChat) return; + mp.events.callRemote('InteriorManager_UseTeleport', interiorId, enterExit); +} \ No newline at end of file diff --git a/Client/Player/keys.js b/Client/Player/keys.js index a5d2f403..33c43546 100644 --- a/Client/Player/keys.js +++ b/Client/Player/keys.js @@ -17,6 +17,7 @@ const player = mp.players.local; mp.keys.bind(0x0D, false, function () { if (chat === true) { chat = false; + globalData.InChat = false; } }); @@ -94,6 +95,7 @@ mp.keys.bind(0x4E, false, function () { mp.keys.bind(0x54, false, function () { if (chat === false && showInv === false) { chat = true; + globalData.InChat = true; } }); diff --git a/Client/index.js b/Client/index.js index 2012f973..422f69ce 100644 --- a/Client/index.js +++ b/Client/index.js @@ -6,7 +6,8 @@ let globalData = { InTuning: false, - HideGui: false + HideGui: false, + InChat: false }; mp.game.gameplay.enableMpDlcMaps(true); @@ -25,6 +26,7 @@ require('./Gui/nametags.js'); require('./Gui/playerlist.js'); require('./Gui/Inventory/inventory.js'); require('./Gui/vehiclemenu/main.js'); +require('./Gui/interiors.js'); require('./Login/main.js'); diff --git a/Main.cs b/Main.cs index ff5c3174..d4ed1d47 100644 --- a/Main.cs +++ b/Main.cs @@ -48,9 +48,9 @@ namespace reallife_gamemode DatabaseHelper.InitDatabaseFirstTime(); - InteriorManager.LoadInteriors(); FactionHelper.CheckFactionBankAccounts(); BusinessManager.LoadBusinesses(); + InteriorManager.LoadInteriors(); TempBlip tempBlip = new TempBlip() diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 274ba4f5..37974de3 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -2111,7 +2111,7 @@ namespace reallife_gamemode.Server.Commands player.TriggerEvent("showTuningMenu"); } - [Command("interior", "~m~Benutzung: ~s~/interior [Add / Remove / SetEnterPosition / SetExitPosition] [Name]")] + [Command("interior", "~m~Benutzung: ~s~/interior [Add / Remove / SetEnterPosition / SetExitPosition] [Name / ID]")] public void CmdAdminInterior(Client player, string option1, string option2) { if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) @@ -2131,11 +2131,6 @@ namespace reallife_gamemode.Server.Commands switch(option1) { case "add": - if(InteriorManager.GetInteriorByName(option2) != null) - { - player.SendChatMessage("~r~[FEHLER]~s~ Dieses Interior existiert schon."); - return; - } using(var dbContext = new DatabaseContext()) { Interior interiorAdd = new Interior @@ -2150,23 +2145,18 @@ namespace reallife_gamemode.Server.Commands case "remove": using (var dbContext = new DatabaseContext()) { - Interior interiorRemove = InteriorManager.GetInteriorByName(option2, dbContext); + if(!int.TryParse(option2, out int intId)) + { + player.SendChatMessage("~r~[FEHLER]~s~ Es muss eine Nummer angegeben werden."); + return; + } + Interior interiorRemove = InteriorManager.GetInteriorById(intId, dbContext); if(interiorRemove == null) { player.SendChatMessage("~r~[FEHLER]~s~ Dieses Interior existiert nicht."); return; } - TextLabel enT = InteriorManager.GetInteriorEnterTextLabel(interiorRemove); - TextLabel exT = InteriorManager.GetInteriorExitTextLabel(interiorRemove); - Marker enM = InteriorManager.GetInteriorEnterMarker(interiorRemove); - Marker exM = InteriorManager.GetInteriorExitMarkers(interiorRemove); - - if (enT != null) enT.Delete(); - if (exT != null) exT.Delete(); - if (enM != null) enM.Delete(); - if (exM != null) exM.Delete(); - InteriorManager.DeleteInterior(interiorRemove); dbContext.Interiors.Remove(interiorRemove); @@ -2177,7 +2167,12 @@ namespace reallife_gamemode.Server.Commands case "setenterposition": using (var dbContext = new DatabaseContext()) { - Interior interior = InteriorManager.GetInteriorByName(option2, dbContext); + if (!int.TryParse(option2, out int intIdEnter)) + { + player.SendChatMessage("~r~[FEHLER]~s~ Es muss eine Nummer angegeben werden."); + return; + } + Interior interior = InteriorManager.GetInteriorById(intIdEnter, dbContext); if (interior == null) { player.SendChatMessage("~r~[FEHLER]~s~ Dieses Interior existiert nicht."); @@ -2185,14 +2180,21 @@ namespace reallife_gamemode.Server.Commands } interior.EnterPosition = player.Position; dbContext.SaveChanges(); + InteriorManager.DeleteInterior(interior); + InteriorManager.LoadInterior(interior); + player.SendChatMessage("~b~[ADMIN]~s~ Die Eingangs-Position vom Interior ~y~" + interior.Name + "~s~ wurde gesetzt."); InteriorManager.LoadInteriors(); } - player.SendChatMessage("~b~[ADMIN]~s~ Die Eingangs-Position vom Interior ~y~" + option2 + "~s~ wurde gesetzt."); break; case "setexitposition": using (var dbContext = new DatabaseContext()) { - Interior interior = InteriorManager.GetInteriorByName(option2, dbContext); + if (!int.TryParse(option2, out int intIdExit)) + { + player.SendChatMessage("~r~[FEHLER]~s~ Es muss eine Nummer angegeben werden."); + return; + } + Interior interior = InteriorManager.GetInteriorById(intIdExit, dbContext); if (interior == null) { player.SendChatMessage("~r~[FEHLER]~s~ Dieses Interior existiert nicht."); @@ -2200,9 +2202,11 @@ namespace reallife_gamemode.Server.Commands } interior.ExitPosition = player.Position; dbContext.SaveChanges(); + InteriorManager.DeleteInterior(interior); + InteriorManager.LoadInterior(interior); + player.SendChatMessage("~b~[ADMIN]~s~ Die Eingangs-Position vom Interior ~y~" + interior.Name + "~s~ wurde gesetzt."); InteriorManager.LoadInteriors(); } - player.SendChatMessage("~b~[ADMIN]~s~ Die Ausgangs-Position vom Interior ~y~" + option2 + "~s~ wurde gesetzt."); break; } } @@ -2297,45 +2301,6 @@ namespace reallife_gamemode.Server.Commands /* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ - //TEST COMMAND - [Command("own")] - public void CmdAdminOwn(Client player) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - - if (player.IsInVehicle) - { - Vehicle playerVehicle = player.Vehicle; - int playerSeat = player.VehicleSeat; - using (var saveVehicle = new DatabaseContext()) - { - var dataSet = new UserVehicle - { - UserId = player.GetUser().Id, - Model = (VehicleHash)playerVehicle.Model, - PositionX = playerVehicle.Position.X, - PositionY = playerVehicle.Position.Y, - PositionZ = playerVehicle.Position.Z, - Heading = playerVehicle.Heading, - NumberPlate = playerVehicle.NumberPlate, - PrimaryColor = playerVehicle.PrimaryColor, - SecondaryColor = playerVehicle.SecondaryColor, - Locked = playerVehicle.Locked, - Active = true - }; - saveVehicle.UserVehicles.Add(dataSet); - saveVehicle.SaveChanges(); - - player.SetIntoVehicle(dataSet.Spawn(playerVehicle), -1); - } - } - else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); - } - //TEST COMMAND [Command("myvehicles")] public void CmdAdminMyVehicles(Client player) @@ -2383,37 +2348,6 @@ namespace reallife_gamemode.Server.Commands } } - //TODO Ausführen bei Tastendruck wenn in Fahrzeug. - [Command("buyv")] - public void BuyShopVehicle(Client player) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - - if (player.IsInVehicle) - { - if (player.Vehicle.HasData("shopVehicleId")) - { - int shopVehicleId = player.Vehicle.GetData("shopVehicleId"); - using (var getShopVehicle = new DatabaseContext()) - { - ShopVehicle sVehicle = getShopVehicle.ShopVehicles.FirstOrDefault(u => u.Id == shopVehicleId); - Entities.Faction receiverUser = getShopVehicle.Factions.FirstOrDefault(u => u.Name == "LSPD"); - BankManager.TransferMoney(player.GetUser(), receiverUser, sVehicle.Price, "Fahrzeug gekauft: " + NAPI.Vehicle.GetVehicleDisplayName(sVehicle.Model)); - //TODO Anpassen - Vehicle boughtVehicle = NAPI.Vehicle.CreateVehicle(sVehicle.Model, new Vector3(sVehicle.PositionX, sVehicle.PositionY + 10, sVehicle.PositionZ + 0.5), sVehicle.Heading, - sVehicle.PrimaryColor, sVehicle.SecondaryColor, "LoG", 255, false, true, 0); - player.SetIntoVehicle(boughtVehicle, 0); - //TODO fügt das Fahrzeug als Userfahrzeug hinzu - CmdAdminOwn(player); - } - } - } - } - [Command("saveall")] public void SaveAll(Client player) { diff --git a/Server/Managers/InteriorManager.cs b/Server/Managers/InteriorManager.cs index b6443009..acc902ef 100644 --- a/Server/Managers/InteriorManager.cs +++ b/Server/Managers/InteriorManager.cs @@ -8,12 +8,14 @@ using System.Text; namespace reallife_gamemode.Server.Managers { - public class InteriorManager + public class InteriorManager : Script { public static Dictionary _interiorEnterTextLabels = new Dictionary(); public static Dictionary _interiorExitTextLabels = new Dictionary(); public static Dictionary _interiorEnterMarkers = new Dictionary(); public static Dictionary _interiorExitMarkers = new Dictionary(); + public static Dictionary _interiorEnterColShapes = new Dictionary(); + public static Dictionary _interiorExitColShapes = new Dictionary(); public static Interior GetInteriorByName(string name, DatabaseContext dbContext = null) { @@ -30,50 +32,116 @@ namespace reallife_gamemode.Server.Managers } } + public static Interior GetInteriorById(int id, DatabaseContext dbContext = null) + { + if (dbContext == null) + { + using (dbContext = new DatabaseContext()) + { + return dbContext.Interiors.Where(i => i.Id == id).FirstOrDefault(); + } + } + else + { + return dbContext.Interiors.Where(i => i.Id == id).FirstOrDefault(); + } + } + public static void LoadInteriors() { using (var dbContext = new DatabaseContext()) { foreach (Interior interior in dbContext.Interiors) { - TextLabel enT = GetInteriorEnterTextLabel(interior); - TextLabel exT = GetInteriorExitTextLabel(interior); - Marker enM = GetInteriorEnterMarker(interior); - Marker exM = GetInteriorExitMarkers(interior); - - if (enT != null) enT.Delete(); - if (exT != null) exT.Delete(); - if (enM != null) enM.Delete(); - if (exM != null) exM.Delete(); - if (interior.EnterPosition != null) - { - NAPI.Util.ConsoleOutput("enterposition not null"); - _interiorEnterTextLabels[interior.Id] = NAPI.TextLabel.CreateTextLabel("~y~" + interior.Name + "\n~s~Eingang", interior.EnterPosition, 10f, 1f, 0, new Color(255, 255, 255)); - _interiorEnterMarkers[interior.Id] = NAPI.Marker.CreateMarker(MarkerType.VerticalCylinder, interior.EnterPosition.Subtract(new Vector3(0, 0, 1.5)), new Vector3(), new Vector3(), 1.0f, new Color(255, 255, 255)); - } - - if(interior.ExitPosition != null) - { - NAPI.Util.ConsoleOutput("exitposition not null"); - _interiorExitTextLabels[interior.Id] = NAPI.TextLabel.CreateTextLabel("~y~" + interior.Name + "\n~s~Ausgang", interior.ExitPosition, 10f, 1f, 0, new Color(255, 255, 255)); - _interiorExitMarkers[interior.Id] = NAPI.Marker.CreateMarker(MarkerType.VerticalCylinder, interior.ExitPosition.Subtract(new Vector3(0, 0, 1.5)), new Vector3(), new Vector3(), 1.0f, new Color(255, 255, 255)); - } + LoadInterior(interior); } - dbContext.SaveChanges(); + } + } + + public static void LoadInterior(Interior interior) + { + if (interior.EnterPosition != null) + { + _interiorEnterTextLabels[interior.Id] = NAPI.TextLabel.CreateTextLabel("~y~" + interior.Name + "\n~s~Eingang", interior.EnterPosition, 10f, 1f, 0, new Color(255, 255, 255)); + _interiorEnterMarkers[interior.Id] = NAPI.Marker.CreateMarker(MarkerType.VerticalCylinder, interior.EnterPosition.Subtract(new Vector3(0, 0, 1.7)), new Vector3(), new Vector3(), 2.0f, new Color(255, 255, 255, 100)); + _interiorEnterColShapes[interior.Id] = NAPI.ColShape.CreateSphereColShape(interior.EnterPosition, 1.5f); + } + + if (interior.ExitPosition != null) + { + _interiorExitTextLabels[interior.Id] = NAPI.TextLabel.CreateTextLabel("~y~" + interior.Name + "\n~s~Ausgang", interior.ExitPosition, 10f, 1f, 0, new Color(255, 255, 255)); + _interiorExitMarkers[interior.Id] = NAPI.Marker.CreateMarker(MarkerType.VerticalCylinder, interior.ExitPosition.Subtract(new Vector3(0, 0, 1.7)), new Vector3(), new Vector3(), 1.6f, new Color(255, 255, 255, 100)); + _interiorExitColShapes[interior.Id] = NAPI.ColShape.CreateSphereColShape(interior.ExitPosition, 1.3f); } } public static void DeleteInterior(Interior interior) { + TextLabel enT = GetInteriorEnterTextLabel(interior); + TextLabel exT = GetInteriorExitTextLabel(interior); + Marker enM = GetInteriorEnterMarker(interior); + Marker exM = GetInteriorExitMarkers(interior); + ColShape enC = GetInteriorEnterColShape(interior); + ColShape exC = GetInteriorExitColShape(interior); + + if (enT != null) enT.Delete(); + if (exT != null) exT.Delete(); + if (enM != null) enM.Delete(); + if (exM != null) exM.Delete(); + if (enC != null) enC.Delete(); + if (exC != null) exC.Delete(); + _interiorEnterTextLabels.Remove(interior.Id); _interiorExitTextLabels.Remove(interior.Id); _interiorEnterMarkers.Remove(interior.Id); _interiorExitMarkers.Remove(interior.Id); + _interiorEnterColShapes.Remove(interior.Id); + _interiorExitColShapes.Remove(interior.Id); } public static TextLabel GetInteriorEnterTextLabel(Interior interior) => NAPI.Pools.GetAllTextLabels().Find(t => t.Handle.Value == _interiorEnterTextLabels.FirstOrDefault(x => x.Key == interior.Id).Value.Value); public static TextLabel GetInteriorExitTextLabel(Interior interior) => NAPI.Pools.GetAllTextLabels().Find(t => t.Handle.Value == _interiorExitTextLabels.FirstOrDefault(x => x.Key == interior.Id).Value.Value); + public static Marker GetInteriorEnterMarker(Interior interior) => NAPI.Pools.GetAllMarkers().Find(t => t.Handle.Value == _interiorEnterMarkers.FirstOrDefault(x => x.Key == interior.Id).Value.Value); public static Marker GetInteriorExitMarkers(Interior interior) => NAPI.Pools.GetAllMarkers().Find(t => t.Handle.Value == _interiorExitMarkers.FirstOrDefault(x => x.Key == interior.Id).Value.Value); + + public static ColShape GetInteriorEnterColShape(Interior interior) => NAPI.Pools.GetAllColShapes().Find(t => t.Handle.Value == _interiorEnterColShapes.FirstOrDefault(x => x.Key == interior.Id).Value.Value); + public static ColShape GetInteriorExitColShape(Interior interior) => NAPI.Pools.GetAllColShapes().Find(t => t.Handle.Value == _interiorExitColShapes.FirstOrDefault(x => x.Key == interior.Id).Value.Value); + + public static int GetInteriorIdFromEnterColShape(NetHandle handle) => _interiorEnterColShapes.FirstOrDefault(c => c.Value.Value == handle.Value).Key; + public static int GetInteriorIdFromExitColShape(NetHandle handle) => _interiorExitColShapes.FirstOrDefault(c => c.Value.Value == handle.Value).Key; + + [ServerEvent(Event.PlayerEnterColshape)] + public void InteriorManagerPlayerEnterColshapeEvent(ColShape colShape, Client player) + { + int enterId = GetInteriorIdFromEnterColShape(colShape); + int exitId = GetInteriorIdFromExitColShape(colShape); + if(enterId != 0) + { + Interior interior = GetInteriorById(enterId); + player.TriggerEvent("InteriorManager_ShowHelpText", interior.Name, interior.Id, 0); + } + else if(exitId != 0) + { + Interior interior = GetInteriorById(exitId); + player.TriggerEvent("InteriorManager_ShowHelpText", interior.Name, interior.Id, 1); + } + } + + [ServerEvent(Event.PlayerExitColshape)] + public void InteriorManagerPlayerExitColshapeEvent(ColShape colShape, Client player) + { + if(GetInteriorIdFromEnterColShape(colShape) != 0 || GetInteriorIdFromExitColShape(colShape) != 0) + { + player.TriggerEvent("InteriorManager_ClearHelpText"); + } + } + + [RemoteEvent("InteriorManager_UseTeleport")] + public void InteriorManagerUseTeleportEvent(Client player, int id, int enterExit) + { + Interior interior = GetInteriorById(id); + player.Position = enterExit == 0 ? interior.ExitPosition : interior.EnterPosition; + } } }