Files
esx_core/resources/esx_optionalneeds/client/main.lua
T

503 lines
13 KiB
Lua

<<<<<<< HEAD
ESX = nil
local lastSkin, playerLoaded, cam, isCameraActive
local firstSpawn, zoomOffset, camOffset, heading, skinLoaded = true, 0.0, 0.0, 90.0, false
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end
end)
function OpenMenu(submitCb, cancelCb, restrict)
local playerPed = PlayerPedId()
TriggerEvent('skinchanger:getSkin', function(skin) lastSkin = skin end)
TriggerEvent('skinchanger:getData', function(components, maxVals)
local elements = {}
local _components = {}
-- Restrict menu
if restrict == nil then
for i=1, #components, 1 do
_components[i] = components[i]
end
else
for i=1, #components, 1 do
local found = false
for j=1, #restrict, 1 do
if components[i].name == restrict[j] then
found = true
end
end
if found then
table.insert(_components, components[i])
end
end
end
-- Insert elements
for i=1, #_components, 1 do
local value = _components[i].value
local componentId = _components[i].componentId
if componentId == 0 then
value = GetPedPropIndex(playerPed, _components[i].componentId)
end
local data = {
label = _components[i].label,
name = _components[i].name,
value = value,
min = _components[i].min,
textureof = _components[i].textureof,
zoomOffset= _components[i].zoomOffset,
camOffset = _components[i].camOffset,
type = 'slider'
}
for k,v in pairs(maxVals) do
if k == _components[i].name then
data.max = v
break
end
end
table.insert(elements, data)
end
CreateSkinCam()
zoomOffset = _components[1].zoomOffset
camOffset = _components[1].camOffset
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'skin', {
title = _U('skin_menu'),
align = 'top-left',
elements = elements
}, function(data, menu)
TriggerEvent('skinchanger:getSkin', function(skin) lastSkin = skin end)
submitCb(data, menu)
DeleteSkinCam()
end, function(data, menu)
menu.close()
DeleteSkinCam()
TriggerEvent('skinchanger:loadSkin', lastSkin)
if cancelCb ~= nil then
cancelCb(data, menu)
end
end, function(data, menu)
local skin, components, maxVals
TriggerEvent('skinchanger:getSkin', function(getSkin) skin = getSkin end)
zoomOffset = data.current.zoomOffset
camOffset = data.current.camOffset
if skin[data.current.name] ~= data.current.value then
-- Change skin element
TriggerEvent('skinchanger:change', data.current.name, data.current.value)
-- Update max values
TriggerEvent('skinchanger:getData', function(comp, max)
components, maxVals = comp, max
end)
local newData = {}
for i=1, #elements, 1 do
newData = {}
newData.max = maxVals[elements[i].name]
if elements[i].textureof ~= nil and data.current.name == elements[i].textureof then
newData.value = 0
end
menu.update({name = elements[i].name}, newData)
end
menu.refresh()
end
end, function(data, menu)
DeleteSkinCam()
end)
end)
end
function CreateSkinCam()
if not DoesCamExist(cam) then
cam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
end
local playerPed = PlayerPedId()
SetCamActive(cam, true)
RenderScriptCams(true, true, 500, true, true)
isCameraActive = true
SetCamCoord(cam, GetEntityCoords(playerPed))
SetCamRot(cam, 0.0, 0.0, 270.0, true)
SetEntityHeading(playerPed, 0.0)
end
function DeleteSkinCam()
isCameraActive = false
SetCamActive(cam, false)
RenderScriptCams(false, true, 500, true, true)
cam = nil
end
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if isCameraActive then
DisableControlAction(2, 30, true)
DisableControlAction(2, 31, true)
DisableControlAction(2, 32, true)
DisableControlAction(2, 33, true)
DisableControlAction(2, 34, true)
DisableControlAction(2, 35, true)
DisableControlAction(0, 25, true) -- Input Aim
DisableControlAction(0, 24, true) -- Input Attack
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local angle = heading * math.pi / 180.0
local theta = {
x = math.cos(angle),
y = math.sin(angle)
}
local pos = {
x = coords.x + (zoomOffset * theta.x),
y = coords.y + (zoomOffset * theta.y)
}
local angleToLook = heading - 140.0
if angleToLook > 360 then
angleToLook = angleToLook - 360
elseif angleToLook < 0 then
angleToLook = angleToLook + 360
end
angleToLook = angleToLook * math.pi / 180.0
local thetaToLook = {
x = math.cos(angleToLook),
y = math.sin(angleToLook)
}
local posToLook = {
x = coords.x + (zoomOffset * thetaToLook.x),
y = coords.y + (zoomOffset * thetaToLook.y)
}
SetCamCoord(cam, pos.x, pos.y, coords.z + camOffset)
PointCamAtCoord(cam, posToLook.x, posToLook.y, coords.z + camOffset)
ESX.ShowHelpNotification(_U('use_rotate_view'))
else
Citizen.Wait(500)
end
end
end)
Citizen.CreateThread(function()
local angle = 90
while true do
Citizen.Wait(0)
if isCameraActive then
if IsControlPressed(0, 108) then
angle = angle - 1
elseif IsControlPressed(0, 109) then
angle = angle + 1
end
if angle > 360 then
angle = angle - 360
elseif angle < 0 then
angle = angle + 360
end
heading = angle + 0.0
else
Citizen.Wait(500)
end
end
end)
function OpenSaveableMenu(submitCb, cancelCb, restrict)
TriggerEvent('skinchanger:getSkin', function(skin) lastSkin = skin end)
OpenMenu(function(data, menu)
menu.close()
DeleteSkinCam()
TriggerEvent('skinchanger:getSkin', function(skin)
TriggerServerEvent('esx_skin:save', skin)
if submitCb ~= nil then
submitCb(data, menu)
end
end)
end, cancelCb, restrict)
end
AddEventHandler('esx:onPlayerSpawn', function()
Citizen.CreateThread(function()
while not playerLoaded do
Citizen.Wait(100)
end
if firstSpawn and ESX.GetConfig().Multichar ~= true then
ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
if skin == nil then
TriggerEvent('skinchanger:loadSkin', {sex = 0}, OpenSaveableMenu)
else
TriggerEvent('skinchanger:loadSkin', skin)
end
end)
firstSpawn = false
end
end)
end)
AddEventHandler('esx_skin:resetFirstSpawn', function()
firstSpawn = true
skinLoaded = false
end)
AddEventHandler('esx_skin:playerRegistered', function()
Citizen.CreateThread(function()
while not playerLoaded do
Citizen.Wait(100)
end
if firstSpawn then
ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
if skin == nil then
TriggerEvent('skinchanger:loadSkin', {sex = 0}, OpenSaveableMenu)
Citizen.Wait(100)
skinLoaded = true
else
TriggerEvent('skinchanger:loadSkin', skin)
Citizen.Wait(100)
skinLoaded = true
end
end)
firstSpawn = false
end
end)
end)
RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer)
playerLoaded = true
end)
AddEventHandler('esx_skin:getLastSkin', function(cb) cb(lastSkin) end)
AddEventHandler('esx_skin:setLastSkin', function(skin) lastSkin = skin end)
RegisterNetEvent('esx_skin:openMenu')
AddEventHandler('esx_skin:openMenu', function(submitCb, cancelCb)
OpenMenu(submitCb, cancelCb, nil)
end)
RegisterNetEvent('esx_skin:openRestrictedMenu')
AddEventHandler('esx_skin:openRestrictedMenu', function(submitCb, cancelCb, restrict)
OpenMenu(submitCb, cancelCb, restrict)
end)
RegisterNetEvent('esx_skin:openSaveableMenu')
AddEventHandler('esx_skin:openSaveableMenu', function(submitCb, cancelCb)
OpenSaveableMenu(submitCb, cancelCb, nil)
end)
RegisterNetEvent('esx_skin:openSaveableRestrictedMenu')
AddEventHandler('esx_skin:openSaveableRestrictedMenu', function(submitCb, cancelCb, restrict)
OpenSaveableMenu(submitCb, cancelCb, restrict)
end)
RegisterNetEvent('esx_skin:requestSaveSkin')
AddEventHandler('esx_skin:requestSaveSkin', function()
TriggerEvent('skinchanger:getSkin', function(skin)
TriggerServerEvent('esx_skin:responseSaveSkin', skin)
end)
end)
=======
ESX = nil
local IsAlreadyDrunk = false
local DrunkLevel = -1
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end
end)
function Drunk(level, start)
Citizen.CreateThread(function()
local playerPed = GetPlayerPed(-1)
if start then
DoScreenFadeOut(800)
Wait(1000)
end
if level == 0 then
RequestAnimSet("move_m@drunk@slightlydrunk")
while not HasAnimSetLoaded("move_m@drunk@slightlydrunk") do
Citizen.Wait(0)
end
SetPedMovementClipset(playerPed, "move_m@drunk@slightlydrunk", true)
elseif level == 1 then
RequestAnimSet("move_m@drunk@moderatedrunk")
while not HasAnimSetLoaded("move_m@drunk@moderatedrunk") do
Citizen.Wait(0)
end
SetPedMovementClipset(playerPed, "move_m@drunk@moderatedrunk", true)
elseif level == 2 then
RequestAnimSet("move_m@drunk@verydrunk")
while not HasAnimSetLoaded("move_m@drunk@verydrunk") do
Citizen.Wait(0)
end
SetPedMovementClipset(playerPed, "move_m@drunk@verydrunk", true)
end
SetTimecycleModifier("spectator5")
SetPedMotionBlur(playerPed, true)
SetPedIsDrunk(playerPed, true)
if start then
DoScreenFadeIn(800)
end
end)
end
function Reality()
Citizen.CreateThread(function()
local playerPed = GetPlayerPed(-1)
DoScreenFadeOut(800)
Wait(1000)
ClearTimecycleModifier()
ResetScenarioTypesEnabled()
ResetPedMovementClipset(playerPed, 0)
SetPedIsDrunk(playerPed, false)
SetPedMotionBlur(playerPed, false)
DoScreenFadeIn(800)
end)
end
AddEventHandler('esx_status:loaded', function(status)
TriggerEvent('esx_status:registerStatus', 'drunk', 0, '#8F15A5',
function(status)
if status.val > 0 then
return true
else
return false
end
end,
function(status)
status.remove(1500)
end
)
Citizen.CreateThread(function()
while true do
Wait(1000)
TriggerEvent('esx_status:getStatus', 'drunk', function(status)
if status.val > 0 then
local start = true
if IsAlreadyDrunk then
start = false
end
local level = 0
if status.val <= 250000 then
level = 0
elseif status.val <= 500000 then
level = 1
else
level = 2
end
if level ~= DrunkLevel then
Drunk(level, start)
end
IsAlreadyDrunk = true
DrunkLevel = level
end
if status.val == 0 then
if IsAlreadyDrunk then
Reality()
end
IsAlreadyDrunk = false
DrunkLevel = -1
end
end)
end
end)
end)
RegisterNetEvent('esx_optionalneeds:onDrink')
AddEventHandler('esx_optionalneeds:onDrink', function()
local playerPed = GetPlayerPed(-1)
TaskStartScenarioInPlace(playerPed, "WORLD_HUMAN_DRINKING", 0, 1)
Citizen.Wait(1000)
ClearPedTasksImmediately(playerPed)
end)
>>>>>>> esx_optionalneeds/master