Created
April 24, 2025 14:03
-
-
Save itzalfie01/de300a9e009896ad6bbc64acdb7117ca to your computer and use it in GitHub Desktop.
Mythic-Dumpsterdiving
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
_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 } }, | |
}, | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment