using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Log; using ReallifeGamemode.Server.Services; namespace ReallifeGamemode.Server.Gangwar { public class Gangwar : Script { private static ILogger logger = LogManager.GetLogger(); public static Turf[] _loadedTurfs; private static List turfs; public const int GANGWAR_TOTAL_TIME = 900; public static void loadTurfs() { _loadedTurfs = null; using (var context = new DatabaseContext()) { turfs = context.Turfs.Select(t => t).ToList(); List turfing = new List(); foreach (var t in turfs) { Turf newTurf = new Turf(t.Id, t.Name, t.Color, t.Owner, t.Value, t.MaxValue, t.Surplus); turfing.Add(newTurf); } _loadedTurfs = turfing.ToArray(); } } public static void loadPlayer(Player client) { client.TriggerEvent("GangAreas:Create", JsonConvert.SerializeObject(turfs.ToArray())); } public static void loadTurfs_ToAllPlayers() { NAPI.ClientEvent.TriggerClientEventForAll("GangAreas:Create", JsonConvert.SerializeObject(turfs.ToArray())); foreach (var l in NAPI.Pools.GetAllPlayers()) { if (l.IsLoggedIn() && l.GetUser()?.FactionLeader == true) { l.TriggerEvent("CLIENT:Turf_LoadLeaderBlip"); } } } public static void GangwarKill(Player killer, Player victim) { var killerInsideTurf = killer.HasData("GotInsideOfTurf"); var victimInsideTurf = victim.HasData("GotInsideOfTurf"); logger.LogDebug($"GangwarKill - Victim {victim.Name} - KillerInsideTurf = {killerInsideTurf}, VictimInsideTurf = {victimInsideTurf}"); if (killerInsideTurf && victimInsideTurf) { logger.LogDebug($"GangwarKill - Victim {victim.Name} - Killer and Victim are in Turf area"); killer.TriggerEvent("gangWarKillNotification", victim.Name); foreach (var turf in getTurfs()) { if (turf.getId() == victim.GetData("inGangWar")) { logger.LogDebug($"GangwarKill - Victim {victim.Name} - Killed in turf id {turf.getId()}"); var victimFactionName = victim.GetUser().Faction.Name; logger.LogDebug($"GangwarKill - Victim {victim.Name} - Faction Name = {victimFactionName}"); turf.setKill(victimFactionName); return; } } } } public static Turf[] getTurfs() { return _loadedTurfs; } [RemoteEvent("Gangarea:Enter")] public void RmtEvent_TurfEnter(Player client, string jsonId) { int id = JsonConvert.DeserializeObject(jsonId); foreach (var turf in getTurfs()) { if (turf.getId() == id) { turf.enter(client); return; } } } [RemoteEvent("Gangarea:Leave")] public void RmtEvent_TurfLeave(Player client, string jsonId) { if (string.IsNullOrEmpty(jsonId)) { return; } int id = JsonConvert.DeserializeObject(jsonId); foreach (var turf in getTurfs()) { if (turf.getId() == id) { turf.leave(client); return; } } } [RemoteEvent("SERVER:SetTurf")] public void RmtEvent_SetTurf(Player client, string jsonX, string jsonY, string jsonRot, string jsonRange, string Name) { float pX = JsonConvert.DeserializeObject(jsonX); float pY = (float)JsonConvert.DeserializeObject(jsonY); float Rot = (float)JsonConvert.DeserializeObject(jsonRot); float Range = (float)JsonConvert.DeserializeObject(jsonRange); var newTurf = new Turfs { Name = Name, X = pX, Y = pY, Rotation = Rot, Range = Range, Owner = "Neutral", Color = 0, Vector = null }; using (var dbContext = new DatabaseContext()) { dbContext.Turfs.Add(newTurf); dbContext.SaveChanges(); } loadTurfs(); //loadTurfs_ToAllPlayers(); } [RemoteEvent("SERVER:DeleteTurf")] public void RmtEvent_DeleteTurf(Player client, string jsonId) { int id = JsonConvert.DeserializeObject(jsonId); if (id == -1) { ChatService.ErrorMessage(client, "Du befindest dich in keinem Gebiet"); return; } using (var dbContext = new DatabaseContext()) { Turfs dturf = dbContext.Turfs.Where(t => t.Id == id).FirstOrDefault(); if (dturf != null) { dbContext.Turfs.Remove(dturf); dbContext.SaveChanges(); loadTurfs(); loadTurfs_ToAllPlayers(); } } } [RemoteEvent("SERVER:Turf_SetNewLeaderPoint")] public void RmtEvent_SetNewLeaderPoint(Player client, string vector, string jsonId) { int id = JsonConvert.DeserializeObject(jsonId); if (id == -1) { ChatService.ErrorMessage(client, "Du befindest dich in keinem Gebiet"); return; } using (var dbContext = new DatabaseContext()) { Turfs dturf = dbContext.Turfs.Where(t => t.Id == id).FirstOrDefault(); if (dturf != null) { dturf.Vector = vector; dbContext.SaveChanges(); loadTurfs(); loadTurfs_ToAllPlayers(); } } } [RemoteEvent("SERVER:StartGangwar")] public void RmtEvent_StartGangwar(Player client) { User user = client.GetUser(); if (user == null || user.Faction == null) { return; } if (!user.FactionLeader) return; foreach (var turf in getTurfs()) { if (turf.status == "attack") { ChatService.ErrorMessage(client, "Du kannst momentan kein Gangwar starten"); return; } } if (user.Faction.GangOwned) { foreach (var turf in getTurfs()) { foreach (var u in turf.playerInside) { if (u == client) { if (turf.Owner != user.Faction.Name) { turf.attack(user.Faction.Name); break; } } } } } } public static void Value_TimerElapsed() { List values = new List(); using (var dbContext = new DatabaseContext()) { foreach (var turf in getTurfs()) { if ((turf.getValue() + 5) >= turf.getMaxValue()) { turf.setValue(turf.getMaxValue()); } else { turf.addValue(5); } values.Add(turf.getValue()); Turfs _turf = dbContext.Turfs.Where(t => t.Id == turf.getId()).FirstOrDefault(); _turf.Value = turf.getValue(); } dbContext.SaveChanges(); } NAPI.Task.Run(() => { NAPI.ClientEvent.TriggerClientEventForAll("CLIENT:UpdateTurfValue", JsonConvert.SerializeObject(values.ToArray())); }); } } }