Added door locked state sync

This commit is contained in:
hydrant
2018-12-26 12:19:49 +01:00
parent 882391265a
commit 0d2eb11390
3 changed files with 47 additions and 11 deletions

View File

@@ -51,6 +51,7 @@ namespace reallife_gamemode
FactionHelper.CheckFactionBankAccounts(); FactionHelper.CheckFactionBankAccounts();
BusinessManager.LoadBusinesses(); BusinessManager.LoadBusinesses();
InteriorManager.LoadInteriors(); InteriorManager.LoadInteriors();
DoorManager.LoadDoors();
TempBlip tempBlip = new TempBlip() TempBlip tempBlip = new TempBlip()

View File

@@ -1,8 +1,8 @@
using System; using GTANetworkAPI;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Numerics;
using System.Text; using System.Text;
/** /**
@@ -25,7 +25,10 @@ namespace reallife_gamemode.Server.Entities
public float Y { get; set; } public float Y { get; set; }
public float Z { get; set; } public float Z { get; set; }
public float Radius { get; set; } public float Radius { get; set; }
[NotMapped]
public Vector3 Position => new Vector3(X, Y, Z);
[ForeignKey("FactionId")] [ForeignKey("FactionId")]
public int? FactionId { get; set; } public int? FactionId { get; set; }
public Faction Faction { get; set; } public Faction Faction { get; set; }

View File

@@ -17,18 +17,34 @@ namespace reallife_gamemode.Server.Managers
{ {
public class DoorManager : Script public class DoorManager : Script
{ {
private static Dictionary<int, NetHandle> _doorColShapes = new Dictionary<int, NetHandle>();
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) public static void ChangeDoorState(Client player)
{ {
List<Door> NearDoors = new List<Door>();
var user = player.GetUser(); 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<Door> NearDoors = dbContext.Doors.Where(d => d.Position.DistanceTo(player.Position) <= d.Radius);
foreach (Door d in NearDoors) 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)) 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!"; 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; continue;
} }
currentDoor.Locked = !currentDoor.Locked; d.Locked = !d.Locked;
string notStr = d.Name + " " + (d.Locked == false ? "~g~auf" : "~r~ab") + "geschlossen"; string notStr = d.Name + " " + (d.Locked == false ? "~g~auf" : "~r~ab") + "geschlossen";
player.SendNotification(notStr, true); 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();
} }
} }
} }