using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using GTANetworkAPI; using Newtonsoft.Json; using ReallifeGamemode.Server.Entities; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Models; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Util; namespace ReallifeGamemode.Server.Managers { class ManagerOfInventory : Script { private static Dictionary TradeItems { get; set; } = new Dictionary(); private static Dictionary TradeTimer { get; set; } = new Dictionary(); private static Dictionary TradeValue { get; set; } = new Dictionary(); public static void GetUserItems(Client client) { User user = client.GetUser(); List ItemId = new List(); List amount = new List(); List vehItemId = new List(); List vehAmount = new List(); using (var context = new DatabaseContext()) { List userItems = context.UserItems.ToList().FindAll(i => i.UserId == user.Id); foreach (var item in userItems) { ItemId.Add(item.ItemId); amount.Add(item.Amount); } foreach(Vehicle veh in NAPI.Pools.GetAllVehicles()) { if(veh.Position.DistanceTo(client.Position) < 1) { if (VehicleStreaming.GetDoorState(veh, DoorID.DoorTrunk) == DoorState.DoorOpen) { ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(veh, context); List vehicleItems = context.VehicleItems.ToList().FindAll(i => i.VehicleId == serverVehicle.Id); foreach (var vehItem in vehicleItems) { vehItemId.Add(vehItem.ItemId); vehAmount.Add(vehItem.Amount); } client.TriggerEvent("vehInventoryShow", ItemId.ToArray(), amount.ToArray(), vehItemId.ToArray(), vehAmount.ToArray(), serverVehicle.Id); return; } ChatService.SendMessage(client, "Kofferraum ist zu nigger!"); break; } } client.TriggerEvent("inventoryShow", ItemId.ToArray(), amount.ToArray()); } } [RemoteEvent("invUseItem")] public void ServerEvent_invUseItem(Client client, int itemId) { User user = client.GetUser(); using (var context = new DatabaseContext()) { UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault(); if (item.Amount > 1) { item.Amount -= 1; } else { context.UserItems.Remove(item); } client.SendNotification("Du hast ~g~" + item.Amount + " ~y~" + InventoryManager.GetItemById(itemId).Name + " ~s~ benutzt.", false); context.SaveChanges(); return; } } [RemoteEvent("saveHelper")] public void ServerEvent_invSaveHelper(Client client, string vehID) { User user = client.GetUser(); int serVehID = JsonConvert.DeserializeObject(vehID); } [RemoteEvent("saveItems")] public void ServerEvent_invSaveItems(Client client, string itemIdArr, string itemAmountArr, string SlotArr) { User user = client.GetUser(); int itemId = JsonConvert.DeserializeObject(itemIdArr); int itemAmount = JsonConvert.DeserializeObject(itemAmountArr); int Slot = JsonConvert.DeserializeObject(SlotArr); using (var context = new DatabaseContext()) { if (Slot < 24) { UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault(); if (item != null) { item.Amount += itemAmount; } else { var newItem = new UserItem { ItemId = itemId, UserId = user.Id, Amount = itemAmount, Slot = -1 }; context.UserItems.Add(newItem); } context.SaveChanges(); } else { foreach (Vehicle veh in NAPI.Pools.GetAllVehicles()) { if (veh.Position.DistanceTo(client.Position) < 1) { if (VehicleStreaming.GetDoorState(veh, DoorID.DoorTrunk) == DoorState.DoorOpen) { ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(veh, context); VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == serverVehicle.Id && v.ItemId == itemId).FirstOrDefault(); if (vehItem != null) { vehItem.Amount = itemAmount; } else { var newItem = new VehicleItem { ItemId = itemId, VehicleId = serverVehicle.Id, Amount = itemAmount, Slot = -1 }; context.VehicleItems.Add(newItem); } context.SaveChanges(); } } } } } } [RemoteEvent("invThrowItem")] public void ServerEvent_invThrowItem(Client client, int itemId, int amount) { User user = client.GetUser(); using (var context = new DatabaseContext()) { UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault(); if (item.Amount > amount) { item.Amount -= amount; client.SendNotification("Du hast ~g~" + amount + " ~y~" + InventoryManager.GetItemById(itemId).Name + " ~s~weggeworfen.", false); } else { client.SendNotification("Du hast ~g~" + item.Amount + " ~y~" + InventoryManager.GetItemById(itemId).Name + " ~s~weggeworfen.", false); context.UserItems.Remove(item); } context.SaveChanges(); return; } } [RemoteEvent("tradeItem")] public void ServerEvent_tradeItem(Client client, int value, string nameOrId, string itemIdArrStr, string itemAmountArrStr) { User user = client.GetUser(); Client target = ClientService.GetClientByNameOrId(nameOrId); if (target == null || !target.IsLoggedIn() || target == client) { ChatService.PlayerNotFound(client); return; } if(client.Position.DistanceTo(target.Position) >= 5) { ChatService.ErrorMessage(client, "Spieler ist zu weit entfernt."); return; } int[] itemIdArr = JsonConvert.DeserializeObject(itemIdArrStr); int[] itemAmountArr = JsonConvert.DeserializeObject(itemAmountArrStr); if (target.HasData("inTrade") && target.GetData("inTrade") == true) { ChatService.SendMessage(client, $"~r~[FEHLER] ~w~{target.Name} befindet sich bereits in einem Handel."); return; } using (var context = new DatabaseContext()) { for (int x = 0; x < itemIdArr.Length; x++) { int itemId = itemIdArr[x]; int itemAmount = itemAmountArr[x]; UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault(); if (item.Amount - itemAmount > 0) { item.Amount -= itemAmount; } else { context.UserItems.Remove(item); } context.SaveChanges(); } } ChatService.SendMessage(client, $"~b~Du hast eine Handelsanfrage an {target.Name} gesendet."); TradeItems[user.Id] = (itemIdArr, itemAmountArr); TradeValue[user.Id] = value; target.SetData("tradePartner", user.Id); target.SetData("trade", client.Name); SendTradeOffer(target,client); } public void SendTradeOffer(Client client, Client sender) { client.SetData("inTrade", true); sender.SetData("inTrade", true); ChatService.SendMessage(client, $"~b~ Du hast eine Handelsanfrage von {sender.Name} bekommen."); ChatService.SendMessage(client, $"~b~ Drücke '~w~X~b~' um die Handelsanfrage zu akzeptieren."); User user = sender.GetUser(); Timer tradeTimer = new Timer(30000); TradeTimer[user.Id] = tradeTimer; tradeTimer.Start(); tradeTimer.Elapsed += (s, e) => { SendBackToSender(sender); client.SetData("inTrade", false); sender.SetData("inTrade", false); }; } public void SendBackToSender(Client client) { User user = client.GetUser(); ChatService.SendMessage(client, "Dein Handelspartner hat die Anfrage nicht angenommen."); (int[] itemIdArr, int[] itemAmountArr) = TradeItems[user.Id]; Timer timer = TradeTimer[user.Id]; timer.Stop(); using (var context = new DatabaseContext()) { for (int x = 0; x < itemIdArr.Length; x++) { int itemId = itemIdArr[x]; int itemAmount = itemAmountArr[x]; UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault(); if (item != null) { item.Amount += itemAmount; } else { var newItem = new UserItem { ItemId = itemId, UserId = user.Id, Amount = itemAmount, Slot = -1 }; context.UserItems.Add(newItem); } context.SaveChanges(); } } } [RemoteEvent("declineTrade")] public void ServerEvent_declineTrade(Client client) { if (!client.GetData("inTrade")) { ChatService.ErrorMessage(client, "Das Handelsangebot ist abgelaufen."); return; } string name = client.GetData("trade"); Client target = ClientService.GetClientByNameOrId(name); if (target == null || !target.IsLoggedIn()) { ChatService.PlayerNotFound(client); return; } client.SetData("inTrade", false); target.SetData("inTrade", false); SendBackToSender(target); } public static void OpenTradeAccept(Client client) { User user = client.GetUser(); int id = client.GetData("tradePartner"); (int[] itemIdArr, int[] itemAmountArr) = TradeItems[id]; Timer tradeTimer = TradeTimer[id]; tradeTimer.Stop(); tradeTimer.Start(); client.TriggerEvent("openTradeWindow", TradeValue[id], itemIdArr, itemAmountArr); } [RemoteEvent("acceptTrade")] public void ServerEvent_AcceptTrade(Client client) { if (!client.GetData("inTrade")) { ChatService.ErrorMessage(client, "Das Handelsangebot ist abgelaufen."); return; } client.SetData("inTrade", false); User user = client.GetUser(); int id = client.GetData("tradePartner"); (int[] itemIdArr, int[] itemAmountArr) = TradeItems[id]; Timer tradeTimer = TradeTimer[id]; tradeTimer.Stop(); string name = client.GetData("trade"); Client target = ClientService.GetClientByNameOrId(name); if (target == null || !target.IsLoggedIn()) { ChatService.PlayerNotFound(client); return; } target.SetData("inTrade", false); ChatService.SendMessage(target, $"{client.Name} hat deine Anfrage angenommen."); using (var context = new DatabaseContext()) { for (int x = 0; x < itemIdArr.Length; x++) { int itemId = itemIdArr[x]; int itemAmount = itemAmountArr[x]; UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault(); if (item != null) { item.Amount += itemAmount; } else { var newItem = new UserItem { ItemId = itemId, UserId = user.Id, Amount = itemAmount, Slot = -1 }; context.UserItems.Add(newItem); } context.SaveChanges(); } } } } }