Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save itzalfie01/de300a9e009896ad6bbc64acdb7117ca to your computer and use it in GitHub Desktop.
Save itzalfie01/de300a9e009896ad6bbc64acdb7117ca to your computer and use it in GitHub Desktop.
Mythic-Dumpsterdiving
local _DumpsterEntities = {
{
objectID = 666561306,
description = "Blue Dumpster",
},
{
objectID = 218085040,
description = "Light Blue Dumpster",
},
{
objectID = -58485588,
description = "Gray Dumpster",
},
{
objectID = 682791951,
description = "Big Blue Dumpster",
},
{
objectID = -206690185,
description = "Big Green Dumpster",
},
{
objectID = 364445978,
description = "Big Green Skip Bin",
},
{
objectID = 143369,
description = "Small Bin",
},
{
objectID = -329415894,
description = "Small Trash Can",
},
{
objectID = 1614656839,
description = "Small Trash Can",
},
{
objectID = 1437508529,
description = "Small Trash Can",
},
{
objectID = -1096777189,
description = "Small Trash Can",
},
{
objectID = -228596739,
description = "Small Trash Can",
},
{
objectID = 1329570871,
description = "Small Trash Can",
},
}
local _searching = false
local _isLocked = nil
local _insideDumpster = false
local _insideCurrentDumpster = nil
AddEventHandler("Labor:Client:Setup", function()
RegisterDumpsterStartup()
end)
AddEventHandler("Labor:Dumpster:RegisterDumpsters", function()
RegisterDumpsterStartup()
end)
function RegisterDumpsterStartup()
for k, v in ipairs(_DumpsterEntities) do
Targeting:AddObject(v.objectID, "dumpster", {
{
icon = "magnifying-glass",
isEnabled = function(data, entityData)
if entityData ~= nil and v.objectID == entityData.model then
return true
end
return false
end,
text = "Search Trash",
event = "Inventory:Client:SearchDumpster",
data = {},
minDist = 1.5,
},
{
icon = "trash-can-slash",
isEnabled = function(data, entityData)
if entityData ~= nil and v.objectID == entityData.model then
return true
end
return false
end,
text = "Hide In Dumpster",
event = "Inventory:Client:HideInDumpster",
data = {},
minDist = 1.5,
},
}, 2.0)
end
end
AddEventHandler("Inventory:Client:HideInDumpster", function(entity, data)
local data = {
identifier = entity.entity,
locked = math.random(1, 3),
}
Progress:Progress({
name = "hide_dumpster",
duration = 30000,
label = "Climbing into dumpster",
useWhileDead = false,
canCancel = true,
ignoreModifier = true,
controlDisables = {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
},
}, function(cancelled)
if not cancelled then
Callbacks:ServerCallback("Inventory:Dumpster:HidePlayer", data, function(s, l)
if not s then
Notification:Error("You're not in the right state to hide in the dumpster.")
return
end
if data.identifier == nil or type(data.identifier) == "boolean" then
Notification:Error("This is not a dumpster. Try again.")
return
end
if not l then
Notification:Error("Dumpster is locked.")
return
end
LocalPlayer.state.inDumpster = true
_insideCurrentDumpster = data.identifier
AttachEntityToEntity(
LocalPlayer.state.ped,
_insideCurrentDumpster,
-1,
0.0,
-0.2,
2.0,
0.0,
0.0,
0.0,
true,
true,
true,
false,
2,
true
)
Animations.Emotes:Play("laydown_garbage", false, nil, true)
SetEntityVisible(LocalPlayer.state.ped, false, 0)
_insideDumpster = true
_isLocked = false
TriggerEvent("Inventory:Client:DumpsterHideThread")
if not LocalPlayer.state.isCuffed and not LocalPlayer.state.isDead then
Action:Show("{keybind}secondary_action{/keybind} Exit Trash")
end
end)
end
end)
end)
AddEventHandler("Inventory:Client:SearchDumpster", function(entity, data)
-- print(entity.endCoords, entity.entity, data)
Callbacks:ServerCallback("Inventory:Server:AvailableDumpster", entity, function(s)
if s and entity then
if entity.entity == nil or type(entity.entity) == "boolean" then
Notification:Error("This is not a dumpster. Try again.")
return
end
if not _searching then
_searching = true
TaskTurnPedToFaceEntity(LocalPlayer.state.ped, entity.entity, 3000)
Wait(2000)
local dict = "amb@prop_human_bum_bin@base"
local anim = "base"
if LocalPlayer.state.isK9Ped then
dict = "creatures@rottweiler@move"
anim = "fetch_pickup"
end
Progress:Progress({
name = "inv_dumpster_search",
duration = math.random(20, 25) * 1000,
label = "Searching Trash",
useWhileDead = false,
canCancel = true,
ignoreModifier = true,
controlDisables = {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
},
animation = {
animDict = dict,
anim = anim,
flag = 49,
},
}, function(status)
if not status then
Callbacks:ServerCallback("Inventory:Server:SearchDumpster", entity, function(s) end)
end
_searching = false
end)
end
else
Notification:Error("This dumpster has been searched.")
end
end)
end)
AddEventHandler("Keybinds:Client:KeyUp:secondary_action", function()
if _insideDumpster and LocalPlayer.state.loggedIn then
ClearPedTasks(LocalPlayer.state.ped)
DetachEntity(LocalPlayer.state.ped)
if DoesEntityExist(_insideCurrentDumpster) then
SetEntityCoords(
LocalPlayer.state.ped,
GetOffsetFromEntityInWorldCoords(LocalPlayer.state.ped, 0.0, -0.7, -0.75)
)
else
SetEntityCoords(LocalPlayer.state.ped, GetEntityCoords(LocalPlayer.state.ped))
end
SetEntityVisible(LocalPlayer.state.ped, true, 0)
_insideDumpster = false
_isLocked = false
_insideCurrentDumpster = nil
LocalPlayer.state.inDumpster = false
Animations.Emotes:ForceCancel()
Action:Hide()
end
end)
local _dumpsterHideThreading = false
RegisterNetEvent("Inventory:Client:DumpsterHideThread", function()
if _dumpsterHideThreading then
return
end
_dumpsterHideThreading = true
Citizen.CreateThread(function()
-- Wait till this is synced from server
while not LocalPlayer.state.inDumpster do
Citizen.Wait(10)
end
while LocalPlayer.state.inDumpster do
Citizen.Wait(5)
Weapons:UnequipIfEquipped()
DisableControls()
end
ClearPedTasks(LocalPlayer.state.ped)
FreezeEntityPosition(LocalPlayer.state.ped, false)
_dumpsterHideThreading = false
end)
end)
RegisterNetEvent("Characters:Client:Spawn", function()
LocalPlayer.state.inDumpster = false
end)
function DisableControls()
DisableControlAction(0, 30, true) -- disable left/right
DisableControlAction(0, 31, true) -- disable forward/back
DisableControlAction(0, 36, true) -- INPUT_DUCK
DisableControlAction(0, 21, true) -- disable sprint
DisableControlAction(0, 44, true) -- disable cover
DisableControlAction(0, 63, true) -- veh turn left
DisableControlAction(0, 64, true) -- veh turn right
DisableControlAction(0, 71, true) -- veh forward
DisableControlAction(0, 72, true) -- veh backwards
DisableControlAction(0, 75, true) -- disable exit vehicle
DisablePlayerFiring(PlayerId(), true) -- Disable weapon firing
DisableControlAction(0, 24, true) -- disable attack
DisableControlAction(0, 25, true) -- disable aim
DisableControlAction(1, 37, true) -- disable weapon select
DisableControlAction(0, 47, true) -- disable weapon
DisableControlAction(0, 58, true) -- disable weapon
DisableControlAction(0, 140, true) -- disable melee
DisableControlAction(0, 141, true) -- disable melee
DisableControlAction(0, 142, true) -- disable melee
DisableControlAction(0, 143, true) -- disable melee
DisableControlAction(0, 263, true) -- disable melee
DisableControlAction(0, 264, true) -- disable melee
DisableControlAction(0, 257, true) -- disable melee
end
_dumpsterLoot = {
low = {
{ 50, { name = "beer", min = 1, max = 1 } },
{ 50, { name = "water", min = 1, max = 1 } },
{ 50, { name = "chocolate_bar", min = 1, max = 1 } },
-- { 50, { name = "donut", min = 1, max = 1 } },
{ 50, { name = "plastic", min = 5, max = 15 } },
{ 50, { name = "scrapmetal", min = 3, max = 6 } },
{ 50, { name = "electronic_parts", min = 8, max = 14 } },
{ 50, { name = "rubber", min = 5, max = 10 } },
{ 50, { name = "glue", min = 1, max = 3 } },
{ 50, { name = "cloth", min = 1, max = 1 } },
{ 50, { name = "pipe", min = 1, max = 1 } },
{ 50, { name = "nails", min = 1, max = 1 } },
{ 15, { name = "screwdriver", min = 1, max = 1 } },
{ 15, { name = "wine_bottle", min = 1, max = 1 } },
{ 15, { name = "petrock", min = 1, max = 1 } },
{ 10, { name = "birthday_cake", min = 1, max = 1 } },
{ 10, { name = "gascan", min = 1, max = 1 } },
{ 5, { name = "weed_joint", min = 1, max = 1 } },
{ 5, { name = "goldcoins", min = 2, max = 4 } },
-- { 2, { name = "buttplug_black", min = 1, max = 1 } },
-- { 2, { name = "buttplug_pink", min = 1, max = 1 } },
{ 2, { name = "megaphone", min = 1, max = 1 } },
{ 2, { name = "redlight", min = 1, max = 1 } },
},
medium = {
{ 5, { name = "fluffyhandcuffs", min = 1, max = 1 } },
{ 5, { name = "blindfold", min = 1, max = 1 } },
{ 5, { name = "sign_dontblock", min = 1, max = 1 } },
{ 5, { name = "sign_leftturn", min = 1, max = 1 } },
{ 5, { name = "sign_nopark", min = 1, max = 1 } },
{ 5, { name = "sign_notresspass", min = 1, max = 1 } },
{ 5, { name = "sign_rightturn", min = 1, max = 1 } },
{ 5, { name = "sign_stop", min = 1, max = 1 } },
{ 5, { name = "sign_uturn", min = 1, max = 1 } },
{ 5, { name = "sign_walkingman", min = 1, max = 1 } },
{ 5, { name = "sign_yield", min = 1, max = 1 } },
{ 3, { name = "foodbag", min = 1, max = 1 } },
{ 2, { name = "boombox", min = 1, max = 1 } },
-- { 2, { name = "vibrator_pink", min = 1, max = 1 } },
{ 1, { name = "silverbar", min = 1, max = 1 } },
{ 1, { name = "microwave", min = 1, max = 1 } },
{ 1, { name = "golfclubs", min = 1, max = 1 } },
{ 1, { name = "lockpick", min = 1, max = 1 } },
{ 1, { name = "tv", min = 1, max = 1 } },
},
high = {
{ 2, { name = "ATTCH_PISTOL_EXT_MAG", min = 1, max = 1 } },
{ 5, { name = "boombox", min = 1, max = 2 } },
{ 25, { name = "goldcoins", min = 5, max = 10 } },
{ 25, { name = "ring", min = 1, max = 4 } },
{ 10, { name = "rolex", min = 1, max = 2 } },
{ 1, { name = "tv", min = 1, max = 1 } },
{ 5, { name = "radio_extendo", min = 1, max = 1 } },
{ 10, { name = "goldbar", min = 1, max = 1 } },
{ 1, { name = "valuegoods", min = 1, max = 1 } },
},
}
local _searchedDumpsters = {}
local _lockedDumpsters = {}
local _dumpsterLockVal = 3
local _repName = "DumpsterDiving"
AddEventHandler("Labor:Server:Startup", function()
RegisterDumpsterCallbacks()
RegisterDumpsterStartup()
end)
function RegisterDumpsterStartup()
Reputation:Create(_repName, "Dumpster Diving", {
{ label = "Rank 1", value = 1000 },
{ label = "Rank 2", value = 2500 },
{ label = "Rank 3", value = 5000 },
{ label = "Rank 4", value = 10000 },
{ label = "Rank 5", value = 25000 },
{ label = "Rank 6", value = 50000 },
{ label = "Rank 7", value = 100000 },
{ label = "Rank 8", value = 250000 },
{ label = "Rank 9", value = 500000 },
{ label = "Rank 10", value = 1000000 },
})
end
function RegisterDumpsterCallbacks()
Callbacks:RegisterServerCallback("Inventory:Server:AvailableDumpster", function(source, data, cb)
local _dumpsterId = data.entity
if data and _searchedDumpsters[_dumpsterId] == nil then
cb(true)
else
cb(false)
end
end)
Callbacks:RegisterServerCallback("Inventory:Dumpster:HidePlayer", function(source, data, cb)
local plyr = Fetch:Source(source)
local _dumpsterId = data.identifier
local _locked = data.locked
if plyr ~= nil then
if not Player(source).state.isCuffed and not Player(source).state.isDead then
if _lockedDumpsters[_dumpsterId] == nil then
if _locked == _dumpsterLockVal then
_lockedDumpsters[_dumpsterId] = true
else
_lockedDumpsters[_dumpsterId] = false
end
cb(true, _lockedDumpsters[_dumpsterId])
else
cb(true, _lockedDumpsters[_dumpsterId])
end
else
cb(false, false)
end
else
cb(false, false)
end
end)
Callbacks:RegisterServerCallback("Inventory:Server:SearchDumpster", function(source, data, cb)
local char = Fetch:Source(source):GetData("Character")
if char ~= nil then
local _dumpsterId = data.entity
if data and _searchedDumpsters[_dumpsterId] == nil then
_searchedDumpsters[_dumpsterId] = true
local _PlayerRep = Reputation:GetLevel(source, _repName) or 0
local _found = math.random(100) >= math.random(75)
if _found then
if _PlayerRep >= 8 then
if math.random(100) >= math.random(75) then
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.high,
char:GetData("SID"),
1,
1,
false
)
end
if math.random(100) >= math.random(75) then
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.medium,
char:GetData("SID"),
1,
1,
false
)
end
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.low,
char:GetData("SID"),
1,
1,
false
)
elseif _PlayerRep <= 7 and _PlayerRep >= 4 then
if math.random(100) >= math.random(75) then
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.medium,
char:GetData("SID"),
1,
1,
false
)
end
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.low,
char:GetData("SID"),
1,
1,
false
)
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.low,
char:GetData("SID"),
1,
1,
false
)
else
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.low,
char:GetData("SID"),
1,
1,
false
)
Loot:CustomWeightedSetWithCountAndModifier(
_dumpsterLoot.low,
char:GetData("SID"),
1,
1,
false
)
end
Reputation.Modify:Add(source, _repName, math.random(5, 10))
Execute:Client(source, "Notification", "Success", "You found something!")
else
Reputation.Modify:Add(source, _repName, math.random(1, 3))
Execute:Client(source, "Notification", "Info", "Nothing was found.")
end
cb(true)
else
Execute:Client(source, "Notification", "Error", "This dumpster has been searched already!")
cb(false)
end
else
cb(false)
end
end)
end
_dumpsterLoot = {
low = {
{ 50, { name = "beer", min = 1, max = 1 } },
{ 50, { name = "water", min = 1, max = 1 } },
{ 50, { name = "chocolate_bar", min = 1, max = 1 } },
-- { 50, { name = "donut", min = 1, max = 1 } },
{ 50, { name = "plastic", min = 5, max = 15 } },
{ 50, { name = "scrapmetal", min = 3, max = 6 } },
{ 50, { name = "electronic_parts", min = 8, max = 14 } },
{ 50, { name = "rubber", min = 5, max = 10 } },
{ 50, { name = "glue", min = 1, max = 3 } },
{ 50, { name = "cloth", min = 1, max = 1 } },
{ 50, { name = "pipe", min = 1, max = 1 } },
{ 50, { name = "nails", min = 1, max = 1 } },
{ 15, { name = "screwdriver", min = 1, max = 1 } },
{ 15, { name = "wine_bottle", min = 1, max = 1 } },
{ 15, { name = "petrock", min = 1, max = 1 } },
{ 10, { name = "birthday_cake", min = 1, max = 1 } },
{ 10, { name = "gascan", min = 1, max = 1 } },
{ 5, { name = "weed_joint", min = 1, max = 1 } },
{ 5, { name = "goldcoins", min = 2, max = 4 } },
-- { 2, { name = "buttplug_black", min = 1, max = 1 } },
-- { 2, { name = "buttplug_pink", min = 1, max = 1 } },
{ 2, { name = "megaphone", min = 1, max = 1 } },
{ 2, { name = "redlight", min = 1, max = 1 } },
},
medium = {
{ 5, { name = "fluffyhandcuffs", min = 1, max = 1 } },
{ 5, { name = "blindfold", min = 1, max = 1 } },
{ 5, { name = "sign_dontblock", min = 1, max = 1 } },
{ 5, { name = "sign_leftturn", min = 1, max = 1 } },
{ 5, { name = "sign_nopark", min = 1, max = 1 } },
{ 5, { name = "sign_notresspass", min = 1, max = 1 } },
{ 5, { name = "sign_rightturn", min = 1, max = 1 } },
{ 5, { name = "sign_stop", min = 1, max = 1 } },
{ 5, { name = "sign_uturn", min = 1, max = 1 } },
{ 5, { name = "sign_walkingman", min = 1, max = 1 } },
{ 5, { name = "sign_yield", min = 1, max = 1 } },
{ 3, { name = "foodbag", min = 1, max = 1 } },
{ 2, { name = "boombox", min = 1, max = 1 } },
-- { 2, { name = "vibrator_pink", min = 1, max = 1 } },
{ 1, { name = "silverbar", min = 1, max = 1 } },
{ 1, { name = "microwave", min = 1, max = 1 } },
{ 1, { name = "golfclubs", min = 1, max = 1 } },
{ 1, { name = "lockpick", min = 1, max = 1 } },
{ 1, { name = "tv", min = 1, max = 1 } },
},
high = {
{ 2, { name = "ATTCH_PISTOL_EXT_MAG", min = 1, max = 1 } },
{ 5, { name = "boombox", min = 1, max = 2 } },
{ 25, { name = "goldcoins", min = 5, max = 10 } },
{ 25, { name = "ring", min = 1, max = 4 } },
{ 10, { name = "rolex", min = 1, max = 2 } },
{ 1, { name = "tv", min = 1, max = 1 } },
{ 5, { name = "radio_extendo", min = 1, max = 1 } },
{ 10, { name = "goldbar", min = 1, max = 1 } },
{ 1, { name = "valuegoods", min = 1, max = 1 } },
},
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment