44 Commits

Author SHA1 Message Date
Jim Shield
518c5204ae Version Bump
`2.0.02` - `2.0.03`
2025-05-22 14:25:48 +01:00
Jim Shield
12642b7e7b Temp fix consumables not being usable randomly
I believe, the imported consumables from other scripts were fighting with each other in the `createUsableItem` event

In theory, when syncing them (at least at the moment) the restaurant would try to make them usable, and also this script would try. Possibly cancelling each other out?

This removes the `createUsableItem` event from the sync add item event
2025-05-22 14:23:12 +01:00
Jim Shield
c2843eaee2 Try to fix hunger/thirst for essx 2025-05-22 14:12:27 +01:00
Jim Shield
b92e26129f Convert to globalstatebag syncing for optimization
When consumables are added from outside the script, it uses global statebags to ensure data is received successfully. This syncs live and for players who have just connected

This removes the callbacks in the script to help optimization
2025-05-22 14:10:30 +01:00
Jim Shield
129b65deda Update version.txt 2025-05-19 17:10:56 +01:00
Jim Shield
d83d0bbfc4 check and store variable
If `jim-consumables:Consume` was triggered by an item with no information it would error and possibly break the script

This a check to instantly `return` when no consumable information is found
2025-05-17 21:03:29 +01:00
Jim Shield
2b6d3f2825 Update README.md 2025-05-14 15:56:13 +01:00
Jim Shield
cab1ddbe52 Update README.md 2025-05-14 15:54:58 +01:00
Jim Shield
868f322c8c Re-add dynamic string changer
Removed this by accident when people were getting notification issues

Restored it to display the correct message when consuming
2025-05-14 15:54:53 +01:00
Jim Shield
5bbd8a70e8 Version Bump
`2.0.01` - `2.0.02`
2025-05-14 15:38:08 +01:00
Jim Shield
9f5bde25ae Reset consumables.lua file
The file contained a lot of files from a server I worked on, I've removed these and added the files back from the previous file

But kept the examples of "boxes" being used and a explanation of how to make them
2025-05-14 15:33:27 +01:00
Jim Shield
445ddc82ac Change the "Stop Consuming" popup
It was originally using `drawText` to use framework ui to display `[BACKSPACE] Stop Consuming`

Changed to display an instructional native ui popup on the bottom right of the screen
2025-05-14 15:31:58 +01:00
Jim Shield
d9b97dc14c Fix stats overriding itself
The `stats` table was being overridden by the function to calculate random times for certain settings replacing the table with only `hunger` and `thirst`

Separated them now things like screen effects work again

Also refactored some sections to reduce amount of `if` statements
2025-05-14 15:24:36 +01:00
Jim Shield
c96d1ec277 place start functions behind onResourceStart() 2025-05-12 22:52:03 +01:00
Jim Shield
cf3d3c4147 Update fxmanifest.lua to new format
Removes core loading in `fxmanifest.lua` in favour of more "verbose" file loader in jim_bridge v`2.0.08+`
2025-05-10 20:06:00 +01:00
Jim Shield
4e565268cd Version Bump
`2.0` - `2.0.01`
2025-05-06 10:35:00 +01:00
Jim Shield
9e8dcc39f9 Remove notify types
I was hoping this wouldn't affect notification systems but it did

I left in code for a automated notification type, this was used on a server I worked on, forgot it was there and had a couple reports of it breaking qb-core nui
2025-05-05 19:48:11 +01:00
Jim Shield
c2d902c813 fix discord bot yml 2025-05-01 13:38:26 +01:00
Jim Shield
4d83c8c612 add gitbot yml 2025-05-01 00:19:02 +01:00
Jim Shield
f23d2bbdd0 Merge pull request #20 from jimathy/2.0beta 2025-04-28 18:19:53 +01:00
Jim Shield
9323c46406 Create FUNDING.yml 2025-04-13 13:25:23 +01:00
Jim Shield
57ed8b2ae0 Create FUNDING.yml 2025-04-13 13:11:50 +01:00
Jim Shield
7492531621 Version 2.0 Bump + readability changes 2025-04-01 19:39:26 +01:00
Jim Shield
531c93377a 2.0Beta upload 2025-04-01 19:34:44 +01:00
Jim Shield
11f479d8f8 Fix reward item errors 2023-03-27 18:59:56 +01:00
Jim Shield
d60a93448d Update README.md 2023-03-11 22:37:08 +00:00
Jim Shield
0b45087596 Update README.md 2023-03-11 22:27:47 +00:00
Jim Shield
5b1c949903 Update README.md 2023-03-11 22:27:21 +00:00
Jim Shield
61ca273b5f Merge pull request #13 from jellyton69/patch-1
Exports not export
2023-03-06 21:00:17 +00:00
Jellyton
7feaa12f7e Exports not export
Fixed progress bar cancelation export for ox lib.
2023-03-04 20:33:51 -08:00
Jim Shield
7f5383f90e emotes... 2023-03-02 15:22:15 +00:00
Jim Shield
e988fb216a emotes. 2023-03-02 15:08:11 +00:00
Jim Shield
6a17162638 1.5 - ox_prog/correct emotes/import system update
Refactor
Support for ox_progressbar
Sorted out the fucking default emotes
Item/Emote System update, works better and syncs better
Update Readme to reflect the chagnes
2023-03-02 15:06:30 +00:00
Jim Shield
cec84d4ba9 Merge pull request #12 from taylorrenee1/patch-3
forgot a }
2023-02-27 13:50:41 +00:00
taylorrenee1
9558f71ce8 forgot a } 2023-02-27 05:49:46 -08:00
Jim Shield
3565c9850f Merge pull request #11 from taylorrenee1/patch-2
Putting default drugs back in
2023-02-27 13:38:50 +00:00
taylorrenee1
8f57772427 Putting default drugs back in 2023-02-27 05:33:10 -08:00
Jim Shield
d7ec8dd90c Merge pull request #10 from taylorrenee1/patch-1
Fixes player being stuck when consuming
2023-02-24 20:14:09 +00:00
taylorrenee1
429bf50b3a also adds print to check movement type 2023-02-24 11:04:47 -08:00
taylorrenee1
0b42cbc362 Fixes player being stuck when consuming 2023-02-24 11:01:05 -08:00
Jim Shield
e7d9946532 ox lib notify support - Config.Notify = "ox" 2023-02-21 17:20:20 +00:00
Jim Shield
c10860f788 add shared ox inv support 2023-02-21 17:07:02 +00:00
Jim Shield
7e10b7835f Add server-side ox inv support 2023-02-21 17:06:12 +00:00
Jim Shield
80ffb27ac2 ox inv basic support 2023-02-21 17:04:52 +00:00
12 changed files with 1158 additions and 723 deletions

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: jixelpatterns
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://jimathy666.tebex.io/']

17
.github/workflows/notify-discord.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: Discord Commit Notifier
on:
push:
branches:
- '*' # triggers on all branches
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Discord Commits
uses: Sniddl/discord-commits@v1.6
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
template: "avatar-with-link"
include-extras: true

242
README.md
View File

@@ -1,91 +1,151 @@
# jim-consumables # Jim-Consumables
Consumables script for QBCore Consumables script for QBCore
# What is this? # What is this?
This script is designed as a replacement/override for food and drink consumables in qb-smallresources This script WAS designed as a replacement/override for food and drink consumables in `qb-smallresources`
It's main purpose was to make it possible to not stand up while sitting due to lazy events such as ClearPedTasks in most scripts, this one is designed to cancel the animation you have chosen, not all animations. This includes progressbar. It's main purpose was to make it so players did not stand up while sitting with my scripts due to lazy events such as ClearPedTasks in progressbar and dpemotes, this one is designed to cancel the animation you have chosen, not ALL animations.
## v1.4 Beta Information Users requested I readd the progressbar but it ended up being a config option to enable it
I've added a export system that allows scripts to easily add new foods and drinks to be usable and then sync them between players
This should work but may have issues. Though if your players are cancelling all animations when consuming, it's recommended to set `Config.UseProgBar` to `false` to get this effect.
But because of the export system being used, Jim-Consumables **NEEDS** to start before any scripts that use it. # THIS DOESN'T USE DPEMOTES OR RPEMOTES OR SCULLYS EMOTEMENU
And small example snippet for this imports the item and the emote, then syncs it to players # Installation
```lua - I always recommend starting my scripts **AFTER** `[qb]` not inside it as it can mess with any dependancies on server load
local foodTable = { - I have a separate folder called `[jimextras]` (that is also in the resources folder) that starts before any scripts would use it.
["shotfries"] = { emote = "bsfries", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(55,65), }}, - This ensure's it has everything it requires before trying to load
} - Example of my load order:
local emoteTable = { ```CSS
["bsfries"] = {"mp_player_inteat@burger", "mp_player_int_eat_burger_fp", "Fries", AnimationOptions = { Prop = "prop_food_bs_chips", PropBone = 18905, PropPlacement = {0.09, -0.06, 0.05, 300.0, 150.0}, EmoteMoving = true, EmoteLoop = true, }}, # QBCore & Extra stuff
} ensure qb-core
ensure [qb]
for k, v in pairs(emoteTable) do exports["jim-consumables"]:importEmote(k, v) end ensure [standalone]
for k, v in pairs(foodTable) do exports["jim-consumables"]:importConsumable(k, v) end ensure [voice]
``` ensure [defaultmaps]
This will grab the `shotfries` item info and add it to the `Config.Consumables` while the servers running and the same with the built-in emote system ensure [vehicles]
# Installation # Extra Jim Stuff
ensure [jimextras]
This script is recommended to be ran last/at the bottom of your server.cfg because this is intended to take control of items, if ran too early the original script may override this one. ensure [jim]
```
It already takes control of default qbcore food and drink, but you would probably want to add more.
## QB-SmallResources
To add an item, you only need to add a new item table in the Config.Consumables like this:
```lua - It should already take control of default qbcore food, drink and drugs.
["heartstopper"] = { - If it fails to do this and attempts to use qb-smallresources still you will need to:
emote = "burger", -- Select an emote from below, it has to be in here - `[qb]` > `qb-smallresources` > `server` > `consumables.lua`
time = math.random(5000, 6000), -- Amount of time it takes to consume the item - Remove or comment out the `CreateUseableItem` events for *alcohol*, *eat*, *drink* and *drug* in this file
stress = math.random(1, 2), -- Amount of stress relief, can be 0 - Not all of them! (such as armour related items)
heal = 0, -- Set amount to heal by after consuming - This ***should*** stop `qb-smallresources` taking control and confusing `jim-consumables`
armor = 5, -- Amount of armor to add
type = "food", -- Type: "alcohol" / "drink" / "food" ## New Items
returnItem = { -- Item that will be given when the item is used To add an item, you only need to add a new item table in the Config.Consumables like this:
item = "plastic", -- eg. Plastic bottles can give "plastic" ```lua
amount = 1, heartstopper = {
}, emote = "burger", -- Select an emote from below, it has to be in here
stats = { time = math.random(5000, 6000), -- Amount of time it takes to consume the item
screen = "rampage", -- The screen effect to be played when after consuming the item stress = math.random(1,2), -- Amount of stress relief, can be 0
effect = "heal", -- The status effect given by the item, "heal" / "stamina" heal = 0, -- Set amount to heal by after consuming
time = 10000, -- How long the effect should last (if not added it will default to 10000) armor = 5, -- Amount of armor to add
amount = 2, -- How much the value is changed by per second type = "food", -- Type: "alcohol" / "drink" / "food"
hunger = math.random(10,20), -- The hunger/thirst stats of the item, if not found in the items.lua canRun = true, -- If true player can run while using the item, not to it will cancel the event
thirst = math.random(10,20), -- The hunger/thirst stats of the item, if not found in the items.lua
}, stats = {
}, screen = "thermal", -- The screen effect to be played when after consuming the item "rampage" "turbo" "focus" "weed" "trevor" "nightvision" "thermal"
``` effect = "heal", -- The status effect given by the item, "heal" / "stamina"
Consuming an item can also manually activate screen effects -- This supports ps-buffs effects "armor" "stress" "swimming" "hacking" "intelligence" "luck" "strength"
time = 10000, -- How long the effect should last (if not added it will default to 10000)
The example above uses `rampage` as this is what the effect is named after, you can use it for any item you think best amount = 6, -- How much the value is changed by per second
```lua hunger = math.random(10, 20), -- The hunger/thirst stats of the item, if not found in the items.lua
--The current list of screen effects are: thirst = math.random(10, 20), -- The hunger/thirst stats of the item, if not found in the items.lua
"turbo" canOD = true, -- This creates an OD Effect, killing the user if they have too much
"focus" },
"rampage" --Reward Items Variables
"weed" -- These can be the only thing in a consumable table and the item will still work
"trevor" amounttogive = 3, -- Used for "RewardItems", tells the script how many to give
"nightvision" rewards = {
"thermal" [1] = {
``` item = "plastic", -- prize item name
max = 10, -- max amount to give (this is put into math.random(1, max) )
## PS-Buffs Support rarity = 1, -- the rarity system, 1 being rarest, 4 being most common
This scripts can be expanded with ps-buffs (https://github.com/Project-Sloth/ps-buffs) },
},
If this script is enabled it will automatically try to use their system to apply buffs: },
```
```lua Consuming an item can also manually activate screen effects
--The extra buffs that can be set include:
"heal" -- Health recovery buff The example above uses `rampage` as this is what the effect is named after, you can use it for any item you think best
"stamina" -- Stamina recovery buff ```lua
"swimming" -- Swimming speed buff --The current list of screen effects are:
"stress" -- Stress recovery buff "turbo"
"armor" -- Armour recovery buff "focus"
"hacking" -- Hacking effect "rampage"
"intelligence" -- Intelligence effect "weed"
"luck" -- Luck effect "trevor"
"strength" -- Strength effect "nightvision"
``` "thermal"
```
This script supports dpemotes style emotes, so if you have some that you want to be triggered when eating or drinking drop it in the Config.Emotes section.
You can also now create "Box" items, when setting type to "pack", it will act as if you user is opening a box
Examples:
- Ammo boxes that give clips
- Packets of cigarretes
- Crates of beer
How to set up these:
```lua
-- Example Box Item
["9_box"] = { -- Name of the box item in the shared items
emote = "uncuff", -- The emote than should run when "unboxing"
canRun = true, -- If true player can run while using the item, not to it will cancel the event
time = 3500, -- How long it takes to use the item
type = "pack", -- Designate it as a "pack" to the script knows what to do
pack = {
item = "9_ammo", -- The item to give from the box when complete
amount = 20 -- How many of the item to give
},
},
```
## PS-Buffs Support
This scripts can be expanded with ps-buffs (https://github.com/Project-Sloth/ps-buffs)
If this script is enabled it will automatically try to use their system to apply buffs:
```lua
--The extra buffs that can be set include:
"heal" -- Health recovery buff
"stamina" -- Stamina recovery buff
"swimming" -- Swimming speed buff
"stress" -- Stress recovery buff
"armor" -- Armour recovery buff
"hacking" -- Hacking effect
"intelligence" -- Intelligence effect
"luck" -- Luck effect
"strength" -- Strength effect
```
This script supports dpemotes style emotes, so if you have some that you want to be triggered when eating or drinking drop it in the Config.Emotes section.
## Add consumables from external scripts
A small example of a server-sided snippet for this imports the item and the emote, then syncs it to players before and after they connect.
```lua
local foodTable = {
["shotfries"] = { emote = "bsfries", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(55,65), }},
}
local emoteTable = {
["bsfries"] = {"mp_player_inteat@burger", "mp_player_int_eat_burger_fp", "Fries", AnimationOptions = { Prop = "prop_food_bs_chips", PropBone = 18905, PropPlacement = {0.09, -0.06, 0.05, 300.0, 150.0}, EmoteMoving = true, EmoteLoop = true, }},
}
for k, v in pairs(foodTable) do TriggerEvent("jim-consumables:server:syncAddItem", k, v) end
for k, v in pairs(emoteTable) do TriggerEvent("jim-consumables:server:syncAddEmote", k, v) end
```
This will grab the `shotfries` item info and add it to the `Config.Consumables` while the servers running and the same with the built-in emote system

View File

@@ -1,46 +1,151 @@
local QBCore = exports['qb-core']:GetCoreObject() local alcoholCount, drugCount, consuming, cancelled = 0, 0, false, false
Consumables, Emotes = {}, {}
local alcoholCount = 0 onPlayerLoaded(function()
local drugCount = 0 -- Wait until statebag exists, then trigger local handler
CreateThread(function()
--Convert Prop Model Names to Model HashKeys now to be more optimized when loading later while not GlobalState.jimConsumableItems do Wait(100) end
for k in pairs(Config.Emotes) do local newConsumables = GlobalState.jimConsumableItems
if Config.Emotes[k].AnimationOptions.Prop then for k in pairsByKeys(newConsumables) do
Config.Emotes[k].AnimationOptions.Prop = GetHashKey(Config.Emotes[k].AnimationOptions.Prop) if not Consumables[k] then
if Config.Emotes[k].AnimationOptions.SecondProp then debugPrint("^5Statebag^7: ^2New ^3Consumable ^2Info synced^7: ^6"..k.."^7")
Config.Emotes[k].AnimationOptions.SecondProp = GetHashKey(Config.Emotes[k].AnimationOptions.SecondProp) end
end end
while not GlobalState.jimConsumableEmotes do Wait(100) end
local newEmotes = GlobalState.jimConsumableEmotes
for k in pairsByKeys(newEmotes) do
if not Emotes[k] then
debugPrint("^5Statebag^7: ^2New ^3Emote ^2Info synced^7: ^6"..k.."^7")
end
end
Consumables = newConsumables
Emotes = newEmotes
debugPrint("^5Statebag^7: ^2Synced ^6"..countTable(Consumables).." ^2Items and ^6"..countTable(Emotes).." ^2Emotes^7")
end)
end, true)
-- Handlers to recieve global statebag data from the server
AddStateBagChangeHandler("jimConsumableItems", nil, function(bagName, key, value, _unused)
if type(value) == "table" then
local newItemCount = 0
for k in pairsByKeys(value) do
if not Consumables[k] then
newItemCount += 1
debugPrint("^5Statebag^7: ^2New ^3Consumable ^2Info synced^7: ^6"..k.."^7")
end
end
Consumables = value
debugPrint("^5Statebag^7: ^2Synced ^6"..newItemCount.." ^2new Consumables^7")
end
end)
AddStateBagChangeHandler("jimConsumableEmotes", nil, function(bagName, key, value, _unused)
if type(value) == "table" then
local newEmoteCount = 0
for k in pairsByKeys(value) do
if not Emotes[k] then
newEmoteCount += 1
debugPrint("^5Statebag^7: ^2New ^3Emote ^2Info synced^7: ^6"..k.."^7")
end
end
Emotes = value
debugPrint("^5Statebag^7: ^2Synced ^6"..newEmoteCount.." ^2new Emotes^7")
end end
end
local consuming = false
local cancelled = false
AddEventHandler('onResourceStart', function(r) if GetCurrentResourceName() ~= r then return end TriggerServerEvent("jim-consumables:getSync") end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() TriggerServerEvent("jim-consumables:getSync") end)
RegisterNetEvent("jim-consumables:syncItems", function(consumables, emotes)
if consumables then for k, v in pairs(consumables) do if not Config.Consumables[k] then Config.Consumables[k] = v print("^5Debug^7 ^2Adding Item^7: '^6"..k.."^7'") end end end
if emotes then for k, v in pairs(emotes) do if not Config.Emotes[k] then Config.Emotes[k] = v print("^5Debug^7 ^2Adding Emote^7: '^6"..k.."^7'") end end end
end) end)
RegisterNetEvent('jim-consumables:Consume', function(itemName) RegisterNetEvent(getScript()..':Consume', function(itemName)
if not HasItem(itemName, 1) then print("^5Debug^7: ^1Error^7: ^2Item not found in inventory^7, ^2stopping^7..") end if not Consumables[itemName] then return end
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Starting event, locking inventory and grabbing data^7..") end local consumable = Consumables[itemName]
LocalPlayer.state:set("inv_busy", true, true) TriggerEvent('inventory:client:busy:status', true) TriggerEvent('canUseInventoryAndHotbar:toggle', false) if not hasItem(itemName, 1) then
local Player = PlayerPedId() print("^5Debug^7: ^1Error^7: ^2Item not found in inventory^7, ^2stopping^7..")
local emote = Config.Emotes[Config.Consumables[itemName].emote] or Config.Emotes["crisps"] end
local returnItem = Config.Consumables[itemName].returnItem or nil local requiredItem = consumable and consumable.requiredItem or nil
if requiredItem then
if not hasItem(requiredItem, 1) then
triggerNotify(nil, "You need a "..Items[requiredItem].label, "error")
return
else
-- if requiredItem == "lighter" then breakTool({ item = "lighter", damage = math.random(0, 1) }) end
end
end
debugPrint("^5Debug^7: ^3Consume^7: ^2Starting event, locking inventory and grabbing data^7..")
tempLockInv(true)
local Player = PlayerPedId()
local emote = Emotes[consumable.emote] or Emotes["crisps"]
if isAnimal then --- Animal ped adjustments
local presets = {
["default"] = {
propPlacement = { 0.0, 0.25, -0.04, 0.0, 0.0, 0.0, },
propPlacement2 = { 0.0, 0.25, -0.02, 0.0, 0.0, 0.0, }
},
[`a_c_rabbit_01`] = {
propPlacement = { 0.0, 0.37, -0.15, 0.0, 0.0, 0.0, },
propPlacement2 = { 0.0, 0.37, -0.13, 0.0, 0.0, 0.0, }
},
[`a_c_rat`] = {
propPlacement = { 0.0, 0.25, -0.04, 0.0, 0.0, 0.0, },
propPlacement2 = { 0.0, 0.25, -0.02, 0.0, 0.0, 0.0, }
},
[`a_c_crow`] = {
propPlacement = { 0.0, 0.25, 0.02, 0.0, 0.0, 0.0, },
propPlacement2 = { 0.0, 0.25, 0.04, 0.0, 0.0, 0.0, }
},
}
local model = GetEntityModel(Player)
local isCat = (isCat() or model == `ft-raccoon`) and (model ~= `ft-sphynx`)
local isDog, bigDog = isDog()
if isDog and model == `a_c_coyote` then isDog = false end
local isCoyote = (model == `ft-sphynx` or model == `a_c_coyote`)
if model == `ft-capmonkey2` then isDog = true end
local propPlacement, propPlacement2 = { 0.0, 0.37, -0.19, 0.0, 0.0, 0.0, }, { 0.0, 0.37, -0.17, 0.0, 0.0, 0.0, }
if isDog then
if bigDog or isCoyote then
propPlacement = { 0.0, 0.53, -0.39, 0.0, 0.0, 0.0, } propPlacement2 = { 0.0, 0.53, -0.37, 0.0, 0.0, 0.0, }
else
propPlacement = { 0.0, 0.33, -0.28, 0.0, 0.0, 0.0, } propPlacement2 = { 0.0, 0.33, -0.26, 0.0, 0.0, 0.0, }
end
end
if not isCat and not isDog then
propPlacement = presets[model] and presets[model].propPlacement or presets["default"].propPlacement
propPlacement2 = presets[model] and presets[model].propPlacement2 or presets["default"].propPlacement
end
emote = {
"creatures@pug@move", "nill", "",
AnimationOptions = {
EmoteLoop = true,
Prop = "v_res_tt_bowl",
PropBone = 64081,
PropPlacement = propPlacement,
SecondProp = Emotes[consumable.emote].AnimationOptions.Prop or nil,
SecondPropBone = Emotes[consumable.emote].AnimationOptions.Prop and 64081 or nil,
SecondPropPlacement = Emotes[consumable.emote].AnimationOptions.Prop and propPlacement2 or nil,
},
}
end
local returnItem = consumable.returnItem or nil
local animDict, anim = tostring(emote[1]), tostring(emote[2]) local animDict, anim = tostring(emote[1]), tostring(emote[2])
local model, model2, bone, bone2, drugeffect, stress local model, model2, bone, bone2, drugeffect, stress
local P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 = table.unpack({0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}) -- Default placement coord cariable local P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 = table.unpack({0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}) -- Default placement coord cariable
local RewardItem = Config.Consumables[itemName].rewards or nil local RewardItem = consumable.rewards or nil
local time = Config.Consumables[itemName].time or math.random(5000, 6000) local type = consumable.type or ""
local type = Config.Consumables[itemName].type or "" local pack = consumable.pack or nil
local stress = Config.Consumables[itemName].stress or 0
local heal = Config.Consumables[itemName].heal or 0
local armor = Config.Consumables[itemName].armor or 0
local string = "Using " local string = "Using "
local canRun = consumable.canRun
local stats = consumable.stats
local time, stress, heal, armor, needStats = GenerateRandomValues({
time = consumable.time or { 5000, 6000 },
stress = consumable.stress or 0,
heal = consumable.heal or 0,
armor = consumable.armor or 0,
hunger = consumable.stats and consumable.stats.hunger or 0,
thirst = consumable.stats and consumable.stats.thirst or 0,
})
if emote.AnimationOptions.Prop then if emote.AnimationOptions.Prop then
model = emote.AnimationOptions.Prop model = emote.AnimationOptions.Prop
bone = GetPedBoneIndex(Player, emote.AnimationOptions.PropBone) bone = GetPedBoneIndex(Player, emote.AnimationOptions.PropBone)
@@ -50,16 +155,24 @@ RegisterNetEvent('jim-consumables:Consume', function(itemName)
bone2 = GetPedBoneIndex(Player, emote.AnimationOptions.SecondPropBone) bone2 = GetPedBoneIndex(Player, emote.AnimationOptions.SecondPropBone)
P7, P8, P9, P10, P11, P12 = table.unpack(emote.AnimationOptions.SecondPropPlacement) P7, P8, P9, P10, P11, P12 = table.unpack(emote.AnimationOptions.SecondPropPlacement)
end end
end end
if type == "drink" or type == "alcohol" then string = "Drinking "
elseif type == "food" then string = "Eating " if type == "drink" or type == "alcohol" then
else string = "Using " end string = "Drinking "
if consuming then elseif type == "food" then
cancelled = true string = "Eating "
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Event already started^7, ^1Cancelling^7.") end elseif type == "smoke" then
LocalPlayer.state:set("inv_busy", false, true) string = "Smoking "
elseif type == "pack" then
string = "Opening "
end
if consuming then
cancelled = true
debugPrint("^5Debug^7: ^3Consume^7: ^2Event already started^7, ^1Cancelling^7.")
tempLockInv(false)
if Config.UseProgbar then if Config.UseProgbar then
TriggerEvent("progressbar:client:cancel") stopPropgressBar()
else else
triggerNotify(nil, "Stopped "..string, "error") triggerNotify(nil, "Stopped "..string, "error")
end end
@@ -67,80 +180,130 @@ RegisterNetEvent('jim-consumables:Consume', function(itemName)
return return
end end
--Emote Stuff --Emote Stuff
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Grabbing Emote Animation Options^7...") end debugPrint("^5Debug^7: ^3Consume^7: ^2Grabbing Emote Animation Options^7...")
if emote.AnimationOptions then local InVehicle = IsPedInAnyVehicle(Player, true)
if emote.AnimationOptions.EmoteLoop then MovementType = 1 debugPrint("^5Debug^7: ^3Consume^7: ^2Checking if player is in a vehicle^7 - ^6"..tostring(InVehicle).."^7")
elseif emote.AnimationOptions.EmoteMoving then MovementType = 51
elseif emote.AnimationOptions.EmoteMoving == false then MovementType = 0
elseif emote.AnimationOptions.EmoteStuck then MovementType = 50 end
else MovementType = 0 end
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Checking if player is in a vehicle^7...") end
local InVehicle = IsPedInAnyVehicle(Player, true)
if InVehicle == 1 then MovementType = 51 end
--Load and Start animation
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Playing Animation^7...") end
loadAnimDict(animDict)
TaskPlayAnim(Player, animDict, anim, 1.0, 1.0, -1, MovementType, 0, 0, 0, 0)
if Config.UseProgbar then MovementType = 0 -- Default movement type
QBCore.Functions.Progressbar('jimmy_consume_', string..QBCore.Shared.Items[itemName].label.."..", time, false, false, {disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = true,}, {}, {}, {}, function() consuming = false end, function() end, itemName)
if InVehicle == 1 then
MovementType = 51
elseif emote.AnimationOptions then
if emote.AnimationOptions.EmoteMoving then
MovementType = 51
elseif emote.AnimationOptions.EmoteLoop then
MovementType = 1
elseif emote.AnimationOptions.EmoteStuck then
MovementType = emote.AnimationOptions.EmoteMoving and 50 or 2
elseif emote.AnimationOptions.EmoteMoving == false then
MovementType = 0
end
end
--Load and Start animation
debugPrint("^5Debug^7: ^3Consume^7: ^2Playing Animation^7...")
if not (GetPedType(Player) == 28)then
playAnim(animDict, anim, -1, MovementType)
end
debugPrint("^5Debug^7: ^3Consume^7: ^2Player Movement Flag^7 - ^6"..json.encode(MovementType).." ^7")
if Config.Main.UseProgbar then
CreateThread(function()
if progressBar({ time = time, label = string..Items[itemName].label.."..", dead = false, cancel = false}) then
consuming = false
else
end
end)
else else
triggerNotify(nil, string..QBCore.Shared.Items[itemName].label.."..", "success") triggerNotify(nil, string..Items[itemName].label.."..", "success")
end end
consuming = true consuming = true
CreateThread(function() CreateThread(function()
--Prop Spawning --Prop Spawning
if model then if model then
if IsModelValid(model) == 1 then if IsModelValid(model) == 1 then
if Config.Debug then print("^5Debug^7: ^3PropSpawn^7: ^2Spawning consumable prop^7.") end debugPrint("^5Debug^7: ^3PropSpawn^7: ^2Spawning consumable prop^7...")
attachProp = makeProp({ prop = model, coords = vector4(0.0,0.0,0.0,0.0)}, 1, 1) attachProp = makeProp({ prop = model, coords = vector4(0.0,0.0,0.0,0.0)}, 1, 1)
AttachEntityToEntity(attachProp, Player, bone, P1, P2, P3, P4, P5, P6, true, true, false, true, 1, true) AttachEntityToEntity(attachProp, Player, bone, P1, P2, P3, P4, P5, P6, true, true, false, true, 1, true)
if model2 then if model2 then
if IsModelValid(model2) == 1 then if IsModelValid(model2) == 1 then
attachProp2 = makeProp({ prop = model2, coords = vector4(0.0,0.0,0.0,0.0)}, 1, 1) attachProp2 = makeProp({ prop = model2, coords = vector4(0.0,0.0,0.0,0.0)}, 1, 1)
AttachEntityToEntity(attachProp2, Player, bone2, P7, P8, P9, P10, P11, P12, true, true, false, true, 1, true) AttachEntityToEntity(attachProp2, Player, bone2, P7, P8, P9, P10, P11, P12, true, true, false, true, 1, true)
else print("^5Debug^7: ^3PropSpawn^7: ^2Second prop model isn't valid/found^7.") end else
print("^5Debug^7: ^3PropSpawn^7: ^2Second prop model isn't valid/found^7.")
end end
while consuming do Wait(50) end
if DoesEntityExist(attachProp) then destroyProp(attachProp) attachProp = nil end
if DoesEntityExist(attachProp2) then destroyProp(attachProp2) attachProp2 = nil end
else print("^5Debug^7: ^3PropSpawn^7: ^2Prop model isn't valid/found^7.") end
end
end)
while consuming do
if time <= 0 then consuming = false end
if not Config.Consumables[itemName].canRun then
if IsControlJustPressed(0, 21) then
consuming = false
cancelled = true
LocalPlayer.state:set("inv_busy", false, true)
if Config.UseProgbar then
TriggerEvent("progressbar:client:cancel")
else
triggerNotify(nil, "Cancelled "..string, "error")
end end
while consuming do Wait(50) end
if DoesEntityExist(attachProp) then
destroyProp(attachProp)
attachProp = nil
end
if DoesEntityExist(attachProp2) then
destroyProp(attachProp2)
attachProp2 = nil
end
else
print("^5Debug^7: ^3PropSpawn^7: ^2Prop model isn't valid/found^7.")
end end
end end
Wait(10) end)
time -= 10
while consuming do
if debugMode then
drawText(nil, {
"Time: "..tostring(time),
"Type: "..(type or ""),
"Hunger: "..(needStats.hunger or 0).."%",
"Thirst: "..(needStats.thirst or 0).."%",
"Stress: "..(stress or 0).."%",
"Heal: "..(heal or 0).."%",
"Armour: "..(armor or 0).."%",
}, nil, nil)
end
makeInstructionalButtons({
{ keys = { 194 }, text = "Stop Consuming" },
})
if time <= 0 then
consuming = false
end
if (IsControlJustPressed(0, 21) and not canRun) or IsPedRagdoll(Player) or IsControlJustPressed(0, 177) then
consuming = false
cancelled = true
tempLockInv(false)
hideText()
if Config.Main.UseProgbar then
stopPropgressBar()
else
triggerNotify(nil, "Cancelled "..string, "error")
end
end
Wait(0)
time -= 12
end end
StopEntityAnim(Player, anim, animDict, 1.0) StopEntityAnim(Player, anim, animDict, 1.0)
unloadAnimDict(animDict) unloadAnimDict(animDict)
if not cancelled then if not cancelled then
toggleItem(false, itemName, 1) hideText()
if returnItem ~= nil then toggleItem(true, returnItem.item, returnItem.amount) end removeItem(itemName, 1)
if returnItem ~= nil then
debugPrint("returnItem detected")
currentToken = triggerCallback(AuthEvent)
addItem(returnItem.item, returnItem.amount)
end
-- Reward Item calculations -- Reward Item calculations
CreateThread(function() CreateThread(function()
if RewardItem then if RewardItem then
for i = 1, Config.Consumables[itemName].amounttogive do debugPrint("Reward Item detected")
local rarity = math.random(1, countTable(Config.Rarity)) -- rarity calculation for i = 1, consumable.amounttogive do
local rarity = math.random(1, 4) -- rarity calculation
while true do while true do
local item = math.random(1, countTable(RewardItem)) -- random item in the list to pick local item = math.random(1, countTable(RewardItem)) -- random item in the list to pick
if RewardItem[item].rarity >= rarity then if RewardItem[item].rarity >= rarity then
toggleItem(true, RewardItem[item].item, math.random(1, RewardItem[item].max)) currentToken = triggerCallback(AuthEvent)
if Config.Debug then print("^5Debug^7: ^2Given reward prize^7: '^6"..RewardItem[item].item.."^7'") end addItem(RewardItem[item].item, math.random(1, RewardItem[item].max or 1))
debugPrint("^5Debug^7: ^2Given reward prize^7: '^6"..RewardItem[item].item.."^7'")
break break
end end
Wait(100) Wait(100)
@@ -149,98 +312,181 @@ RegisterNetEvent('jim-consumables:Consume', function(itemName)
end end
end end
end) end)
local hunger = 0 if needStats then
local thirst = 0 if needStats.hunger then
if Config.Consumables[itemName].stats then local hunger = 0
if Config.Consumables[itemName].stats.hunger then hunger = Config.Consumables[itemName].stats.hunger end if Core.Functions and Core.Functions.GetPlayerData then
TriggerServerEvent("jim-consumables:server:addHunger", QBCore.Functions.GetPlayerData().metadata["hunger"] + hunger) hunger = Core.Functions.GetPlayerData().metadata["hunger"] or 0
if Config.Consumables[itemName].stats.thirst then thirst = Config.Consumables[itemName].stats.thirst end elseif ESX and ESX.GetPlayerData then
TriggerServerEvent("jim-consumables:server:addThirst", QBCore.Functions.GetPlayerData().metadata["thirst"] + thirst) hunger = ESX.GetPlayerData().hunger or 0
end
TriggerServerEvent(getScript()..":server:addNeed", hunger + needStats.hunger, "hunger")
end
if needStats.thirst then
local thirst = 0
if Core.Functions and Core.Functions.GetPlayerData then
thirst = Core.Functions.GetPlayerData().metadata["thirst"] or 0
elseif ESX and ESX.GetPlayerData then
thirst = ESX.GetPlayerData().thirst or 0
end
TriggerServerEvent(getScript()..":server:addNeed", thirst + needStats.thirst, "thirst")
end
end end
if Config.Debug then print("^5Debug^7: ^2Hunger^7: [^6"..hunger.."^7] ^2Thrist^7: [^6"..thirst.."^7]" ) end debugPrint("^5Debug^7: ^2Hunger^7: [^6"..(needStats.hunger or 0).."^7] ^2Thrist^7: [^6"..(needStats.thirst or 0).."^7]" )
if stress and stress ~= 0 then if stress and stress ~= 0 then
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Reliving ^6"..stress.." ^2stress^7.") end debugPrint("^5Debug^7: ^3Consume^7: ^2Relieving ^6"..stress.." ^2stress^7.")
TriggerServerEvent('hud:server:RelieveStress', stress) TriggerServerEvent('hud:server:RelieveStress', stress)
end end
if heal and heal ~= 0 then if heal and heal ~= 0 then
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Healing player by^7: ^6"..heal) end debugPrint("^5Debug^7: ^3Consume^7: ^2Healing player by^7: ^6"..heal)
SetEntityHealth(Player, GetEntityHealth(Player) + heal) SetEntityHealth(Player, GetEntityHealth(Player) + heal)
end end
if armor and armor ~= 0 then if armor and armor ~= 0 then
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Adding ^6"..armor.." ^2armour^7.") end debugPrint("^5Debug^7: ^3Consume^7: ^2Adding ^6"..armor.." ^2armour^7.")
TriggerServerEvent('hospital:server:SetArmor', (GetPedArmour(Player) + armor)) SetPedArmour(Player, (GetPedArmour(Player) + armor)) TriggerServerEvent('hospital:server:SetArmor', (GetPedArmour(Player) + armor)) SetPedArmour(Player, (GetPedArmour(Player) + armor))
end end
if type == "alcohol" then if type == "alcohol" then
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Current ^4alcoholCount^7: ^6"..(alcoholCount + 1)) end alcoholCount += 1
alcoholCount = alcoholCount + 1 debugPrint("^5Debug^7: ^3Consume^7: ^2Current ^4alcoholCount^7: ^6"..alcoholCount)
if alcoholCount > 1 and alcoholCount < 4 then if alcoholCount > 1 and alcoholCount < 4 then
TriggerEvent("evidence:client:SetStatus", "alcohol", 200) TriggerEvent("evidence:client:SetStatus", "alcohol", 200)
elseif alcoholCount >= 4 then elseif alcoholCount >= 4 then
TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200) TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200)
CreateThread(function() AlienEffect() end) -- Used as overdosing/too drunk effect CreateThread(function()
AlienEffect()
end) -- Used as overdosing/too drunk effect
end end
end end
stats = Config.Consumables[itemName].stats or nil if pack then
if Config.Consumables[itemName].stats then currentToken = triggerCallback(AuthEvent)
addItem(pack.item, pack.amount)
end
if stats then
if stats.screen then -- Screen effect activation if stats.screen then -- Screen effect activation
if stats.screen == "turbo" then CreateThread(function() TurboEffect() end) end debugPrint(stats.screen)
if stats.screen == "focus" then CreateThread(function() FocusEffect() end) end local statFunctions = {
if stats.screen == "rampage" then CreateThread(function() RampageEffect() end) end ["turbo"] = TurboEffect,
if stats.screen == "weed" then CreateThread(function() WeedEffect() end) end ["focus"] = FocusEffect,
if stats.screen == "trevor" then CreateThread(function() TrevorEffect() end) end ["rampage"] = RampageEffect,
if stats.screen == "nightvision" then CreateThread(function() NightVisionEffect() end) end ["weed"] = WeedEffect,
if stats.screen == "thermal" then CreateThread(function() ThermalEffect() end) end ["trevor"] = TrevorEffect,
["nightvision"] = NightVisionEffect,
["thermal"] = ThermalEffect,
}
if statFunctions[stats.screen] then
CreateThread(function()
statFunctions[stats.screen]()
end)
end
end end
if stats.canOD then if stats.canOD then
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Current ^4drugCount^7: ^6"..(drugCount + 1)) end
drugCount += 1 drugCount += 1
debugPrint("^5Debug^7: ^3Consume^7: ^2Current ^4drugCount^7: ^6"..drugCount)
if drugCount >= 4 then if drugCount >= 4 then
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Current ^4drugCount^7: ^6"..drugCount.."^7 - ^2 removing health") end debugPrint("^5Debug^7: ^3Consume^7: ^2Current ^4drugCount^7: ^6"..drugCount.."^7 - ^2 removing health")
SetEntityHealth(PlayerPedId(), GetEntityHealth(Player) - math.random(10,15)) SetEntityHealth(PlayerPedId(), GetEntityHealth(Player) - math.random(10, 15))
if drugCount >= 7 then if drugCount >= 7 then
CreateThread(function() AlienEffect() end) -- If too many drugs, if not dead will make you stumble CreateThread(function() AlienEffect() end) -- If too many drugs, if not dead will make you stumble
end end
end end
end end
if stats.effect == "heal" then if stats.effect then
if GetResourceState("ps-buffs") == "started" then local effectTable = {
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^4PS^7-^4Buffs ^2found^7, ^2hooking in to get buffs and applying ^6Health Buff ^2for ^6"..stats.time.."^7ms") end ["heal"] = function(stats)
exports["ps-buffs"]:AddHealthBuff((tonumber(stats.time) or 10000), (stats.amount or 6)) if isStarted("ps-buffs") then
else CreateThread(function() HealEffect({(tonumber(stats.time) or 10000), (stats.amount or 6)}) end) end debugPrint("^5Debug^7: ^3Consume^7: ^4PS^7-^4Buffs ^2found^7, ^2hooking in to get buffs and applying ^6Health Buff ^2for ^6"..stats.time.."^7ms")
exports["ps-buffs"]:AddHealthBuff((tonumber(stats.time) or 10000), (stats.amount or 6))
else
CreateThread(function()
HealEffect({(tonumber(stats.time) or 10000), (stats.amount or 6)})
end)
end
end,
["stamina"] = function(stats)
if isStarted("ps-buffs") then
debugPrint("^5Debug^7: ^3Consume^7: ^4PS^7-^4Buffs ^2found^7, ^2hooking in to get buffs and applying ^6Stamina Buff ^2for ^6"..stats.time.."^7ms")
exports["ps-buffs"]:StaminaBuffEffect((tonumber(stats.time) or 10000), (stats.amount or 6))
else
CreateThread(function()
StaminaEffect({(tonumber(stats.time) or 10000), (stats.amount or 6)})
end)
end
end,
["armor"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:AddArmorBuff((tonumber(stats.time) or 10000), (stats.amount or 6))
end
end,
["stress"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:AddStressBuff((tonumber(stats.time) or 10000), (stats.amount or 6))
end
end,
["swimming"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:SwimmingBuffEffect((tonumber(stats.time) or 10000), (stats.amount or 6))
end
end,
["hacking"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:AddBuff("hacking", (tonumber(stats.time) or 10000))
end
end,
["intelligence"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:AddBuff("intelligence", (tonumber(stats.time) or 10000))
end
end,
["luck"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:AddBuff("luck", (tonumber(stats.time) or 10000))
end
end,
["strength"] = function(stats)
if isStarted("ps-buffs") then --PS-BUFFS ONLY
exports["ps-buffs"]:AddBuff("strength", (tonumber(stats.time) or 10000))
end
end,
}
if effectTable[stats.effect] then
effectTable[stats.effect](stats)
end
end end
if stats.effect == "stamina" then if stats.widepupils then
if GetResourceState("ps-buffs") == "started" then TriggerEvent("evidence:client:SetStatus", "widepupils", 200)
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^4PS^7-^4Buffs ^2found^7, ^2hooking in to get buffs and applying ^6Stamina Buff ^2for ^6"..stats.time.."^7ms") end
exports["ps-buffs"]:StaminaBuffEffect((tonumber(stats.time) or 10000), (stats.amount or 6))
else CreateThread(function() StaminaEffect({(tonumber(stats.time) or 10000), (stats.amount or 6)}) end) end
end
if GetResourceState("ps-buffs") == "started" then --PS-BUFFS ONLY
--if Config.Debug then if stats.effect then print("^5Debug^7: ^3Consume^7: ^4PS^7-^4Buffs ^2found^7, ^2hooking in to get buffs and applying ^6"..stats.effect.." Buff ^2for ^6"..(stats.time or "nil").."^7ms") end end
if stats.effect == "armor" then exports["ps-buffs"]:AddArmorBuff((tonumber(stats.time) or 10000), (stats.amount or 6)) end
if stats.effect == "stress" then exports["ps-buffs"]:AddStressBuff((tonumber(stats.time) or 10000), (stats.amount or 6)) end
if stats.effect == "swimming" then exports["ps-buffs"]:SwimmingBuffEffect((tonumber(stats.time) or 10000), (stats.amount or 6)) end
if stats.effect == "hacking" then exports["ps-buffs"]:AddBuff("hacking", (tonumber(stats.time) or 10000)) end
if stats.effect == "intelligence" then exports["ps-buffs"]:AddBuff("intelligence", (tonumber(stats.time) or 10000)) end
if stats.effect == "luck" then exports["ps-buffs"]:AddBuff("luck", (tonumber(stats.time) or 10000)) end
if stats.effect == "strength" then exports["ps-buffs"]:AddBuff("strength", (tonumber(stats.time) or 10000)) end
end end
if stats.widepupils then TriggerEvent("evidence:client:SetStatus", "widepupils", 200) end
end end
end end
cancelled = false cancelled = false
consuming = false consuming = false
if Config.Debug then print("^5Debug^7: ^3Consume^7: ^2Finished, unlocking inventory^7...") end debugPrint("^5Debug^7: ^3Consume^7: ^2Finished, unlocking inventory^7...")
LocalPlayer.state:set("inv_busy", false, true) TriggerEvent('inventory:client:busy:status', false) TriggerEvent('canUseInventoryAndHotbar:toggle', true) tempLockInv(false)
end) end)
CreateThread(function() CreateThread(function()
while true do while true do
Wait(10) Wait(10)
if alcoholCount > 0 then Wait(1000 * 60 * 15) alcoholCount -= 1 else Wait(1000) end if alcoholCount > 0 then
if drugCount > 0 then Wait(1000 * 60 * 15) drugCount -= 1 else Wait(1000) end Wait(1000 * 60 * 15)
alcoholCount -= 1
else
Wait(1000)
end
if drugCount > 0 then
Wait(1000 * 60 * 15)
drugCount -= 1
else
Wait(1000)
end
end end
end) end)
AddEventHandler('onResourceStop', function(r) if r ~= GetCurrentResourceName() then return end onResourceStop(function()
lockInv(false)
StopEffects() StopEffects()
end)
end, true)

View File

@@ -0,0 +1,249 @@
RegisterNetEvent("jim-consumables:client:consumableCreator", function()
local itemTable, emoteTable = {}, {}
for k, v in pairsByKeys(Items) do itemTable[#itemTable+1] = { value = tostring(k), label = tostring((v.label or k)) } end
table.sort(itemTable, function(a, b) return a.label < b.label end)
for k in pairsByKeys(Emotes) do emoteTable[#emoteTable+1] = { value = k, label = k } end
local input = lib.inputDialog("Consumable Creator", {
{ type = "select",
label = "Item List",
options = itemTable,
required = true,
icon = "fas fa-burger",
clearable = true,
searchable = true -- Doesnt work as i think only ox_lib lua was updated, the web stuff doesn't support this
},
{ type = "select",
label = "Emote",
options = emoteTable,
required = true,
icon = "fas fa-user",
clearable = true,
searchable = true, -- Doesnt work as i think only ox_lib lua was updated, the web stuff doesn't support this
default = "burger",
},
{ type = "select",
label = "Item Required for consuming",
options = itemTable,
required = false,
icon = "fas fa-utensils",
clearable = true,
searchable = true -- Doesnt work as i think only ox_lib lua was updated, the web stuff doesn't support this
},
{ type = 'number', label = 'Time', description = "How long it takes in ms to consume item", default = 5000, icon = "fas fa-clock", },
{ type = 'number', label = 'Stress Relief', description = "How much stress to relieve", default = 0, icon = "fas fa-mug-hot", },
{ type = 'number', label = 'Healing Amount', description = "How much to heal after consuming", default = 0, icon = "fas fa-notes-medical", },
{ type = 'number', label = 'Armour', description = "How much armour to give after consuming", default = 0, icon = "fas fa-shield-halved", },
{ type = "select", label = "Type", default = "food", icon = "fas fa-box", options = {
{ value = "food", label = "Food" },
{ value = "drink", label = "Drink" },
{ value = "alcohol", label = "Alcohol" },
{ value = "drug", label = "Drugs" },
{ value = "smoke", label = "Cigar/Cigarette" },
{ value = "pack", label = "Pack (Container Item)" },
}},
})
if not input or not input[1] then return end
local resultTable = {
item = input[1],
emote = input[2],
requireItem = input[3] or nil,
time = { input[4], input[4] + 1000 },
stress = input[5],
heal = input[6],
armor = input[7],
type = input[8],
}
if resultTable.type == "food" or resultTable.type == "drink" then foodInput(resultTable)
elseif resultTable.type == "pack" then packInput(resultTable, itemTable)
else
ExtraStatsInput(resultTable)
end
end, false)
function foodInput(prevInput)
local resultTable = prevInput
local input = lib.inputDialog((Items[prevInput.item].label or prevInput.item).." - Food or Drink",{
{ type = 'number', label = 'Hunger %', default = 0, icon = "fas fa-burger", },
{ type = 'number', label = 'Thirst %', default = 0, icon = "fas fa-mug-hot", },
})
if not input or not input[1] then return end
resultTable["stats"] = {
hunger = input[1] ~= 0 and { input[1], input[1] + 10 } or 0,
thirst = input[2] ~= 0 and { input[2], input[2] + 10 } or 0,
}
ExtraStatsInput(resultTable)
end
function packInput(prevInput, itemTable)
local resultTable = prevInput
local input = lib.inputDialog((Items[prevInput.item].label or prevInput.item).." - Pack", {
{ type = "select",
label = "Item List",
options = itemTable,
required = true,
icon = "fas fa-burger",
},
{ type = 'number', label = 'Amount to give of item', default = 1, icon = "fas fa-box", },
})
resultTable["pack"] = { item = input[1], amount = input[2], }
getConsumableResult(resultTable)
end
function ExtraStatsInput(prevInput)
local resultTable = prevInput
local input = lib.inputDialog((Items[prevInput.item].label or prevInput.item).." - Extra Stats", {
{ type = "select", label = "Buff Type", description = "These are 'gradual' buff effects", default = "none", options = {
{ value = "none", label = "None" },
{ value = "heal", label = "Healing" },
{ value = "stamina", label = "Stamina" },
{ value = "armor", label = "Armour" },
{ value = "stress", label = "Stress" },
{ value = "swimming", label = "Swimming" },
{ value = "hacking", label = "Hacking" },
{ value = "intelligence", label = "Intelligence" },
{ value = "luck", label = "Luck" },
{ value = "strength", label = "Strength" },
}},
{ type = "select", label = "Screen Effect", default = "none", options = {
{ value = "none", label = "None" },
{ value = "rampage", label = "Rampage" },
{ value = "turbo", label = "Turbo" },
{ value = "focus", label = "Focus" },
{ value = "weed", label = "Weed" },
{ value = "trevor", label = "Trevor" },
{ value = "nightvision", label = "Night Vision" },
{ value = "thermal", label = "Thermal Vision" },
}},
{ type = "number", label = "Total Time of 'Buff'", default = 10000, },
{ type = "number", label = "Amount to give per second", default = 6, },
((prevInput.type ~= "food" and prevInput.type ~= "drink") and { type = "select", label = "Wide Pupils", default = "false", options = {
{ value = "true", label = "True" },
{ value = "false", label = "False" },
}} or nil),
((prevInput.type ~= "food" and prevInput.type ~= "drink") and { type = "select", label = "Can Over Dose", default = "false", options = {
{ value = "true", label = "True" },
{ value = "false", label = "False" },
}} or nil),
})
if not input or not input[1] then return end
resultTable["stats"] = {
hunger = resultTable["stats"] and resultTable["stats"].hunger or 0,
thirst = resultTable["stats"] and resultTable["stats"].thirst or 0,
screen = input[2] or nil,
effect = input[1] or nil,
time = input[1] ~= "none" and input[3] or nil,
amount = input[1] ~= "none" and input[4] or nil,
widepupils = input[5],
canOD = input[6],
}
getConsumableResult(resultTable)
end
function getConsumableResult(data)
local resultString = '["'..data.item..'"] = { '
resultString = resultString..'emote = "'..data.emote..'", '
resultString = resultString.."canRun = true, "
resultString = resultString.."time = {"..data.time[1]..", "..data.time[2].."}, "
resultString = (data.stress > 0 and resultString.."stress = "..data.stress..", ") or resultString..""
resultString = (data.heal > 0 and resultString.."heal = "..data.heal..", ") or resultString..""
resultString = (data.armor > 0 and resultString.."armor = "..data.armor..", ") or resultString..""
resultString = resultString..'type = "'..data.type..'", '
if data.type == "pack" then
resultString = resultString..'pack = { item = "'..data.pack.item..'", amount = "'..data.pack.amount..'", }, '
end
if data.stats then
resultString = resultString.."stats = { "
if data.stats.hunger and type(data.stats.hunger) == "table" then
resultString = resultString..'hunger = { '..data.stats.hunger[1]..', '..data.stats.hunger[2]..' }, '
end
if data.stats.thirst and type(data.stats.thirst) == "table" then
resultString = resultString..'thirst = { '..data.stats.thirst[1]..', '..data.stats.thirst[2]..' }, '
end
if data.stats.screen and data.stats.screen ~= "none" then
resultString = resultString..'screen = "'..data.stats.screen..'", '
end
if data.stats.effect and data.stats.effect ~= "none" then
resultString = resultString..'effect = "'..data.stats.effect..'", '
resultString = resultString..'time = "'..data.stats.time..'", '
resultString = resultString..'amount = "'..data.stats.amount..'", '
end
if data.stats.widepupils == "true" then
resultString = resultString..'widepupils = "'..data.stats.widepupils..'", '
end
if data.stats.canOD == "true" then
resultString = resultString..'canOD = "'..data.stats.canOD..'", '
end
end
triggerNotify(nil, "Copied new consumable info to clipboard", "success")
lib.setClipboard(resultString .. " },")
end
RegisterNetEvent("jim-consumables:client:testEmotes", function()
local Menu = {}
for k, v in pairsByKeys(Emotes) do
Menu[#Menu+1] = {
header = k,
onSelect = function()
testEmote(v, k)
end
}
end
openMenu(Menu, { header = "Test Consumable Emotes" })
end)
function testEmote(emote, name)
triggerNotify(nil, "Testing "..name, "warning")
triggerNotify(nil, "Anim will loop twice then return to menu", "warning")
local MovementType = nil
local Player = PlayerPedId()
local InVehicle = IsPedInAnyVehicle(Player, true)
local animDict, anim = tostring(emote[1]), tostring(emote[2])
local model, model2, bone, bone2
local P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 = table.unpack({0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}) -- Default placement coord cariable
if emote.AnimationOptions.Prop then
model = emote.AnimationOptions.Prop
bone = GetPedBoneIndex(Player, emote.AnimationOptions.PropBone)
P1, P2, P3, P4, P5, P6 = table.unpack(emote.AnimationOptions.PropPlacement)
if emote.AnimationOptions.SecondProp then
model2 = emote.AnimationOptions.SecondProp
bone2 = GetPedBoneIndex(Player, emote.AnimationOptions.SecondPropBone)
P7, P8, P9, P10, P11, P12 = table.unpack(emote.AnimationOptions.SecondPropPlacement)
end
end
if InVehicle == 1 then
MovementType = 51
elseif emote.AnimationOptions then
if emote.AnimationOptions.EmoteMoving then MovementType = 51
elseif emote.AnimationOptions.EmoteLoop then MovementType = 1
elseif emote.AnimationOptions.EmoteStuck then MovementType = emote.AnimationOptions.EmoteMoving and 50 or 2
elseif emote.AnimationOptions.EmoteMoving == false then MovementType = 0 end
end
playAnim(animDict, anim, (GetAnimDuration(animDict, anim) * 1000 )*2, MovementType)
local consuming = true
--Prop Spawning
CreateThread(function()
if model then
if IsModelValid(model) == 1 then
triggerNotify(nil, "Debug: Spawning consumable prop")
attachProp = makeProp({ prop = model, coords = vector4(0.0,0.0,0.0,0.0)}, 1, 1)
AttachEntityToEntity(attachProp, Player, bone, P1, P2, P3, P4, P5, P6, true, true, false, true, 1, true)
if model2 then
triggerNotify(nil, "Debug: Spawning consumable prop 2")
if IsModelValid(model2) == 1 then
attachProp2 = makeProp({ prop = model2, coords = vector4(0.0,0.0,0.0,0.0)}, 1, 1)
AttachEntityToEntity(attachProp2, Player, bone2, P7, P8, P9, P10, P11, P12, true, true, false, true, 1, true)
else triggerNotify(nil, "Debug: Second prop model isn't valid", "error") end
end
while consuming do Wait(50) end
if DoesEntityExist(attachProp) then destroyProp(attachProp) attachProp = nil end
if DoesEntityExist(attachProp2) then destroyProp(attachProp2) attachProp2 = nil end
else triggerNotify(nil, "Debug: Prop model isn't valid", "error") end
end
end)
Wait((GetAnimDuration(animDict, anim) * 1000)*2)
consuming = false
stopAnim(animDict, anim)
TriggerEvent("jim-consumables:client:testEmotes")
end

View File

@@ -1,128 +1,19 @@
print("^2Jim^7-^2Consumables ^7v^41^7.^45 ^7- ^2Consumables Script by ^1Jimathy^7") Config = {
System = {
-- If you need support I now have a discord available, it helps me keep track of issues and give better support. Debug = false,
EventDebug = false,
-- https://discord.gg/xKgQZ6wZvS
Menu = "qb", -- "qb", "ox"
Config = { Notify = "gta", -- "qb", "ox", "gta"
Debug = false, ProgressBar = "gta", -- "qb", "ox", "gta"
drawText = "gta", -- "qb", "ox", "gta"
Notify = "qb",
},
UseProgbar = false, Main = {
UseProgbar = false, -- Disabled this, progress bars stop all anims when complete.
Consumables = { -- This is intended to create a progressbar to show consuming but it was usually forces animations to end weirdly
-- Default QB food and drink item override },
Crafting = {
--Effects can be applied here, like stamina on coffee for example showItemBox = true -- Display "use" item boxes on some inventories that need to be told to
["vodka"] = { emote = "vodkab", canRun = false, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "alcohol", stats = { effect = "stress", time = 5000, amount = 2, thirst = math.random(10,20), canOD = true }}, }
["beer"] = { emote = "beer", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "alcohol", stats = { thirst = math.random(10,20), canOD = true }}, }
["whiskey"] = { emote = "whiskey", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "alcohol", stats = { thirst = math.random(10,20), canOD = true }},
["sandwich"] = { emote = "sandwich", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,20), }},
["twerks_candy"] = { emote = "egobar", canRun = true, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,20), }},
["snikkel_candy"] = { emote = "egobar", canRun = true, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,20), }},
["tosti"] = { emote = "sandwich", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,20), }},
["coffee"] = { emote = "coffee", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "drink", stats = { effect = "stamina", time = 10000, thirst = math.random(10,20), }},
["water_bottle"] = { emote = "drink", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "drink", stats = { thirst = math.random(10,20), }},
["kurkakola"] = { emote = "ecola", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "drink", stats = { thirst = math.random(10,20), }},
--[[----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Items that effect status changes, like bleeding can cause problems as they are all handled in their own scripts
-- Testing these but they may be best left handled by default scripts
["ifaks"] = { emote = "oxy", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 10, armor = 0, type = "drug", stats = { effect = "heal", amount = 6, widepupils = false, canOD = false } },
["bandage"] = { emote = "oxy", time = math.random(5000, 6000), stress = 0, heal = 10, armor = 0, type = "drug", stats = { effect = "heal", amount = 3, widepupils = false, canOD = false } }, },
]]
--Testing effects & armor with small functionality to drugs - This may be another one left to default scripts
["joint"] = { emote = "smoke3", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 10, type = "drug", stats = { screen = "weed", effect = "armor", widepupils = false, canOD = false } },
["cokebaggy"] = { emote = "coke", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 0, type = "drug", stats = { screen = "focus", effect = "stamina", widepupils = false, canOD = true } },
--["crackbaggy"] = { emote = "coke", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 0, type = "drug", stats = { effect = "heal", widepupils = false, canOD = true } },
["xtcbaggy"] = { emote = "oxy", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 10, type = "drug", stats = { effect = "strength", widepupils = true, canOD = true } },
["oxy"] = { emote = "oxy", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 0, type = "drug", stats = { effect = "heal", widepupils = false, canOD = false } },
["meth"] = { emote = "coke", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 10, type = "drug", stats = { effect = "stamina", widepupils = false, canOD = true } },
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--[[Example item
["heartstopper"] = {
emote = "burger", -- Select an emote from below, it has to be in here
time = math.random(5000, 6000), -- Amount of time it takes to consume the item
stress = math.random(1,2), -- Amount of stress relief, can be 0
heal = 0, -- Set amount to heal by after consuming
armor = 5, -- Amount of armor to add
type = "food", -- Type: "alcohol" / "drink" / "food"
stats = {
screen = "thermal", -- The screen effect to be played when after consuming the item "rampage" "turbo" "focus" "weed" "trevor" "nightvision" "thermal"
effect = "heal", -- The status effect given by the item, "heal" / "stamina"
-- This supports ps-buffs effects "armor" "stress" "swimming" "hacking" "intelligence" "luck" "strength"
time = 10000, -- How long the effect should last (if not added it will default to 10000)
amount = 6, -- How much the value is changed by per second
hunger = math.random(10, 20), -- The hunger/thirst stats of the item, if not found in the items.lua
thirst = math.random(10, 20), -- The hunger/thirst stats of the item, if not found in the items.lua
},
--Reward Items Variables
-- These can be the only thing in a consumable table and the item will still work
amounttogive = 3, -- Used for "RewardItems", tells the script how many to give
rewards = {
[1] = {
item = "plastic", -- prize item name
max = 10, -- max amount to give (this is put into math.random(1, max) )
rarity = 1, -- the rarity system, 1 being rarest, 4 being most common
},
},
},]]
},
Emotes = {
["drink"] = {"mp_player_intdrink", "loop_bottle", "Drink", AnimationOptions =
{ Prop = "prop_ld_flow_bottle", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["whiskeyb"] = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Whiskey Bottle", AnimationOptions =
{ Prop = "prop_cs_whiskey_bottle", PropBone = 60309, PropPlacement = {0.0, 0.0, 0.0, 0.0, 0.0},
EmoteMoving = true, EmoteLoop = true }},
["rumb"] = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Rum Bottle", AnimationOptions =
{ Prop = "prop_rum_bottle", PropBone = 18905, PropPlacement = {0.03, -0.18, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true }},
["icream"] = {"mp_player_intdrink", "loop_bottle", "Irish Cream Bottle", AnimationOptions =
{ Prop = "prop_bottle_brandy", PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true }},
["ginb"] = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Gin Bottle", AnimationOptions =
{ Prop = "prop_tequila_bottle", PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true }},
["vodkab"] = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions =
{ Prop = 'prop_vodka_bottle', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true }},
["crisps"] = {"amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Chrisps", AnimationOptions =
{ Prop = 'v_ret_ml_chips2', PropBone = 28422, PropPlacement = {0.01, -0.05, -0.1, 0.0, 0.0, 90.0},
EmoteLoop = true, EmoteMoving = true, }},
["beer1"] = {"mp_player_intdrink", "loop_bottle", "Dusche", AnimationOptions =
{ Prop = "prop_beerdusche", PropBone = 18905, PropPlacement = {0.04, -0.14, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["beer2"] = {"mp_player_intdrink", "loop_bottle", "Logger", AnimationOptions =
{ Prop = "prop_beer_logopen", PropBone = 18905, PropPlacement = {0.03, -0.18, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["beer3"] = {"mp_player_intdrink", "loop_bottle", "AM Beer", AnimationOptions =
{ Prop = "prop_beer_amopen", PropBone = 18905, PropPlacement = {0.03, -0.18, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["beer4"] = {"mp_player_intdrink", "loop_bottle", "Pisswasser1", AnimationOptions =
{ Prop = "prop_beer_pissh", PropBone = 18905, PropPlacement = {0.03, -0.18, 0.10, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["beer5"] = {"mp_player_intdrink", "loop_bottle", "Pisswasser2", AnimationOptions =
{ Prop = "prop_amb_beer_bottle", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["beer6"] = {"mp_player_intdrink", "loop_bottle", "Pisswasser3", AnimationOptions =
{ Prop = "prop_cs_beer_bot_02", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["ecola"] = {"mp_player_intdrink", "loop_bottle", "E-cola", AnimationOptions =
{ Prop = "prop_ecola_can", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
["sprunk"] = {"mp_player_intdrink", "loop_bottle", "Sprunk", AnimationOptions =
{ Prop = "v_res_tt_can03", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0},
EmoteMoving = true, EmoteLoop = true, }},
},
}

View File

@@ -1,11 +1,27 @@
name "Jim-Consumables" name "Jim-Consumables"
author "Jimathy" author "Jimathy"
version "v1.5" version "2.0.03"
description "Consumable Script By Jimathy" description "Consumables Script"
fx_version "cerulean" fx_version "cerulean"
game "gta5" game "gta5"
lua54 'yes' lua54 'yes'
shared_scripts { 'config.lua', 'shared/*.lua' } server_script '@oxmysql/lib/MySQL.lua'
client_scripts { 'client/*.lua', }
server_scripts { 'server/*.lua' } shared_scripts {
'config.lua',
'shared/emotes.lua',
'shared/consumables.lua',
'shared/shared.lua',
--Jim Bridge - https://github.com/jimathy/jim_bridge
'@jim_bridge/starter.lua',
}
client_scripts {
'client/*.lua',
}
server_script 'server/*.lua'
dependency 'jim_bridge'

View File

@@ -1,97 +1,104 @@
local QBCore = exports['qb-core']:GetCoreObject() local Consumables = Config.Consumables
local Emotes = Config.Emotes
for k, v in pairs(Config.Consumables) do onResourceStart(function()
QBCore.Functions.CreateUseableItem(k, function(source, item) TriggerClientEvent('jim-consumables:Consume', source, item.name) end) for k, v in pairs(Config.Consumables) do
if not QBCore.Shared.Items[k] then print("^1Debug^7: ^2Item check ^7- '^1"..k.."^7' ^2not found in the shared lua^7") end createUseableItem(k, function(source, item) TriggerClientEvent(getScript()..':Consume', source, item.name) end)
if not Config.Emotes[v.emote] then print("^1Debug^7: ^2Emote check ^7- '^1"..k.."^7' ^2requested emote ^7'^6"..v.emote.."^7' - ^2not found in config^7.^2lua^7") end if not Items[k] then print("^1Debug^7: ^2Item check ^7- '^1"..k.."^7' ^2not found in the shared lua^7") end
end if not Config.Emotes[v.emote] then print("^1Debug^7: ^2Emote check ^7- '^1"..k.."^7' ^2requested emote ^7'^6"..v.emote.."^7' - ^2not found in config^7.^2lua^7") end
end
RegisterNetEvent("jim-consumables:server:DupeWarn", function(item, newsrc) --Export Import System--
local src = newsrc or source GlobalState.jimConsumableItems = Consumables
local P = QBCore.Functions.GetPlayer(src) GlobalState.jimConsumableEmotes = Emotes
print("^5DupeWarn: ^1"..P.PlayerData.charinfo.firstname.." "..P.PlayerData.charinfo.lastname.."^7(^1"..tostring(src).."^7) ^2Tried to remove item ^7('^3"..item.."^7')^2 but it wasn't there^7") end, true)
if not Config.Debug then DropPlayer(src, "Kicked for attempting to duplicate items") end
print("^5DupeWarn: ^1"..P.PlayerData.charinfo.firstname.." "..P.PlayerData.charinfo.lastname.."^7(^1"..tostring(src).."^7) ^2Dropped from server for item duplicating^7") onResourceStop(function()
GlobalState.jimConsumableItems = Consumables
GlobalState.jimConsumableEmotes = Emotes
end) end)
RegisterNetEvent('jim-consumables:server:toggleItem', function(give, item, amount, newsrc) RegisterNetEvent(getScript()..':server:addNeed', function(amount, type)
local src = newsrc or source local src = source
local amount = amount or 1
local remamount = amount if Core.Functions and Core.Functions.GetPlayer then -- QBCore/QBox
if not give then local Player = Core.Functions.GetPlayer(src)
if HasItem(src, item, amount) then -- check if you still have the item if not Player then return end
if QBCore.Functions.GetPlayer(src).Functions.GetItemByName(item).unique then -- If unique item, keep removing until gone
while remamount > 0 do if type == "thirst" then
QBCore.Functions.GetPlayer(src).Functions.RemoveItem(item, 1) Player.Functions.SetMetaData('thirst', amount)
remamount -= 1 TriggerClientEvent('hud:client:UpdateNeeds', src, Player.PlayerData.metadata.hunger, amount)
end elseif type == "hunger" then
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[item], "remove", amount) -- Show removal item box when all are removed Player.Functions.SetMetaData('hunger', amount)
return TriggerClientEvent('hud:client:UpdateNeeds', src, amount, Player.PlayerData.metadata.thirst)
end end
if QBCore.Functions.GetPlayer(src).Functions.RemoveItem(item, amount) then
if Config.Debug then print("^5Debug^7: ^1Removing ^2from Player^7(^2"..src.."^7) '^6"..QBCore.Shared.Items[item].label.."^7(^2x^6"..(amount or "1").."^7)'") end elseif ESX and ESX.GetPlayerFromId then -- ESX
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[item], "remove", amount) local xPlayer = ESX.GetPlayerFromId(src)
end if not xPlayer then return end
else TriggerEvent("jim-consumables:server:DupeWarn", item, src) end -- if not boot the player
elseif give then local hunger = xPlayer.get('hunger') or 0
if QBCore.Functions.GetPlayer(src).Functions.AddItem(item, amount) then local thirst = xPlayer.get('thirst') or 0
if Config.Debug then print("^5Debug^7: ^4Giving ^2Player^7(^2"..src.."^7) '^6"..QBCore.Shared.Items[item].label.."^7(^2x^6"..(amount or "1").."^7)'") end
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[item], "add", amount) if type == "thirst" then
end thirst = amount
end xPlayer.set('thirst', thirst)
elseif type == "hunger" then
hunger = amount
xPlayer.set('hunger', hunger)
end
TriggerClientEvent('hud:client:UpdateNeeds', src, hunger, thirst)
end
end) end)
RegisterNetEvent('jim-consumables:server:addThirst', function(amount) local syncScheduled = false
local Player = QBCore.Functions.GetPlayer(source) function syncConsumables()
if not Player then return end debugPrint("^5Statebag^7: ^2Sending ^6"..countTable(Consumables).." ^3Consumables ^2to all clients^7")
Player.Functions.SetMetaData('thirst', amount) GlobalState.jimConsumableItems = Consumables
TriggerClientEvent('hud:client:UpdateNeeds', source, Player.PlayerData.metadata.hunger, amount) syncScheduled = false
end
local emoteSyncScheduled = false
function syncEmotes()
debugPrint("^5Statebag^7: ^2Sending ^6"..countTable(Emotes).." ^3Emotes to all clients^7")
GlobalState.jimConsumableEmotes = Emotes
emoteSyncScheduled = false
end
RegisterNetEvent(getScript()..':server:syncAddItem', function(itemName, data)
if not Consumables[itemName] then
Consumables[itemName] = data
--createUseableItem(itemName, function(source, item) TriggerClientEvent(getScript()..':Consume', source, itemName) end)
debugPrint("^5Debug^7: "..GetInvokingResource().." ^2is sending new ^3Item^7: '"..itemName.."'")
if not syncScheduled then
syncScheduled = true
SetTimeout(5000, syncConsumables)
end
else
debugPrint("^1Debug^7: "..GetInvokingResource().." ^2is sending ^1duplicate ^3Item^7: '"..itemName.."'")
end
end) end)
RegisterNetEvent('jim-consumables:server:addHunger', function(amount) RegisterNetEvent(getScript()..':server:syncAddEmote', function(emoteName, data)
local Player = QBCore.Functions.GetPlayer(source) if not Emotes[emoteName] then
if not Player then return end Emotes[emoteName] = data
Player.Functions.SetMetaData('hunger', amount) debugPrint("^5Debug^7: "..GetInvokingResource().." ^2is sending new ^3Emote^7: '"..emoteName.."'")
TriggerClientEvent('hud:client:UpdateNeeds', source, amount, Player.PlayerData.metadata.thirst) if not emoteSyncScheduled then
emoteSyncScheduled = true
SetTimeout(5000, syncEmotes)
end
else
debugPrint("^1Debug^7: "..GetInvokingResource().." ^2is sending ^1duplicate ^3Emote^7: '"..emoteName.."'")
end
end) end)
function HasItem(source, items, amount) --[[
local amount = amount or 1 Core.Commands.Add('consumableCreator', "Create consumables (admin only)", {}, false, function(source)
local Player = QBCore.Functions.GetPlayer(source) if source > 0 then return TriggerClientEvent(getScript()..":client:consumableCreator", source) end
if not Player then return false end end, 'admin')
local count = 0
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Checking if player has required item^7 '^3"..tostring(items).."^7'") end Core.Commands.Add('testConsumableEmotes', "Test consumables Emotes (admin only)", {}, false, function(source)
if source > 0 then return TriggerClientEvent(getScript()..":client:testEmotes", source) end
for _, itemData in pairs(Player.PlayerData.items) do end, 'admin')
if itemData and (itemData.name == items) then ]]
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
count += itemData.amount
end
end
if count >= amount then
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Items ^5FOUND^7 x^3"..count.."^7") end
return true
end
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Items ^1NOT FOUND^7") end
return false
end
--Export Import System--
RegisterNetEvent("jim-consumables:getSync", function() local src = source TriggerClientEvent("jim-consumables:syncItems", source, Config.Consumables, Config.Emotes) end)
local function importEmote(emoteName, eInfo)
if Config.Debug then print("^5Debug^7: ^2Importing Item ^7'^6"..emoteName.."^7'") end
Config.Emotes[emoteName] = eInfo
TriggerClientEvent("jim-consumables:syncItems", -1, nil, Config.Emotes)
end
local function importConsumable(itemName, conInfo)
if Config.Debug then print("^5Debug^7: ^2Importing Item ^7'^6"..itemName.."^7'") end
if not QBCore.Shared.Items[itemName] then print("^1Debug^7: ^2Item check ^7- '^1"..k.."^7' ^2not found in the shared lua^7") end
Config.Consumables[itemName] = conInfo
QBCore.Functions.CreateUseableItem(itemName, function(source, item) TriggerClientEvent('jim-consumables:Consume', source, itemName) end)
TriggerClientEvent("jim-consumables:syncItems", -1, Config.Consumables, nil)
end
exports("importEmote", importEmote)
exports("importConsumable", importConsumable)

86
shared/consumables.lua Normal file
View File

@@ -0,0 +1,86 @@
Config = Config or {}
Config.Consumables = {
--Effects can be applied here, like stamina on coffee for example
vodka = { emote = "vodkab", canRun = false, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "alcohol", stats = { effect = "stress", time = 5000, amount = 2, thirst = math.random(10,20), canOD = true }},
beer = { emote = "beer", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "alcohol", stats = { thirst = math.random(10,20), canOD = true }},
whiskey = { emote = "whiskey", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "alcohol", stats = { thirst = math.random(10,20), canOD = true }},
sandwich = { emote = "sandwich", canRun = false, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "food", stats = { hunger = 20, }},
twerks_candy = { emote = "egobar", canRun = true, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,15), }},
snikkel_candy = { emote = "egobar", canRun = true, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,15), }},
coffee = { emote = "coffee", canRun = false, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "drink", stats = { time = 10000, thirst = math.random(10,15), }},
water_bottle = { emote = "drink", canRun = false, time = math.random(5000, 6000), stress = 0, heal = 0, armor = 0, type = "drink", stats = { thirst = 20, }},
tosti = { emote = "sandwich", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "food", stats = { hunger = math.random(10,15), }},
kurkakola = { emote = "ecola", canRun = false, time = math.random(5000, 6000), stress = math.random(2, 4), heal = 0, armor = 0, type = "drink", stats = { thirst = math.random(10,20), }},
--[[----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Items that effect status changes, like bleeding can cause problems as they are all handled in their own scripts
-- Testing these but they may be best left handled by default scripts
["ifaks"] = { emote = "oxy", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 10, armor = 0, type = "drug", stats = { effect = "heal", amount = 6, widepupils = false, canOD = false } },
["bandage"] = { emote = "oxy", time = math.random(5000, 6000), stress = 0, heal = 10, armor = 0, type = "drug", stats = { effect = "heal", amount = 3, widepupils = false, canOD = false } }, },
]]
--Testing effects & armor with small functionality to drugs - This may be another one left to default scripts
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--[[ --Testing effects & armor with small functionality to drugs - This may be another one left to default scripts
joint = { emote = "smoke3", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 10, type = "drug", stats = { screen = "weed", effect = "armor", widepupils = false, canOD = false } },
cokebaggy = { emote = "coke", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 0, type = "drug", stats = { screen = "focus", effect = "stamina", widepupils = false, canOD = true } },
--crackbaggy = { emote = "coke", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 0, type = "drug", stats = { effect = "heal", widepupils = false, canOD = true } },
xtcbaggy = { emote = "oxy", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 10, type = "drug", stats = { effect = "strength", widepupils = true, canOD = true } },
oxy = { emote = "oxy", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 0, type = "drug", stats = { effect = "heal", widepupils = false, canOD = false } },
meth = { emote = "coke", time = math.random(5000, 6000), stress = math.random(12, 24), heal = 0, armor = 10, type = "drug", stats = { effect = "stamina", widepupils = false, canOD = true } },
]] ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--Example item
-- heartstopper = {
-- emote = "burger", -- Select an emote from below, it has to be in here
-- time = math.random(5000, 6000), -- Amount of time it takes to consume the item
-- stress = math.random(1,2), -- Amount of stress relief, can be 0
-- heal = 0, -- Set amount to heal by after consuming
-- armor = 5, -- Amount of armor to add
-- type = "food", -- Type: "alcohol" / "drink" / "food"
-- canRun = true, -- If true player can run while using the item, not to it will cancel the event
--
-- stats = {
-- screen = "thermal", -- The screen effect to be played when after consuming the item "rampage" "turbo" "focus" "weed" "trevor" "nightvision" "thermal"
-- effect = "heal", -- The status effect given by the item, "heal" / "stamina"
-- -- This supports ps-buffs effects "armor" "stress" "swimming" "hacking" "intelligence" "luck" "strength"
-- time = 10000, -- How long the effect should last (if not added it will default to 10000)
-- amount = 6, -- How much the value is changed by per second
-- hunger = math.random(10, 20), -- The hunger/thirst stats of the item, if not found in the items.lua
-- thirst = math.random(10, 20), -- The hunger/thirst stats of the item, if not found in the items.lua
-- canOD = true, -- This creates an OD Effect, killing the user if they have too much
-- },
-- --Reward Items Variables
-- -- These can be the only thing in a consumable table and the item will still work
-- amounttogive = 3, -- Used for "RewardItems", tells the script how many to give
-- rewards = {
-- [1] = {
-- item = "plastic", -- prize item name
-- max = 10, -- max amount to give (this is put into math.random(1, max) )
-- rarity = 1, -- the rarity system, 1 being rarest, 4 being most common
-- },
-- },
-- },
-- Example Box Item
-- ["9_box"] = { -- Name of the box item in the shared
-- emote = "uncuff", -- The emote than should run when "unboxing"
-- canRun = true, -- If true player can run while using the item, not to it will cancel the event
-- time = 3500, -- How long it takes to use the item
-- type = "pack", -- Designate it as a "pack" to the script knows what to do
-- pack = {
-- item = "9_ammo", -- The item to give from the box when complete
-- amount = 20 -- How many of the item to give
-- },
-- },
}

89
shared/emotes.lua Normal file
View File

@@ -0,0 +1,89 @@
Config = Config or {}
Config.Emotes = {
drink = { "mp_player_intdrink", "loop_bottle", "Drink", AnimationOptions = { Prop = "prop_ld_flow_bottle", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true, }},
milk = {"mp_player_intdrink", "loop_bottle", "Glass of milk", AnimationOptions = { Prop = 'bzzz_farmprops_milk_a', PropBone = 18905, PropPlacement = {-0.02, -0.04, 0.1, 34.0, 140.0, 224.0}, EmoteLoop = true, EmoteMoving = true, }},
coffee = {"amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Coffee", AnimationOptions = { Prop = 'p_amb_coffeecup_01', PropBone = 28422, PropPlacement = {0.0,0.0,0.0,0.0,0.0,0.0}, EmoteLoop = true, EmoteMoving = true }},
burger = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Burger", AnimationOptions = { Prop = 'prop_cs_burger_01', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
beer = {"amb@world_human_drinking@beer@male@idle_a", "idle_c", "Beer", AnimationOptions = { Prop = 'prop_amb_beer_bottle', PropBone = 28422, PropPlacement = {0.0,0.0,0.06,0.0,15.0,0.0}, EmoteLoop = true, EmoteMoving = true }},
egobar = {"mp_player_inteat@burger", "mp_player_int_eat_burger","Ego Bar", AnimationOptions = { Prop = 'prop_choc_ego', PropBone = 60309, PropPlacement = {0.0,0.0,0.0,0.0,0.0,0.0}, EmoteMoving = true }},
sandwich = {"mp_player_inteat@burger", "mp_player_int_eat_burger", "Sandwich", AnimationOptions = { Prop = 'prop_sandwich_01', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
apple = {"mp_player_inteat@burger", "mp_player_int_eat_burger", "Apple", AnimationOptions = { Prop = 'idrp_apple_solo', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
avacado = {"mp_player_inteat@burger", "mp_player_int_eat_burger", "Avacado", AnimationOptions = { Prop = 'idrp_avo_solo', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
banana = {"mp_player_inteat@burger", "mp_player_int_eat_burger", "Banana", AnimationOptions = { Prop = 'idrp_bana_solo', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
carrot = {"mp_player_inteat@burger", "mp_player_int_eat_burger", "Carrot", AnimationOptions = { Prop = 'idrp_carrot_single', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
orange = {"mp_player_inteat@burger", "mp_player_int_eat_burger", "Orange", AnimationOptions = { Prop = 'idrp_bana_solo', PropBone = 18905, PropPlacement = {0.13,0.05,0.02,-50.0,16.0,60.0}, EmoteMoving = true }},
smoke3 = { "amb@world_human_aa_smoke@male@idle_a", "idle_b", "Smoke 3", AnimationOptions = { Prop = 'prop_cs_ciggy_01', PropBone = 28422, PropPlacement = {0.0,0.0,0.0,0.0,0.0,0.0}, EmoteLoop = true, EmoteMoving = true }},
whiskey = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Whiskey", AnimationOptions = { Prop = 'prop_drink_whisky', PropBone = 28422, PropPlacement = {0.01,-0.01,-0.06,0.0,0.0,0.0}, EmoteLoop = true, EmoteMoving = true } },
vodkab = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_vodka_bottle', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
cherenkov1 = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_cherenkov_01', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
cherenkov2 = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_cherenkov_04', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
cherenkov3 = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_cherenkov_03', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
cherenkov4 = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_cherenkov_02', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
bleuturd = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_champ_01b', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
bourgeoix = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_bottle_cognac', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
cardiaque = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_bottle_brandy', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
raggae = {"mp_player_intdrink", "loop_bottle", "(Don't Use) Vodka Bottle", AnimationOptions = { Prop = 'prop_rum_bottle', PropBone = 18905, PropPlacement = {0.00, -0.26, 0.10, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true }},
ecola = {"mp_player_intdrink", "loop_bottle", "E-cola", AnimationOptions = { Prop = "prop_ecola_can", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true, }},
crisps = {"amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Chrisps", AnimationOptions = { Prop = 'v_ret_ml_chips2', PropBone = 28422, PropPlacement = {0.01, -0.05, -0.1, 0.0, 0.0, 90.0}, EmoteLoop = true, EmoteMoving = true, }},
sprunk = {"mp_player_intdrink", "loop_bottle", "Sprunk", AnimationOptions = { Prop = "v_res_tt_can03", PropBone = 18905, PropPlacement = {0.12, 0.008, 0.03, 240.0, -60.0}, EmoteMoving = true, EmoteLoop = true, }},
wine = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Wine", AnimationOptions = { Prop = 'prop_drink_redwine', PropBone = 18905, PropPlacement = {0.10, -0.03, 0.03, -100.0, 0.0, -10.0}, EmoteMoving = true, EmoteLoop = true }},
champagne = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Champagne", AnimationOptions = { Prop = 'prop_drink_champ', PropBone = 18905, PropPlacement = { 0.10, -0.03, 0.03, -100.0, 0.0, -10.0 }, EmoteMoving = true, EmoteLoop = true }},
croissant = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Croissant", AnimationOptions = { Prop = 'bzzz_foodpack_croissant001', PropBone = 60309, PropPlacement = { 0.00, 0.0, -0.01, 0.0, 0.0, 90.0 }, EmoteMoving = true }},
cup = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Cup", AnimationOptions = { Prop = 'prop_plastic_cup_02', PropBone = 28422, PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, EmoteLoop = true, EmoteMoving = true }},
desert = { "mp_player_inteat@burger", "mp_player_int_eat_burger","Eat dessert", AnimationOptions = { Prop = 'bzzz_food_dessert_a', PropBone = 18905, PropPlacement = { 0.15, 0.03, 0.03, -42.0, -36.0, 0.0 }, EmoteMoving = true}},
dinner = { "anim@scripted@island@special_peds@pavel@hs4_pavel_ig5_caviar_p1", "base_idle", "Dinner", AnimationOptions = { Prop = "prop_cs_plate_01", PropBone = 60309, PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0 }, SecondProp = 'h4_prop_h4_caviar_spoon_01a', SecondPropBone = 28422, SecondPropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, EmoteLoop = true, EmoteMoving = true }},
flute = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Flute", AnimationOptions = { Prop = 'prop_champ_flute', PropBone = 18905, PropPlacement = { 0.10, -0.03, 0.03, -100.0, 0.0, -10.0 }, EmoteMoving = true, EmoteLoop = true }},
frappe = { "amb@code_human_wander_drinking@male@base", "static", "Frappe", AnimationOptions = { Prop = 'brum_heartfrappe', PropBone = 28422, PropPlacement = { 0.0, -0.0150, -0.0100, 0.0, -3.9999, 0.0 }, EmoteLoop = true, EmoteMoving = true }},
frappe2 = { "amb@code_human_wander_drinking@female@base", "static", "Frappe 2", AnimationOptions = { Prop = 'beanmachine_cup', PropBone = 28422, PropPlacement = { 0.0110, 0.0, 0.0300, 0.0, 0.0, -140.0 }, EmoteLoop = true, EmoteMoving = true }},
frappe3 = { "amb@code_human_wander_drinking@female@base", "static", "Frappe 3", AnimationOptions = { Prop = 'beanmachine_cup2', PropBone = 28422, PropPlacement = { 0.0, 0.0, -0.0600, 0.0, 0.0, -178.0 }, EmoteLoop = true, EmoteMoving = true }},
frappe4 = { "amb@code_human_wander_drinking@female@base", "static", "Frappe 4", AnimationOptions = { Prop = 'beanmachine_cup3', PropBone = 28422, PropPlacement = { 0.0, 0.0, -0.0600, 0.0, 0.0, -178.0 }, EmoteLoop = true, EmoteMoving = true }},
hotdog = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Hotdog", AnimationOptions = { Prop = 'prop_cs_hotdog_02', PropBone = 60309, PropPlacement = { -0.0300, 0.0100, -0.0100, 95.1071, 94.7001, -66.9179 }, EmoteMoving = true }},
icecreama = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Cherry", AnimationOptions = { Prop = 'bzzz_icecream_cherry', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreamb = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Chocolate", AnimationOptions = { Prop = 'bzzz_icecream_chocolate', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreamc = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Lemon", AnimationOptions = { Prop = 'bzzz_icecream_lemon', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreamd = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Pistachio", AnimationOptions = { Prop = 'bzzz_icecream_pistachio', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreame = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Raspberry", AnimationOptions = { Prop = 'bzzz_icecream_raspberry', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreamf = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Stracciatella", AnimationOptions = { Prop = 'bzzz_icecream_stracciatella', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreamg = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Strawberry", AnimationOptions = { Prop = 'bzzz_icecream_strawberry', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
icecreamh = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ice cream Walnut", AnimationOptions = { Prop = 'bzzz_icecream_walnut', PropBone = 18905, PropPlacement = { 0.14, 0.03, 0.01, 85.0, 70.0, -203.0 }, EmoteMoving = true }},
macaroon = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Macaroon", AnimationOptions = { Prop = 'bzzz_food_xmas_macaroon_a', PropBone = 18905, PropPlacement = { 0.15, 0.07, 0.00, 38.0, 7.0, 7.0 }, EmoteMoving = true }},
sipshake = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Bubblegum", AnimationOptions = { Prop = 'brum_cherryshake_raspberry', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakeb = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Cherry", AnimationOptions = { Prop = 'brum_cherryshake_cherry', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakec = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Chocolate", AnimationOptions = { Prop = 'brum_cherryshake_chocolate', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshaked = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Coffee", AnimationOptions = { Prop = 'brum_cherryshake_coffee', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakee = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Double Chocolate", AnimationOptions = { Prop = 'brum_cherryshake_doublechocolate', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakef = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Frappe", AnimationOptions = { Prop = 'brum_cherryshake_frappe', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakeg = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Lemon", AnimationOptions = { Prop = 'brum_cherryshake_lemon', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakeh = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Mint", AnimationOptions = { Prop = 'brum_cherryshake_mint', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakei = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Strawberry", AnimationOptions = { Prop = 'brum_cherryshake_strawberry', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakej = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Raspberry", AnimationOptions = { Prop = 'brum_cherryshake_raspberry', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakek = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Salted", AnimationOptions = { Prop = 'brum_cherryshake_salted', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
sipshakel = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Milkshake - Vanilla", AnimationOptions = { Prop = 'brum_cherryshake_vanilla', PropBone = 28422, PropPlacement = { 0.0850, 0.0670, -0.0350, -115.0862, -165.7841, 24.1318 }, EmoteLoop = true, EmoteMoving = true }},
pizzaslice = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Pizza Slice - Jalapeño And Peperoni", AnimationOptions = { Prop = 'knjgh_pizzaslice1', PropBone = 60309, PropPlacement = { 0.0500, -0.0200, -0.0200, 73.6928, -66.7427, 68.3677 }, EmoteMoving = true }},
pizzas = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Pizza Slice - Jalapeño And Peperoni", AnimationOptions = { Prop = 'knjgh_pizzaslice1', PropBone = 60309, PropPlacement = { 0.0500, -0.0200, -0.0200, 73.6928, -66.7427, 68.3677 }, EmoteMoving = true }},
pizzas2 = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Pizza Slice - Tomato And Pesto", AnimationOptions = { Prop = 'knjgh_pizzaslice2', PropBone = 60309, PropPlacement = { 0.0500, -0.0200, -0.0200, 73.6928, -66.7427, 68.3677 }, EmoteMoving = true }},
pizzas3 = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Pizza Slice - Mushroom", AnimationOptions = { Prop = 'knjgh_pizzaslice3', PropBone = 60309, PropPlacement = { 0.0500, -0.0200, -0.0200, 73.6928, -66.7427, 68.3677 }, EmoteMoving = true }},
pizzas4 = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Pizza Slice - Margherita", AnimationOptions = { Prop = 'knjgh_pizzaslice4', PropBone = 60309, PropPlacement = { 0.0500, -0.0200, -0.0200, 73.6928, -66.7427, 68.3677 }, EmoteMoving = true }},
pizzas5 = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Pizza Slice - Double Peperoni", AnimationOptions = { Prop = 'knjgh_pizzaslice5', PropBone = 60309, PropPlacement = { 0.0500, -0.0200, -0.0200, 73.6928, -66.7427, 68.3677 }, EmoteMoving = true }},
popcorn = { "amb@code_human_wander_drinking@female@base", "static", "Popcorn", AnimationOptions = { Prop = 'prop_taymckenzienz_popcorn', PropBone = 28422, PropPlacement = { -0.0200, -0.0100, -0.0700, -179.3626, 176.9331, 11.9833 }, EmoteLoop = true, EmoteMoving = true }},
sipsoda = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Soda Cup - Sprunk", AnimationOptions = { Prop = 'prop_rpemotes_soda01', PropBone = 28422, PropPlacement = { 0.0470, 0.0040, -0.0600, -88.0263, -25.0367, -27.3898 }, EmoteLoop = true, EmoteMoving = true }},
sipsodab = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Soda Cup - Sprunk Light", AnimationOptions = { Prop = 'prop_rpemotes_soda02', PropBone = 28422, PropPlacement = { 0.0470, 0.0040, -0.0600, -88.0263, -25.0367, -27.3898 }, EmoteLoop = true, EmoteMoving = true }},
sipsodac = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Soda Cup - eCola", AnimationOptions = { Prop = 'prop_rpemotes_soda03', PropBone = 28422, PropPlacement = { 0.0470, 0.0040, -0.0600, -88.0263, -25.0367, -27.3898 }, EmoteLoop = true, EmoteMoving = true }},
sipsodad = { "smo@milkshake_idle", "milkshake_idle_clip", "Sip Soda Cup - eCola Light", AnimationOptions = { Prop = 'prop_rpemotes_soda04', PropBone = 28422, PropPlacement = { 0.0470, 0.0040, -0.0600, -88.0263, -25.0367, -27.3898 }, EmoteLoop = true, EmoteMoving = true }},
taco = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Taco", AnimationOptions = { Prop = 'prop_taco_01', PropBone = 60309, PropPlacement = { -0.0170, 0.0070, -0.0210, 107.9846, -105.0251, 55.7779 }, EmoteMoving = true }},
xmascc = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Xmas Cupcake", AnimationOptions = { Prop = 'pata_christmasfood6', PropBone = 60309, PropPlacement = { 0.0100, 0.0200, -0.0100, -170.1788, 87.6716, 30.0540 }, EmoteMoving = true }},
xmascc2 = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Xmas Cupcake 2", AnimationOptions = { Prop = 'pata_christmasfood8', PropBone = 60309, PropPlacement = { 0.0200, 0.0, -0.0100, 9.3608, -90.1809, 66.3689 }, EmoteMoving = true }},
xmasic = { "anim@scripted@island@special_peds@pavel@hs4_pavel_ig5_caviar_p1", "base_idle", "Xmas Ice Cream", AnimationOptions = { Prop = "pata_christmasfood7", PropBone = 60309, PropPlacement = { -0.0460, 0.0000, -0.0300, 0.0, 0.0, -50.0000 }, SecondProp = 'h4_prop_h4_coke_spoon_01', SecondPropBone = 28422, SecondPropPlacement = { 0.0, 0.0, 0.0, 0.0, 20.0, 0.0 }, EmoteLoop = true, EmoteMoving = true }},
xmaswine = { "mp_player_intdrink", "loop_bottle", "Xmas Mulled Wine", AnimationOptions = { Prop = 'bzzz_food_xmas_mulled_wine_a', PropBone = 18905, PropPlacement = { 0.13, 0.03, 0.05, -110.0, -47.0, 7.0 }, EmoteMoving = true }},
cocoa = { "amb@world_human_aa_coffee@base", "base", "Xmas Cocoa", AnimationOptions = { Prop = 'pata_christmasfood1', PropBone = 28422, PropPlacement = { 0.0100, -0.1100, -0.1300, 0.0, 0.0, 0.0 }, EmoteLoop = true, EmoteMoving = true }},
coke = { "switch@trevor@trev_smoking_meth", "trev_smoking_meth_loop", "Coke", AnimationOptions = { EmoteLoop = true, EmoteMoving = true }},
oxy = { "mp_suicide", "pill", "Oxy", AnimationOptions = { EmoteLoop = true, EmoteMoving = true }},
cigar = { "amb@world_human_smoking@male@male_a@enter", "enter", "Cigar", AnimationOptions = { Prop = 'prop_cigar_02', PropBone = 47419, PropPlacement = { 0.010, 0.0, 0.0, 50.0, 0.0, -80.0 }, EmoteMoving = true, EmoteDuration = 2600 }},
cigar2 = { "amb@world_human_smoking@male@male_a@enter", "enter", "Cigar 2", AnimationOptions = { Prop = 'prop_cigar_01', PropBone = 47419, PropPlacement = { 0.010, 0.0, 0.0, 50.0, 0.0, -80.0 }, EmoteMoving = true, EmoteDuration = 2600 }},
joint = { "amb@world_human_smoking@male@male_a@enter", "enter", "Joint", AnimationOptions = { Prop = 'p_cs_joint_02', PropBone = 47419, PropPlacement = { 0.015, -0.009, 0.003, 55.0, 0.0, 110.0 }, EmoteMoving = true, EmoteDuration = 2600 }},
cig = { "amb@world_human_smoking@male@male_a@enter", "enter", "Cig", AnimationOptions = { Prop = 'prop_amb_ciggy_01', PropBone = 47419, PropPlacement = { 0.015, -0.009, 0.003, 55.0, 0.0, 110.0 }, EmoteMoving = true, EmoteDuration = 2600 }},
smoke2 = { "amb@world_human_aa_smoke@male@idle_a", "idle_c", "Smoke 2", AnimationOptions = { Prop = 'prop_cs_ciggy_01', PropBone = 28422, PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, EmoteLoop = true, EmoteMoving = true }},
smokecigar = { "amb@world_human_aa_smoke@male@idle_a", "idle_c", "Smoke Cigar", AnimationOptions = { Prop = 'prop_cigar_01', PropBone = 28422, PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 180.0 }, EmoteLoop = true, EmoteMoving = true }},
uncuff = { "mp_arresting", "a_uncuff", "Uncuff", AnimationOptions = { EmoteLoop = true, EmoteMoving = true }},
}

View File

@@ -1,268 +1,23 @@
local QBCore = exports['qb-core']:GetCoreObject() function tempLockInv(toggle)
RegisterNetEvent('QBCore:Client:UpdateObject', function() QBCore = exports['qb-core']:GetCoreObject() end) LocalPlayer.state:set("inv_busy", toggle, true)
TriggerEvent('inventory:client:busy:status', toggle)
local time = 1000 TriggerEvent('canUseInventoryAndHotbar:toggle', not toggle)
function loadModel(model) if not HasModelLoaded(model) then end
if Config.Debug then print("^5Debug^7: ^2Loading Model^7: '^6"..model.."^7'") end
while not HasModelLoaded(model) do function GenerateRandomValues(data)
if time > 0 then time -= 1 RequestModel(model) local transData = {}
else time = 1000 print("^5Debug^7: ^3LoadModel^7: ^2Timed out loading model ^7'^6"..model.."^7'") break for k, v in pairs(data) do
end if type(v) == "table" then
Wait(10) debugPrint("Converting Table "..json.encode(v).." to math.random")
end transData[k] = math.random(v[1], v[2])
end end debugPrint("Translated value: "..k.." - "..transData[k])
function unloadModel(model) if Config.Debug then print("^5Debug^7: ^2Removing Model^7: '^6"..model.."^7'") end SetModelAsNoLongerNeeded(model) end else
function loadAnimDict(dict) if not HasAnimDictLoaded(dict) then if Config.Debug then print("^5Debug^7: ^2Loading Anim Dictionary^7: '^6"..dict.."^7'") end while not HasAnimDictLoaded(dict) do RequestAnimDict(dict) Wait(5) end end end transData[k] = v
function unloadAnimDict(dict) if Config.Debug then print("^5Debug^7: ^2Removing Anim Dictionary^7: '^6"..dict.."^7'") end RemoveAnimDict(dict) end end
function loadPtfxDict(dict) if not HasNamedPtfxAssetLoaded(dict) then if Config.Debug then print("^5Debug^7: ^2Loading Ptfx Dictionary^7: '^6"..dict.."^7'") end while not HasNamedPtfxAssetLoaded(dict) do RequestNamedPtfxAsset(dict) Wait(5) end end end end
function unloadPtfxDict(dict) if Config.Debug then print("^5Debug^7: ^2Removing Ptfx Dictionary^7: '^6"..dict.."^7'") end RemoveNamedPtfxAsset(dict) end return transData["time"],
transData["stress"],
function destroyProp(entity) transData["heal"],
if Config.Debug then print("^5Debug^7: ^2Destroying Prop^7: '^6"..entity.."^7'") end transData["armor"],
SetEntityAsMissionEntity(entity) Wait(5) { hunger = transData["hunger"], thirst = transData["thirst"] }
--DetachEntity(entity, true, true) Wait(5) end
DeleteObject(entity)
end
function makeProp(data, freeze, synced)
loadModel(data.prop)
local prop = CreateObject(data.prop, 0.0, 0.0, 0.0, synced or false, synced or false, false)
SetEntityHeading(prop, data.coords.w+180.0)
--FreezeEntityPosition(prop, freeze or false)
SetEntityCompletelyDisableCollision(prop, true, false)
DisableCamCollisionForEntity(prop)
DisableCamCollisionForObject(prop)
if Config.Debug then print("^5Debug^7: ^6Prop ^2Created ^7: '^6"..prop.."^7'") end
return prop
end
function triggerNotify(title, message, type, src)
if Config.Notify == "okok" then
if not src then exports['okokNotify']:Alert(title, message, 6000, type)
else TriggerClientEvent('okokNotify:Alert', src, title, message, 6000, type) end
elseif Config.Notify == "qb" then
if not src then TriggerEvent("QBCore:Notify", message, type)
else TriggerClientEvent("QBCore:Notify", src, message, type) end
elseif Config.Notify == "t" then
if not src then exports['t-notify']:Custom({title = title, style = type, message = message, sound = true})
else TriggerClientEvent('t-notify:client:Custom', src, { style = type, duration = 6000, title = title, message = message, sound = true, custom = true}) end
elseif Config.Notify == "infinity" then
if not src then TriggerEvent('infinity-notify:sendNotify', message, type)
else TriggerClientEvent('infinity-notify:sendNotify', src, message, type) end
elseif Config.Notify == "rr" then
if not src then exports.rr_uilib:Notify({msg = message, type = type, style = "dark", duration = 6000, position = "top-right", })
else TriggerClientEvent("rr_uilib:Notify", src, {msg = message, type = type, style = "dark", duration = 6000, position = "top-right", }) end
end
end
function countTable(table) local i = 0 for keys in pairs(table) do i += 1 end return i end
function toggleItem(give, item, amount) TriggerServerEvent("jim-consumables:server:toggleItem", give, item, amount) end
function HasItem(items, amount)
local amount = amount or 1
local count = 0
for _, itemData in pairs(QBCore.Functions.GetPlayerData().items) do
if itemData and (itemData.name == items) then
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
count += itemData.amount
end
end
if count >= amount then
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Items ^5FOUND^7 x^3"..count.."^7") end
return true
else
if Config.Debug then print("^5Debug^7: ^3HasItem^7: ^2Items ^1NOT FOUND^7") end
return false
end
end
--Screen Effects
local alienEffect = false
function AlienEffect()
if alienEffect then return else alienEffect = true end
if Config.Debug then print("^5Debug^7: ^3AlienEffect^7() ^2activated") end
AnimpostfxPlay("DrugsMichaelAliensFightIn", 3.0, 0)
Wait(math.random(5000, 8000))
local Ped = PlayerPedId()
local animDict = "MOVE_M@DRUNK@VERYDRUNK"
loadAnimDict(animDict)
SetPedCanRagdoll(Ped, true)
ShakeGameplayCam('DRUNK_SHAKE', 2.80)
SetTimecycleModifier("Drunk")
SetPedMovementClipset(Ped, animDict, 1)
SetPedMotionBlur(Ped, true)
SetPedIsDrunk(Ped, true)
Wait(1500)
SetPedToRagdoll(Ped, 5000, 1000, 1, 0, 0, 0)
Wait(13500)
SetPedToRagdoll(Ped, 5000, 1000, 1, 0, 0, 0)
Wait(120500)
ClearTimecycleModifier()
ResetScenarioTypesEnabled()
ResetPedMovementClipset(Ped, 0)
SetPedIsDrunk(Ped, false)
SetPedMotionBlur(Ped, false)
AnimpostfxStopAll()
ShakeGameplayCam('DRUNK_SHAKE', 0.0)
AnimpostfxPlay("DrugsMichaelAliensFight", 3.0, 0)
Wait(math.random(45000, 60000))
AnimpostfxPlay("DrugsMichaelAliensFightOut", 3.0, 0)
AnimpostfxStop("DrugsMichaelAliensFightIn")
AnimpostfxStop("DrugsMichaelAliensFight")
AnimpostfxStop("DrugsMichaelAliensFightOut")
alienEffect = false
if Config.Debug then print("^5Debug^7: ^3AlienEffect^7() ^2stopped") end
end
local weedEffect = false
function WeedEffect()
if weedEffect then return else weedEffect = true end
if Config.Debug then print("^5Debug^7: ^3WeedEffect^7() ^2activated") end
AnimpostfxPlay("DrugsMichaelAliensFightIn", 3.0, 0)
Wait(math.random(3000, 20000))
AnimpostfxPlay("DrugsMichaelAliensFight", 3.0, 0)
Wait(math.random(15000, 20000))
AnimpostfxPlay("DrugsMichaelAliensFightOut", 3.0, 0)
AnimpostfxStop("DrugsMichaelAliensFightIn")
AnimpostfxStop("DrugsMichaelAliensFight")
AnimpostfxStop("DrugsMichaelAliensFightOut")
weedEffect = false
if Config.Debug then print("^5Debug^7: ^3WeedEffect^7() ^2stopped") end
end
local trevorEffect = false
function TrevorEffect()
if trevorEffect then return else trevorEffect = true end
if Config.Debug then print("^5Debug^7: ^3TrevorEffect^7() ^2activated") end
AnimpostfxPlay("DrugsTrevorClownsFightIn", 3.0, 0)
Wait(3000)
AnimpostfxPlay("DrugsTrevorClownsFight", 3.0, 0)
Wait(30000)
AnimpostfxPlay("DrugsTrevorClownsFightOut", 3.0, 0)
AnimpostfxStop("DrugsTrevorClownsFight")
AnimpostfxStop("DrugsTrevorClownsFightIn")
AnimpostfxStop("DrugsTrevorClownsFightOut")
trevorEffect = false
if Config.Debug then print("^5Debug^7: ^3TrevorEffect^7() ^2stopped") end
end
local turboEffect = false
function TurboEffect()
if turboEffect then return else turboEffect = true end
if Config.Debug then print("^5Debug^7: ^3TurboEffect^7() ^2activated") end
AnimpostfxPlay('RaceTurbo', 0, true)
SetTimecycleModifier('rply_motionblur')
ShakeGameplayCam('SKY_DIVING_SHAKE', 0.25)
Wait(30000)
StopGameplayCamShaking(true)
SetTransitionTimecycleModifier('default', 0.35)
Wait(1000)
ClearTimecycleModifier()
AnimpostfxStop('RaceTurbo')
turboEffect = false
if Config.Debug then print("^5Debug^7: ^3TurboEffect^7() ^2stopped") end
end
local rampageEffect = false
function RampageEffect()
if rampageEffect then return else rampageEffect = true end
if Config.Debug then print("^5Debug^7: ^3RampageEffect^7() ^2activated") end
AnimpostfxPlay('Rampage', 0, true)
SetTimecycleModifier('rply_motionblur')
ShakeGameplayCam('SKY_DIVING_SHAKE', 0.25)
Wait(30000)
StopGameplayCamShaking(true)
SetTransitionTimecycleModifier('default', 0.35)
Wait(1000)
ClearTimecycleModifier()
AnimpostfxStop('Rampage')
rampageEffect = false
if Config.Debug then print("^5Debug^7: ^3RampageEffect^7() ^2stopped") end
end
local focusEffect = false
function FocusEffect()
if focusEffect then return else focusEffect = true end
if Config.Debug then print("^5Debug^7: ^3FocusEffect^7() ^2activated") end
Wait(1000)
AnimpostfxPlay('FocusIn', 0, true)
Wait(30000)
AnimpostfxStop('FocusIn')
focusEffect = false
if Config.Debug then print("^5Debug^7: ^3FocusEffect^7() ^2stopped") end
end
local NightVisionEffect = false
function NightVisionEffect()
if NightVisionEffect then return else NightVisionEffect = true end
if Config.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2activated") end
SetNightvision(true)
Wait(math.random(3000, 4000)) -- FEEL FREE TO CHANGE THIS
SetNightvision(false)
SetSeethrough(false)
NightVisionEffect = false
if Config.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2stopped") end
end
local thermalEffect = false
function ThermalEffect()
if thermalEffect then return else thermalEffect = true end
if Config.Debug then print("^5Debug^7: ^3ThermalEffect^7() ^2activated") end
SetNightvision(true)
SetSeethrough(true)
Wait(math.random(2000, 3000)) -- FEEL FREE TO CHANGE THIS
SetNightvision(false)
SetSeethrough(false)
thermalEffect = false
if Config.Debug then print("^5Debug^7: ^3ThermalEffect^7() ^2stopped") end
end
--Built-in Buff effects
local healEffect = false
function HealEffect(data)
if healEffect then return end
if Config.Debug then print("^5Debug^7: ^3HealEffect^7() ^2activated") end
healEffect = true
local count = (data[1] / 1000)
while count > 0 do
Wait(1000)
count -= 1
SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) + data[2])
end
healEffect = false
if Config.Debug then print("^5Debug^7: ^3HealEffect^7() ^2stopped") end
end
local staminaEffect = false
function StaminaEffect(data)
if staminaEffect then return end
if Config.Debug then print("^5Debug^7: ^3StaminaEffect^7() ^2activated") end
staminaEffect = true
local startStamina = (data[1] / 1000)
SetRunSprintMultiplierForPlayer(PlayerId(), 1.49)
while startStamina > 0 do
Wait(1000)
if math.random(5, 100) < 10 then RestorePlayerStamina(PlayerId(), data[2]) end
startStamina -= 1
if math.random(5, 100) < 51 then end
end
startStamina = 0
SetRunSprintMultiplierForPlayer(PlayerId(), 1.0)
staminaEffect = false
if Config.Debug then print("^5Debug^7: ^3StaminaEffect^7() ^2stopped") end
end
function StopEffects() -- Used to clear up any effects stuck on screen
if Config.Debug then print("^5Debug^7: ^2All screen effects stopped") end
ShakeGameplayCam('DRUNK_SHAKE', 0.0)
SetPedToRagdoll(PlayerPedId(), 5000, 1000, 1, 0, 0, 0)
ClearTimecycleModifier()
ResetScenarioTypesEnabled()
ResetPedMovementClipset(PlayerPedId(), 0)
SetPedIsDrunk(PlayerPedId(), false)
SetPedMotionBlur(PlayerPedId(), false)
SetNightvision(false)
SetSeethrough(false)
AnimpostfxStop("DrugsMichaelAliensFightIn")
AnimpostfxStop("DrugsMichaelAliensFight")
AnimpostfxStop("DrugsMichaelAliensFightOut")
AnimpostfxStop("DrugsTrevorClownsFight")
AnimpostfxStop("DrugsTrevorClownsFightIn")
AnimpostfxStop("DrugsTrevorClownsFightOut")
AnimpostfxStop('RaceTurbo')
AnimpostfxStop('FocusIn')
AnimpostfxStop('Rampage')
end

7
version.txt Normal file
View File

@@ -0,0 +1,7 @@
2.0.03
- Convert to Global Statebags for optimized data syncing
- Fix hunger/thirst for esx
- Possible fix for imported items not being usable
https://github.com/jimathy/jim-consumables