mirror of
https://github.com/jimathy/jim_bridge.git
synced 2026-08-17 05:56:02 +01:00
Compare commits
80 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4e9333ab8 | ||
|
|
e08b349e31 | ||
|
|
2bf7a28508 | ||
|
|
e6bee2ae2e | ||
|
|
fc832d73f9 | ||
|
|
e8e9b53f53 | ||
|
|
7304376e90 | ||
|
|
7e9914afda | ||
|
|
89f6f6deb0 | ||
|
|
f1ae24d0fe | ||
|
|
4848b51ecc | ||
|
|
2aa0cc9d5d | ||
|
|
5e3ace804d | ||
|
|
42b109a5f1 | ||
|
|
5a8afb516b | ||
|
|
ef2771cc83 | ||
|
|
942c11af1d | ||
|
|
b291e3f4b6 | ||
|
|
46e3f18edc | ||
|
|
0886d8a4b6 | ||
|
|
6a23e4ac91 | ||
|
|
f7b7718679 | ||
|
|
9ae034da77 | ||
|
|
4d1b2abd3d | ||
|
|
f8e3f64907 | ||
|
|
3702835958 | ||
|
|
23c2e1472e | ||
|
|
6367c9ed3b | ||
|
|
2d299a6a4a | ||
|
|
ced629d4dc | ||
|
|
714121d272 | ||
|
|
14c140cf85 | ||
|
|
881aec7c04 | ||
|
|
85b31e7e1d | ||
|
|
66c9287202 | ||
|
|
f0f59b8568 | ||
|
|
e03efa6687 | ||
|
|
5a22651961 | ||
|
|
236689452e | ||
|
|
b686f267e1 | ||
|
|
096e323409 | ||
|
|
b71ec14615 | ||
|
|
5a2304b785 | ||
|
|
6f413c555d | ||
|
|
fbc92aea41 | ||
|
|
7b31343991 | ||
|
|
872cb39715 | ||
|
|
dd35674307 | ||
|
|
1d102e94b4 | ||
|
|
c18932443a | ||
|
|
7563b4abdf | ||
|
|
20509e5cc2 | ||
|
|
43e30e95bc | ||
|
|
9efff1060b | ||
|
|
3b608e2b4f | ||
|
|
bfed10c019 | ||
|
|
4bb29b8f14 | ||
|
|
6eca0dd1d1 | ||
|
|
cc96bcde34 | ||
|
|
ab61e40567 | ||
|
|
e17e2fb865 | ||
|
|
a6bd82a41c | ||
|
|
fac495c0ef | ||
|
|
15bea85bfb | ||
|
|
f889080bc0 | ||
|
|
7d62358558 | ||
|
|
f7a7e89c56 | ||
|
|
5f6720d37b | ||
|
|
e541201a08 | ||
|
|
2bf04f69cf | ||
|
|
8479aea1b0 | ||
|
|
d17a1da5b2 | ||
|
|
f1ff06c098 | ||
|
|
df785043e8 | ||
|
|
5ae4799a5f | ||
|
|
8cf4a6bd23 | ||
|
|
3e067c8492 | ||
|
|
6847639c65 | ||
|
|
0592c3ebc8 | ||
|
|
2ca1cbd110 |
593
README.md
593
README.md
@@ -45,4 +45,595 @@ to
|
|||||||
QBInv = "ps-inventory",
|
QBInv = "ps-inventory",
|
||||||
```
|
```
|
||||||
|
|
||||||
This will now use events from `ps-inventory` and use it through out the scripts.
|
This will now use events from `ps-inventory` and use it through out the scripts.
|
||||||
|
|
||||||
|
# WIP
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
This script brings alot of features to simplify making scripts with preset functions and automations.
|
||||||
|
|
||||||
|
It attempts to make use of configs from the scripts its loaded into. For example:
|
||||||
|
|
||||||
|
### `Config`
|
||||||
|
This needs to be in every script that uses it, a `System` table with Debug, Menu, Notify, drawText, progressBar
|
||||||
|
|
||||||
|
This is required to use jim_bridge with your script
|
||||||
|
```lua
|
||||||
|
Config = {
|
||||||
|
System = {
|
||||||
|
Debug = true, -- This enables Debug mode
|
||||||
|
-- Revealing debug prints and debug boxes on targets
|
||||||
|
|
||||||
|
Menu = "qb", -- This specifies what menu script will be loaded
|
||||||
|
-- "qb" = `qb-menu` and edited versions of it
|
||||||
|
-- "ox" = `ox_lib`'s context menu system
|
||||||
|
-- "gta" = `WarMenu' a free script for a gta style menu
|
||||||
|
|
||||||
|
Notify = "gta", -- This allows you to choose the notification system for scripts
|
||||||
|
-- "qb" = `qb-core`'s built in notifications
|
||||||
|
-- "ox" = `ox_lib`'s built in notifications
|
||||||
|
-- "esx" = `esx_notify` esx's default notifications
|
||||||
|
-- "okok" = `okok-notify` okok's notifications
|
||||||
|
-- "gta" = Native GTA style popups
|
||||||
|
|
||||||
|
drawText = "gta", -- The style of drawText you want to use
|
||||||
|
-- "qb" = `qb-core`'s drawText system
|
||||||
|
-- "ox" = `ox_lib`'s drawTextUI system
|
||||||
|
-- "gta" = Native GTA style popups
|
||||||
|
|
||||||
|
|
||||||
|
progressBar = "gta" -- The style of progressBar you want to use
|
||||||
|
-- "qb" = `qb-core`'s style progressBar
|
||||||
|
-- "ox" = `ox_lib`'s default progressBar
|
||||||
|
-- "gta" = Native GTA style "spinner"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `openMenu(Menu, data)`
|
||||||
|
|
||||||
|
This handles creation of menus using `OX_Lib`, `qb-menu` or `WarMenu`
|
||||||
|
|
||||||
|
It uses mixed/new functions to bring more compatability to one another
|
||||||
|
|
||||||
|
`Menu` is your button entries and works like qb-menu or ox_lib, for example:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local Menu = {}
|
||||||
|
Menu[#Menu + 1] = {
|
||||||
|
isMenuHeader = true, -- This makes the current button unclickable
|
||||||
|
icon = invImg("lockpick") -- Supports fontawesome or custom images
|
||||||
|
-- This example use the custom function `invImg()` to retreive an nui:// link to the given item's image
|
||||||
|
arrow = true, -- Adds a arrow icon to the button (in qb-menu overrides the icon)
|
||||||
|
header = "Header Test", -- The header/title for the button
|
||||||
|
txt = "Text test", -- The txt/description for the button
|
||||||
|
|
||||||
|
onSelect = function() -- This brings the onSelect function to qb-menu
|
||||||
|
TriggerEvent("lolhi", { lol = hi }),
|
||||||
|
end,
|
||||||
|
-- Enter what happens when you click the button
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see above, it mixes variables but makes it possible to switch between menus just by changing the config option
|
||||||
|
|
||||||
|
After you have created the info above, you need to then trigger opening of this menu with:
|
||||||
|
```lua
|
||||||
|
openMenu(Menu, -- Menu here is your table name you created above
|
||||||
|
{ -- Next entry in openMenu is a table
|
||||||
|
header = "Menu Header", -- What your menu title will be shown as
|
||||||
|
headertxt = "Header info", -- Info to be displayed under the title
|
||||||
|
|
||||||
|
onExit = function() -- Will create a "Close button"
|
||||||
|
TriggerEvent("lolhi", { lol = hi }),
|
||||||
|
end, -- When clicked it will trigger the onExit event
|
||||||
|
|
||||||
|
onBack = function() -- Will create a "Back button"
|
||||||
|
TriggerEvent("lolhi", { lol = hi }),
|
||||||
|
end, -- When clicked it will trigger the onBack event
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Support for multiple target events
|
||||||
|
These automatically detect what target script you are using
|
||||||
|
|
||||||
|
They are also automatically removed when the script is stopped (for helping optimization)
|
||||||
|
### `createEntityTarget(entity, opts, dist)`
|
||||||
|
Create an entity based target
|
||||||
|
```lua
|
||||||
|
createEntityTarget(
|
||||||
|
entity, -- The entity ID of what you want to target
|
||||||
|
{
|
||||||
|
{ -- Your target options here
|
||||||
|
icon = "icon", -- Your icon, only supports font awesome icons
|
||||||
|
label = "Test Label", -- The label of your target
|
||||||
|
item = "lockpick" -- The required it em
|
||||||
|
job = "mechanic", -- The required job
|
||||||
|
gang = "lostmc", -- The required gang
|
||||||
|
action = function() -- What happens when the target is selected
|
||||||
|
TriggerEvent("lolhi", { lol = hi }),
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
, dist) -- How close you ned to be to see the target
|
||||||
|
```
|
||||||
|
|
||||||
|
### `createBoxTarget(data, opts, dist)`
|
||||||
|
Create an entity based target
|
||||||
|
```lua
|
||||||
|
createBoxTarget(
|
||||||
|
{
|
||||||
|
"TargetName", -- The name/id of your target here
|
||||||
|
vec3(0, 0, 0), -- The coordinates of your target
|
||||||
|
2.0, -- The width of your target box
|
||||||
|
2.0, -- The depth of your target box
|
||||||
|
{
|
||||||
|
name = "TargetName", -- The name/id of your target here
|
||||||
|
heading = 200.0, -- The direction your target will be placed
|
||||||
|
debugPoly = true, -- Wether to show debug boxes to help place targets
|
||||||
|
minZ = 190.0, -- The bottom of your box
|
||||||
|
maxZ = 210.0, -- The top of your box
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ -- Your target options here
|
||||||
|
icon = "icon", -- Your icon, only supports font awesome icons
|
||||||
|
label = "Test Label", -- The label of your target
|
||||||
|
item = "lockpick" -- The required it em
|
||||||
|
job = "mechanic", -- The required job
|
||||||
|
gang = "lostmc", -- The required gang
|
||||||
|
action = function() -- What happens when the target is selected
|
||||||
|
TriggerEvent("lolhi", { lol = hi }),
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dist) -- How close you ned to be to see the target
|
||||||
|
```
|
||||||
|
|
||||||
|
### `createCircleTarget(data, opts, dist)`
|
||||||
|
Create an entity based target
|
||||||
|
```lua
|
||||||
|
createCircleTarget(
|
||||||
|
{
|
||||||
|
"TargetName", -- The name/id of your target here
|
||||||
|
vec3(0, 0, 0), -- The coordinates of your target
|
||||||
|
2.0, -- The radius of your target circle
|
||||||
|
{
|
||||||
|
name = "TargetName", -- The name/id of your target here
|
||||||
|
heading = 200.0, -- The direction your target will be placed
|
||||||
|
debugPoly = true, -- Wether to show debug boxes to help place targets
|
||||||
|
minZ = 190.0, -- The bottom of your box
|
||||||
|
maxZ = 210.0, -- The top of your box
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ -- Your target options here
|
||||||
|
icon = "icon", -- Your icon, only supports font awesome icons
|
||||||
|
label = "Test Label", -- The label of your target
|
||||||
|
item = "lockpick" -- The required it em
|
||||||
|
job = "mechanic", -- The required job
|
||||||
|
gang = "lostmc", -- The required gang
|
||||||
|
action = function() -- What happens when the target is selected
|
||||||
|
TriggerEvent("lolhi", { lol = hi }),
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dist) -- How close you ned to be to see the target
|
||||||
|
```
|
||||||
|
|
||||||
|
### `removeEntityTarget(entity)`
|
||||||
|
Triggers removal of the target entity, by checking the entity name
|
||||||
|
|
||||||
|
### `removeZoneTarget(target)`
|
||||||
|
Triggers removal of a zone(Box/Circle) target by calling the target's name/id
|
||||||
|
|
||||||
|
### `triggerNotify(title, message, type, src)`
|
||||||
|
Handles notifications for the script called from either the server or client
|
||||||
|
|
||||||
|
Supports:
|
||||||
|
- `okok`
|
||||||
|
- `qb`
|
||||||
|
- `ox`
|
||||||
|
- `gta`
|
||||||
|
- `esx`
|
||||||
|
|
||||||
|
```lua
|
||||||
|
triggerNotify(
|
||||||
|
title = "Notification Title", -- Usually 'nil' in my scripts, supports notifications with titles
|
||||||
|
message = "Notification Message", -- The notification's message
|
||||||
|
type = "success" -- The type of notification, depends on the supporting script
|
||||||
|
src = 1, -- If in the server, this is required to send to player
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `drawText(image, input, style)`
|
||||||
|
This handles calling drawText functions
|
||||||
|
|
||||||
|
Supports:
|
||||||
|
- `gta`
|
||||||
|
- `qb`
|
||||||
|
- `ox`
|
||||||
|
- `esx`
|
||||||
|
|
||||||
|
```lua
|
||||||
|
drawText(
|
||||||
|
187, -- Very specific for adding blip images to drawtexts, usually nil
|
||||||
|
{
|
||||||
|
"Line 1", -- Supports multiple lines, helpful for displaying button prompts
|
||||||
|
"Line 2",
|
||||||
|
},
|
||||||
|
"g" -- Sets colour of text after a ":" when using GTA drawtext
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `hideText()`
|
||||||
|
Simply used to hide drawText prompts when not needed anymore
|
||||||
|
|
||||||
|
### `createCallback(callbackName, funct)`
|
||||||
|
This is my attempt at making multiframework server callbacks by using their provided events
|
||||||
|
|
||||||
|
(Only works server side)
|
||||||
|
|
||||||
|
```lua
|
||||||
|
createCallback(
|
||||||
|
"jimsCallback", -- Callback event name, needs to be something that isn't already set
|
||||||
|
function()
|
||||||
|
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
### `triggerCallback(callBackName, value)`
|
||||||
|
This is an attempt at a mutliframework callback
|
||||||
|
|
||||||
|
### `onPlayerLoaded(func)`
|
||||||
|
This is a multiframework event that is triggered when a player has fully loaded their character in
|
||||||
|
|
||||||
|
```lua
|
||||||
|
onPlayerLoaded(
|
||||||
|
function()
|
||||||
|
print("Player Loaded In!")
|
||||||
|
end
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `createInput(title, opts)`
|
||||||
|
|
||||||
|
### `searchCar(vehicle)`
|
||||||
|
|
||||||
|
This function was made for `jim-mechanic` but can be used in other instances
|
||||||
|
|
||||||
|
I searches the model name of a currently spawned vehicle and retrieves info about it
|
||||||
|
|
||||||
|
It is smart, in terms of, if you use this multiple times it reteives the previously found info instead of searching again
|
||||||
|
|
||||||
|
It retrieves data from your vehicles.lua/database:
|
||||||
|
- `name` for example: "Zentorno Pegassi"
|
||||||
|
- `price` for example: 100000
|
||||||
|
- `class` this converts the class number to a String, for example: if the class is 10 it converts this to "Off-road"
|
||||||
|
|
||||||
|
### `getVehicleProperties(vehicle)`
|
||||||
|
Gets the current properties of the vehicle in a table
|
||||||
|
- if using qb-core it will default to its version
|
||||||
|
- if not it will attempt to use ox_libs version
|
||||||
|
|
||||||
|
### `setVehicleProperties(vehicle, props)`
|
||||||
|
Set's the vehicles properites using the `props` table provided
|
||||||
|
- if using qb-core it will default to its version
|
||||||
|
- if not it will attempt to use ox_libs version
|
||||||
|
|
||||||
|
### `checkDifferences(vehicle, newProps)`
|
||||||
|
This function is used by `setVehicleProperties`
|
||||||
|
|
||||||
|
It determine's what differences there are between the current vehicle and the new set of properites
|
||||||
|
|
||||||
|
If there are differences, return `true`
|
||||||
|
|
||||||
|
### `RegisterNetEvent(GetCurrentResourceName()..":server:ChargePlayer", function(cost, type, newsrc)`
|
||||||
|
This event is made to REMOVE money from a player
|
||||||
|
|
||||||
|
It can be called from client with `TriggerServerEvent`
|
||||||
|
|
||||||
|
Also can be called from server with `TriggerEvent` and a source id in `newsrc`
|
||||||
|
|
||||||
|
The name of the event uses `GetCurrentResourceName()` so it doesn't double up results with other scripts
|
||||||
|
```lua
|
||||||
|
cost = 100 -- The amount of money to be removed
|
||||||
|
type = "cash" or "card" -- The type of money that should be removed
|
||||||
|
newsrc = 1 -- The source of the player, must be nil if calling from client
|
||||||
|
```
|
||||||
|
Examples of use:
|
||||||
|
```lua
|
||||||
|
-- Client
|
||||||
|
TriggerEvent(GetCurrentResourceName()..":server:ChargePlayer", function(1000, "cash")
|
||||||
|
|
||||||
|
-- Server
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":server:ChargePlayer", function(1000, "bank", 1)
|
||||||
|
```
|
||||||
|
|
||||||
|
## `RegisterNetEvent(GetCurrentResourceName()..":server:FundPlayer", function(cost, type, newsrc)`
|
||||||
|
This event is made to ADD money from a player
|
||||||
|
|
||||||
|
It can be called from client with `TriggerServerEvent`
|
||||||
|
|
||||||
|
Also can be called from server with `TriggerEvent` and a source id in `newsrc`
|
||||||
|
|
||||||
|
The name of the event uses `GetCurrentResourceName()` so it doesn't double up results with other scripts
|
||||||
|
```lua
|
||||||
|
fund = 100 -- The amount of money to be added
|
||||||
|
type = "cash" or "card" -- The type of money that should be added
|
||||||
|
newsrc = 1 -- The source of the player, must be `nil` if calling from client
|
||||||
|
```
|
||||||
|
Examples of use:
|
||||||
|
```lua
|
||||||
|
-- Client
|
||||||
|
TriggerEvent(GetCurrentResourceName()..":server:FundPlayer", function(1000, "cash")
|
||||||
|
|
||||||
|
-- Server
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":server:FundPlayer", function(1000, "bank", newsrc)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `createUseableItem(item, funct)`
|
||||||
|
This is a server side event to make an item usable
|
||||||
|
|
||||||
|
Note: If using ox_inv and the items.lua info has event or a `status` section, this will be ignored
|
||||||
|
|
||||||
|
```lua
|
||||||
|
createUseableItem(
|
||||||
|
"lockpick", -- The item you want to make usable
|
||||||
|
function(source, item)
|
||||||
|
TriggerClientEvent("lolhi", source, { lol = item.name }),
|
||||||
|
end
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `hasJob(job, source, grade)`
|
||||||
|
This is an event that makes checking if the player has the requested job simple
|
||||||
|
|
||||||
|
It works both client side and server side
|
||||||
|
|
||||||
|
returns `true` or `false` and if they are on duty or not
|
||||||
|
```lua
|
||||||
|
local hasjob, duty =
|
||||||
|
hasJob(
|
||||||
|
"mechanic", -- the job role
|
||||||
|
1, -- the source id of the player, set to nil if on client
|
||||||
|
3, -- the required grade of the player, can be nil to check job
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `getPlayer(source)`
|
||||||
|
This retrieves basic info of the player
|
||||||
|
|
||||||
|
works client side and server side
|
||||||
|
Retrieves:
|
||||||
|
- Players Name
|
||||||
|
- Players Current Cash
|
||||||
|
- Players Current Bank Balance
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local PlayerInfo =
|
||||||
|
getPlayer(
|
||||||
|
1 -- The
|
||||||
|
)
|
||||||
|
print(json.encode(PlayerInfo, { indent = true })
|
||||||
|
```
|
||||||
|
|
||||||
|
### `registerCommand(command, options)`
|
||||||
|
This is a server side event that uses
|
||||||
|
- `ox_lib`'s - `lib.addCommand`
|
||||||
|
- `qb-core`'s - `QBCore.Commands.Add`
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```lua
|
||||||
|
registerCommand(
|
||||||
|
"hello", -- /hello the command to be used
|
||||||
|
"Print 'hello world'", -- text to show in chat
|
||||||
|
{ name = "lol", help = "hi" }, -- Help text for the command
|
||||||
|
false,
|
||||||
|
function() -- Function to be ran when the command is triggered
|
||||||
|
print("Hello World")
|
||||||
|
end,
|
||||||
|
"admin", -- the restriction, can be nil
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `invImg(item)`
|
||||||
|
This is used mainly for menu's to retrieve the item images
|
||||||
|
|
||||||
|
It detects what inventory you are using and automatically generates an `nui://` link
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local imgLink = invImg("lockpick")
|
||||||
|
print(imgLink)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `registerStash(name, label, slots, weight)`
|
||||||
|
This is a serverside function used to register a new stash in `ox_inventory` and `qs-inventory`
|
||||||
|
|
||||||
|
```lua
|
||||||
|
registerStash(
|
||||||
|
"newStash", -- The stash name/ID, this is used to open it later
|
||||||
|
"New created Stash", -- The name of the stash that shows in inventories
|
||||||
|
50, -- The amount of slots in the inventory
|
||||||
|
4000000, -- The max weight in the inventory
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `loadModel(model)`
|
||||||
|
This loads the requested model into the memory cache to help spawning of props
|
||||||
|
- Checks if the model exists in the server
|
||||||
|
- Attempts to load the model with a timeout, if not loaded, sends warning
|
||||||
|
|
||||||
|
### `unloadModel(model)`
|
||||||
|
This unloads a model to help clear the memory cache and help optimization
|
||||||
|
- Recommended to run after spawning a prop
|
||||||
|
|
||||||
|
### `loadAnimDict(animDict)`
|
||||||
|
This loads the requested animDict into the memory cache to help loading anims
|
||||||
|
- Checks if the dict exists in the server
|
||||||
|
|
||||||
|
### `unloadAnimDict(animDict)`
|
||||||
|
This unloads the animDict to help clear the memory cache and help optimization
|
||||||
|
- Recommended to run after running an animation
|
||||||
|
|
||||||
|
### `loadPtfxDict(ptFxName)`
|
||||||
|
This loads the requested ptFx dict into the memory cache to help loading particle effects
|
||||||
|
- Skips if the effect is alredy loaded
|
||||||
|
|
||||||
|
### `unloadPtfxDict(dict)`
|
||||||
|
This unloads a particle effect to help clear the memory cache and help optimization
|
||||||
|
- Recommended to run after running an ptfx
|
||||||
|
|
||||||
|
### `loadTextureDict(dict)`
|
||||||
|
This loads the requested texture dictionary into memory
|
||||||
|
|
||||||
|
### `countTable(table)`
|
||||||
|
This is a simple function to count how many entires are in a table, for if your table keys aren't numbered
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```lua
|
||||||
|
local table = {
|
||||||
|
["tableentry"] = true,
|
||||||
|
["anotherentry"] = true,
|
||||||
|
}
|
||||||
|
print("countTable", countTable(table))
|
||||||
|
```
|
||||||
|
|
||||||
|
### `pairsByKeys(t)`
|
||||||
|
Searches through a table alphabetically instead of randomly
|
||||||
|
|
||||||
|
This is an optional function made to replace:
|
||||||
|
```lua
|
||||||
|
for k, v in pairs(table) do end
|
||||||
|
```
|
||||||
|
with:
|
||||||
|
```lua
|
||||||
|
for k, v in pairsByKeys(table) do end
|
||||||
|
```
|
||||||
|
|
||||||
|
### `playAnim(animDict, animName, duration, flag, ped)`
|
||||||
|
A simplified version of `TaskPlayAnim()`
|
||||||
|
|
||||||
|
Has some settings already set and basic ones ready to change
|
||||||
|
|
||||||
|
Loads the animDict automatically with `loadAnimDict()`
|
||||||
|
```lua
|
||||||
|
playAnim(
|
||||||
|
animDict, -- The animation dictionary
|
||||||
|
animName, -- The animation's name
|
||||||
|
duration, -- How far into the animation it should stop
|
||||||
|
flag, -- The animation flag
|
||||||
|
ped, -- Optional, for if you want any one other than the player to do the animation
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `stopAnim(animDict, animName, ped)`
|
||||||
|
Similar to `StopAnimTask()`
|
||||||
|
|
||||||
|
Made to stop the given animation with being able to choose which ped
|
||||||
|
```lua
|
||||||
|
stopAnim(
|
||||||
|
animDict, -- The animation dictionary
|
||||||
|
animName, -- The animation's name
|
||||||
|
ped, -- Optional, for if you want any one other than the player to do the animation
|
||||||
|
)
|
||||||
|
```
|
||||||
|
### `makeVeh(model, coords)`
|
||||||
|
Spawns a vehicle for the player to use
|
||||||
|
- Server Synced
|
||||||
|
- Easy creation
|
||||||
|
- Returns entity id for further control through the script
|
||||||
|
- Loads model before spawning
|
||||||
|
- Unloads model from memory cache after spawn
|
||||||
|
|
||||||
|
Example of use:
|
||||||
|
```lua
|
||||||
|
local vehicle = makeVeh(
|
||||||
|
`zentorno`,
|
||||||
|
vec4(-596.74, 2090.99, 131.41, 16.6)
|
||||||
|
)
|
||||||
|
print(vehicle, GetEntityCoords(vehicle))
|
||||||
|
```
|
||||||
|
|
||||||
|
### `makePed(model, coords, freeze, collision, scenario, anim, synced)`
|
||||||
|
Spawns a controllable ped
|
||||||
|
- Loads the model before spawning
|
||||||
|
- Unloads model from memory cache after spawn
|
||||||
|
- Several options for creation
|
||||||
|
- Can spawn with scenario name or anims
|
||||||
|
- Spawns invincible
|
||||||
|
|
||||||
|
Example of use:
|
||||||
|
```lua
|
||||||
|
local ped = makePed(
|
||||||
|
`MP_M_Freemode_011,
|
||||||
|
vec4(-596.74, 2090.99, 131.41, 16.6),
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
nil,
|
||||||
|
{ "amb@prop_human_parking_meter@male@idle_a", "idle_a" },
|
||||||
|
false
|
||||||
|
)
|
||||||
|
print(ped, GetEntityCoords(ped))
|
||||||
|
```
|
||||||
|
|
||||||
|
### `makeProp(data, freeze, synced)`
|
||||||
|
This function is made to easily load a prop in the world
|
||||||
|
- Has a simplified process
|
||||||
|
- Lodas model before spawning prop
|
||||||
|
- Unloads model from memory cache when done
|
||||||
|
- Returns entity id for control through the script
|
||||||
|
|
||||||
|
Example of use:
|
||||||
|
```lua
|
||||||
|
local entityid = makeProp(
|
||||||
|
{
|
||||||
|
prop = "v_serv_plas_boxgt2", -- Prop model, can be a string or hash key
|
||||||
|
coords = vec4(-596.74, 2090.99, 131.41, 16.6), -- needs to be vector4 or vec4, 4th variable is heading
|
||||||
|
},
|
||||||
|
true, -- Decide if the entiy is frozen in place
|
||||||
|
false -- Does this prop spawn for everyone or just the client
|
||||||
|
)
|
||||||
|
print(entityid, GetEntityCoords(entityid))
|
||||||
|
```
|
||||||
|
|
||||||
|
### `instantLookEnt(ent, ent2)`
|
||||||
|
This function forcibly changes `ent`'s heading to face `ent2`
|
||||||
|
|
||||||
|
Helpful for animations in a specific direction
|
||||||
|
|
||||||
|
### `lookEnt(entity)`
|
||||||
|
This function attempts to slowly turn the player to the given entity/coords
|
||||||
|
|
||||||
|
Accepts either a `entity ID` or `vector3`
|
||||||
|
|
||||||
|
### `destroyProp(entity)`
|
||||||
|
Attempts to remove a spawned prop
|
||||||
|
|
||||||
|
If its attached to a player it attempts to to detatch it first
|
||||||
|
|
||||||
|
### `pushVehicle(entity)`
|
||||||
|
This attempts to make the current entity(vehicle) network controlled
|
||||||
|
|
||||||
|
This helps with syncing it with other players (used in jim-mechanic often)
|
||||||
|
|
||||||
|
### `ensureNetToVeh(vehNetId)`
|
||||||
|
This was created to get around fivem's warnings of failing to get network objects
|
||||||
|
|
||||||
|
Although these warnings mean't nothing, it is annoying
|
||||||
|
|
||||||
|
This is made to replace the native `NetToVeh()` but checking first if it exists
|
||||||
|
|
||||||
|
### `makeBlip(data)`
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
517
crafting.lua
517
crafting.lua
@@ -6,75 +6,82 @@ if IsDuplicityVersion() then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local timeout = 0
|
local timeout, timing, stashItems = 0, false, {}
|
||||||
local timing = false
|
|
||||||
local stashItems = {}
|
|
||||||
function GetStashTimeout(stashName, stop)
|
function GetStashTimeout(stashName, stop)
|
||||||
if stop then stashItems = {} timing = false timeout = 0 return end
|
if stop then stashItems, timing, timeout = {}, false, 0 return end
|
||||||
if stashItems[1] then return true else
|
if #stashItems > 0 then return true end
|
||||||
if timeout <= 0 then
|
if timeout <= 0 then
|
||||||
stashItems = triggerCallback(GetCurrentResourceName()..':server:GetStashItems', stashName)
|
stashItems = triggerCallback(GetCurrentResourceName()..':server:GetStashItems', stashName)
|
||||||
timeout = 15000
|
timeout = 10000
|
||||||
if not timing then
|
if not timing then
|
||||||
CreateThread(function()
|
CreateThread(function()
|
||||||
timing = true
|
timing = true
|
||||||
while timeout > 0 do timeout -= 1000 Wait(1000) end
|
while timeout > 0 do timeout -= 1000 Wait(1000) end
|
||||||
timing = false stashItems = {} timeout = 0
|
timing, stashItems, timeout = false, {}, 0
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local CraftLock = false
|
local CraftLock = false
|
||||||
function craftingMenu(data) local hasjob = false
|
function craftingMenu(data)
|
||||||
if CraftLock then return end
|
if CraftLock then return end
|
||||||
if data.stashName and not GetStashTimeout(data.stashName) then
|
if data.stashName and not GetStashTimeout(data.stashName) then
|
||||||
--triggerNotify(nil, "Chacking", "success")
|
--triggerNotify(nil, "Chacking", "success")
|
||||||
end
|
end
|
||||||
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
||||||
local Menu = {}
|
local Menu, hasjob = {}, false
|
||||||
local Recipes = data.craftable.Recipes
|
local Recipes = data.craftable.Recipes
|
||||||
|
local tempCarryTable = {}
|
||||||
for i = 1, #Recipes do
|
for i = 1, #Recipes do
|
||||||
for k, v in pairs(Recipes[i]) do
|
for k in pairs(Recipes[i]) do
|
||||||
|
if k ~= "amount" and k ~= "job" and k ~= "gang" then
|
||||||
|
tempCarryTable[k] = Recipes[i].amount or 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local canCarryTable = triggerCallback(GetCurrentResourceName()..':server:canCarry', tempCarryTable)
|
||||||
|
for i = 1, #Recipes do
|
||||||
|
if not Recipes[i]["amount"] then Recipes[i]["amount"] = 1 end
|
||||||
|
for k, v in pairs(Recipes[i]) do
|
||||||
if k ~= "amount" and k ~= "job" and k ~= "gang" then
|
if k ~= "amount" and k ~= "job" and k ~= "gang" then
|
||||||
if not Recipes[i]["amount"] then Recipes[i]["amount"] = 1 end
|
if Recipes[i].job then
|
||||||
if Recipes[i].job then hasjob = false
|
|
||||||
for l, b in pairs(Recipes[i].job) do
|
for l, b in pairs(Recipes[i].job) do
|
||||||
hasjob = hasJob(l, nil, b)
|
hasjob = hasJob(l, nil, b)
|
||||||
if hasJob == true then break end
|
if hasjob == true then break end
|
||||||
end
|
end
|
||||||
end
|
else hasjob = true end
|
||||||
local setheader, settext = "", ""
|
local setheader, settext, disable = "", "", false
|
||||||
local disable = false
|
if hasjob then
|
||||||
if Recipes[i].job and hasjob == false then else
|
|
||||||
local itemTable = {}
|
local itemTable = {}
|
||||||
for l, b in pairs(Recipes[i][tostring(k)]) do
|
for l, b in pairs(Recipes[i][tostring(k)]) do
|
||||||
settext = settext..(settext ~= "" and br or "")..(Items[l] and Items[l].label or "error - "..l)..(b > 1 and " x"..b or "")
|
settext = settext..(settext ~= "" and br or "")..(Items[l] and Items[l].label or "error - "..l)..(b > 1 and " x"..b or "")
|
||||||
itemTable[l] = b
|
itemTable[l] = b
|
||||||
Wait(0)
|
Wait(0)
|
||||||
end
|
end
|
||||||
|
while not canCarryTable do Wait(0) end
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Checking"..(data.stashName and " ^7'^6"..data.stashName.."^7'" or "").." ^2ingredients^7 - ^6"..k.."^7") end
|
if Config.System.Debug then print("^6Bridge^7: ^2Checking"..(data.stashName and " ^7'^6"..data.stashName.."^7'" or "").." ^2ingredients^7 - ^6"..k.."^7") end
|
||||||
if data.stashName then disable = not stashhasItem(stashItems, itemTable)
|
if data.stashName then disable = not stashhasItem(stashItems, itemTable)
|
||||||
else disable = not hasItem(itemTable) end
|
else disable = not hasItem(itemTable) end
|
||||||
|
setheader = (Items[tostring(k)] and Items[tostring(k)].label or "error - " .. tostring(k)) .. (Recipes[i]["amount"] > 1 and " x" .. Recipes[i]["amount"] or "")
|
||||||
setheader = Items[tostring(k)].label..(Recipes[i]["amount"] > 1 and " x"..Recipes[i]["amount"] or "")..(not disable and " ✔️" or "")
|
if not disable then
|
||||||
|
if not canCarryTable[k] then setheader = setheader .. " 📦"
|
||||||
|
else setheader = setheader .. " ✔️" end
|
||||||
|
elseif not canCarryTable[k] then setheader = setheader .. " 📦" end
|
||||||
Menu[#Menu + 1] = {
|
Menu[#Menu + 1] = {
|
||||||
isMenuHeader = disable,
|
isMenuHeader = disable or not canCarryTable[k],
|
||||||
icon = invImg(tostring(k)),
|
icon = invImg(tostring(k)),
|
||||||
header = setheader, txt = settext,
|
header = setheader,
|
||||||
|
txt = settext,
|
||||||
onSelect = function()
|
onSelect = function()
|
||||||
local transdata = { item = k, craft = data.craftable.Recipes[i], craftable = data.craftable, coords = data.coords, stashName = data.stashName, onBack = data.onBack }
|
local transdata = { item = k, craft = data.craftable.Recipes[i], craftable = data.craftable, coords = data.coords, stashName = data.stashName, onBack = data.onBack, }
|
||||||
if Config.Crafting.MultiCraft then
|
if Config.Crafting.MultiCraft then multiCraft(transdata) else makeItem(transdata) end
|
||||||
multiCraft(transdata)
|
|
||||||
else
|
|
||||||
makeItem(transdata)
|
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Wait(0)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
openMenu(Menu, { header = data.craftable.Header, onBack = data.onBack or nil, canClose = true, onExit = function() end, })
|
openMenu(Menu, { header = data.craftable.Header, onBack = data.onBack or nil, canClose = true, onExit = function() end, })
|
||||||
@@ -118,61 +125,54 @@ function multiCraft(data) local Menu = {}
|
|||||||
end
|
end
|
||||||
|
|
||||||
function makeItem(data)
|
function makeItem(data)
|
||||||
if not CraftLock then CraftLock = true else return end
|
if CraftLock then return end
|
||||||
local bartime, bartext, animDict, anim = nil, nil, nil, nil
|
CraftLock = true
|
||||||
if data.craftable.progressBar then
|
|
||||||
bartime = data.craftable.progressBar.time
|
|
||||||
bartext = data.craftable.progressBar.label
|
|
||||||
else
|
|
||||||
bartime = 5000
|
|
||||||
bartext = Loc[Config.Lan].progressbar["progress_make"]
|
|
||||||
end
|
|
||||||
animDict = data.craftable.Anims.animDict or "amb@prop_human_parking_meter@male@idle_a"
|
|
||||||
anim = data.craftable.Anims.anim or "idle_a"
|
|
||||||
|
|
||||||
local amount = (data.amount and data.amount ~= 1) and data.amount or 1
|
local bartime = data.craftable.progressBar and data.craftable.progressBar.time or 5000
|
||||||
|
local bartext = (data.craftable.progressBar and data.craftable.progressBar.label) or (Loc[Config.Lan].progressbar and Loc[Config.Lan].progressbar["progress_make"]) or "Making a"
|
||||||
local crafted = true
|
local animDict = data.craftable.Anims and data.craftable.Anims.animDict or "amb@prop_human_parking_meter@male@idle_a"
|
||||||
local crafting = true
|
local anim = data.craftable.Anims and data.craftable.Anims.anim or "idle_a"
|
||||||
|
local amount = data.amount and (data.amount ~= 1) and data.amount or 1
|
||||||
local cam = createTempCam(PlayerPedId(), data.coords)
|
|
||||||
startTempCam(cam)
|
|
||||||
|
|
||||||
|
local crafted, crafting = true, true
|
||||||
|
local cam = createTempCam(PlayerPedId(), data.coords)
|
||||||
|
startTempCam(cam)
|
||||||
for i = 1, amount do
|
for i = 1, amount do
|
||||||
for _, v in pairs(data.craft) do
|
for k, v in pairs(data.craft) do
|
||||||
if type(v) == "table" then
|
if k ~= "amount" and k ~= "job" then
|
||||||
for l, b in pairs(v) do
|
if type(v) == "table" then
|
||||||
if crafting and progressBar({
|
for l, b in pairs(v) do
|
||||||
label = "Using "..b.." "..Items[l].label,
|
if crafting and progressBar({
|
||||||
time = 1000,
|
label = "Using "..b.." "..Items[l].label,
|
||||||
cancel = true,
|
time = 1000,
|
||||||
dict = 'pickup_object',
|
cancel = true,
|
||||||
anim = "putdown_low",
|
dict = 'pickup_object',
|
||||||
flag = 48,
|
anim = "putdown_low",
|
||||||
icon = l,
|
flag = 48,
|
||||||
}) then
|
icon = l,
|
||||||
--TriggerEvent('inventory:client:ItemBox', Items[l], "use", b) -- Show item box for each item
|
}) then
|
||||||
else
|
--TriggerEvent('inventory:client:ItemBox', Items[l], "use", b) -- Show item box for each item
|
||||||
crafted = false
|
else
|
||||||
crafting = false
|
crafted, crafting = false, false
|
||||||
break
|
break
|
||||||
|
end
|
||||||
|
Wait(200)
|
||||||
end
|
end
|
||||||
Wait(200)
|
if crafted then
|
||||||
end
|
if crafting and progressBar({
|
||||||
if crafted then
|
label = bartext..Items[data.item].label,
|
||||||
if crafting and progressBar({
|
time = bartime,
|
||||||
label = bartext..Items[data.item].label,
|
cancel = true,
|
||||||
time = bartime,
|
dict = animDict,
|
||||||
cancel = true,
|
anim = anim,
|
||||||
dict = animDict,
|
flag = 8,
|
||||||
anim = anim,
|
icon = data.item,
|
||||||
flag = 8,
|
}) then
|
||||||
icon = data.item,
|
TriggerServerEvent(GetCurrentResourceName()..":Crafting:GetItem", data.item, data.craft, data.stashName)
|
||||||
}) then
|
else
|
||||||
TriggerServerEvent(GetCurrentResourceName()..":Crafting:GetItem", data.item, data.craft, data.stashName)
|
crafting = false
|
||||||
else
|
break
|
||||||
crafting = false
|
end
|
||||||
break
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -187,32 +187,101 @@ function makeItem(data)
|
|||||||
end
|
end
|
||||||
|
|
||||||
RegisterNetEvent(GetCurrentResourceName()..":Crafting:GetItem", function(ItemMake, craftable, stashName)
|
RegisterNetEvent(GetCurrentResourceName()..":Crafting:GetItem", function(ItemMake, craftable, stashName)
|
||||||
local src = source
|
local src, amount, stashItems = source, craftable and craftable.amount or 1, stashName and getStash(stashName)
|
||||||
local amount = 1
|
|
||||||
if stashName then
|
if stashName then
|
||||||
local stashItems = getStash(stashName)
|
|
||||||
if craftable["amount"] then amount = craftable["amount"] end
|
|
||||||
local itemRemove = {}
|
local itemRemove = {}
|
||||||
for k, v in pairs(craftable[ItemMake]) do
|
for k, v in pairs(craftable[ItemMake] or {}) do
|
||||||
for l, b in pairs(stashItems) do
|
for _, b in pairs(stashItems or {}) do
|
||||||
if k == b.name then
|
if k == b.name then itemRemove[k] = v end
|
||||||
itemRemove[k] = v
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
stashRemoveItem(stashItems, stashName, itemRemove)
|
stashRemoveItem(stashItems, stashName, itemRemove)
|
||||||
else
|
else
|
||||||
if craftable then
|
if craftable then
|
||||||
if craftable["amount"] then amount = craftable["amount"] end
|
for k, v in pairs(craftable[ItemMake] or {}) do
|
||||||
for k, v in pairs(craftable[ItemMake]) do
|
|
||||||
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", false, tostring(k), v, src)
|
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", false, tostring(k), v, src)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", true, ItemMake, amount, src)
|
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", true, ItemMake, amount, src)
|
||||||
|
if GetResourceState("core_skills"):find("start") then exports["core_skills"]:AddExperience(src, 2) end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
--[[SHOPS]]--
|
--[[SHOPS]]--
|
||||||
|
function sellMenu(data)
|
||||||
|
local origData = data
|
||||||
|
local Menu = {}
|
||||||
|
if data.sellTable.Items then
|
||||||
|
local itemList = {}
|
||||||
|
for k, v in pairs(data.sellTable.Items) do itemList[k] = 1 end
|
||||||
|
local hasitems, hasTable = hasItem(itemList)
|
||||||
|
for k, v in pairsByKeys(data.sellTable.Items) do
|
||||||
|
Menu[#Menu +1] = {
|
||||||
|
isMenuHeader = not hasTable[k].hasItem,
|
||||||
|
icon = invImg(k),
|
||||||
|
header = Items[k].label.. (hasTable[k].hasItem and "💰 (x"..hasTable[k].count..")" or ""),
|
||||||
|
txt = Loc[Config.Lan].info["sell_all"].." "..v.." "..Loc[Config.Lan].info["sell_each"],
|
||||||
|
onSelect = function()
|
||||||
|
sellAnim({ item = k, price = v, ped = data.ped, onBack = function() sellMenu(data) end })
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for k, v in pairsByKeys(data.sellTable) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
Menu[#Menu +1] = {
|
||||||
|
arrow = true,
|
||||||
|
header = k,
|
||||||
|
txt = "Amount of items: "..countTable(v.Items),
|
||||||
|
onSelect = function()
|
||||||
|
v.onBack = function() sellMenu(origData) end
|
||||||
|
v.sellTable = data.sellTable[k]
|
||||||
|
sellMenu(v)
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
openMenu(Menu, { header = data.sellTable.Header or "Amount of items: "..countTable(data.sellTable.Items), canClose = true, onBack = data.onBack })
|
||||||
|
end
|
||||||
|
|
||||||
|
function sellAnim(data)
|
||||||
|
if not hasItem(data.item, 1) then
|
||||||
|
triggerNotify(nil, Loc[Config.Lan].error["dont_have"].." "..Items[data.item].label, "error")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
for k, v in pairs(GetGamePool('CObject')) do
|
||||||
|
for _, model in pairs({`p_cs_clipboard`}) do
|
||||||
|
if GetEntityModel(v) == model then
|
||||||
|
if IsEntityAttachedToEntity(data.ped, v) then
|
||||||
|
DeleteObject(v) DetachEntity(v, 0, 0) SetEntityAsMissionEntity(v, true, true)
|
||||||
|
Wait(100) DeleteEntity(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
TriggerServerEvent(GetCurrentResourceName().."Sellitems", data) -- Had to slip in the sell command during the animation command
|
||||||
|
lookEnt(data.ped)
|
||||||
|
local dict = "mp_common"
|
||||||
|
playAnim(dict, "givetake2_a", 0.3, 2)
|
||||||
|
playAnim(dict, "givetake2_b", 0.3, 2, data.ped)
|
||||||
|
Wait(2000)
|
||||||
|
StopAnimTask(PlayerPedId(), dict, "givetake2_a", 0.5)
|
||||||
|
StopAnimTask(data.ped, dict, "givetake2_b", 0.5)
|
||||||
|
if data.onBack then data.onBack() end
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName().."Sellitems", function(data)
|
||||||
|
local src = source
|
||||||
|
local hasItems, hasTable = hasItem(data.item, 1, src)
|
||||||
|
if hasItems then
|
||||||
|
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", false, data.item, hasTable[data.item].count, src)
|
||||||
|
TriggerEvent(GetCurrentResourceName()..":server:FundPlayer", (hasTable[data.item].count * data.price), "cash", src)
|
||||||
|
else
|
||||||
|
triggerNotify(nil,Loc[Config.Lan].error["dont_have"].." "..Items[data.item].label, "error", src)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
function openShop(data)
|
function openShop(data)
|
||||||
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then
|
||||||
@@ -230,33 +299,45 @@ function hasItem(items, amount, src) local amount = amount and amount or 1
|
|||||||
if type(items) ~= "table" then items = { [items] = amount and amount or 1, } end
|
if type(items) ~= "table" then items = { [items] = amount and amount or 1, } end
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then
|
||||||
foundInv = OXInv
|
foundInv = OXInv
|
||||||
if src then grabInv = exports.ox_inventory:GetInventoryItems(src)
|
if src then grabInv = exports[OXInv]:GetInventoryItems(src)
|
||||||
else grabInv = exports[OXInv]:GetPlayerItems()
|
else grabInv = exports[OXInv]:GetPlayerItems() end
|
||||||
end
|
|
||||||
|
|
||||||
elseif GetResourceState(QSInv):find("start") then
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
foundInv = QSInv
|
foundInv = QSInv
|
||||||
if src then grabInv = exports[QSInv]:GetInventory(src)
|
if src then grabInv = exports[QSInv]:GetInventory(src)
|
||||||
else grabInv = exports[QSInv]:getUserInventory()
|
else grabInv = exports[QSInv]:getUserInventory() end
|
||||||
end
|
|
||||||
|
elseif GetResourceState(OrigenInv):find("start") then
|
||||||
|
foundInv = OrigenInv
|
||||||
|
if src then grabInv = exports[OrigenInv]:GetInventory(src)
|
||||||
|
else grabInv = exports[OrigenInv]:getPlayerInventory() end
|
||||||
|
|
||||||
elseif GetResourceState(CoreInv):find("start") then
|
elseif GetResourceState(CoreInv):find("start") then
|
||||||
foundInv = CoreInv
|
foundInv = CoreInv
|
||||||
if src then grabInv = exports['core_inventory']:getInventory('primary-'..src)
|
if src then
|
||||||
else grabInv = exports[CoreInv]:getInventory('primary-'..GetPlayerServerId(PlayerPedId()))
|
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||||
|
grabInv = Core.Functions.GetPlayer(src).PlayerData.items
|
||||||
|
elseif GetResourceState(ESXExport):find("start") then
|
||||||
|
local Player = ESX.GetPlayerFromId(src)
|
||||||
|
grabInv = Player.getInventory(false)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local p = promise.new()
|
||||||
|
Core.Functions.TriggerCallback('core_inventory:server:getInventory', function(cb) p:resolve(cb) end)
|
||||||
|
local result = Citizen.Await(p)
|
||||||
|
if type(result) == "string" then result = json.decode(result) end
|
||||||
|
grabInv = result
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(CodeMInv):find("start") then
|
elseif GetResourceState(CodeMInv):find("start") then
|
||||||
foundInv = CodeMInv
|
foundInv = CodeMInv
|
||||||
if src then grabInv = exports[CodeMInv]:GetUserInventory(src)
|
if src then grabInv = exports[CodeMInv]:GetUserInventory(src)
|
||||||
else grabInv = exports[CodeMInv]:GetClientPlayerInventory()
|
else grabInv = exports[CodeMInv]:GetClientPlayerInventory() end
|
||||||
end
|
|
||||||
|
|
||||||
elseif GetResourceState(QBInv):find("start") then
|
elseif GetResourceState(QBInv):find("start") then
|
||||||
foundInv = QBInv
|
foundInv = QBInv
|
||||||
if src then grabInv = Core.Functions.GetPlayer(src).PlayerData.items
|
if src then grabInv = Core.Functions.GetPlayer(src).PlayerData.items
|
||||||
else grabInv = Core.Functions.GetPlayerData().items
|
else grabInv = Core.Functions.GetPlayerData().items end
|
||||||
end
|
|
||||||
|
|
||||||
else
|
else
|
||||||
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
@@ -268,20 +349,15 @@ function hasItem(items, amount, src) local amount = amount and amount or 1
|
|||||||
if not Items[item] then print("^4ERROR^7: ^2Script can't find ingredient item in Shared Items - ^1"..item.."^7") end
|
if not Items[item] then print("^4ERROR^7: ^2Script can't find ingredient item in Shared Items - ^1"..item.."^7") end
|
||||||
local count = 0
|
local count = 0
|
||||||
for _, itemData in pairs(grabInv) do
|
for _, itemData in pairs(grabInv) do
|
||||||
if itemData and (itemData.name == item) then
|
if itemData and (itemData.name == item) then count += (itemData.count or itemData.amount or 1) end
|
||||||
--if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(item).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.count or itemData.amount).."^7)", foundInv) end
|
|
||||||
count += ((itemData.count or itemData.amount) or 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if count >= amount then
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7[^6"..foundInv.."^7]: "..tostring(item).." ^3"..count.."^7/^3"..amount.." ^5FOUND^7") end
|
|
||||||
hasTable[item] = { hasItem = true, count = count, }
|
|
||||||
else
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7[^6"..foundInv.."^7]: "..tostring(item).." ^1"..count.."^7/^3"..amount.." ^1NOT FOUND^7") end
|
|
||||||
hasTable[item] = { hasItem = false, count = count, }
|
|
||||||
end
|
end
|
||||||
|
foundInv = foundInv:gsub("%-", "^7-^6"):gsub("%_", "^7_^6")
|
||||||
|
local foundMessage = "^6Bridge^7: ^3hasItem^7[^6"..foundInv.."^7]: "..tostring(item).." ^3"..count.."^7/^3"..amount
|
||||||
|
if count >= amount then foundMessage = foundMessage.." ^5FOUND^7" else foundMessage = foundMessage .." ^1NOT FOUND^7" end
|
||||||
|
if Config.System.Debug then print(foundMessage) end
|
||||||
|
hasTable[item] = { hasItem = count >= amount, count = count }
|
||||||
end
|
end
|
||||||
for k, v in pairs(hasTable) do if v.hasItem == false then return false, hasTable end end
|
for k, v in pairs(hasTable) do if not v.hasItem then return false, hasTable end end
|
||||||
return true, hasTable
|
return true, hasTable
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -300,38 +376,46 @@ function openStash(data)
|
|||||||
lookEnt(data.coords)
|
lookEnt(data.coords)
|
||||||
end
|
end
|
||||||
|
|
||||||
function getStash(stashName)
|
function getStash(stashName) local stashResource = ""
|
||||||
local stashItems, items = {}, {}
|
local stashItems, items = {}, {}
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then stashResource = OXInv
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7ox_inventory") end
|
|
||||||
stashItems = exports[OXInv]:Inventory(stashName).items
|
stashItems = exports[OXInv]:Inventory(stashName).items
|
||||||
elseif GetResourceState(QSInv):find("start") then
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7qs-inventory") end
|
elseif GetResourceState(QSInv):find("start") then stashResource = QSInv
|
||||||
stashItems = exports[QSInv]:GetStashItems(stashName)
|
stashItems = exports[QSInv]:GetStashItems(stashName)
|
||||||
elseif GetResourceState(CodeMInv):find("start") then
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7qs-inventory") end
|
elseif GetResourceState(CoreInv):find("start") then stashResource = CoreInv
|
||||||
|
stashItems = exports[CoreInv]:getInventory(stashName)
|
||||||
|
|
||||||
|
elseif GetResourceState(CodeMInv):find("start") then stashResource = CodeMInv
|
||||||
stashItems = exports[CodeMInv]:GetInventoryItems('Stash', stashName)
|
stashItems = exports[CodeMInv]:GetInventoryItems('Stash', stashName)
|
||||||
elseif GetResourceState(QBInv):find("start") then
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7qb-inventory") end
|
elseif GetResourceState(OrigenInv):find("start") then stashResource = OrigenInv
|
||||||
|
stashItems = exports[OrigenInv]:GetStashItems(stashName)
|
||||||
|
|
||||||
|
elseif GetResourceState(QBInv):find("start") then stashResource = QBInv
|
||||||
local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', { stashName })
|
local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', { stashName })
|
||||||
if result then stashItems = json.decode(result) end
|
if result then stashItems = json.decode(result) end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7"..stashResource) end
|
||||||
if stashItems then
|
if stashItems then
|
||||||
for _, item in pairs(stashItems) do
|
for _, item in pairs(stashItems) do
|
||||||
local itemInfo = Items[item.name:lower()]
|
local itemInfo = Items[item.name:lower()]
|
||||||
if itemInfo then
|
if itemInfo then
|
||||||
items[item.slot] = {
|
local indexNum = #items+1 -- Added to help recreate missing slot numbers
|
||||||
name = itemInfo["name"],
|
items[(item.slot and item.slot) or indexNum] = {
|
||||||
|
name = itemInfo.name or nil,
|
||||||
amount = tonumber(item.amount) or tonumber(item.count),
|
amount = tonumber(item.amount) or tonumber(item.count),
|
||||||
info = item.info ~= nil and item.info or "",
|
info = item.info or "",
|
||||||
label = itemInfo["label"],
|
label = itemInfo.label or nil,
|
||||||
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
description = itemInfo.description or "",
|
||||||
weight = itemInfo["weight"],
|
weight = itemInfo.weight or nil,
|
||||||
type = itemInfo["type"],
|
type = itemInfo.type or nil,
|
||||||
unique = itemInfo["unique"],
|
unique = itemInfo.unique or nil,
|
||||||
useable = itemInfo["useable"],
|
useable = itemInfo.useable or nil,
|
||||||
image = itemInfo["image"],
|
image = itemInfo.image or nil,
|
||||||
slot = item.slot,
|
slot = (item.slot and item.slot) or indexNum,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -346,11 +430,32 @@ function stashRemoveItem(stashItems, stashName, items) local amount = amount and
|
|||||||
exports[OXInv]:RemoveItem(stashName, k, v)
|
exports[OXInv]:RemoveItem(stashName, k, v)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..OXInv, k, v) end
|
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..OXInv, k, v) end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QSInv):find("start") then
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
|
for k, v in pairs(items) do
|
||||||
|
for l in pairs(stashItems) do
|
||||||
|
if stashItems[l].name == k then
|
||||||
|
if (stashItems[l].amount - v) <= 0 then
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^2None of this item left in stash ^3Stash^7", k, v)
|
||||||
|
end
|
||||||
|
stashItems[l] = nil
|
||||||
|
else
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QBInv, k, v)
|
||||||
|
end
|
||||||
|
exports[QSInv]:RemoveItemIntoStash(stashName, k, v, l)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(CoreInv):find("start") then
|
||||||
for k, v in pairs(items) do
|
for k, v in pairs(items) do
|
||||||
exports[QSInv]:RemoveItemIntoStash(stashName, k, v)
|
exports[CoreInv]:removeItemExact(stashName, k, v)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QSInv, k, v) end
|
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..CoreInv, k, v) end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(CodeMInv):find("start") then
|
elseif GetResourceState(CodeMInv):find("start") then
|
||||||
for k, v in pairs(items) do
|
for k, v in pairs(items) do
|
||||||
for l in pairs(stashItems) do
|
for l in pairs(stashItems) do
|
||||||
@@ -372,6 +477,13 @@ function stashRemoveItem(stashItems, stashName, items) local amount = amount and
|
|||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName.."^7'")
|
print("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName.."^7'")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(OrigenInv):find("start") then
|
||||||
|
for k, v in pairs(items) do
|
||||||
|
exports[OrigenInv]:RemoveFromStash(stashName, k, v)
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..OrigenInv, k, v) end
|
||||||
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QBInv):find("start") then
|
elseif GetResourceState(QBInv):find("start") then
|
||||||
for k, v in pairs(items) do
|
for k, v in pairs(items) do
|
||||||
for l in pairs(stashItems) do
|
for l in pairs(stashItems) do
|
||||||
@@ -401,7 +513,15 @@ end
|
|||||||
RegisterNetEvent(GetCurrentResourceName()..":server:stashRemoveItem", stashRemoveItem)
|
RegisterNetEvent(GetCurrentResourceName()..":server:stashRemoveItem", stashRemoveItem)
|
||||||
|
|
||||||
function stashhasItem(stashItems, items, amount)
|
function stashhasItem(stashItems, items, amount)
|
||||||
|
local invs = {OXInv, QSInv, CoreInv, CodeMInv, OrigenInv, QBInv}
|
||||||
local foundInv = ""
|
local foundInv = ""
|
||||||
|
for _, inv in ipairs(invs) do
|
||||||
|
if GetResourceState(inv):find("start") then
|
||||||
|
foundInv = inv:gsub("%-", "^7-^6"):gsub("%_", "^7_^6")
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if type(items) ~= "table" then items = { [items] = amount and amount or 1, } end
|
if type(items) ~= "table" then items = { [items] = amount and amount or 1, } end
|
||||||
local hasTable = {}
|
local hasTable = {}
|
||||||
for item, amount in pairs(items) do
|
for item, amount in pairs(items) do
|
||||||
@@ -411,14 +531,105 @@ function stashhasItem(stashItems, items, amount)
|
|||||||
count += (itemData.amount or 1)
|
count += (itemData.amount or 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if count >= amount then
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^3stashHasItem^7: ^5FOUND '"..item.."' ^3"..count.."^7/^3"..amount.."^7") end
|
local debugMsg = string.format("^6Bridge^7: ^3stashHasItem^7[^6%s^7]: %s '%s' ^3%d^7/^3%d^7", foundInv, (count >= amount and "^5FOUND^7" or "^1NOT FOUND^7"), item, count, amount)
|
||||||
hasTable[item] = { hasItem = true, count = count, }
|
if Config.System.Debug then print(debugMsg) end
|
||||||
else
|
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^3stashHasItem^7: ^1NOT FOUND^7 '"..item.."' ^1"..count.."^7/^3"..amount.."^7") end
|
hasTable[item] = { hasItem = (count >= amount), count = count }
|
||||||
hasTable[item] = { hasItem = false, count = count, }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
for k, v in pairs(hasTable) do if v.hasItem == false then return false, hasTable end end
|
for k, v in pairs(hasTable) do if v.hasItem == false then return false, hasTable end end
|
||||||
return true, hasTable
|
return true, hasTable
|
||||||
|
end
|
||||||
|
|
||||||
|
if IsDuplicityVersion() then
|
||||||
|
if GetResourceState(OXLibExport):find("start") then
|
||||||
|
createCallback(GetCurrentResourceName()..':server:canCarry', function(source, itemTable) local result = canCarry(itemTable, source) return result end)
|
||||||
|
else
|
||||||
|
createCallback(GetCurrentResourceName()..':server:canCarry', function(source, cb, itemTable) local result = canCarry(itemTable, source) cb(result) end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function canCarry(itemTable, src)
|
||||||
|
local resultTable = {}
|
||||||
|
if src then
|
||||||
|
if GetResourceState(OXInv):find("start") then
|
||||||
|
for k, v in pairs(itemTable) do
|
||||||
|
resultTable[k] = exports[OXInv]:CanCarryItem(src, k, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
|
for k, v in pairs(itemTable) do
|
||||||
|
resultTable[k] = exports[OXInv]:CanCarryItem(src, k, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(CoreInv):find("start") then
|
||||||
|
--??
|
||||||
|
|
||||||
|
elseif GetResourceState(CodeMInv):find("start") then
|
||||||
|
for k, v in pairs(itemTable) do
|
||||||
|
local weight = Items[k].weight
|
||||||
|
resultTable[k] = exports[CodeMInv]:CanCarryItem(src, weight, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(OrigenInv):find("start") then
|
||||||
|
for k, v in pairs(itemTable) do
|
||||||
|
resultTable[k] = exports[OrigenInv]:canCarryItem(src, k, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(QBInv):find("start") then
|
||||||
|
local Player = Core.Functions.GetPlayer(src)
|
||||||
|
local items = Player.PlayerData.items
|
||||||
|
local weight, totalWeight = 0, 0
|
||||||
|
if not items then return false end
|
||||||
|
for _, item in pairs(items) do weight += item.weight * item.amount end
|
||||||
|
totalWeight = tonumber(weight)
|
||||||
|
|
||||||
|
for k, v in pairs(itemTable) do
|
||||||
|
local itemInfo = Items[k]
|
||||||
|
if not itemInfo and not Player.Offline then
|
||||||
|
triggerNotify(nil, 'Item does not exist', 'error', src)
|
||||||
|
resultTable[k] = true
|
||||||
|
else
|
||||||
|
resultTable[k] = (totalWeight + (Items[k]['weight'] * v)) <= 120000
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return resultTable
|
||||||
|
end
|
||||||
|
|
||||||
|
function getRandomReward(itemName) -- intended for job scripts
|
||||||
|
if Config.Rewards.RewardPool then
|
||||||
|
local reward = false
|
||||||
|
if type(Config.Rewards.RewardItem) == "string" then Config.Rewards.RewardItem = { Config.Rewards.RewardItem } end
|
||||||
|
for k, v in pairs(Config.Rewards.RewardItem) do
|
||||||
|
if v == itemName then reward = true break end
|
||||||
|
end
|
||||||
|
if reward then
|
||||||
|
removeItem(itemName, 1)
|
||||||
|
local totalRarity = 0
|
||||||
|
for i=1, #Config.Rewards.RewardPool do
|
||||||
|
totalRarity += Config.Rewards.RewardPool[i].rarity
|
||||||
|
end
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^3getRandomReward^7: ^2Total Rarity ^7'^6"..totalRarity.."^7'")
|
||||||
|
end
|
||||||
|
|
||||||
|
local randomNum = math.random(1, totalRarity)
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^3getRandomReward^7: ^2Random Number ^7'^6"..randomNum.."^7'")
|
||||||
|
end
|
||||||
|
local currentRarity = 0
|
||||||
|
for i=1, #Config.Rewards.RewardPool do
|
||||||
|
currentRarity += Config.Rewards.RewardPool[i].rarity
|
||||||
|
if randomNum <= currentRarity then
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^3getRandomReward^7: ^2Selected toy ^7'^6"..Config.Rewards.RewardPool[i].item.."^7'")
|
||||||
|
end
|
||||||
|
addItem(Config.Rewards.RewardPool[i].item, 1)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -7,8 +7,9 @@ Exports = {
|
|||||||
OXInv = "ox_inventory",
|
OXInv = "ox_inventory",
|
||||||
QBInv = "qb-inventory",
|
QBInv = "qb-inventory",
|
||||||
QSInv = "qs-inventory",
|
QSInv = "qs-inventory",
|
||||||
CoreInv = "core-inventory",
|
CoreInv = "core_inventory",
|
||||||
CodeMInv = "codem-inventory",
|
CodeMInv = "codem-inventory",
|
||||||
|
OrigenInv = "origen_inventory",
|
||||||
|
|
||||||
OXLibExport = "ox_lib",
|
OXLibExport = "ox_lib",
|
||||||
|
|
||||||
|
|||||||
397
functions.lua
397
functions.lua
@@ -8,20 +8,47 @@ function jobCheck(job)
|
|||||||
return canDo
|
return canDo
|
||||||
end
|
end
|
||||||
|
|
||||||
local time = 100
|
local time = 500
|
||||||
function loadModel(model)
|
function loadModel(model)
|
||||||
if not HasModelLoaded(model) then if Config.System.Debug then print("^6Bridge^7: ^2Loading Model^7: '^6"..model.."^7'") end
|
if not IsModelValid(model) then print("^6Bridge^7: ^1ERROR^7: ^2Model^7 - '^6"..model.."^7' ^2does not exist in server") return
|
||||||
while not HasModelLoaded(model) do if time > 0 then time -= 1 RequestModel(model)
|
else
|
||||||
else time = 1000 print("^6Bridge^7: ^3LoadModel^7: ^2Timed out loading model ^7'^6"..model.."^7'") break end
|
if not HasModelLoaded(model) then
|
||||||
Wait(10) end
|
if Config.System.Debug then print("^6Bridge^7: ^2Loading Model^7: '^6"..model.."^7'") end
|
||||||
|
while not HasModelLoaded(model) and time > 0 do time -= 1 RequestModel(model) Wait(0) end
|
||||||
|
if not HasModelLoaded(model) then print("^6Bridge^7: ^3LoadModel^7: ^2Timed out loading model ^7'^6"..model.."^7'") end
|
||||||
|
end
|
||||||
|
time = 500
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function unloadModel(model) if Config.System.Debug then print("^6Bridge^7: ^2Removing Model from memory cache^7: '^6"..model.."^7'") end SetModelAsNoLongerNeeded(model) end
|
||||||
|
|
||||||
|
function loadAnimDict(animDict)
|
||||||
|
if not DoesAnimDictExist(animDict) then print("^6Bridge^7: ^1ERROR^7: ^2Anim Dictionary^7 - '^6"..animDict.."^7' ^2does not exist in server") return
|
||||||
|
else
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Loading Anim Dictionary^7: '^6"..animDict.."^7'") end
|
||||||
|
while not HasAnimDictLoaded(animDict) do RequestAnimDict(animDict) Wait(5) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function unloadAnimDict(animDict) if Config.System.Debug then print("^6Bridge^7: ^2Removing Anim Dictionary from memory cache^7: '^6"..animDict.."^7'") end RemoveAnimDict(animDict) end
|
||||||
|
|
||||||
|
function loadPtfxDict(ptFxName)
|
||||||
|
if not HasNamedPtfxAssetLoaded(ptFxName) then
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^2Loading Ptfx Dictionary^7: '^6"..ptFxName.."^7'")
|
||||||
|
end
|
||||||
|
while not HasNamedPtfxAssetLoaded(ptFxName) do RequestNamedPtfxAsset(ptFxName) Wait(5) end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function unloadModel(model) if Config.System.Debug then print("^6Bridge^7: ^2Removing Model^7: '^6"..model.."^7'") end SetModelAsNoLongerNeeded(model) end
|
|
||||||
function loadAnimDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Loading Anim Dictionary^7: '^6"..dict.."^7'") end while not HasAnimDictLoaded(dict) do RequestAnimDict(dict) Wait(5) end end
|
|
||||||
function unloadAnimDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Removing Anim Dictionary^7: '^6"..dict.."^7'") end RemoveAnimDict(dict) end
|
|
||||||
function loadPtfxDict(dict) if Config.System.Debug then if not HasNamedPtfxAssetLoaded(dict) then print("^6Bridge^7: ^2Loading Ptfx Dictionary^7: '^6"..dict.."^7'") end end while not HasNamedPtfxAssetLoaded(dict) do RequestNamedPtfxAsset(dict) Wait(5) end end
|
|
||||||
function unloadPtfxDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Removing Ptfx Dictionary^7: '^6"..dict.."^7'") end RemoveNamedPtfxAsset(dict) end
|
function unloadPtfxDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Removing Ptfx Dictionary^7: '^6"..dict.."^7'") end RemoveNamedPtfxAsset(dict) end
|
||||||
function loadTextureDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Loading Texture Dictionary^7: '^6"..dict.."^7'") end while not HasStreamedTextureDictLoaded(dict) do RequestNamedPtfxAsset(dict) Wait(5) end end
|
|
||||||
|
function loadTextureDict(dict)
|
||||||
|
if not HasStreamedTextureDictLoaded(dict) then
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^2Loading Texture Dictionary^7: '^6"..dict.."^7'")
|
||||||
|
end
|
||||||
|
while not HasStreamedTextureDictLoaded(dict) do RequestStreamedTextureDict(dict) Wait(5) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function countTable(table) local i = 0 for keys in pairs(table) do i += 1 end return i end
|
function countTable(table) local i = 0 for keys in pairs(table) do i += 1 end return i end
|
||||||
|
|
||||||
@@ -32,8 +59,9 @@ function playAnim(animDict, animName, duration, flag, ped)
|
|||||||
TaskPlayAnim(ped and ped or PlayerPedId(), animDict, animName, 8.0, -8.0, duration or 30000, flag or 50, 1, false, false, false)
|
TaskPlayAnim(ped and ped or PlayerPedId(), animDict, animName, 8.0, -8.0, duration or 30000, flag or 50, 1, false, false, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
function stopAnim(animDict, animName)
|
function stopAnim(animDict, animName, ped)
|
||||||
StopAnimTask(PlayerPedId(), animName, animDict)
|
StopAnimTask(ped or PlayerPedId(), animDict, animName, 0.5)
|
||||||
|
StopAnimTask(ped or PlayerPedId(), animName, animDict, 0.5)
|
||||||
unloadAnimDict(animDict)
|
unloadAnimDict(animDict)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -60,7 +88,7 @@ local Peds = {}
|
|||||||
local Props = {}
|
local Props = {}
|
||||||
function makePed(model, coords, freeze, collision, scenario, anim, synced)
|
function makePed(model, coords, freeze, collision, scenario, anim, synced)
|
||||||
loadModel(model)
|
loadModel(model)
|
||||||
local ped = CreatePed(0, model, coords.x, coords.y, coords.z-1.03, coords.w, synced and synced or true, false)
|
local ped = CreatePed(0, model, coords.x, coords.y, coords.z-1.03, coords.w, synced and synced or false, false)
|
||||||
SetEntityInvincible(ped, true)
|
SetEntityInvincible(ped, true)
|
||||||
SetBlockingOfNonTemporaryEvents(ped, true)
|
SetBlockingOfNonTemporaryEvents(ped, true)
|
||||||
FreezeEntityPosition(ped, freeze and freeze or true)
|
FreezeEntityPosition(ped, freeze and freeze or true)
|
||||||
@@ -82,7 +110,7 @@ end
|
|||||||
|
|
||||||
function makeProp(data, freeze, synced)
|
function makeProp(data, freeze, synced)
|
||||||
loadModel(data.prop)
|
loadModel(data.prop)
|
||||||
local prop = CreateObject(data.prop, data.coords.x, data.coords.y, data.coords.z-1.03, synced or false, synced or false, false)
|
local prop = CreateObject(data.prop, data.coords.x, data.coords.y, data.coords.z-1.03, synced and synced or false, synced and synced or false, false)
|
||||||
SetEntityHeading(prop, data.coords.w + 180.0)
|
SetEntityHeading(prop, data.coords.w + 180.0)
|
||||||
FreezeEntityPosition(prop, freeze and freeze or 0)
|
FreezeEntityPosition(prop, freeze and freeze or 0)
|
||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
@@ -115,13 +143,6 @@ function DrawText3D(x, y, z, text)
|
|||||||
ClearDrawOrigin()
|
ClearDrawOrigin()
|
||||||
end
|
end
|
||||||
|
|
||||||
AddEventHandler('onResourceStop', function(r)
|
|
||||||
if r ~= GetCurrentResourceName() then return end
|
|
||||||
stopSpinner()
|
|
||||||
for i = 1, #Peds do DeletePed(Peds[i]) end
|
|
||||||
for i = 1, #Props do destroyProp(Props[i]) end
|
|
||||||
end)
|
|
||||||
|
|
||||||
function instantLookEnt(ent, ent2)
|
function instantLookEnt(ent, ent2)
|
||||||
local p1 = GetEntityCoords(ent, true)
|
local p1 = GetEntityCoords(ent, true)
|
||||||
local p2 = GetEntityCoords(ent2, true)
|
local p2 = GetEntityCoords(ent2, true)
|
||||||
@@ -193,27 +214,20 @@ end
|
|||||||
function ensureNetToVeh(vehNetID)
|
function ensureNetToVeh(vehNetID)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^3ensureNetToVeh^7: ^2Requesting NetworkDoesNetworkIdExist^7(^6"..vehNetID.."^7)") end
|
if Config.System.Debug then print("^6Bridge^7: ^3ensureNetToVeh^7: ^2Requesting NetworkDoesNetworkIdExist^7(^6"..vehNetID.."^7)") end
|
||||||
local timeout = 100
|
local timeout = 100
|
||||||
while not NetworkDoesNetworkIdExist(vehNetID) and timeout > 0 do
|
while not NetworkDoesNetworkIdExist(vehNetID) and timeout > 0 do timeout -= 1 Wait(10) end
|
||||||
timeout -= 1
|
if not NetworkDoesNetworkIdExist(vehNetID) then return 0 end
|
||||||
Wait(10)
|
|
||||||
end
|
|
||||||
if not NetworkDoesNetworkIdExist(vehNetID) then
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
timeout = 100
|
timeout = 100
|
||||||
local vehicle = NetToVeh(vehNetID)
|
local vehicle = NetToVeh(vehNetID)
|
||||||
while not DoesEntityExist(vehicle) and vehicle ~= 0 and timeout > 0 do
|
while not DoesEntityExist(vehicle) and vehicle ~= 0 and timeout > 0 do timeout -= 1 Wait(10) end
|
||||||
timeout -= 1
|
if not DoesEntityExist(vehicle) then return 0 end
|
||||||
Wait(10)
|
|
||||||
end
|
|
||||||
if not DoesEntityExist(vehicle) then
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
return vehicle
|
return vehicle
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local scriptTxd = not IsDuplicityVersion() and CreateRuntimeTxd(GetCurrentResourceName()..'scriptTxd') or nil
|
||||||
|
|
||||||
|
local customDUIList = {}
|
||||||
function makeBlip(data)
|
function makeBlip(data)
|
||||||
local blip = AddBlipForCoord(data.coords)
|
local blip = AddBlipForCoord(vec3(data.coords.x, data.coords.y, data.coords.z))
|
||||||
SetBlipAsShortRange(blip, true)
|
SetBlipAsShortRange(blip, true)
|
||||||
SetBlipSprite(blip, data.sprite or 106)
|
SetBlipSprite(blip, data.sprite or 106)
|
||||||
SetBlipColour(blip, data.col or 5)
|
SetBlipColour(blip, data.col or 5)
|
||||||
@@ -223,8 +237,20 @@ function makeBlip(data)
|
|||||||
BeginTextCommandSetBlipName('STRING')
|
BeginTextCommandSetBlipName('STRING')
|
||||||
AddTextComponentString(tostring(data.name))
|
AddTextComponentString(tostring(data.name))
|
||||||
EndTextCommandSetBlipName(blip)
|
EndTextCommandSetBlipName(blip)
|
||||||
|
if GetResourceState("blip_info"):find("start") or GetResourceState("blip-info"):find("start") or GetResourceState("blipinfo"):find("start") then
|
||||||
|
if data.preview then
|
||||||
|
local txname = tostring(data.name..'preview'..string.gsub(data.coords.z, "%.", ""))
|
||||||
|
if data.preview:find("http") then
|
||||||
|
createDui(txname, data.preview, vec2(512, 256), scriptTxd)
|
||||||
|
else
|
||||||
|
CreateRuntimeTextureFromImage(scriptTxd, txname, data.preview)
|
||||||
|
end
|
||||||
|
exports["blip_info"]:SetBlipInfoImage(blip, GetCurrentResourceName()..'scriptTxd', txname)
|
||||||
|
exports["blip_info"]:SetBlipInfoTitle(blip, data.name, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^6Blip ^2created for location^7: '^6"..data.name.."^7'") end
|
if Config.System.Debug then print("^6Bridge^7: ^6Blip ^2created for location^7: '^6"..data.name.."^7'") end
|
||||||
return blip
|
return blip
|
||||||
end
|
end
|
||||||
|
|
||||||
function makeEntityBlip(data)
|
function makeEntityBlip(data)
|
||||||
@@ -239,10 +265,135 @@ function makeEntityBlip(data)
|
|||||||
BeginTextCommandSetBlipName('STRING')
|
BeginTextCommandSetBlipName('STRING')
|
||||||
AddTextComponentString(tostring(data.name))
|
AddTextComponentString(tostring(data.name))
|
||||||
EndTextCommandSetBlipName(blip)
|
EndTextCommandSetBlipName(blip)
|
||||||
|
if GetResourceState("blip_info"):find("start") or GetResourceState("blip-info"):find("start") or GetResourceState("blipinfo"):find("start") then
|
||||||
|
if data.preview then
|
||||||
|
local txname = data.name..'preview'
|
||||||
|
if data.preview:find("http") then
|
||||||
|
createDui(txname, data.preview, vec2(512, 256), scriptTxd)
|
||||||
|
else
|
||||||
|
CreateRuntimeTextureFromImage(scriptTxd, txname, data.preview)
|
||||||
|
end
|
||||||
|
exports["blip_info"]:SetBlipInfoImage(blip, GetCurrentResourceName()..'previewTxd', txname)
|
||||||
|
exports["blip_info"]:SetBlipInfoTitle(blip, data.name, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^6Blip ^2created for Entity^7: '^6"..data.name.."^7'") end
|
if Config.System.Debug then print("^6Bridge^7: ^6Blip ^2created for Entity^7: '^6"..data.name.."^7'") end
|
||||||
return blip
|
return blip
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- DUI STUFF - WIP --
|
||||||
|
|
||||||
|
-- DUI CLIENT
|
||||||
|
function createDui(name, http, size, txd)
|
||||||
|
if not customDUIList[name] then
|
||||||
|
local newTxt = CreateDui(http, math.floor(size.x), math.floor(size.y))
|
||||||
|
while not GetDuiHandle(newTxt) do Wait(0) end
|
||||||
|
CreateRuntimeTextureFromDuiHandle(txd, name, GetDuiHandle(newTxt))
|
||||||
|
customDUIList[name] = newTxt
|
||||||
|
SetDuiUrl(customDUIList[name], http)
|
||||||
|
else
|
||||||
|
SetDuiUrl(customDUIList[name], http)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function DuiSelect(data)
|
||||||
|
local image = ""
|
||||||
|
for k, v in pairs(duiList[data.name]) do
|
||||||
|
if v.tex.texn == data.texn then
|
||||||
|
if duiList[data.name][k] then
|
||||||
|
image = "<center>- Current Image -<br>"..
|
||||||
|
"<img src="..duiList[data.name][k].url.." width=150px><br>"..
|
||||||
|
"Size: ["..math.floor(data.size.x)..", "..math.floor(data.size.y).."]<br><br>"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local dialog = exports['qb-input']:ShowInput({
|
||||||
|
header = image..Loc[Config.Lan].menu["dui_new"],
|
||||||
|
submitText = Loc[Config.Lan].menu["dui_change"],
|
||||||
|
inputs = { { type = 'text', isRequired = true, name = 'url', text = Loc[Config.Lan].menu["dui_url"] } } })
|
||||||
|
if dialog then
|
||||||
|
if not dialog.url then return end
|
||||||
|
data.url = dialog.url
|
||||||
|
--Scan the link to see if it has an image extention otherwise, stop here.
|
||||||
|
local searchList = { "png", "jpg", "jpeg", "gif", "webp", "bmp" }
|
||||||
|
--Scan the link for certain terms that will flag it and refuse to show it
|
||||||
|
local banList = { "porn" } -- I dunno, let me know what links people manage to find
|
||||||
|
local searchFound = false
|
||||||
|
for k, v in pairs(searchList) do
|
||||||
|
if string.find(tostring(data.url), tostring(v))then
|
||||||
|
searchFound = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for k, v in pairs(banList) do
|
||||||
|
if string.find(tostring(data.url), tostring(v)) then
|
||||||
|
searchFound = false print("BANNED WORD: "..v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if searchFound then
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":Server:ChangeDUI", data)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":Client:ChangeDUI", function(data)
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Recieving new DUI ^7- ^6"..data.url.."^7") end
|
||||||
|
if tostring(data.url) ~= "-" then
|
||||||
|
createDui(data.texn, tostring(data.url), data.size, scriptTxd)
|
||||||
|
AddReplaceTexture(tostring(data.texd), tostring(data.texn), GetCurrentResourceName()..'scriptTxd', tostring(data.texn))
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":Client:ClearDUI", function(data)
|
||||||
|
if customDUIList[tostring(data.texn)] then
|
||||||
|
RemoveReplaceTexture(tostring(data.texd), tostring(data.texn))
|
||||||
|
if IsDuiAvailable(customDUIList[tostring(data.texn)]) then
|
||||||
|
SetDuiUrl(customDUIList[data.name], nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- DUI SERVER
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":Server:ChangeDUI", function(data)
|
||||||
|
-- if no url given, "reset" it back to preset
|
||||||
|
if not data.url then
|
||||||
|
for k, v in pairs(duiList[data.name]) do
|
||||||
|
if v.tex.texn == data.texn then
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Preset^7: ^6"..tostring(duiList[data.name][k].preset).."^7") end
|
||||||
|
data.url = duiList[data.name][k].preset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- if it has a url, update server DUI list and send to players
|
||||||
|
for k, v in pairs(duiList[data.name]) do
|
||||||
|
if v.tex.texn == data.texn then
|
||||||
|
duiList[data.name][k].url = data.url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^3DUI^2 Sending new DUI to all players^7 - ^6"..data.url.."^7") end
|
||||||
|
TriggerClientEvent(GetCurrentResourceName()..":Client:ChangeDUI", -1, data)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":Server:ClearDUI", function(data)
|
||||||
|
if data.url == "-" then
|
||||||
|
for k, v in pairs(duiList[data.name]) do
|
||||||
|
if v.tex.texn == data.texn then
|
||||||
|
duiList[data.name][k].url = "-"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Clear the DUI from loading
|
||||||
|
TriggerClientEvent(GetCurrentResourceName()..":Client:ClearDUI", -1, data)
|
||||||
|
--duiList[tostring(data.tex)].url = ""
|
||||||
|
end)
|
||||||
|
|
||||||
|
AddEventHandler('onResourceStop', function(r) if r ~= GetCurrentResourceName() then return end
|
||||||
|
for k, v in pairs(duiList or {}) do
|
||||||
|
for i = 1, #v do
|
||||||
|
RemoveReplaceTexture(tostring(v[i].tex.texd), tostring(v[i].tex.texn))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
function lockInv(toggle)
|
function lockInv(toggle)
|
||||||
FreezeEntityPosition(PlayerPedId(), toggle)
|
FreezeEntityPosition(PlayerPedId(), toggle)
|
||||||
LocalPlayer.state:set("inv_busy", toggle, true)
|
LocalPlayer.state:set("inv_busy", toggle, true)
|
||||||
@@ -504,7 +655,7 @@ end)
|
|||||||
RegisterNetEvent(GetCurrentResourceName()..":server:setNeed", function(type, amount) local src = source
|
RegisterNetEvent(GetCurrentResourceName()..":server:setNeed", function(type, amount) local src = source
|
||||||
if type == "thirst" then
|
if type == "thirst" then
|
||||||
setThirst(src, amount)
|
setThirst(src, amount)
|
||||||
elseif type == "thirst" then
|
elseif type == "hunger" then
|
||||||
setHunger(src, amount)
|
setHunger(src, amount)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
@@ -513,7 +664,7 @@ function setThirst(src, thirst)
|
|||||||
if GetResourceState(ESXExport):find("start") then
|
if GetResourceState(ESXExport):find("start") then
|
||||||
TriggerClientEvent('esx_status:add', src, 'thirst', thirst)
|
TriggerClientEvent('esx_status:add', src, 'thirst', thirst)
|
||||||
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||||
local Player = QBCore.Functions.GetPlayer(src)
|
local Player = Core.Functions.GetPlayer(src)
|
||||||
Player.Functions.SetMetaData('thirst', thirst)
|
Player.Functions.SetMetaData('thirst', thirst)
|
||||||
TriggerClientEvent("hud:client:UpdateNeeds", src, thirst, Player.PlayerData.metadata.thirst)
|
TriggerClientEvent("hud:client:UpdateNeeds", src, thirst, Player.PlayerData.metadata.thirst)
|
||||||
end
|
end
|
||||||
@@ -523,7 +674,7 @@ function setHunger(src, hunger)
|
|||||||
if GetResourceState(ESXExport):find("start") then
|
if GetResourceState(ESXExport):find("start") then
|
||||||
TriggerClientEvent('esx_status:add', src, 'hunger', hunger)
|
TriggerClientEvent('esx_status:add', src, 'hunger', hunger)
|
||||||
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||||
local Player = QBCore.Functions.GetPlayer(src)
|
local Player = Core.Functions.GetPlayer(src)
|
||||||
Player.Functions.SetMetaData('hunger', hunger)
|
Player.Functions.SetMetaData('hunger', hunger)
|
||||||
TriggerClientEvent("hud:client:UpdateNeeds", src, hunger, Player.PlayerData.metadata.hunger)
|
TriggerClientEvent("hud:client:UpdateNeeds", src, hunger, Player.PlayerData.metadata.hunger)
|
||||||
end
|
end
|
||||||
@@ -541,8 +692,8 @@ end
|
|||||||
-- [[CONSUME]] --
|
-- [[CONSUME]] --
|
||||||
function ConsumeSuccess(itemName, type)
|
function ConsumeSuccess(itemName, type)
|
||||||
ExecuteCommand("e c")
|
ExecuteCommand("e c")
|
||||||
toggleItem(false, itemName, 1)
|
removeItem(itemName, 1)
|
||||||
if GetResourceState(ESXEport):find("start") then
|
if GetResourceState(ESXExport):find("start") then
|
||||||
if Items[itemName].hunger then
|
if Items[itemName].hunger then
|
||||||
TriggerServerEvent(GetCurrentResourceName()..":server:setNeed", "hunger", Items[itemName].hunger * 10000)
|
TriggerServerEvent(GetCurrentResourceName()..":server:setNeed", "hunger", Items[itemName].hunger * 10000)
|
||||||
end
|
end
|
||||||
@@ -558,17 +709,22 @@ function ConsumeSuccess(itemName, type)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if type == "alcohol" then alcoholCount += 1
|
if type == "alcohol" then alcoholCount += 1
|
||||||
if alcoholCount > 1 and alcoholCount < 4 then TriggerEvent("evidence:client:SetStatus", "alcohol", 200) elseif alcoholCount >= 4 then TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200) AlienEffect() end
|
if alcoholCount > 1 and alcoholCount < 4 then
|
||||||
|
TriggerEvent("evidence:client:SetStatus", "alcohol", 200)
|
||||||
|
elseif alcoholCount >= 4 then
|
||||||
|
TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200)
|
||||||
|
AlienEffect()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if Config.RewardItem == itemName then toggleItem(true, Config.RewardPool[math.random(1, #Config.RewardPool)], 1) end
|
getRandomReward(itemName) -- check if a reward item should be given
|
||||||
end
|
end
|
||||||
|
|
||||||
function addItem(item, amount, info)
|
function addItem(item, amount, info)
|
||||||
TriggerServerEvent(GetCurrentResourceName()..":server:toggleItem", true, item, amount)
|
TriggerServerEvent(GetCurrentResourceName()..":server:toggleItem", true, item, amount, nil, info)
|
||||||
end
|
end
|
||||||
|
|
||||||
function removeItem(item, amount)
|
function removeItem(item, amount)
|
||||||
TriggerServerEvent(GetCurrentResourceName()..":server:toggleItem", false, item, amount)
|
TriggerServerEvent(GetCurrentResourceName()..":server:toggleItem", false, item, amount, nil, info)
|
||||||
end
|
end
|
||||||
|
|
||||||
RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give, item, amount, newsrc)
|
RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give, item, amount, newsrc)
|
||||||
@@ -586,21 +742,35 @@ RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give,
|
|||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..OXInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..OXInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QSInv):find("start") then
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
local success = exports[QSInv]:RemoveItem(src, item, amount)
|
local success = exports[QSInv]:RemoveItem(src, item, amount)
|
||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..QSInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..QSInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
elseif GetResourceState(CoreInv):find("start") then
|
|
||||||
local success = exports[CoreInv]:removeItemExact('primary-'..src, item, amount)
|
elseif GetResourceState(CoreInv):find("start") then
|
||||||
|
if GetResourceState(QBExport):find("start") then
|
||||||
|
Core.Functions.GetPlayer(src).Functions.RemoveItem(item, amount, nil)
|
||||||
|
elseif GetResourceState(ESXExport):find("start") then
|
||||||
|
ESX.GetPlayerFromId(src).removeInventoryItem(item, count)
|
||||||
|
end
|
||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CoreInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CoreInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
elseif GetResourceState(CodeMInv):find("start") then
|
|
||||||
|
elseif GetResourceState(OrigenInv):find("start") then
|
||||||
|
local success = exports[OrigenInv]:RemoveItem(src, item, amount)
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..OrigenInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(CodeMInv):find("start") then
|
||||||
local success = exports[CodeMInv]:RemoveItem(src, item, amount)
|
local success = exports[CodeMInv]:RemoveItem(src, item, amount)
|
||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CodeMInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CodeMInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QBInv):find("start") then
|
elseif GetResourceState(QBInv):find("start") then
|
||||||
while remamount > 0 do
|
while remamount > 0 do
|
||||||
if Core.Functions.GetPlayer(src).Functions.RemoveItem(item, 1) then end
|
if Core.Functions.GetPlayer(src).Functions.RemoveItem(item, 1) then end
|
||||||
@@ -616,7 +786,7 @@ RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give,
|
|||||||
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
dupeWarn(src, item) -- if not boot the player
|
dupeWarn(src, item, amount) -- if not boot the player
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
local amount = amount and amount or 1
|
local amount = amount and amount or 1
|
||||||
@@ -625,21 +795,35 @@ RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give,
|
|||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..OXInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..OXInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QSInv):find("start") then
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
local success = exports[QSInv]:AddItem(src, item, amount)
|
local success = exports[QSInv]:AddItem(src, item, amount)
|
||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..QSInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..QSInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(CoreInv):find("start") then
|
elseif GetResourceState(CoreInv):find("start") then
|
||||||
local success = exports[CoreInv]:addItem('primary-'..src, item, amount)
|
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||||
if Config.System.Debug then
|
Core.Functions.GetPlayer(src).Functions.AddItem(item, amount, nil, nil)
|
||||||
|
elseif GetResourceState(ESXExport):find("start") then
|
||||||
|
ESX.GetPlayerFromId(src).addInventoryItem(item, amount)
|
||||||
|
end
|
||||||
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CoreInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CoreInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(CodeMInv):find("start") then
|
elseif GetResourceState(CodeMInv):find("start") then
|
||||||
local success = exports[CodeMInv]:AddItem(src, item, amount)
|
local success = exports[CodeMInv]:AddItem(src, item, amount)
|
||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CodeMInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..CodeMInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elseif GetResourceState(OrigenInv):find("start") then
|
||||||
|
local success = exports[OrigenInv]:AddItem(src, item, amount)
|
||||||
|
if Config.System.Debug then
|
||||||
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..OrigenInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QBInv):find("start") then
|
elseif GetResourceState(QBInv):find("start") then
|
||||||
if Core.Functions.GetPlayer(src).Functions.AddItem(item, amount or 1) then
|
if Core.Functions.GetPlayer(src).Functions.AddItem(item, amount or 1) then
|
||||||
--if Config.Crafting.showItemBox then
|
--if Config.Crafting.showItemBox then
|
||||||
@@ -649,6 +833,7 @@ RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give,
|
|||||||
if Config.System.Debug then
|
if Config.System.Debug then
|
||||||
print("^6Bridge^7: ^3"..addremove.."^7[^6"..QBInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
print("^6Bridge^7: ^3"..addremove.."^7[^6"..QBInv.."^7] ^2Player^7("..src..") ^6"..Items[item].label.."^7("..item..") x^5"..(amount and amount or "1").."^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
end
|
end
|
||||||
@@ -656,14 +841,99 @@ RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give,
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
--Item Exploit protection
|
--Item Exploit protection
|
||||||
function dupeWarn(src, item)
|
function dupeWarn(src, item, amount)
|
||||||
print("^5DupeWarn^7: (^1"..tostring(src).."^7) ^2Tried to remove item ^7('^3"..item.."^7')^2 but it wasn't there^7")
|
print("^5DupeWarn^7: (^1"..tostring(src).."^7) ^2Tried to remove item ^7('^3"..item.."^7')^2 but it wasn't there^7")
|
||||||
if Config.System.Debug == false then
|
if Config.System.Debug == false then
|
||||||
DropPlayer(src, src.." ^1Kicked for attempting to duplicate items")
|
DropPlayer(src, src.." ^1Kicked for suspected duplicating items:"..item)
|
||||||
end
|
end
|
||||||
print("^5DupeWarn:^7: (^1"..tostring(src).."^7) ^2Dropped from server - exploit protection detected an item not being found in players inventory^7")
|
print("^5DupeWarn:^7: (^1"..tostring(src).."^7) ^2Dropped from server - exploit protection detected an item not being found in players inventory^7")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function breakTool(data) --wip
|
||||||
|
local durability, slot = getDurability(item)
|
||||||
|
durability -= data.damage
|
||||||
|
if not durability then durability = 100 end
|
||||||
|
if durability <= 0 then
|
||||||
|
removeItem(data.item, 1)
|
||||||
|
local breakId = GetSoundId()
|
||||||
|
PlaySoundFromEntity(breakId, "Drill_Pin_Break", PlayerPedId(), "DLC_HEIST_FLEECA_SOUNDSET", 1, 0)
|
||||||
|
else
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":server:setMetaData", { item = data.item, slot = slot, metadata = { durability = durability }})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function getDurability(item)
|
||||||
|
local lowestSlot = 100 -- anything above your players max slots
|
||||||
|
local durability = nil
|
||||||
|
if GetResourceState(QBInv):find("start") then
|
||||||
|
local itemcheck = Core.Functions.GetPlayerData().items
|
||||||
|
for k, v in pairs(itemcheck) do
|
||||||
|
if v.name == item then
|
||||||
|
if v.slot <= lowestSlot then
|
||||||
|
lowestSlot = v.slot
|
||||||
|
durability = itemcheck[k].info.durability
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetResourceState(OXInv):find("start") then
|
||||||
|
local itemcheck = exports[OXInv]:Search('slots', item)
|
||||||
|
for k, v in pairs(itemcheck) do
|
||||||
|
if v.slot <= lowestSlot then
|
||||||
|
lowestSlot = v.slot
|
||||||
|
durability = itemcheck[k].metadata.durability
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetResourceState(QSInv):find("start") then
|
||||||
|
local itemcheck = exports[QSInv]:getUserInventory()
|
||||||
|
for k, v in pairs(itemcheck) do
|
||||||
|
if v.name == item and v.slot <= lowestSlot then
|
||||||
|
lowestSlot = v.slot
|
||||||
|
durability = itemcheck[k].metadata.durability
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetResourceState(OrigenInv):find("start") then
|
||||||
|
local itemcheck = exports[OrigenInv]:getPlayerInventory()
|
||||||
|
for k, v in pairs(itemcheck) do
|
||||||
|
if v.name == item and v.slot <= lowestSlot then
|
||||||
|
lowestSlot = v.slot
|
||||||
|
durability = itemcheck[k].metadata.durability
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return durability, lowestSlot
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":server:setMetaData", function(data)
|
||||||
|
local src = source
|
||||||
|
if GetResourceState(QBInv):find("start") then
|
||||||
|
local Player = Core.Functions.GetPlayer(src)
|
||||||
|
Player.PlayerData.items[data.slot].info = data.metadata
|
||||||
|
Player.PlayerData.items[data.slot].description = "HP : "..data.metadata.durability
|
||||||
|
Player.Functions.SetInventory(Player.PlayerData.items)
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetResourceState(OXInv):find("start") then
|
||||||
|
exports[OXInv]:SetMetadata(source, data.slot, data.metadata)
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetResourceState(QSInv):find("start") then
|
||||||
|
exports[QSInv]:SetItemMetadata(source, data.slot, data.metadata)
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetResourceState(OrigenInv):find("start") then
|
||||||
|
local item = exports[OrigenInv]:GetItemBySlot(source, data.slot)
|
||||||
|
if item then
|
||||||
|
exports[OrigenInv]:SetItemData(source, item.name, "durability", data.metadata.durability)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
function toggleDuty()
|
function toggleDuty()
|
||||||
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||||
TriggerServerEvent("QBCore:ToggleDuty")
|
TriggerServerEvent("QBCore:ToggleDuty")
|
||||||
@@ -685,12 +955,12 @@ local function CheckVersion()
|
|||||||
PerformHttpRequest('https://raw.githubusercontent.com/jimathy/'..GetCurrentResourceName()..'/master/version.txt', function(err, freeVersion, headers)
|
PerformHttpRequest('https://raw.githubusercontent.com/jimathy/'..GetCurrentResourceName()..'/master/version.txt', function(err, freeVersion, headers)
|
||||||
if not freeVersion then print("^1Currently unable to run a version check for ^7'^3"..GetCurrentResourceName().."^7' ("..currentVersion.."^7)") return end
|
if not freeVersion then print("^1Currently unable to run a version check for ^7'^3"..GetCurrentResourceName().."^7' ("..currentVersion.."^7)") return end
|
||||||
local currentVersion = "^3"..GetResourceMetadata(GetCurrentResourceName(), 'version'):gsub("%.", "^7.^3").."^7"
|
local currentVersion = "^3"..GetResourceMetadata(GetCurrentResourceName(), 'version'):gsub("%.", "^7.^3").."^7"
|
||||||
freeVersion = "^3"..freeVersion:sub(1, -2):gsub("%.", "^7.^3").."^7"
|
freeVersion = "^3"..freeVersion:sub(1, -2):gsub("%.", "^7.^3"):gsub("%\r", "").."^7"
|
||||||
print("^6Version Check^7: ^2Running^7: "..currentVersion.." ^2Latest^7: "..freeVersion)
|
print("^6Version Check^7: ^2Running^7: "..currentVersion.." ^2Latest^7: "..freeVersion)
|
||||||
print(freeVersion == currentVersion and "^7'^3"..GetCurrentResourceName().."^7' - ^6You are running the latest version.^7 ("..currentVersion..")" or "^7'^3"..GetCurrentResourceName().."^7' - ^1You are currently running an outdated version^7, ^1please update^7!")
|
print(freeVersion == currentVersion and "^7'^3"..GetCurrentResourceName().."^7' - ^6You are running the latest version.^7 ("..currentVersion..")" or "^7'^3"..GetCurrentResourceName().."^7' - ^1You are currently running an outdated version^7, ^1please update^7!")
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
newestVersion = "^3"..newestVersion:sub(1, -2):gsub("%.", "^7.^3").."^7"
|
newestVersion = "^3"..newestVersion:sub(1, -2):gsub("%.", "^7.^3"):gsub("%\r", "").."^7"
|
||||||
print("^6Version Check^7: ^2Running^7: "..currentVersion.." ^2Latest^7: "..newestVersion)
|
print("^6Version Check^7: ^2Running^7: "..currentVersion.." ^2Latest^7: "..newestVersion)
|
||||||
print(newestVersion == currentVersion and '^6You are running the latest version.^7 ('..currentVersion..')' or "^1You are currently running an outdated version^7, ^1please update^7!")
|
print(newestVersion == currentVersion and '^6You are running the latest version.^7 ('..currentVersion..')' or "^1You are currently running an outdated version^7, ^1please update^7!")
|
||||||
end
|
end
|
||||||
@@ -809,15 +1079,15 @@ function FocusEffect()
|
|||||||
focusEffect = false
|
focusEffect = false
|
||||||
if Config.System.Debug then print("^5Debug^7: ^3FocusEffect^7() ^2stopped") end
|
if Config.System.Debug then print("^5Debug^7: ^3FocusEffect^7() ^2stopped") end
|
||||||
end
|
end
|
||||||
local NightVisionEffect = false
|
local nightVisionEffect = false
|
||||||
function NightVisionEffect()
|
function NightVisionEffect()
|
||||||
if NightVisionEffect then return else NightVisionEffect = true end
|
if NightVisionEffect then return else nightVisionEffect = true end
|
||||||
if Config.System.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2activated") end
|
if Config.System.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2activated") end
|
||||||
SetNightvision(true)
|
SetNightvision(true)
|
||||||
Wait(math.random(3000, 4000)) -- FEEL FREE TO CHANGE THIS
|
Wait(math.random(3000, 4000)) -- FEEL FREE TO CHANGE THIS
|
||||||
SetNightvision(false)
|
SetNightvision(false)
|
||||||
SetSeethrough(false)
|
SetSeethrough(false)
|
||||||
NightVisionEffect = false
|
nightVisionEffect = false
|
||||||
if Config.System.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2stopped") end
|
if Config.System.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2stopped") end
|
||||||
end
|
end
|
||||||
local thermalEffect = false
|
local thermalEffect = false
|
||||||
@@ -888,4 +1158,11 @@ function StopEffects() -- Used to clear up any effects stuck on screen
|
|||||||
AnimpostfxStop('RaceTurbo')
|
AnimpostfxStop('RaceTurbo')
|
||||||
AnimpostfxStop('FocusIn')
|
AnimpostfxStop('FocusIn')
|
||||||
AnimpostfxStop('Rampage')
|
AnimpostfxStop('Rampage')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
AddEventHandler('onResourceStop', function(r)
|
||||||
|
if r ~= GetCurrentResourceName() then return end
|
||||||
|
stopSpinner()
|
||||||
|
for i = 1, #Peds do DeletePed(Peds[i]) end
|
||||||
|
for i = 1, #Props do destroyProp(Props[i]) end
|
||||||
|
end)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
name "Jim_Bridge"
|
name "Jim_Bridge"
|
||||||
author "Jimathy"
|
author "Jimathy"
|
||||||
version "1.0.4"
|
version "1.0.14"
|
||||||
description "Framework Bridge By Jimathy"
|
description "Framework Bridge By Jimathy"
|
||||||
fx_version "cerulean"
|
fx_version "cerulean"
|
||||||
game "gta5"
|
game "gta5"
|
||||||
@@ -11,4 +11,4 @@ files {
|
|||||||
'functions.lua',
|
'functions.lua',
|
||||||
'wrapper.lua',
|
'wrapper.lua',
|
||||||
'crafting.lua',
|
'crafting.lua',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.0.5
|
1.0.13
|
||||||
|
|||||||
344
wrapper.lua
344
wrapper.lua
@@ -1,29 +1,21 @@
|
|||||||
Items, Vehicles, Jobs, Gangs, Core, ESX = {}, nil, nil, nil, nil, nil
|
Items, Vehicles, Jobs, Gangs, Core, ESX = {}, nil, nil, nil, nil, nil
|
||||||
|
|
||||||
OXLibExport = Exports and Exports.OXLibExport or ""
|
Exports.QBInv = GetResourceState("ps-inventory"):find("start") and "ps-inventory" or GetResourceState("lj-inventory"):find("start") and "lj-inventory" or Exports.QBInv
|
||||||
|
|
||||||
QBXExport = Exports and Exports.QBXExport or ""
|
OXLibExport, QBXExport, QBExport, ESXExport, OXCoreExport = Exports.OXLibExport or "", Exports.QBXExport or "", Exports.QBExport or "", Exports.ESXExport or "", Exports.OXCoreExport or ""
|
||||||
QBExport = Exports and Exports.QBExport or ""
|
|
||||||
ESXExport = Exports and Exports.ESXExport or ""
|
|
||||||
OXCoreExport = Exports and Exports.OXCoreExport or ""
|
|
||||||
|
|
||||||
OXInv = Exports and Exports.OXInv or ""
|
OXInv, QBInv, QSInv, CoreInv, CodeMInv, OrigenInv = Exports.OXInv or "", Exports.QBInv or "", Exports.QSInv or "", Exports.CoreInv or "", Exports.CodeMInv or "", Exports.OrigenInv or ""
|
||||||
QBInv = Exports and Exports.QBInv or ""
|
|
||||||
QSInv = Exports and Exports.QSInv or ""
|
|
||||||
CoreInv = Exports and Exports.CoreInv or ""
|
|
||||||
CodeMInv = Exports and Exports.CodeMInv or ""
|
|
||||||
|
|
||||||
QBMenuExport = Exports and Exports.QBMenuExport or ""
|
QBMenuExport = Exports.QBMenuExport or ""
|
||||||
|
|
||||||
QBTargetExport = Exports and Exports.QBTargetExport or ""
|
QBTargetExport, OXTargetExport = Exports.QBTargetExport or "", Exports.OXTargetExport or ""
|
||||||
OXTargetExport = Exports and Exports.OXTargetExport or ""
|
|
||||||
|
|
||||||
function CheckBridgeVersion()
|
function CheckBridgeVersion()
|
||||||
if IsDuplicityVersion() then
|
if IsDuplicityVersion() then
|
||||||
local currentVersion = "^3"..GetResourceMetadata("jim_bridge", 'version'):gsub("%.", "^7.^3").."^7"
|
local currentVersion = "^3"..GetResourceMetadata("jim_bridge", 'version'):gsub("%.", "^7.^3").."^7"
|
||||||
PerformHttpRequest('https://raw.githubusercontent.com/jimathy/jim_bridge/master/version.txt', function(err, newestVersion, headers)
|
PerformHttpRequest('https://raw.githubusercontent.com/jimathy/jim_bridge/master/version.txt', function(err, newestVersion, headers)
|
||||||
if not newestVersion then print("^1Currently unable to run a version check for ^7'^3jim_bridge^7' ("..currentVersion.."^7)") return end
|
if not newestVersion then print("^1Currently unable to run a version check for ^7'^3jim_bridge^7' ("..currentVersion.."^7)") return end
|
||||||
newestVersion = "^3"..newestVersion:sub(1, -2):gsub("%.", "^7.^3").."^7"
|
newestVersion = "^3"..newestVersion:sub(1, -2):gsub("%.", "^7.^3"):gsub("%\r", "").."^7"
|
||||||
print(newestVersion == currentVersion and "^7'^3jim_bridge^7' - ^6You are running the latest version.^7 ("..currentVersion..")" or "^7'^3jim_bridge^7' - ^1You are currently running an outdated version^7, ^1please update^7!")
|
print(newestVersion == currentVersion and "^7'^3jim_bridge^7' - ^6You are running the latest version.^7 ("..currentVersion..")" or "^7'^3jim_bridge^7' - ^1You are currently running an outdated version^7, ^1please update^7!")
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@@ -34,54 +26,59 @@ for k, v in pairs(Exports) do
|
|||||||
if GetResourceState(v):find("start") then print("^6Bridge^7: '^3"..v.."^7' ^2export found ^7") end
|
if GetResourceState(v):find("start") then print("^6Bridge^7: '^3"..v.."^7' ^2export found ^7") end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local itemResource, jobResource = "", ""
|
||||||
|
|
||||||
-- Load item lists
|
-- Load item lists
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then itemResource = OXInv
|
||||||
print("^6Bridge^7: ^2Loading ^3Items^2 from ^7"..OXInv)
|
|
||||||
Items = exports[OXInv]:Items()
|
Items = exports[OXInv]:Items()
|
||||||
for k, v in pairs(Items) do
|
for k, v in pairs(Items) do
|
||||||
if v.client then
|
if v.client and v.client.image then
|
||||||
if v.client.image then Items[k].image = (Items[k].client.image):gsub("nui://"..OXInv.."/web/images/","")
|
Items[k].image = (v.client.image):gsub("nui://"..OXInv.."/web/images/", "")
|
||||||
else Items[k].image = k..".png" end
|
else
|
||||||
if v.client.hunger then Items[k].hunger = v.client.hunger end
|
Items[k].image = k..".png"
|
||||||
if v.client.thirst then Items[k].thirst = v.client.thirst end
|
|
||||||
end
|
end
|
||||||
|
Items[k].hunger = v.client and v.client.hunger or nil
|
||||||
|
Items[k].thirst = v.client and v.client.thirst or nil
|
||||||
end
|
end
|
||||||
elseif GetResourceState(QBExport):find("start") then
|
|
||||||
print("^6Bridge^7: ^2Loading ^3Items^2 from ^7"..QBExport)
|
elseif GetResourceState(QBExport):find("start") then itemResource = QBExport
|
||||||
Core = Core or exports[QBExport]:GetCoreObject()
|
Core = Core or exports[QBExport]:GetCoreObject()
|
||||||
Items = Core.Shared.Items
|
Items = Core and Core.Shared.Items or nil
|
||||||
elseif GetResourceState(ESXExport):find("start") then
|
|
||||||
print("^6Bridge^7: ^2Loading ^3Items^2 from ^7"..ESXExport)
|
elseif GetResourceState(ESXExport):find("start") then itemResource = ESXExport
|
||||||
ESX = exports[ESXExport]:getSharedObject()
|
ESX = exports[ESXExport]:getSharedObject()
|
||||||
Items = ESX.Items
|
Items = ESX and ESX.Items or nil
|
||||||
else
|
end
|
||||||
|
if not Items then
|
||||||
print("^4ERROR^7: ^2No Core Items detected ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Core Items detected ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
|
else
|
||||||
|
print("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7" .. itemResource)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Load Vehicles
|
-- Load Vehicles
|
||||||
if GetResourceState(QBXExport):find("start") then
|
if GetResourceState(QBXExport):find("start") or GetResourceState(QBExport):find("start") then
|
||||||
Core = Core or exports[QBExport]:GetCoreObject()
|
Core = Core or exports[QBExport]:GetCoreObject()
|
||||||
print("^6Bridge^7: ^2Loading ^3Vehicles^2 from ^7"..QBXExport)
|
if GetResourceState(QBExport):find("start") and not GetResourceState(QBXExport):find("start") then
|
||||||
Vehicles = exports[QBXExport]:GetVehiclesByHash()
|
RegisterNetEvent('QBCore:Client:UpdateObject', function()
|
||||||
elseif GetResourceState(QBExport):find("start") then
|
Core = Core or exports[QBExport]:GetCoreObject()
|
||||||
print("^6Bridge^7: ^2Loading ^3Vehicles^2 from ^7"..QBExport)
|
end)
|
||||||
Core = Core or exports[QBExport]:GetCoreObject()
|
end
|
||||||
RegisterNetEvent('QBCore:Client:UpdateObject', function()
|
Vehicles = Core and Core.Shared.Vehicles
|
||||||
Core = Core or exports[QBExport]:GetCoreObject()
|
print("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..QBExport)
|
||||||
end)
|
|
||||||
Vehicles = Core.Shared.Vehicles
|
|
||||||
elseif GetResourceState(OXCoreExport):find("start") then
|
elseif GetResourceState(OXCoreExport):find("start") then
|
||||||
print("^6Bridge^7: ^2Loading ^3Vehicles^2 from ^7"..OXCoreExport)
|
Vehicles = {}
|
||||||
for k, v in pairs(Ox.GetVehicleData()) do
|
for k, v in pairs(Ox.GetVehicleData()) do
|
||||||
Vehicles = Vehicles or {}
|
|
||||||
Vehicles[k] = { model = k, price = v.price, name = v.name, brand = v.make }
|
Vehicles[k] = { model = k, price = v.price, name = v.name, brand = v.make }
|
||||||
end
|
end
|
||||||
|
print("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..OXCoreExport)
|
||||||
elseif GetResourceState(ESXExport):find("start") then
|
elseif GetResourceState(ESXExport):find("start") then
|
||||||
print("^6Bridge^7: ^2Loading ^3Vehicles^2 from ^7"..ESXExport)
|
print("^6Bridge^7: ^2Loading ^3Vehicles^2 from ^7"..ESXExport)
|
||||||
|
--print("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..ESXExport)
|
||||||
CreateThread(function()
|
CreateThread(function()
|
||||||
if IsDuplicityVersion() then
|
if IsDuplicityVersion() then
|
||||||
createCallback(GetCurrentResourceName()..":getVehiclesPrices", function(source)
|
createCallback(GetCurrentResourceName()..":getVehiclesPrices", function(source)
|
||||||
Vehicles = MySQL.query.await('SELECT model, price, name FROM vehicles')
|
Vehicles = MySQL.query.await('SELECT model, price, name FROM vehicles')
|
||||||
|
print("^6Bridge^7: ^3Found ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..ESXExport)
|
||||||
return Vehicles
|
return Vehicles
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@@ -98,37 +95,33 @@ else
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Load Jobs
|
-- Load Jobs
|
||||||
if GetResourceState(QBXExport):find("start") then
|
local jobResource = ""
|
||||||
|
if GetResourceState(QBXExport):find("start") then jobResource = QBXExport
|
||||||
Core = Core or exports[QBExport]:GetCoreObject()
|
Core = Core or exports[QBExport]:GetCoreObject()
|
||||||
print("^6Bridge^7: ^2Loading ^3Jobs^7/^3Gangs^2 from ^7"..QBXExport)
|
Jobs, Gangs = exports[QBXExport]:GetJobs(), exports[QBXExport]:GetGangs()
|
||||||
Jobs = exports[QBXExport]:GetJobs()
|
|
||||||
Gangs = exports[QBXExport]:GetGangs()
|
|
||||||
|
|
||||||
elseif GetResourceState(OXCoreExport):find("start") then
|
elseif GetResourceState(OXCoreExport):find("start") then jobResource = OXExport
|
||||||
print("^6Bridge^7: ^2Loading ^3Jobs^7/^3Gangs^2 from ^7"..OXCoreExport)
|
|
||||||
CreateThread(function()
|
CreateThread(function()
|
||||||
if IsDuplicityVersion() then
|
if IsDuplicityVersion() then
|
||||||
createCallback(GetCurrentResourceName()..":getOxGroups", function(source)
|
createCallback(GetCurrentResourceName()..":getOxGroups", function(source)
|
||||||
Jobs = MySQL.query.await('SELECT * FROM `ox_groups`')
|
Jobs = MySQL.query.await('SELECT * FROM `ox_groups`') return Jobs
|
||||||
return Jobs
|
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
local TempJobs = triggerCallback(GetCurrentResourceName()..":getOxGroups")
|
local TempJobs = triggerCallback(GetCurrentResourceName()..":getOxGroups")
|
||||||
|
Jobs = TempJobs and {}
|
||||||
for k, v in pairs(TempJobs) do
|
for k, v in pairs(TempJobs) do
|
||||||
local grades = {}
|
local grades = {}
|
||||||
for i = 1, #v.grades do grades[i] = { name = grades[i], isboss = (i == #v.grades)} end
|
for i = 1, #v.grades do grades[i] = { name = v.grades[i], isboss = (i == #v.grades)} end
|
||||||
Jobs = Jobs or {}
|
Jobs[v.name] = { label = v.label, grades = grades }
|
||||||
Jobs[v.name] = { label = v.label, grades = grades, }
|
|
||||||
end
|
end
|
||||||
|
Gangs = Jobs
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
elseif GetResourceState(QBExport):find("start") then
|
elseif GetResourceState(QBExport):find("start") then jobResource = QBExport
|
||||||
print("^6Bridge^7: ^2Loading ^3Jobs^7/^3Gangs^2 from ^7"..QBExport)
|
|
||||||
Core = Core or Core or exports[QBExport]:GetCoreObject()
|
Core = Core or Core or exports[QBExport]:GetCoreObject()
|
||||||
RegisterNetEvent('QBCore:Client:UpdateObject', function() Core = Core or exports[QBExport]:GetCoreObject() end)
|
RegisterNetEvent('QBCore:Client:UpdateObject', function() Core = Core or exports[QBExport]:GetCoreObject() end)
|
||||||
Jobs = Core.Shared.Jobs
|
Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs
|
||||||
Gangs = Core.Shared.Gangs
|
|
||||||
|
|
||||||
elseif GetResourceState(ESXExport):find("start") then
|
elseif GetResourceState(ESXExport):find("start") then
|
||||||
print("^6Bridge^7: ^2Loading ^3Jobs^7/^3Gangs^2 from ^7"..ESXExport)
|
print("^6Bridge^7: ^2Loading ^3Jobs^7/^3Gangs^2 from ^7"..ESXExport)
|
||||||
@@ -153,29 +146,21 @@ elseif GetResourceState(ESXExport):find("start") then
|
|||||||
Gangs = Jobs
|
Gangs = Jobs
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
else
|
end
|
||||||
print("^4ERROR^7: ^2No Job/Gang ifo detected ^7- ^2Check ^3exports^1.^2lua^7")
|
if not GetResourceState(ESXExport):find("start") and Jobs then
|
||||||
|
print("^6Bridge^7: ^2Loading ^6"..countTable(Jobs).." ^3Jobs^2 from ^7"..jobResource, "^6Bridge^7: ^2Loading ^6"..countTable(Gangs).." ^3Gangs^2 from ^7"..jobResource)
|
||||||
end
|
end
|
||||||
|
|
||||||
function makeBossRoles(role)
|
function makeBossRoles(role)
|
||||||
local boss = {}
|
local boss = {}
|
||||||
if Jobs and Jobs[role] then
|
local data = Jobs and Jobs[role] or Gangs and Gangs[role]
|
||||||
for grade in pairs(Jobs[role].grades) do
|
if data then
|
||||||
if Jobs[role].grades[grade].isboss then
|
for grade, info in pairs(data.grades) do
|
||||||
if boss[role] then
|
if info.isboss then
|
||||||
if boss[role] > tonumber(grade) then boss[role] = tonumber(grade) end
|
boss[role] = boss[role] and math.min(boss[role], tonumber(grade)) or tonumber(grade)
|
||||||
else boss[role] = tonumber(grade) end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif Gangs and Gangs[role] then
|
|
||||||
for grade in pairs(Gangs[role].grades) do
|
|
||||||
if Gangs[role].grades[grade].isboss then
|
|
||||||
if boss[role] then
|
|
||||||
if boss[role] > tonumber(grade) then boss[role] = tonumber(grade) end
|
|
||||||
else boss[role] = tonumber(grade) end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return boss
|
return boss
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -191,11 +176,7 @@ function createPoly(data) local Location = nil
|
|||||||
if Config.System.Debug then print("^6Bridge^7: ^2Creating new poly with ^7PolyZone "..data.name) end
|
if Config.System.Debug then print("^6Bridge^7: ^2Creating new poly with ^7PolyZone "..data.name) end
|
||||||
Location = PolyZone:Create(data.points, { name = data.name, debugPoly = data.debug })
|
Location = PolyZone:Create(data.points, { name = data.name, debugPoly = data.debug })
|
||||||
Location:onPlayerInOut(function(isPointInside)
|
Location:onPlayerInOut(function(isPointInside)
|
||||||
if isPointInside then
|
if isPointInside then data.onEnter() else data.onExit() end
|
||||||
data.onEnter()
|
|
||||||
else
|
|
||||||
data.onExit()
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
print("^4ERROR^7: ^2No PolyZone creation script detected ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No PolyZone creation script detected ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
@@ -223,19 +204,26 @@ end
|
|||||||
|
|
||||||
function openMenu(Menu, data)
|
function openMenu(Menu, data)
|
||||||
if Config.System.Menu == "ox" then
|
if Config.System.Menu == "ox" then
|
||||||
if data.onBack then
|
local index = nil
|
||||||
|
if data.onBack and not data.onSelected then
|
||||||
table.insert(Menu, 1, { icon = "fas fa-circle-arrow-left",
|
table.insert(Menu, 1, { icon = "fas fa-circle-arrow-left",
|
||||||
title = "Return",
|
title = "Return",
|
||||||
onSelect = data.onBack,
|
onSelect = data.onBack,
|
||||||
|
label = "Return"
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
for k in pairs(Menu) do
|
for k in pairs(Menu) do
|
||||||
|
if data.onSelected and Menu[k].arrow then
|
||||||
|
Menu[k].icon = "fas fa-angle-right"
|
||||||
|
end
|
||||||
if not Menu[k].title then
|
if not Menu[k].title then
|
||||||
if Menu[k].header ~= nil and Menu[k].header ~= "" then
|
if Menu[k].header ~= nil and Menu[k].header ~= "" then
|
||||||
Menu[k].title = Menu[k].header
|
Menu[k].title = Menu[k].header
|
||||||
|
Menu[k].label = Menu[k].header
|
||||||
if Menu[k].txt then Menu[k].description = Menu[k].txt else Menu[k].description = "" end
|
if Menu[k].txt then Menu[k].description = Menu[k].txt else Menu[k].description = "" end
|
||||||
else
|
else
|
||||||
Menu[k].title = Menu[k].txt
|
Menu[k].title = Menu[k].txt
|
||||||
|
Menu[k].label = Menu[k].txt
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if Menu[k].params then
|
if Menu[k].params then
|
||||||
@@ -246,8 +234,35 @@ function openMenu(Menu, data)
|
|||||||
Menu[k].disabled = true
|
Menu[k].disabled = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
lib.registerContext({id = 'Menu', title = data.header..br..br..(data.headertxt and data.headertxt or ""), position = 'top-right', options = Menu, canClose = data.canClose and data.canClose or nil, onExit = data.onExit and data.onExit or nil, })
|
local menuID = 'Menu'
|
||||||
lib.showContext("Menu")
|
(data.onSelected and lib.registerMenu or lib.registerContext)({
|
||||||
|
id = menuID,
|
||||||
|
title = data.header..br..br..(data.headertxt and data.headertxt or ""),
|
||||||
|
position = 'top-right',
|
||||||
|
options = Menu,
|
||||||
|
canClose = data.canClose and data.canClose or nil,
|
||||||
|
onClose = (data.onBack and data.onBack) or (data.onExit and data.onExit) or nil,
|
||||||
|
onExit = data.onExit and data.onExit or nil,
|
||||||
|
onSelected = data.onSelected and (function(selected) index = selected end) or nil,
|
||||||
|
}, (data.onSelected and (function(x, y, args)
|
||||||
|
if Menu[x].refresh then
|
||||||
|
if Menu[x].onSelect then
|
||||||
|
Menu[x].onSelect()
|
||||||
|
end
|
||||||
|
lib.showMenu(menuID, index)
|
||||||
|
else
|
||||||
|
if Menu[x].onSelect then
|
||||||
|
Menu[x].onSelect()
|
||||||
|
else
|
||||||
|
lib.showMenu(menuID, index)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end) or nil))
|
||||||
|
if data.onSelected then
|
||||||
|
lib.showMenu(menuID, 1)
|
||||||
|
else
|
||||||
|
lib.showContext(menuID)
|
||||||
|
end
|
||||||
elseif Config.System.Menu == "qb" then
|
elseif Config.System.Menu == "qb" then
|
||||||
if data.onBack then
|
if data.onBack then
|
||||||
table.insert(Menu, 1, { icon = "fas fa-circle-arrow-left",
|
table.insert(Menu, 1, { icon = "fas fa-circle-arrow-left",
|
||||||
@@ -476,7 +491,7 @@ function createBoxTarget(data, opts, dist)
|
|||||||
local options = { options = opts, distance = dist }
|
local options = { options = opts, distance = dist }
|
||||||
local target = exports[QBTargetExport]:AddBoxZone(data[1], data[2], data[3], data[4], data[5], options)
|
local target = exports[QBTargetExport]:AddBoxZone(data[1], data[2], data[3], data[4], data[5], options)
|
||||||
boxTargets[#boxTargets+1] = target
|
boxTargets[#boxTargets+1] = target
|
||||||
return target
|
return data[1]
|
||||||
else
|
else
|
||||||
local tempText = ""
|
local tempText = ""
|
||||||
local keyTable = { 38, 29, 303, }
|
local keyTable = { 38, 29, 303, }
|
||||||
@@ -525,7 +540,7 @@ function createCircleTarget(data, opts, dist)
|
|||||||
local target = exports[QBTargetExport]:AddCircleZone(data[1], data[2], data[3], data[4], options)
|
local target = exports[QBTargetExport]:AddCircleZone(data[1], data[2], data[3], data[4], options)
|
||||||
|
|
||||||
circleTargets[#circleTargets+1] = target
|
circleTargets[#circleTargets+1] = target
|
||||||
return target
|
return data[1]
|
||||||
else
|
else
|
||||||
local tempText = ""
|
local tempText = ""
|
||||||
local keyTable = { 38, 29, 303, }
|
local keyTable = { 38, 29, 303, }
|
||||||
@@ -750,7 +765,7 @@ function createInput(title, opts)
|
|||||||
isRequired = opts[i].isRequired,
|
isRequired = opts[i].isRequired,
|
||||||
label = opts[i].label or opts[i].text,
|
label = opts[i].label or opts[i].text,
|
||||||
name = opts[i].name,
|
name = opts[i].name,
|
||||||
default = opts[i].options[1].value,
|
default = opts[i].default or opts[i].options[1].value,
|
||||||
options = opts[i].options,
|
options = opts[i].options,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
@@ -988,31 +1003,58 @@ AddStateBagChangeHandler(GetCurrentResourceName()..':setVehicleProperties', '',
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
RegisterNetEvent(GetCurrentResourceName()..":server:ChargePlayer", function(cost, type) local src = source
|
RegisterNetEvent(GetCurrentResourceName()..":server:ChargePlayer", function(cost, type, newsrc)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player: '^6"..cost.."^7'", type) end
|
local src = newsrc or source
|
||||||
|
local fundResource = ""
|
||||||
if type == "cash" then
|
if type == "cash" then
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then fundResource = OXInv
|
||||||
exports[OXInv]:RemoveItem(src, "money", cost)
|
exports[OXInv]:RemoveItem(src, "money", cost)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player: '^6"..cost.."^7'", type, OXInv) end
|
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then fundResource = QBExport
|
||||||
elseif GetResourceState(QBExport):find("start") then
|
|
||||||
Core.Functions.GetPlayer(src).Functions.RemoveMoney("cash", cost)
|
Core.Functions.GetPlayer(src).Functions.RemoveMoney("cash", cost)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player: '^6"..cost.."^7'", type, QBExport) end
|
elseif GetResourceState(ESXExport):find("start") then fundResource = ESXExport
|
||||||
elseif GetResourceState(ESXExport):find("start") then
|
|
||||||
local Player = ESX.GetPlayerFromId(src)
|
local Player = ESX.GetPlayerFromId(src)
|
||||||
Player.removeMoney(cost, "")
|
Player.removeMoney(cost, "")
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player: '^6"..cost.."^7'", type, ESXExport) end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if type == "bank" then
|
if type == "bank" then
|
||||||
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then fundResource = QBExport
|
||||||
Core.Functions.GetPlayer(src).Functions.RemoveMoney("bank", cost)
|
Core.Functions.GetPlayer(src).Functions.RemoveMoney("bank", cost)
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player: '^6"..cost.."^7'", type, QBExport) end
|
elseif GetResourceState(ESXExport):find("start") then fundResource = ESXExport
|
||||||
elseif GetResourceState(ESXExport):find("start") then
|
|
||||||
local Player = ESX.GetPlayerFromId(src)
|
local Player = ESX.GetPlayerFromId(src)
|
||||||
Player.removeMoney(cost, "")
|
Player.removeMoney(cost, "")
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player: '^6"..cost.."^7'", type, ESXExport) end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if fundResource == "" then print("error - check exports.lua")
|
||||||
|
else
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Charging ^2Player^7: '^6"..cost.."^7'", type, fundResource) end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":server:FundPlayer", function(fund, type, newsrc)
|
||||||
|
local src = newsrc or source
|
||||||
|
local fundResource = ""
|
||||||
|
if type == "cash" then
|
||||||
|
if GetResourceState(OXInv):find("start") then fundResource = OXInv
|
||||||
|
exports[OXInv]:AddItem(src, "money", fund)
|
||||||
|
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then fundResource = QBExport
|
||||||
|
Core.Functions.GetPlayer(src).Functions.AddMoney("cash", fund)
|
||||||
|
elseif GetResourceState(ESXExport):find("start") then fundResource = ESXExport
|
||||||
|
local Player = ESX.GetPlayerFromId(src)
|
||||||
|
Player.addMoney(fund, "")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if type == "bank" then
|
||||||
|
if GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then fundResource = QBExport
|
||||||
|
Core.Functions.GetPlayer(src).Functions.AddMoney("bank", fund)
|
||||||
|
elseif GetResourceState(ESXExport):find("start") then fundResource = ESXExport
|
||||||
|
local Player = ESX.GetPlayerFromId(src)
|
||||||
|
Player.addMoney(fund, "")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if fundResource == "" then print("error - check exports.lua")
|
||||||
|
else
|
||||||
|
if Config.System.Debug then print("^6Bridge^7: ^2Funding ^2Player^7: '^2"..fund.."^7'", type, fundResource) end
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
function createUseableItem(item, funct)
|
function createUseableItem(item, funct)
|
||||||
@@ -1109,6 +1151,7 @@ function hasJob(job, source, grade) local hasJob, duty = false, true
|
|||||||
if ganginfo.name == job then hasJob = true
|
if ganginfo.name == job then hasJob = true
|
||||||
if grade and not (grade <= ganginfo.grade.level) then hasJob = false end
|
if grade and not (grade <= ganginfo.grade.level) then hasJob = false end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif GetResourceState(QBExport):find("start") and not GetResourceState(QBXExport):find("start") then
|
elseif GetResourceState(QBExport):find("start") and not GetResourceState(QBXExport):find("start") then
|
||||||
local info = nil
|
local info = nil
|
||||||
Core.Functions.GetPlayerData(function(PlayerData)
|
Core.Functions.GetPlayerData(function(PlayerData)
|
||||||
@@ -1124,6 +1167,7 @@ function hasJob(job, source, grade) local hasJob, duty = false, true
|
|||||||
hasJob = true
|
hasJob = true
|
||||||
if grade and not (grade <= ganginfo.grade.level) then hasJob = false end
|
if grade and not (grade <= ganginfo.grade.level) then hasJob = false end
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
print("^4ERROR^7: ^2No Core detected for hasJob() ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Core detected for hasJob() ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
end
|
end
|
||||||
@@ -1142,6 +1186,7 @@ function getPlayer(source) local Player = {}
|
|||||||
cash = info.getMoney(),
|
cash = info.getMoney(),
|
||||||
bank = info.getAccount("bank").money,
|
bank = info.getAccount("bank").money,
|
||||||
}
|
}
|
||||||
|
|
||||||
elseif GetResourceState(OXCoreExport):find("start") then
|
elseif GetResourceState(OXCoreExport):find("start") then
|
||||||
local file = ('imports/%s.lua'):format('server')
|
local file = ('imports/%s.lua'):format('server')
|
||||||
local import = LoadResourceFile('ox_core', file)
|
local import = LoadResourceFile('ox_core', file)
|
||||||
@@ -1153,6 +1198,7 @@ function getPlayer(source) local Player = {}
|
|||||||
cash = exports[OXInv]:Search(src, 'count', "money"),
|
cash = exports[OXInv]:Search(src, 'count', "money"),
|
||||||
bank = 0,
|
bank = 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
elseif GetResourceState(QBXExport):find("start") then
|
elseif GetResourceState(QBXExport):find("start") then
|
||||||
local info = exports[QBXExport]:GetPlayer(src)
|
local info = exports[QBXExport]:GetPlayer(src)
|
||||||
Player = {
|
Player = {
|
||||||
@@ -1160,6 +1206,7 @@ function getPlayer(source) local Player = {}
|
|||||||
cash = exports[OXInv]:Search(src, 'count', "money"),
|
cash = exports[OXInv]:Search(src, 'count', "money"),
|
||||||
bank = info.Functions.GetMoney("bank"),
|
bank = info.Functions.GetMoney("bank"),
|
||||||
}
|
}
|
||||||
|
|
||||||
elseif GetResourceState(QBExport):find("start") and not GetResourceState(QBXExport):find("start") then
|
elseif GetResourceState(QBExport):find("start") and not GetResourceState(QBXExport):find("start") then
|
||||||
if Core.Functions.GetPlayer ~= nil then -- support older qb-core functions
|
if Core.Functions.GetPlayer ~= nil then -- support older qb-core functions
|
||||||
local info = Core.Functions.GetPlayer(src).PlayerData
|
local info = Core.Functions.GetPlayer(src).PlayerData
|
||||||
@@ -1176,6 +1223,7 @@ function getPlayer(source) local Player = {}
|
|||||||
bank = info.money["bank"],
|
bank = info.money["bank"],
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
print("^4ERROR^7: ^2No Core detected for getPlayer() ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Core detected for getPlayer() ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
end
|
end
|
||||||
@@ -1221,6 +1269,76 @@ function getPlayer(source) local Player = {}
|
|||||||
return Player
|
return Player
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function sendPhoneMail(data) local phoneResource = ""
|
||||||
|
if GetResourceState("gksphone"):find("start") then phoneResource = "gksphone"
|
||||||
|
exports["gksphone"]:SendNewMail(data)
|
||||||
|
|
||||||
|
elseif GetResourceState("yflip-phone"):find("start") then phoneResource = "yflip-phone"
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":yflip:SendMail", data)
|
||||||
|
|
||||||
|
elseif GetResourceState("qs-smartphone"):find("start") then phoneResource = "qs-smartphone"
|
||||||
|
TriggerServerEvent('qs-smartphone:server:sendNewMail', data)
|
||||||
|
|
||||||
|
elseif GetResourceState("qs-smartphone-pro"):find("start") then phoneResource = "qs-smartphone-pro"
|
||||||
|
TriggerServerEvent('phone:sendNewMail', data)
|
||||||
|
|
||||||
|
elseif GetResourceState("roadphone"):find("start") then phoneResource = "roadphone"
|
||||||
|
data.message = data.message:gsub("%<br>", "\n")
|
||||||
|
exports['roadphone']:sendMail(data)
|
||||||
|
|
||||||
|
elseif GetResourceState("lb-phone"):find("start") then phoneResource = "lb-phone"
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":lbphone:SendMail", data)
|
||||||
|
|
||||||
|
elseif GetResourceState("qb-phone"):find("start") then phoneResource = "qb-phone"
|
||||||
|
TriggerServerEvent('qb-phone:server:sendNewMail', data)
|
||||||
|
|
||||||
|
elseif GetResourceState("jpr-phonesystem"):find("start") then phoneResource = "jpr-phonesystem"
|
||||||
|
TriggerServerEvent(GetCurrentResourceName()..":jpr:SendMail", data)
|
||||||
|
end
|
||||||
|
|
||||||
|
if phoneResource ~= "" then if Config.System.Debug then print("^6Bridge^7[^3"..phoneResource.."^7]: ^2Sending mail to player") end
|
||||||
|
else print("^6Bridge^7: ^1ERROR ^2Sending mail to player ^7 - ^2No supported phone found") end
|
||||||
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":lbphone:SendMail", function(data)
|
||||||
|
local src = source
|
||||||
|
local phoneNumber = exports["lb-phone"]:GetEquippedPhoneNumber(src)
|
||||||
|
local emailAddress = exports["lb-phone"]:GetEmailAddress(phoneNumber)
|
||||||
|
exports["lb-phone"]:SendMail({
|
||||||
|
to = emailAddress,
|
||||||
|
subject = data.subject,
|
||||||
|
message = data.message,
|
||||||
|
--[[attachments = {
|
||||||
|
"https://cdn.discordapp.com/attachments/1035667053115363349/1042500877426110474/upload.png",
|
||||||
|
},]]
|
||||||
|
actions = data.buttons,
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":yflip:SendMail", function(data)
|
||||||
|
local src = source
|
||||||
|
exports["yflip-phone"]:SendMail({
|
||||||
|
title = data.subject,
|
||||||
|
sender = data.sender,
|
||||||
|
senderDisplayName = data.sender,
|
||||||
|
content = data.message,
|
||||||
|
actions = data.buttons,
|
||||||
|
}, 'source', src)
|
||||||
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent(GetCurrentResourceName()..":jpr:SendMail", function(data)
|
||||||
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||||||
|
local src = source
|
||||||
|
local Player = QBCore.Functions.GetPlayer(src)
|
||||||
|
TriggerEvent('jpr-phonesystem:server:sendEmail', {
|
||||||
|
Assunto = data.subject, -- Subject
|
||||||
|
Conteudo = data.message, -- Content
|
||||||
|
Enviado = data.sender, -- Submitted by
|
||||||
|
Destinatario = Player.PlayerData.citizenid, -- Target
|
||||||
|
Event = {}, -- Optional
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
function registerCommand(command, options)
|
function registerCommand(command, options)
|
||||||
if GetResourceState(OXLibExport):find("start") then
|
if GetResourceState(OXLibExport):find("start") then
|
||||||
if Config.System.Debug then print("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..OXLibExport, command) end
|
if Config.System.Debug then print("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..OXLibExport, command) end
|
||||||
@@ -1236,11 +1354,13 @@ function invImg(item)
|
|||||||
if item ~= "" and Items[item] then
|
if item ~= "" and Items[item] then
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then
|
||||||
imgLink = "nui://"..OXInv.."/web/images/"..(Items[item].image or "")
|
imgLink = "nui://"..OXInv.."/web/images/"..(Items[item].image or "")
|
||||||
elseif GetResourceState(QSInv and QSInv or ""):find("start") then
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
imgLink = "nui://"..QSInv.."/html/images/"..(Items[item].image or "")
|
imgLink = "nui://"..QSInv.."/html/images/"..(Items[item].image or "")
|
||||||
elseif GetResourceState(CoreInv and CoreInv or ""):find("start") then
|
elseif GetResourceState(CoreInv):find("start") then
|
||||||
imgLink = "nui://"..CoreInv.."/html/img/"..(Items[item].image or "")
|
imgLink = "nui://"..CoreInv.."/html/img/"..(Items[item].image or "")
|
||||||
elseif GetResourceState(QBInv and QBInv or ""):find("start") then
|
elseif GetResourceState(OrigenInv):find("start") then
|
||||||
|
imgLink = "nui://"..OrigenInv.."/html/img/"..(Items[item].image or "")
|
||||||
|
elseif GetResourceState(QBInv):find("start") then
|
||||||
imgLink = "nui://"..QBInv.."/html/images/"..(Items[item].image or "")
|
imgLink = "nui://"..QBInv.."/html/images/"..(Items[item].image or "")
|
||||||
else
|
else
|
||||||
print("^4ERROR^7: ^2No Inventory detected for invImg ^7- ^2Check ^3exports^1.^2lua^7")
|
print("^4ERROR^7: ^2No Inventory detected for invImg ^7- ^2Check ^3exports^1.^2lua^7")
|
||||||
@@ -1249,13 +1369,27 @@ function invImg(item)
|
|||||||
return imgLink
|
return imgLink
|
||||||
end
|
end
|
||||||
|
|
||||||
function registerStash(name, label)
|
function registerStash(name, label, slots, weight)
|
||||||
if GetResourceState(OXInv):find("start") then
|
if GetResourceState(OXInv):find("start") then
|
||||||
--print("Registering OX Stash:", name, label)
|
--print("Registering OX Stash:", name, label)
|
||||||
exports[OXInv]:RegisterStash(name, label, 50, 4000000)
|
exports[OXInv]:RegisterStash(name, label, slots or 50, weight or 4000000)
|
||||||
elseif GetResourceState(QSInv):find("start") then
|
elseif GetResourceState(QSInv):find("start") then
|
||||||
--print("Registering QS Stash:", name, label)
|
--print("Registering QS Stash:", name, label)
|
||||||
exports[QSInv]:RegisterStash(name, 50, 4000000)
|
exports[QSInv]:RegisterStash(name, slots or 50, weight or 4000000)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- IN NO WAY PERFECT --
|
|
||||||
|
-- duiList callback here because it wouldnt load in functions.lua
|
||||||
|
|
||||||
|
if IsDuplicityVersion() then
|
||||||
|
createCallback(GetCurrentResourceName()..":Server:duiList", function(source, cb)
|
||||||
|
if GetResourceState(OXLibExport):find("start") then
|
||||||
|
return duiList
|
||||||
|
else
|
||||||
|
cb(duiList)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- IN NO WAY PERFECT --
|
||||||
|
|||||||
Reference in New Issue
Block a user