diff --git a/Main.cs b/Main.cs index d4ed1d47..38198a41 100644 --- a/Main.cs +++ b/Main.cs @@ -51,6 +51,7 @@ namespace reallife_gamemode FactionHelper.CheckFactionBankAccounts(); BusinessManager.LoadBusinesses(); InteriorManager.LoadInteriors(); + DoorManager.LoadDoors(); TempBlip tempBlip = new TempBlip() diff --git a/Server/Entities/Door.cs b/Server/Entities/Door.cs index 87dd5a66..3e87810a 100644 --- a/Server/Entities/Door.cs +++ b/Server/Entities/Door.cs @@ -1,8 +1,8 @@ -using System; +using GTANetworkAPI; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using System.Numerics; using System.Text; /** @@ -25,7 +25,10 @@ namespace reallife_gamemode.Server.Entities public float Y { get; set; } public float Z { get; set; } public float Radius { get; set; } - + + [NotMapped] + public Vector3 Position => new Vector3(X, Y, Z); + [ForeignKey("FactionId")] public int? FactionId { get; set; } public Faction Faction { get; set; } diff --git a/Server/Managers/DoorManager.cs b/Server/Managers/DoorManager.cs index 4fe0f3fb..1b51b611 100644 --- a/Server/Managers/DoorManager.cs +++ b/Server/Managers/DoorManager.cs @@ -17,18 +17,34 @@ namespace reallife_gamemode.Server.Managers { public class DoorManager : Script { + private static Dictionary _doorColShapes = new Dictionary(); + + public static void LoadDoors() + { + using (var dbContext = new DatabaseContext()) + { + foreach(Door door in dbContext.Doors) + { + _doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, 30f); + } + } + } + + public static void ReloadDoors() + { + _doorColShapes.Clear(); + LoadDoors(); + } + public static void ChangeDoorState(Client player) { - List NearDoors = new List(); var user = player.GetUser(); - using (var saveDoor = new DatabaseContext()) + using (var dbContext = new DatabaseContext()) { - NearDoors = saveDoor.Doors.ToList().FindAll(d => new Vector3(d.X, d.Y, d.Z).DistanceTo(player.Position) <= d.Radius); + IQueryable NearDoors = dbContext.Doors.Where(d => d.Position.DistanceTo(player.Position) <= d.Radius); foreach (Door d in NearDoors) { - Door currentDoor = saveDoor.Doors.FirstOrDefault(c => c.Id == d.Id); - if(!user.IsAdmin(AdminLevel.ADMIN) && (d.FactionId != user.FactionId || d.FactionId == null)) { string lockState = "~r~Du hast kein Recht diese T\u00fcr " + (d.Locked == true ? "auf" : "ab") + "zuschlie\u00dfen!"; @@ -36,15 +52,31 @@ namespace reallife_gamemode.Server.Managers continue; } - currentDoor.Locked = !currentDoor.Locked; + d.Locked = !d.Locked; string notStr = d.Name + " " + (d.Locked == false ? "~g~auf" : "~r~ab") + "geschlossen"; player.SendNotification(notStr, true); - NAPI.Pools.GetAllPlayers().ForEach(p => p.TriggerEvent("changeDoorState", d.Model, d.X, d.Y, d.Z, (currentDoor.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f)); + NAPI.Pools.GetAllPlayers().ForEach(p => p.TriggerEvent("changeDoorState", d.Model, d.X, d.Y, d.Z, (d.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f)); + } + dbContext.SaveChanges(); + } + } + + [ServerEvent(Event.PlayerEnterColshape)] + public void DoorManagerPlayerEnterColShapeEvent(ColShape colShape, Client player) + { + if(_doorColShapes.ContainsValue(colShape.Handle)) + { + int doorId = _doorColShapes.Where(d => d.Value.Value == colShape.Handle.Value).FirstOrDefault().Key; + NAPI.Util.ConsoleOutput("entered door colshape id = " + doorId); + + using(var dbContext = new DatabaseContext()) + { + Door door = dbContext.Doors.Where(d => d.Id == doorId).First(); + player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f); } - saveDoor.SaveChanges(); } } }