[+] Improved Inventory System based on old Inventory Manager and new GUI. (test version)

This commit is contained in:
Lukas Moungos
2019-09-12 21:40:27 +02:00
parent df82f8f291
commit deb6b7092e
60 changed files with 2856 additions and 2813 deletions

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace ReallifeGamemode.Server.Entities
{
public class VehicleInventory
{
public int ID;
public int currentWeight;
public int totalWeight;
public string[] ivehName;
public int[] ivehAmount;
public int[] ivehId;
}
}

View File

@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GTANetworkAPI;
using ReallifeGamemode.Server.Entities;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Inventory.Interfaces;
using ReallifeGamemode.Server.Managers;
using ReallifeGamemode.Server.Models;
using ReallifeGamemode.Server.Util;
namespace ReallifeGamemode.Server.Events
{
public class Inventory : Script
{
[RemoteEvent("getNearVehicles")]
public void SrvEvent_GetNearVehicles(Client client)
{
var user = client.GetUser();
var inventoryWeight = 0;
List<VehicleInventory> vehicleInventory = new List<VehicleInventory>();
if (!client.IsInVehicle)
{
using (var context = new DatabaseContext())
{
foreach (Vehicle veh in NAPI.Pools.GetAllVehicles())
{
List<string> iName = new List<string>();
List<int> iAmount = new List<int>();
List<int> iId = new List<int>();
inventoryWeight = 0;
int vehID = 0;
if (veh.Position.DistanceTo(client.Position) < 2)
{
if (VehicleStreaming.GetDoorState(veh, DoorID.DoorTrunk) == DoorState.DoorOpen)
{
ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(veh, context);
List<VehicleItem> vehicleItems = context.VehicleItems.ToList().FindAll(i => i.VehicleId == serverVehicle.Id);
foreach (var vehItem in vehicleItems)
{
IItem iItem = InventoryManager.GetItemById(vehItem.ItemId);
var currentItemWeight = iItem.Gewicht * vehItem.Amount;
inventoryWeight += currentItemWeight;
iName.Add(iItem.Name);
iAmount.Add(vehItem.Amount);
iId.Add(iItem.Id);
vehID = vehItem.VehicleId;
}
var vehInv = new VehicleInventory
{
ID = vehID,
currentWeight = inventoryWeight,
totalWeight = 250,
ivehName = iName.ToArray(),
ivehAmount = iAmount.ToArray(),
ivehId = iId.ToArray()
};
vehicleInventory.Add(vehInv);
}
}
}
}
client.TriggerEvent("setVehiclesInventory", vehicleInventory.ToArray());
}
}
}
}

View File

@@ -134,6 +134,8 @@ namespace ReallifeGamemode.Server.Events
{
if (!player.IsLoggedIn()) return;
var user = player.GetUser();
if (user?.FactionId != null)
{
DutyPoint nearestDuty = PositionManager.DutyPoints.Find(d => d.Position.DistanceTo(player.Position) <= 1.5 && d.FactionId == user.FactionId);
@@ -294,7 +296,7 @@ namespace ReallifeGamemode.Server.Events
public void KeyPressI(Client player)
{
if (!player.IsLoggedIn()) return;
ManagerOfInventory.GetUserItems(player);
InventoryManager.GetUserItems(player);
}
[RemoteEvent("keyPress:O")]
@@ -384,10 +386,9 @@ namespace ReallifeGamemode.Server.Events
{
if (!player.IsLoggedIn()) return;
if (player.HasData("inTrade") && player.GetData("inTrade") == true)
if (!player.IsInVehicle)
{
ManagerOfInventory.OpenTradeAccept(player);
return;
GroundItem.PickUpGroundItem(player);
}
if (player.IsInVehicle && player.VehicleSeat == -1)

View File

@@ -108,3 +108,4 @@ namespace ReallifeGamemode.Server.Inventory
}
}
}

View File

@@ -14,8 +14,8 @@ namespace ReallifeGamemode.Server.Inventory.Items
public class Aal : DropItem
{
public override int Id => 6;
public override string Name => "Kraftstoff";
public override string Description => "Der Stoff gibt dir Kraft.";
public override string Name => "Aal";
public override string Description => "Ein Fisch";
public override int Gewicht => 3600;
public override string Einheit => "g";
public override int HpAmount => 20;

View File

@@ -14,8 +14,8 @@ namespace ReallifeGamemode.Server.Inventory.Items
public class Barsch : DropItem
{
public override int Id => 7;
public override string Name => "Kraftstoff";
public override string Description => "Der Stoff gibt dir Kraft.";
public override string Name => "Barsch";
public override string Description => "Ein Fisch";
public override int Gewicht => 2600;
public override string Einheit => "g";
public override int HpAmount => 20;

View File

@@ -18,6 +18,6 @@ namespace ReallifeGamemode.Server.Inventory.Items
public string Description => "puff puff and pass";
public int Gewicht => 50;
public string Einheit => "g";
public uint Object => 1805779401;
public uint Object => 3076948544;
}
}

View File

@@ -11,11 +11,11 @@ using System.Text;
namespace ReallifeGamemode.Server.Inventory.Items
{
public class Kraftstoff : DropItem
public class Flunder : DropItem
{
public override int Id => 5;
public override string Name => "Flunder";
public override string Description => "ja";
public override string Description => "Ein Fisch";
public override int Gewicht => 7700;
public override string Einheit => "g";
public override int HpAmount => 20;

View File

@@ -14,8 +14,8 @@ namespace ReallifeGamemode.Server.Inventory.Items
public class Lachs : DropItem
{
public override int Id => 8;
public override string Name => "Kraftstoff";
public override string Description => "Der Stoff gibt dir Kraft.";
public override string Name => "Lachs";
public override string Description => "Du Lachs";
public override int Gewicht => 4200;
public override string Einheit => "g";
public override int HpAmount => 20;

View File

@@ -14,8 +14,8 @@ namespace ReallifeGamemode.Server.Inventory.Items
public class Thunfisch : DropItem
{
public override int Id => 9;
public override string Name => "Kraftstoff";
public override string Description => "Der Stoff gibt dir Kraft.";
public override string Name => "Thunfisch";
public override string Description => "Ein Fisch";
public override int Gewicht => 11000;
public override string Einheit => "g";
public override int HpAmount => 20;

View File

@@ -14,8 +14,8 @@ namespace ReallifeGamemode.Server.Inventory.Items
public class Zander : DropItem
{
public override int Id => 10;
public override string Name => "Kraftstoff";
public override string Description => "Der Stoff gibt dir Kraft.";
public override string Name => "Zander";
public override string Description => "Ein Fisch";
public override int Gewicht => 5000;
public override string Einheit => "g";
public override int HpAmount => 20;

View File

@@ -6,7 +6,9 @@ using ReallifeGamemode.Server.Inventory;
using ReallifeGamemode.Server.Inventory.Interfaces;
using ReallifeGamemode.Server.Models;
using ReallifeGamemode.Server.Services;
using ReallifeGamemode.Server.Util;
using System;
using System.Timers;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -23,6 +25,11 @@ namespace ReallifeGamemode.Server.Managers
{
public static List<IItem> itemList;
private static Dictionary<int, (int[], int[])> TradeItems { get; set; } = new Dictionary<int, (int[], int[])>();
private static Dictionary<int, Timer> TradeTimer { get; set; } = new Dictionary<int, Timer>();
private static Dictionary<int, int> TradeValue { get; set; } = new Dictionary<int, int>();
public static void LoadItems()
{
itemList = new List<IItem>();
@@ -77,26 +84,36 @@ namespace ReallifeGamemode.Server.Managers
{
var user = player.GetUser();
var inventoryWeight = 0;
List<string> iName = new List<string>();
List<int> iAmount = new List<int>();
List<int> iId = new List<int>();
List<int> iWeight = new List<int>();
using (var context = new DatabaseContext())
{
List<UserItem> userItems = context.UserItems.ToList().FindAll(i => i.UserId == user.Id);
string[][] items = new string[userItems.Count][];
foreach (var item in userItems)
{
IItem iItem = GetItemById(item.ItemId);
var currentItemWeight = iItem.Gewicht * item.Amount;
inventoryWeight += currentItemWeight;
items[userItems.IndexOf(item)] = new string[6];
items[userItems.IndexOf(item)][0] = iItem.Name;
items[userItems.IndexOf(item)][1] = iItem.Description;
items[userItems.IndexOf(item)][2] = iItem.Gewicht.ToString();
items[userItems.IndexOf(item)][3] = item.Amount.ToString();
items[userItems.IndexOf(item)][4] = item.Slot.ToString();
items[userItems.IndexOf(item)][5] = item.Id.ToString();
iName.Add(iItem.Name);
iAmount.Add(item.Amount);
iId.Add(iItem.Id);
}
player.TriggerEvent("showInventory", inventoryWeight, items);
List<Client> targetList = NAPI.Player.GetPlayersInRadiusOfPlayer(2, player);
List<string> username = new List<string>();
foreach (var target in targetList)
{
User cl = target.GetUser();
username.Add(cl.Name);
}
player.TriggerEvent("inventoryShow", inventoryWeight, iName.ToArray(), iAmount.ToArray(), iId.ToArray(), username.ToArray());
}
}
@@ -155,43 +172,199 @@ namespace ReallifeGamemode.Server.Managers
}
}
[RemoteEvent("saveInventory")]
public void SavePlayerInventory(Client player, string itemArray)
public bool CheckOriginOfItem(Client client, string jsonItemID, string jsonItemAmount, string jsonOrigin, string jsonVehAmount)
{
var origin = JsonConvert.DeserializeObject<int[]>(jsonOrigin);
var itemID = JsonConvert.DeserializeObject<int>(jsonItemID);
var itemAmount = JsonConvert.DeserializeObject<int>(jsonItemAmount);
var vehAmount = JsonConvert.DeserializeObject<int>(jsonVehAmount);
var user = client.GetUser();
using (var context = new DatabaseContext())
{
if (origin[0] == 1)
{
foreach (Vehicle veh in NAPI.Pools.GetAllVehicles())
{
if (veh.Position.DistanceTo(client.Position) < 2)
{
if (VehicleStreaming.GetDoorState(veh, DoorID.DoorTrunk) == DoorState.DoorOpen)
{
var user = player.GetUser();
var items = JsonConvert.DeserializeObject<string[][]>(itemArray);
UserItem vItem = new UserItem
{
Amount = vehAmount,
ItemId = itemID,
UserId = user.Id,
Slot = -1
};
ServerVehicle serverVehicle = VehicleManager.GetServerVehicleFromVehicle(veh, context);
VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == origin[1] && v.ItemId == vItem.ItemId).FirstOrDefault();
if (vehItem != null)
{
if (itemAmount < vehItem.Amount)
{
UserItem uItem = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == vItem.ItemId).FirstOrDefault();
if (uItem == null)
{
context.Add(vItem);
}
else
{
uItem.Amount += vItem.Amount;
}
context.SaveChanges();
return true;
}
else if (itemAmount == vehItem.Amount)
{
UserItem uItem = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == vItem.ItemId).FirstOrDefault();
if (uItem == null)
{
context.Add(vItem);
}
else
{
uItem.Amount += vItem.Amount;
}
context.SaveChanges();
return true;
}
return false;
}
}
}
}
}
else if (origin[0] == 0)
{
VehicleItem cItem = new VehicleItem
{
Amount = vehAmount,
ItemId = itemID,
VehicleId = origin[1],
Slot = -1,
};
UserItem uItem = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == cItem.ItemId).FirstOrDefault();
if (uItem != null)
{
if (vehAmount < uItem.Amount)
{
VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == cItem.VehicleId && v.ItemId == cItem.ItemId).FirstOrDefault();
if (vehItem == null)
{
context.Add(cItem);
}
else
{
vehItem.Amount += cItem.Amount;
}
context.SaveChanges();
return true;
}
else if (vehAmount == uItem.Amount)
{
VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == cItem.VehicleId && v.ItemId == cItem.ItemId).FirstOrDefault();
if (vehItem == null)
{
context.Add(cItem);
}
else
{
vehItem.Amount += cItem.Amount;
}
context.SaveChanges();
return true;
}
return false;
}
}
return false;
}
}
[RemoteEvent("saveVehicleInventory")]
public void SaveVehicleInventory(Client player, string jsonItemID, string jsonItemAmount, string jsonGotFrom, string vehAmount)
{
var itemID = JsonConvert.DeserializeObject<int>(jsonItemID);
var itemAmount = JsonConvert.DeserializeObject<int>(jsonItemAmount);
var origin = JsonConvert.DeserializeObject<int[]>(jsonGotFrom);
if (!CheckOriginOfItem(player, jsonItemID, jsonItemAmount, jsonGotFrom, vehAmount))
return;
using (var context = new DatabaseContext())
{
for (var i = 0; i < items.Length; i++)
VehicleItem vItem = new VehicleItem
{
Amount = itemAmount,
ItemId = itemID,
VehicleId = origin[1],
Slot = -1
};
VehicleItem vehItem = context.VehicleItems.Where(v => v.VehicleId == vItem.VehicleId && v.ItemId == vItem.ItemId).FirstOrDefault();
if (vehItem == null)
{
context.VehicleItems.Add(vItem);
}
else if (vItem.Amount <= 0)
{
context.VehicleItems.Remove(vehItem);
}
else
{
vehItem.Amount = vItem.Amount;
}
context.SaveChanges();
}
}
[RemoteEvent("saveInventory")]
public void SavePlayerInventory(Client player, string jsonItemID,string jsonItemAmount, string jsonGotFrom, string vehAmount)
{
var user = player.GetUser();
var itemID = JsonConvert.DeserializeObject<int>(jsonItemID);
var itemAmount = JsonConvert.DeserializeObject<int>(jsonItemAmount);
if (!CheckOriginOfItem(player,jsonItemID, jsonItemAmount,jsonGotFrom, vehAmount))
return;
using (var context = new DatabaseContext())
{
UserItem cItem = new UserItem
{
Amount = int.Parse(items[i][3]),
ItemId = GetItemByName(items[i][0]).Id,
Amount = itemAmount,
ItemId = itemID,
UserId = user.Id,
Slot = int.Parse(items[i][4]),
Slot = -1,
};
if (int.Parse(items[i][5]) == -1)
UserItem item = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == cItem.ItemId).FirstOrDefault();
if (item == null)
{
context.UserItems.Add(cItem);
}
else if (cItem.Slot == -1)
{
UserItem fItem = context.UserItems.FirstOrDefault(j => j.Id == int.Parse(items[i][5]));
context.UserItems.Remove(fItem);
else if (cItem.Amount <= 0)
{
context.UserItems.Remove(item);
}
else
{
UserItem fItem = context.UserItems.FirstOrDefault(j => j.Id == int.Parse(items[i][5]));
fItem.Amount = cItem.Amount;
fItem.Slot = cItem.Slot;
item.Amount = cItem.Amount;
}
}
context.SaveChanges();
player.TriggerEvent("SERVER:INVENTORY_SYNC");
}
}
@@ -230,7 +403,7 @@ namespace ReallifeGamemode.Server.Managers
}
[RemoteEvent("removeItemAsAdmin")]
public void SavePlayerInventory(Client player, string amount, string userItemId, string targetPlayerName)
public void RemoveAsAdminInventory(Client player, string amount, string userItemId, string targetPlayerName)
{
using (var context = new DatabaseContext())
{
@@ -253,12 +426,20 @@ namespace ReallifeGamemode.Server.Managers
context.SaveChanges();
}
}
[RemoteEvent("itemInteract")]
public void ItemInteract(Client player, string type, string itemId, int amount)
public void ItemInteract(Client player, string jsonType, string jsonItemId, string jsonAmount)
{
int amount = JsonConvert.DeserializeObject<int>(jsonAmount);
int itemId = JsonConvert.DeserializeObject<int>(jsonItemId);
string type = JsonConvert.DeserializeObject<string>(jsonType);
User user = player.GetUser();
using (var context = new DatabaseContext())
{
UserItem fItem = context.UserItems.FirstOrDefault(j => j.Id == int.Parse(itemId));
UserItem fItem = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault();
IItem iItem = GetItemById(fItem.ItemId);
switch (type)
@@ -282,7 +463,7 @@ namespace ReallifeGamemode.Server.Managers
usableItemObj.Use(fItem);
player.TriggerEvent("removeItem", itemId, amount);
}
else ChatService.SendMessage(player, "not useable");
else ChatService.SendMessage(player, "Du kannst dieses Item nicht benutzen.");
break;
case "drop":
@@ -308,13 +489,246 @@ namespace ReallifeGamemode.Server.Managers
GroundItem grndItem = new GroundItem { ItemId = iItem.Id, Amount = amount, Position = dropPosition };
TextLabel grndTxtLbl = NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", dropPosition, 5, 0.5f, 4, new Color(255, 255, 255), false, 0);
GroundItem.AddGroundItem(grndItem, grndObject, grndTxtLbl);
fItem.Amount -= amount;
player.TriggerEvent("removeItem", itemId, amount);
if(fItem.Amount > amount)
{
fItem.Amount -= amount;
}else if(fItem.Amount == amount)
{
context.UserItems.Remove(fItem);
}
}
break;
}
context.SaveChanges();
}
}
[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<int[]>(itemIdArrStr);
int[] itemAmountArr = JsonConvert.DeserializeObject<int[]>(itemAmountArrStr);
List<string> itemNameList = new List<string>();
if (target.HasData("inTrade") && target.GetData("inTrade") == true)
{
ChatService.SendMessage(client, $"~r~[FEHLER] ~w~{target.Name} befindet sich bereits in einem Handel.");
return;
}
int inventoryWeight = 0;
using (var context = new DatabaseContext())
{
int targetInvWeight = GetUserInventoryWeight(target);
for (int i = 0; i < itemIdArr.Length; i++)
{
int itemId = itemIdArr[i];
int itemAmount = itemAmountArr[i];
UserItem uitem = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault();
IItem iItem = GetItemById(uitem.ItemId);
var currentItemWeight = iItem.Gewicht * itemAmount;
inventoryWeight += currentItemWeight;
}
if (((targetInvWeight + inventoryWeight) / 1000) > 40)
{
ChatService.ErrorMessage(client, "Handel kann nicht getätigt werden.");
return;
}
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);
}
IItem iItem = GetItemById(itemId);
itemNameList.Add(iItem.Name);
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);
target.TriggerEvent("addTradeItems", itemIdArr, itemAmountArr, itemNameList.ToArray(), inventoryWeight);
}
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.");
client.SetSharedData("tradeOffer", 1);
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); client.SetSharedData("tradeOffer", 0); };
}
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)
{
client.SetSharedData("tradeOffer", 0);
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.SetSharedData("tradeOffer", 0);
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);
using (var context = new DatabaseContext())
{
int targetInvWeight = GetUserInventoryWeight(client);
int inventoryWeight = 0;
for (int i = 0; i < itemIdArr.Length; i++)
{
int itemId = itemIdArr[i];
int itemAmount = itemAmountArr[i];
UserItem uitem = context.UserItems.Where(u => u.UserId == user.Id && u.ItemId == itemId).FirstOrDefault();
IItem iItem = GetItemById(uitem.ItemId);
var currentItemWeight = iItem.Gewicht * itemAmount;
inventoryWeight += currentItemWeight;
}
if (((targetInvWeight + inventoryWeight) / 1000) > 40)
{
ChatService.ErrorMessage(client, "Handel kann nicht getätigt werden.");
return;
}
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();
}
}
ChatService.SendMessage(target, $"{client.Name} hat deine Anfrage angenommen.");
}
}
}

View File

@@ -1,368 +0,0 @@
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<int, (int[],int[])> TradeItems { get; set; } = new Dictionary<int, (int[], int[])>();
private static Dictionary<int, Timer> TradeTimer { get; set; } = new Dictionary<int,Timer>();
private static Dictionary<int, int> TradeValue { get; set; } = new Dictionary<int, int>();
public static void GetUserItems(Client client)
{
User user = client.GetUser();
List<int> ItemId = new List<int>();
List<int> amount = new List<int>();
List<int> vehItemId = new List<int>();
List<int> vehAmount = new List<int>();
using (var context = new DatabaseContext())
{
List<UserItem> 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<VehicleItem> 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<int>(vehID);
}
[RemoteEvent("saveItems")]
public void ServerEvent_invSaveItems(Client client, string itemIdArr, string itemAmountArr, string SlotArr)
{
User user = client.GetUser();
int itemId = JsonConvert.DeserializeObject<int>(itemIdArr);
int itemAmount = JsonConvert.DeserializeObject<int>(itemAmountArr);
int Slot = JsonConvert.DeserializeObject<int>(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<int[]>(itemIdArrStr);
int[] itemAmountArr = JsonConvert.DeserializeObject<int[]>(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();
}
}
}
}
}