diff --git a/client/drops.lua b/client/drops.lua index 10c8a378..69a23de0 100644 --- a/client/drops.lua +++ b/client/drops.lua @@ -32,6 +32,13 @@ end -- Events +RegisterNetEvent('qb-inventory:client:removeDropTarget', function(dropId) + while not NetworkDoesNetworkIdExist(dropId) do Wait(10) end + local bag = NetworkGetEntityFromNetworkId(dropId) + while not DoesEntityExist(bag) do Wait(10) end + exports['qb-target']:RemoveTargetEntity(bag) +end) + RegisterNetEvent('qb-inventory:client:setupDropTarget', function(dropId) while not NetworkDoesNetworkIdExist(dropId) do Wait(10) end local bag = NetworkGetEntityFromNetworkId(dropId) @@ -51,6 +58,12 @@ RegisterNetEvent('qb-inventory:client:setupDropTarget', function(dropId) icon = 'fas fa-hand-pointer', label = 'Pick up bag', action = function() + if IsPedArmed(PlayerPedId(), 4) then + return QBCore.Functions.Notify("You can not be holding a Gun and a Bag!", "error", 5500) + end + if holdingDrop then + return QBCore.Functions.Notify("Your already holding a bag, Go Drop it!", "error", 5500) + end AttachEntityToEntity( bag, PlayerPedId(), diff --git a/client/main.lua b/client/main.lua index 0b715378..161ecd7b 100644 --- a/client/main.lua +++ b/client/main.lua @@ -219,7 +219,7 @@ RegisterNUICallback('GiveItem', function(data, cb) local playerId = GetPlayerServerId(player) QBCore.Functions.TriggerCallback('qb-inventory:server:giveItem', function(success) cb(success) - end, playerId, data.item.name, data.amount) + end, playerId, data.item.name, data.amount, data.slot, data.info) else QBCore.Functions.Notify(Lang:t('notify.nonb'), 'error') cb(false) @@ -300,6 +300,11 @@ for i = 1, 5 do RegisterCommand('slot_' .. i, function() local itemData = PlayerData.items[i] if not itemData then return end + if itemData.type == "weapon" then + if holdingDrop then + return QBCore.Functions.Notify("Your already holding a bag, Go Drop it!", "error", 5500) + end + end TriggerServerEvent('qb-inventory:server:useItem', itemData) end, false) RegisterKeyMapping('slot_' .. i, Lang:t('inf_mapping.use_item') .. i, 'keyboard', i) diff --git a/config/vehicles.lua b/config/vehicles.lua index 2b0ef53b..4669f8e3 100644 --- a/config/vehicles.lua +++ b/config/vehicles.lua @@ -21,13 +21,13 @@ VehicleStorage = { gloveboxSlots = 5, gloveboxWeight = 10000, trunkSlots = 50, - maxWeight = 75000 + trunkWeight = 75000 }, [3] = { -- Coupes gloveboxSlots = 5, gloveboxWeight = 10000, trunkSlots = 35, - maxWeight = 42000 + trunkWeight = 42000 }, [4] = { -- Muscle gloveboxSlots = 5, @@ -95,6 +95,42 @@ VehicleStorage = { trunkSlots = 50, trunkWeight = 120000 }, + [17] = { -- service + gloveboxSlots = 0, + gloveboxWeight = 0, + trunkSlots = 0, + trunkWeight = 0 + }, + [18] = { -- Emergency + gloveboxSlots = 4, + gloveboxWeight = 10000, + trunkSlots = 12, + trunkWeight = 150000 + }, + [19] = { -- Military + gloveboxSlots = 0, + gloveboxWeight = 0, + trunkSlots = 0, + trunkWeight = 0 + }, + [20] = { -- Commercial + gloveboxSlots = 0, + gloveboxWeight = 0, + trunkSlots = 0, + trunkWeight = 0 + }, + [21] = { -- trains + gloveboxSlots = 0, + gloveboxWeight = 0, + trunkSlots = 0, + trunkWeight = 0 + }, + [22] = { -- Commercial + gloveboxSlots = 0, + gloveboxWeight = 0, + trunkSlots = 0, + trunkWeight = 0 + }, } BackEngineVehicles = { diff --git a/html/app.js b/html/app.js index e17a42ac..ff00bea8 100644 --- a/html/app.js +++ b/html/app.js @@ -70,7 +70,6 @@ const InventoryContainer = Vue.createApp({ otherInventory: {}, otherInventoryName: "", otherInventoryLabel: "Drop", - otherInventoryTotalWeight: 0, otherInventoryMaxWeight: 1000000, otherInventorySlots: 100, isShopInventory: false, @@ -210,7 +209,13 @@ const InventoryContainer = Vue.createApp({ getHotbarItemInSlot(slot) { return this.hotbarItems[slot - 1] || null; }, + containerMouseDownAction(event) { + if (event.button === 0 && this.showContextMenu) { + this.showContextMenu = false; + } + }, handleMouseDown(event, slot, inventory) { + if (event.button === 1) return; // skip middle mouse event.preventDefault(); const itemInSlot = this.getItemInSlot(slot, inventory); if (event.button === 0) { @@ -234,42 +239,58 @@ const InventoryContainer = Vue.createApp({ moveItemBetweenInventories(item, sourceInventoryType) { const sourceInventory = sourceInventoryType === "player" ? this.playerInventory : this.otherInventory; const targetInventory = sourceInventoryType === "player" ? this.otherInventory : this.playerInventory; - const targetItemKey = Object.keys(targetInventory).find((key) => targetInventory[key] && targetInventory[key].name === item.name); - const targetItem = targetInventory[targetItemKey]; const amountToTransfer = this.transferAmount !== null ? this.transferAmount : 1; let targetSlot = null; const sourceItem = sourceInventory[item.slot]; if (!sourceItem || sourceItem.amount < amountToTransfer) { - console.error("Error: Insufficient amount of item in source inventory"); + this.inventoryError(item.slot); return; } - if (!targetItem) { + const totalWeightAfterTransfer = this.otherInventoryWeight + sourceItem.weight * amountToTransfer; + if (totalWeightAfterTransfer > this.otherInventoryMaxWeight) { + this.inventoryError(item.slot); + return; + } + + if (item.unique) { + targetSlot = this.findNextAvailableSlot(targetInventory); + if (targetSlot === null) { + this.inventoryError(item.slot); + return; + } + const newItem = { ...item, inventory: sourceInventoryType === "player" ? "other" : "player", amount: amountToTransfer, }; + targetInventory[targetSlot] = newItem; + newItem.slot = targetSlot; + } else { + const targetItemKey = Object.keys(targetInventory).find((key) => targetInventory[key] && targetInventory[key].name === item.name); + const targetItem = targetInventory[targetItemKey]; + + if (!targetItem) { + const newItem = { + ...item, + inventory: sourceInventoryType === "player" ? "other" : "player", + amount: amountToTransfer, + }; - let added = false; - for (let slot = 1; slot <= this.totalSlots; slot++) { - if (!targetInventory[slot]) { - targetInventory[slot] = newItem; - newItem.slot = slot; - targetSlot = slot; - added = true; - break; + targetSlot = this.findNextAvailableSlot(targetInventory); + if (targetSlot === null) { + this.inventoryError(item.slot); + return; } - } - if (!added) { - console.error("Error: No free slots available in target inventory"); - return; + targetInventory[targetSlot] = newItem; + newItem.slot = targetSlot; + } else { + targetItem.amount += amountToTransfer; + targetSlot = targetItem.slot; } - } else { - targetItem.amount += amountToTransfer; - targetSlot = targetItem.slot; } sourceItem.amount -= amountToTransfer; @@ -298,6 +319,7 @@ const InventoryContainer = Vue.createApp({ this.dragStartX = event.clientX; this.dragStartY = event.clientY; this.dragStartInventoryType = inventoryType; + this.showContextMenu = false; }, createGhostElement(slotElement) { const ghostElement = slotElement.cloneNode(true); @@ -403,6 +425,11 @@ const InventoryContainer = Vue.createApp({ }, handleItemDrop(targetInventoryType, targetSlot) { try { + const isShop = this.otherInventoryName.indexOf("shop-"); + if (this.dragStartInventoryType === "other" && targetInventoryType === "other" && isShop !== -1) { + return; + } + const targetSlotNumber = parseInt(targetSlot, 10); if (isNaN(targetSlotNumber)) { throw new Error("Invalid target slot number"); @@ -420,6 +447,21 @@ const InventoryContainer = Vue.createApp({ if (sourceItem.amount < amountToTransfer) { throw new Error("Insufficient amount of item in source inventory"); } + + if (targetInventoryType == "other") + { + const totalWeightAfterTransfer = this.otherInventoryWeight + sourceItem.weight * amountToTransfer; + if (totalWeightAfterTransfer > this.otherInventoryMaxWeight) { + throw new Error("Insufficient weight capacity in target inventory"); + } + } + else if (targetInventoryType == "player") + { + const totalWeightAfterTransfer = this.playerWeight + sourceItem.weight * amountToTransfer; + if (totalWeightAfterTransfer > this.maxWeight) { + throw new Error("Insufficient weight capacity in player inventory"); + } + } const targetItem = targetInventory[targetSlotNumber]; @@ -659,6 +701,8 @@ const InventoryContainer = Vue.createApp({ await axios.post("https://qb-inventory/GiveItem", { item: selectedItem, amount: amountToGive, + slot: selectedItem.slot, + info: selectedItem.info, }); this.playerInventory[selectedItem.slot].amount -= amountToGive; if (this.playerInventory[selectedItem.slot].amount === 0) { diff --git a/html/index.html b/html/index.html index 8c4d1c19..884f58ad 100644 --- a/html/index.html +++ b/html/index.html @@ -16,7 +16,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -79,7 +79,7 @@
-
+
@@ -191,7 +191,7 @@