From 0daa31fefcd05e6d54dadbf504a4b2dc93b83a21 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Dec 2018 20:42:17 +0100 Subject: [PATCH] Add Drop Item and Pick up item --- Client/Gui/Inventory/inventory.js | 44 ++++++++++- Main.cs | 1 + Server/Classes/TempBlip.cs | 16 ++++ Server/Commands/Admin.cs | 9 +-- Server/Events/Key.cs | 6 +- Server/Inventory/GroundItem.cs | 111 ++++++++++++++++++++++++++++ Server/Managers/InventoryManager.cs | 82 ++++++++++++++------ Server/Saves/SavedBlip.cs | 12 +-- 8 files changed, 241 insertions(+), 40 deletions(-) create mode 100644 Server/Classes/TempBlip.cs create mode 100644 Server/Inventory/GroundItem.cs diff --git a/Client/Gui/Inventory/inventory.js b/Client/Gui/Inventory/inventory.js index 570a0da8..a203fa97 100644 --- a/Client/Gui/Inventory/inventory.js +++ b/Client/Gui/Inventory/inventory.js @@ -108,7 +108,7 @@ mp.events.add("removeItem", (userItemId, amount) => { arrIndex = i; } } - inventoryWeight -= parseInt(items[arrIndex][2]) * parseInt(items[arrIndex][3]); + inventoryWeight -= parseInt(items[arrIndex][2]) * amount; items[arrIndex][3] -= amount; if (items[arrIndex][3] === 0) { items.splice(arrIndex, 1); @@ -500,6 +500,46 @@ mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, world var cX = x / screenX; var cY = y / screenY; + //if (upOrDown === "down" && leftOrRight === "left") { + // clickTimeL = Date.now(); + // if (mouseActive === false) { + // if (clickTimeR !== null && Date.now() - clickTimeR < 100) { + // mouseActive = true; + // mp.gui.cursor.show(true, true); + // clickTimeL = null; + // clickTimeR = null; + // } + // } + // else { + // if (clickTimeR !== null && Date.now() - clickTimeR < 100) { + // mouseActive = false; + // mp.gui.cursor.show(false, false); + // clickTimeL = null; + // clickTimeR = null; + // } else { + // mp.gui.chat.push("~r~" + worldPosition.x.toFixed(3).toString() + ", ~g~" + worldPosition.y.toFixed(3).toString() + ", ~b~" + worldPosition.z.toFixed(3).toString()); + // } + // } + //} + //if (upOrDown === "down" && leftOrRight === "right") { + // clickTimeR = Date.now(); + // if (mouseActive === false) { + // if (clickTimeL !== null && Date.now() - clickTimeL < 100) { + // mouseActive = true; + // mp.gui.cursor.show(true, true); + // clickTimeL = null; + // clickTimeR = null; + // } + // } else { + // if (clickTimeL !== null && Date.now() - clickTimeL < 100) { + // mouseActive = false; + // mp.gui.cursor.show(false, false); + // clickTimeL = null; + // clickTimeR = null; + // } + // } + //} + if (show) { //LINKE MAUSTASTE //RUNTER @@ -592,7 +632,7 @@ mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, world itemRadial = true; hoverItem = null; dragItem = null; - clickTime = 0; + clickTime = null; } else { if (dragItem !== null) { if (isMouseOverFreeSlot(x, y)) { diff --git a/Main.cs b/Main.cs index cc2b1ea7..c7d0af49 100644 --- a/Main.cs +++ b/Main.cs @@ -4,6 +4,7 @@ using System.Linq; using GTANetworkAPI; using Microsoft.EntityFrameworkCore; using reallife_gamemode.Model; +using reallife_gamemode.Server.Classes; using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Managers; using reallife_gamemode.Server.Saves; diff --git a/Server/Classes/TempBlip.cs b/Server/Classes/TempBlip.cs new file mode 100644 index 00000000..374c76e5 --- /dev/null +++ b/Server/Classes/TempBlip.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Classes +{ + public class TempBlip + { + public byte Color { get; set; } + public string Name { get; set; } + public byte Transparency { get; set; } + public bool ShortRange { get; set; } + public uint Sprite { get; set; } + public float Scale { get; set; } + } +} diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index aafffa00..486a7c8b 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -19,6 +19,7 @@ using reallife_gamemode.Server.Inventory.Interfaces; using reallife_gamemode.Server.Saves; using reallife_gamemode.Server.Business; using System.Text.RegularExpressions; +using reallife_gamemode.Server.Classes; /** * @overview Life of German Reallife - Admin Commands (Admin.cs) @@ -1053,15 +1054,13 @@ namespace reallife_gamemode.Server.Commands List userItems = context.UserItems.ToList().FindAll(i => i.UserId == target.GetUser().Id); foreach(var uItem in userItems) { - invWeight += uItem.Amount * InventoryManager.GetItemById(itemId).Gewicht; + invWeight += uItem.Amount * InventoryManager.GetItemById(uItem.ItemId).Gewicht; } } - invWeight += amount * InventoryManager.GetItemById(itemId).Gewicht; - - if (invWeight > 40000) + if (invWeight + (amount * InventoryManager.GetItemById(itemId).Gewicht) > 40000) { - player.SendChatMessage("~y~" + targetname + " ~s~hat nicht mehr genug Platz in seinem Inventar."); + player.SendChatMessage("~y~" + target.Name + " ~s~hat nicht mehr genug Platz in seinem Inventar."); } else { diff --git a/Server/Events/Key.cs b/Server/Events/Key.cs index 8f2e138e..62a25eb0 100644 --- a/Server/Events/Key.cs +++ b/Server/Events/Key.cs @@ -5,8 +5,10 @@ using System.Text; using GTANetworkAPI; using Newtonsoft.Json; using reallife_gamemode.Model; +using reallife_gamemode.Server.Classes; using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Server.Inventory; using reallife_gamemode.Server.Inventory.Interfaces; using reallife_gamemode.Server.Managers; using reallife_gamemode.Server.Saves; @@ -32,7 +34,9 @@ namespace reallife_gamemode.Server.Events SaveManager.OnSaveBlipData(player, tempBlip.Sprite.ToString(), tempBlip.Name, tempBlip.Scale.ToString(), tempBlip.Color.ToString(), tempBlip.Transparency.ToString(), 200.ToString(), tempBlip.ShortRange.ToString(), 0.ToString(), 0.ToString()); player.SendNotification("~y~Blip~s~ erstellt!", false); - } + } + + GroundItem.PickUpGroundItem(player); } [RemoteEvent("keyPress:E")] public void KeyPressE(Client player) diff --git a/Server/Inventory/GroundItem.cs b/Server/Inventory/GroundItem.cs new file mode 100644 index 00000000..6c97b01e --- /dev/null +++ b/Server/Inventory/GroundItem.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using reallife_gamemode.Server.Inventory.Interfaces; +using reallife_gamemode.Server.Managers; +using System.Linq; +using reallife_gamemode.Server.Entities; +using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Model; + +namespace reallife_gamemode.Server.Inventory +{ + public class GroundItem : Script + { + public int ItemId { get; set; } + public int Amount { get; set; } + public Vector3 Position { get; set; } + + public static List GroundItems = new List(); + public static List GroundObjects = new List(); + public static List GroundTextLabels = new List(); + + public static void AddGroundItem(GroundItem grndItem, GTANetworkAPI.Object grndObject, TextLabel grndTextLabel) + { + GroundItems.Add(grndItem); + GroundObjects.Add(grndObject); + GroundTextLabels.Add(grndTextLabel); + } + + public static void PickUpGroundItem(Client player) + { + GroundItem nearest = GroundItems.FirstOrDefault(d => d.Position.DistanceTo(player.Position) <= 1.2); + if (nearest != null) + { + var invWeight = InventoryManager.GetUserInventoryWeight(player); + var itemsToAdd = 0; + GTANetworkAPI.Object nearestObject = GroundObjects.FirstOrDefault(d => d.Position == nearest.Position); + TextLabel nearestTextLabel = GroundTextLabels.FirstOrDefault(d => d.Position == nearest.Position); + IItem nearestItem = InventoryManager.GetItemById(nearest.ItemId); + UserItem existingItem = InventoryManager.UserHasThisItem(player, nearest.ItemId); + var user = player.GetUser(); + if (nearestItem.Gewicht * nearest.Amount + invWeight > 40000) + { + for(var i = 1; i <= nearest.Amount; i++) + { + if(invWeight + (i * nearestItem.Gewicht) > 40000) + { + break; + } + else + { + itemsToAdd = i; + } + } + if(itemsToAdd < 1) + { + player.SendNotification("~r~Du hast keinen Platz im Inventar!", false); + } + else + { + if(existingItem != null) + { + using (var context = new DatabaseContext()) + { + UserItem existingUserItem = context.UserItems.FirstOrDefault(i => i.Id == existingItem.Id); + existingUserItem.Amount += itemsToAdd; + context.SaveChanges(); + } + } + else + { + UserItem newItem = new UserItem { ItemId = nearest.ItemId, UserId = user.Id, Amount = nearest.Amount }; + InventoryManager.AddItemToInventory(player, newItem); + } + nearestTextLabel.Text = nearestItem.Name + " ~s~(~y~" + (nearest.Amount - itemsToAdd) + "~s~)"; + player.SendNotification("Du hast nur ~g~" + itemsToAdd + " ~y~" + nearestItem.Name + " aufgehoben."); + } + } + else + { + if (existingItem != null) + { + using (var context = new DatabaseContext()) + { + UserItem existingUserItem = context.UserItems.FirstOrDefault(i => i.Id == existingItem.Id && i.UserId == user.Id); + existingUserItem.Amount += nearest.Amount; + context.SaveChanges(); + } + } + else + { + UserItem item = new UserItem() { ItemId = nearest.ItemId, UserId = user.Id, Amount = nearest.Amount }; + InventoryManager.AddItemToInventory(player, item); + } + RemoveGroundItem(nearest, nearestObject, nearestTextLabel); + player.SendNotification("Du hast ~g~" + nearest.Amount + " ~y~" + nearestItem.Name + " aufgehoben."); + } + } + } + + public static void RemoveGroundItem(GroundItem grndItem, GTANetworkAPI.Object grndObject, TextLabel grndTextLabel) + { + GroundItems.Remove(grndItem); + NAPI.Entity.DeleteEntity(grndObject); + NAPI.Entity.DeleteEntity(grndTextLabel); + GroundObjects.Remove(grndObject); + GroundTextLabels.Remove(grndTextLabel); + } + } +} diff --git a/Server/Managers/InventoryManager.cs b/Server/Managers/InventoryManager.cs index bc12fd70..039b954d 100644 --- a/Server/Managers/InventoryManager.cs +++ b/Server/Managers/InventoryManager.cs @@ -5,6 +5,7 @@ using reallife_gamemode.Model; using reallife_gamemode.Server.Commands; using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Server.Inventory; using reallife_gamemode.Server.Inventory.Interfaces; using reallife_gamemode.Server.Services; using System; @@ -102,6 +103,35 @@ namespace reallife_gamemode.Server.Managers } } + public static int GetUserInventoryWeight(Client player) + { + var user = player.GetUser(); + var inventoryWeight = 0; + + using (var context = new DatabaseContext()) + { + List userItems = context.UserItems.ToList().FindAll(i => i.UserId == user.Id); + foreach (var item in userItems) + { + IItem iItem = GetItemById(item.ItemId); + var currentItemWeight = iItem.Gewicht * item.Amount; + inventoryWeight += currentItemWeight; + } + } + + return inventoryWeight; + } + + public static UserItem UserHasThisItem(Client player, int itemId) + { + var user = player.GetUser(); + using (var context = new DatabaseContext()) + { + UserItem existingItem = context.UserItems.FirstOrDefault(i => i.UserId == user.Id && i.ItemId == itemId); + return existingItem; + } + } + public static void GetUserItemsAsAdmin(Client player, Entities.User user) { var inventoryWeight = 0; @@ -174,28 +204,35 @@ namespace reallife_gamemode.Server.Managers var user = player.GetUser(); using (var context = new DatabaseContext()) { - - - List allItemsByUser = context.UserItems.ToList().FindAll(i => i.UserId == user.Id); - var slotArr = Enumerable.Range(1, 20).ToList(); - allItemsByUser.ForEach(allItem => + UserItem existingItem = context.UserItems.FirstOrDefault(i => i.ItemId == item.ItemId && i.UserId == item.UserId); + if (existingItem != null) { - if (slotArr.Contains(allItem.Slot)) slotArr.Remove(allItem.Slot); - }); + existingItem.Amount += item.Amount; + } + else + { + List allItemsByUser = context.UserItems.ToList().FindAll(i => i.UserId == user.Id); + var slotArr = Enumerable.Range(1, 20).ToList(); + allItemsByUser.ForEach(allItem => + { + if (slotArr.Contains(allItem.Slot)) slotArr.Remove(allItem.Slot); + }); - int newSlot = slotArr.Min(); + int newSlot = slotArr.Min(); - item.Slot = newSlot; - context.UserItems.Add(item); + item.Slot = newSlot; + context.UserItems.Add(item); + + IItem iItem = GetItemById(item.ItemId); + + string[] newItem = new string[] { iItem.Name, iItem.Description, iItem.Gewicht.ToString(), item.Amount.ToString(), newSlot.ToString(), item.Id.ToString() }; + + player.TriggerEvent("addItem", JsonConvert.SerializeObject(newItem)); + } context.SaveChanges(); - - IItem iItem = GetItemById(item.ItemId); - - string[] newItem = new string[] { iItem.Name, iItem.Description, iItem.Gewicht.ToString(), item.Amount.ToString(), newSlot.ToString(), item.Id.ToString() }; - - player.TriggerEvent("addItem", JsonConvert.SerializeObject(newItem)); } } + [RemoteEvent("removeItemAsAdmin")] public void SavePlayerInventory(Client player, string amount, string userItemId, string targetPlayerName) { @@ -208,13 +245,13 @@ namespace reallife_gamemode.Server.Managers if (amount == "stack") { var itemSlot = fItem.Slot; - targetPlayer.TriggerEvent("removeItem", userItemId, "stack"); + targetPlayer.TriggerEvent("removeItem", userItemId, fItem.Amount); context.UserItems.Remove(fItem); } else if (amount == "one") { var itemSlot = fItem.Slot; - targetPlayer.TriggerEvent("removeItem", userItemId, "one"); + targetPlayer.TriggerEvent("removeItem", userItemId, 1); fItem.Amount--; } context.SaveChanges(); @@ -267,11 +304,14 @@ namespace reallife_gamemode.Server.Managers if (iItem is IDroppableItem usableItemObj2) { + Vector3 dropPosition = new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8f); Random r = new Random(); - NAPI.Object.CreateObject(3777723516, new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.8), new Vector3(0, 0, r.Next(0, 360)), 0); - NAPI.TextLabel.CreateTextLabel(iItem.Name + " ~s~(~y~" + amount + "~s~)", new Vector3(player.Position.X, player.Position.Y, player.Position.Z - 0.6), 5, 0.5f, 4, new Color(255, 255, 255), false, 0); + GTANetworkAPI.Object grndObject = NAPI.Object.CreateObject(3777723516, dropPosition, new Vector3(0, 0, r.Next(0, 360)), 0); + 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); + player.TriggerEvent("removeItem", itemId, amount); } break; } diff --git a/Server/Saves/SavedBlip.cs b/Server/Saves/SavedBlip.cs index 8080ca21..3c9d09c9 100644 --- a/Server/Saves/SavedBlip.cs +++ b/Server/Saves/SavedBlip.cs @@ -34,15 +34,5 @@ namespace reallife_gamemode.Server.Saves public float Rotation { get; set; } public byte Dimension { get; set; } public bool Active { get; set; } - } - - public class TempBlip - { - public byte Color { get; set; } - public string Name { get; set; } - public byte Transparency { get; set; } - public bool ShortRange { get; set; } - public uint Sprite { get; set; } - public float Scale { get; set; } - } + } }