1
0
Fork 0
forked from Simnation/Main

neues consumables

This commit is contained in:
Nordi98 2025-06-17 17:38:06 +02:00
parent 9d9a5c919b
commit fbaf832f92
49 changed files with 3321 additions and 0 deletions

View file

@ -0,0 +1,371 @@
function CreateBlip(data)
local x,y,z = table.unpack(data.coords)
local blip = AddBlipForCoord(x, y, z)
SetBlipSprite(blip, data.id or 1)
SetBlipDisplay(blip, data.display or 4)
SetBlipScale(blip, data.scale or 1.0)
SetBlipColour(blip, data.color or 1)
if (data.rotation) then
SetBlipRotation(blip, math.ceil(data.rotation))
end
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(data.label)
EndTextCommandSetBlipName(blip)
return blip
end
function CreateVeh(modelHash, ...)
RequestModel(modelHash)
while not HasModelLoaded(modelHash) do Wait(0) end
local veh = CreateVehicle(modelHash, ...)
SetModelAsNoLongerNeeded(modelHash)
if Config.GiveKeys then
Config.GiveKeys(veh)
end
return veh
end
function CreateNPC(modelHash, ...)
RequestModel(modelHash)
while not HasModelLoaded(modelHash) do Wait(0) end
local ped = CreatePed(26, modelHash, ...)
SetModelAsNoLongerNeeded(modelHash)
return ped
end
function CreateProp(modelHash, ...)
RequestModel(modelHash)
while not HasModelLoaded(modelHash) do Wait(0) end
local obj = CreateObject(modelHash, ...)
SetModelAsNoLongerNeeded(modelHash)
return obj
end
function PlayAnim(ped, dict, ...)
RequestAnimDict(dict)
while not HasAnimDictLoaded(dict) do Wait(0) end
TaskPlayAnim(ped, dict, ...)
end
function PlayEffect(dict, particleName, entity, off, rot, scale, networked)
RequestNamedPtfxAsset(dict)
while not HasNamedPtfxAssetLoaded(dict) do
Wait(0)
end
UseParticleFxAssetNextCall(dict)
local off = off or vector3(0.0, 0.0, 0.0)
local rot = rot or vector3(0.0, 0.0, 0.0)
local handle = StartParticleFxLoopedOnEntity(particleName, entity, off.x, off.y, off.z, rot.x, rot.y, rot.z, scale or 1.0)
if networked then
TriggerServerEvent("pickle_consumables:startEffect", ObjToNet(entity), dict, particleName, off, rot, scale)
end
return handle
end
function GetClosestVehicleDoor(vehicle, coords)
local coords = coords or GetEntityCoords(PlayerPedId())
local bones = {
"door_dside_f",
"door_dside_r",
"door_pside_f",
"door_pside_r",
"bonnet",
"boot"
}
local doors = {
0,
2,
1,
3,
4,
5
}
local closest
for i=1, #bones do
local boneID = GetEntityBoneIndexByName(vehicle, bones[i])
if boneID ~= -1 then
local vcoords = GetWorldPositionOfEntityBone(vehicle, boneID)
local dist = #(coords - vcoords)
if (not closest or closest.dist > dist) and dist < 3.0 then
closest = {door = doors[i], coords = vcoords, dist = dist}
end
end
end
if closest then
return closest.door, closest.dist
end
end
function GetNearestEntity(pool, coords, radius, model)
local coords = coords or GetEntityCoords(PlayerPedId())
local radius = radius or 3.0
local pool = GetGamePool(pool)
local closest
for i=1, #pool do
local vcoords = GetEntityCoords(pool[i])
local dist = #(coords - vcoords)
if (not closest or closest.dist > dist) and (not model or GetEntityModel(pool[i]) == model) then
closest = {entity = pool[i], dist = dist}
end
end
if closest then
return closest.entity, closest.dist
end
end
function GetNearestVehicle(coords, radius)
return GetNearestEntity('CVehicle', coords, radius)
end
function GetNearestEntityModel(model, coords, radius)
local entity = GetNearestEntity('CVehicle', coords, radius, model)
if entity then return entity end
local entity = GetNearestEntity('CPed', coords, radius, model)
if entity then return entity end
local entity = GetNearestEntity('CObject', coords, radius, model)
if entity then return entity end
end
function GetClosestPlayer(coords, radius)
local coords = coords or GetEntityCoords(PlayerPedId())
local radius = radius or 3.0
local players = GetPlayersInArea(coords, radius)
local closest
for i=1, #players do
local pcoords = GetEntityCoords(GetPlayerPed(players[i]))
local dist = #(coords - pcoords)
if not closest or closest.dist > dist then
closest = {id = GetPlayerServerId(players[i]), dist = dist}
end
end
if closest then
return closest.id, closest.dist
end
end
local interactTick = 0
local interactCheck = false
local interactText = nil
function ShowInteractText(text)
local timer = GetGameTimer()
interactTick = timer
if interactText == nil or interactText ~= text then
interactText = text
lib.showTextUI(text)
end
if interactCheck then return end
interactCheck = true
CreateThread(function()
Wait(150)
local timer = GetGameTimer()
interactCheck = false
if timer ~= interactTick then
lib.hideTextUI()
interactText = nil
interactTick = 0
end
end)
end
local Interactions = {}
EnableInteraction = true
function FormatOptions(index, data)
local options = data.options
local list = {}
if not options or #options < 2 then
list[1] = ((options and options[1]) and options[1] or { label = data.label })
list[1].name = GetCurrentResourceName() .. "_option_" .. math.random(1,999999999)
list[1].onSelect = function(data)
SelectInteraction(index, 1, data)
end
return list
end
for i=1, #options do
list[i] = options[i]
list[i].name = GetCurrentResourceName() .. "_option_" .. math.random(1,999999999)
list[i].onSelect = function(data)
SelectInteraction(index, i, data)
end
end
return list
end
function EnsureInteractionModel(index)
local data = Interactions[index]
if not data or data.entity then return end
local entity
if not data.model and not data.hiddenKeypress and Config.UseTarget and Config.NoModelTargeting then
entity = CreateProp(`ng_proc_brick_01a`, data.coords.x, data.coords.y, data.coords.z, false, true, false)
SetEntityAlpha(entity, 0, false)
elseif data.model and (not data.model.modelType or data.model.modelType == "ped") then
local offset = data.model.offset or vector3(0.0, 0.0, 0.0)
entity = CreateNPC(data.model.hash, data.coords.x + offset.x, data.coords.y + offset.y, (data.coords.z - 1.0) + offset.z, data.heading, false, true)
SetEntityInvincible(entity, true)
SetBlockingOfNonTemporaryEvents(entity, true)
elseif data.model and data.model.modelType == "prop" then
local offset = data.model.offset or vector3(0.0, 0.0, 0.0)
entity = CreateProp(data.model.hash, data.coords.x + offset.x, data.coords.y + offset.y, (data.coords.z - 1.0) + offset.z, false, true, false)
else
return
end
FreezeEntityPosition(entity, true)
SetEntityHeading(entity, data.heading)
Interactions[index].entity = entity
return entity
end
function DeleteInteractionEntity(index)
local data = Interactions[index]
if not data or not data.entity then return end
DeleteEntity(data.entity)
Interactions[index].entity = nil
end
function SelectInteraction(index, selection, targetData)
if not EnableInteraction then return end
local pcoords = GetEntityCoords(PlayerPedId())
local data = Interactions[index]
if not data.target and #(data.coords - pcoords) > Config.InteractDistance then
return ShowNotification(_L("interact_far"))
end
Interactions[index].selected(selection, targetData)
end
function CreateInteraction(data, selected)
local index
repeat
index = math.random(1, 999999999)
until not Interactions[index]
local options = FormatOptions(index, data)
Interactions[index] = {
selected = selected,
options = options,
label = data.label,
model = data.model,
coords = data.coords,
target = data.target,
offset = data.offset,
radius = data.radius or 1.0,
heading = data.heading,
hiddenKeypress = data.hiddenKeypress
}
if Config.UseTarget then
if data.target then
AddTargetModel(data.target, Interactions[index].radius, Interactions[index].options)
else
Interactions[index].zone = AddTargetZone(Interactions[index].coords, Interactions[index].radius, Interactions[index].options)
end
end
return index
end
function UpdateInteraction(index, data, selected)
if not Interactions[index] then return end
Interactions[index].selected = selected
for k,v in pairs(data) do
Interactions[index][k] = v
end
if data.options then
Interactions[index].options = FormatOptions(index, data)
end
if Config.UseTarget then
if Interactions[index].target then
RemoveTargetZone(Interactions[index].zone)
Interactions[index].zone = AddTargetZone(Interactions[index].coords, Interactions[index].radius, Interactions[index].options)
else
RemoveTargetModel(Interactions[index].target, Interactions[index].options)
AddTargetModel(Interactions[index].target, Interactions[index].radius, Interactions[index].options)
end
end
end
function DeleteInteraction(index)
local data = Interactions[index]
if not data then return end
if (data.entity) then
DeleteInteractionEntity(index)
end
if Config.UseTarget then
if data.target then
RemoveTargetModel(data.target, data.options)
else
RemoveTargetZone(data.zone)
end
end
Interactions[index] = nil
end
Citizen.CreateThread(function()
while true do
local ped = PlayerPedId()
local pcoords = GetEntityCoords(ped)
local wait = 1500
for k,v in pairs(Interactions) do
local coords = v.coords
if coords then
local dist = #(pcoords-coords)
if (dist < Config.RenderDistance) then
EnsureInteractionModel(k)
if not Config.UseTarget or v.hiddenKeypress then
if not Config.UseTarget and not v.hiddenKeypress and not v.model and Config.Marker and Config.Marker.enabled then
wait = 0
DrawMarker(Config.Marker.id, coords.x, coords.y, coords.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
Config.Marker.scale, Config.Marker.scale, Config.Marker.scale, Config.Marker.color[1],
Config.Marker.color[2], Config.Marker.color[3], Config.Marker.color[4], false, true)
end
if dist < Config.InteractDistance then
wait = 0
if not ShowInteractText("[E] - " .. v.label) and IsControlJustPressed(1, 51) then
if not v.options or #v.options < 2 then
SelectInteraction(k, 1)
else
lib.registerContext({
id = 'lottery_'..k,
title = v.title or "Options",
options = v.options
})
lib.showContext('lottery_'..k)
end
end
end
end
elseif v.entity then
DeleteInteractionEntity(k)
end
elseif not Config.UseTarget and v.target then
local entity = GetNearestEntityModel(v.target)
if entity then
local offset = v.offset or vector3(0.0, 0.0, 0.0)
local coords = GetOffsetFromEntityInWorldCoords(entity, offset.x, offset.y, offset.z)
local dist = #(pcoords-coords)
if dist < v.radius then
wait = 0
if not ShowInteractText("[E] - " .. v.label) and IsControlJustPressed(1, 51) then
if not v.options or #v.options < 2 then
SelectInteraction(k, 1, {entity = entity, coords = coords, dist = dist})
else
lib.registerContext({
id = 'lottery_'..k,
title = v.title or "Options",
options = v.options
})
lib.showContext('lottery_'..k)
end
end
end
end
end
end
Wait(wait)
end
end)
AddEventHandler('onResourceStop', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then return end
for k,v in pairs(Interactions) do
DeleteInteraction(k)
end
end)

View file

@ -0,0 +1,27 @@
Language = {}
function _L(name, ...)
if name then
local str = Language[Config.Language][name]
if str then
return string.format(str, ...)
else
return "ERR_TRANSLATE_"..(name).."_404"
end
else
return "ERR_TRANSLATE_404"
end
end
function lerp(a, b, t) return a + (b-a) * t end
function v3(coords) return vec3(coords.x, coords.y, coords.z), coords.w end
function GetRandomInt(min, max, exclude)
for i=1, 1000 do
local int = math.random(min, max)
if exclude == nil or exclude ~= int then
return int
end
end
end