Scripts/resources/[hp]/hp_multichar/client/main.lua

503 lines
15 KiB
Lua
Raw Normal View History

2024-12-29 19:48:41 +00:00
local SelectedScene = {}
local Players = {}
local Peds = {}
local oldBucket = nil
local Cam = nil
local Spawned = false
local timeOut = 4000
local uiLoaded = false
local Selected = false
local SelectedPlayerCoords = nil
local Hovered = false
local Creating = false
local CreatedPed = nil
local Deleted = false
local MySlots = 0
RegisterNetEvent("hp_multichar:userConnected", function ()
DoScreenFadeIn(200) -- Fade in the screen for development purposes
Wait(200)
TriggerServerEvent('hp_multichar:playerConnected')
SendNUIMessage({ action = "open" })
end)
RegisterNetEvent("hp_multichar:refreshSlots", function ()
Deleted = true
MySlots = MySlots + 1
end)
RegisterNetEvent('hp_multichar:playerConnected', function(charData, purchasedSlots)
DisplayRadar(false)
SetNuiFocus(true, true)
local random = math.random(1, #Scenes)
SelectedScene = Scenes[random]
while SelectedScene == nil do
Wait(1)
SelectedScene = Scenes[math.random(1, #Scenes)]
end
DoScreenFadeOut(200)
Wait(200)
MySlots = purchasedSlots or 0
SendNUIMessage({
action = "sendData",
charData = charData or {},
slots = Config.Slots,
payedSlots = Config.PayedSlots,
purchasedSlots = MySlots
})
end)
RegisterNetEvent('hp_multichar:getOldBucket', function(bucket)
oldBucket = bucket
end)
RegisterNetEvent('hp_multichar:qb:spawnLastLocation', function(coords, firstSpawn)
local ped = PlayerPedId()
DoScreenFadeOut(500)
Wait(500)
SetEntityCoords(ped, coords.x, coords.y, coords.z, false, false, false, false)
SetEntityInvincible(ped, false)
FreezeEntityPosition(ped, false)
SetEntityVisible(ped, true, false)
DestroyCam(Cam, true)
Cam = nil
SetNuiFocus(false, false)
RenderScriptCams(false, false, 0, false, false)
Spawned = true
timeOut = 20000
Selected = false
SelectedPlayerCoords = nil
Hovered = false
Creating = false
CreatedPed = nil
for k, v in pairs(Peds) do
DeletePed(v.ped)
end
TriggerServerEvent('QBCore:Server:OnPlayerLoaded')
TriggerEvent('QBCore:Client:OnPlayerLoaded')
if firstSpawn and not Config.UseQbApartments then
TriggerServerEvent('qb-houses:server:SetInsideMeta', 0, false)
TriggerServerEvent('qb-apartments:server:SetInsideMeta', 0, 0, false)
TriggerEvent('qb-weathersync:client:EnableSync')
Config.ClothingMenuExport()
end
TriggerServerEvent("hp_multichar:server:sendOldBucket", oldBucket)
Wait(500)
DoScreenFadeIn(500)
DisplayRadar(true)
end)
RegisterNuiCallback("playIdleAnimation", function (data, cb)
if Cam ~= nil then
DoScreenFadeOut(500)
DestroyCam(Cam, true)
RenderScriptCams(false, false, 0, false, false)
end
Wait(500)
Players = data
if next(Peds) then
for k, v in pairs(Peds) do
DeletePed(v.ped)
end
end
local camId = 1
local selectedCamera = SelectedScene.Camera[camId]
local tempId = 1
local maxPlayers = #Players
while selectedCamera[1].x == nil do
Wait(1)
SelectedScene = Scenes[math.random(1, #Scenes)]
selectedCamera = SelectedScene.Camera[camId]
end
Wait(500)
for k, v in pairs(Players) do
Wait(300)
local ped = nil
local license = Config.Framework == "qb" and v.citizenid or v.identifier
if tempId <= maxPlayers then
local charPos = SelectedScene.Characters[tempId]
tempId = tempId + 1
TriggerServerCallback('hp_multichar:server:getSkin', function(model, data)
local cModel = joaat(model)
if cModel ~= nil then
CreateThread(function()
RequestModel(cModel)
while not HasModelLoaded(cModel) do
Wait(0)
end
ped = CreatePed(2, cModel, charPos.Coords.x, charPos.Coords.y, charPos.Coords.z - 1, charPos.Coords.w, false, true)
SetPedComponentVariation(ped, 8, 15, 0, 0)
SetPedComponentVariation(ped, 0, 0, 0, 2)
FreezeEntityPosition(ped, false)
SetEntityInvincible(ped, true)
PlaceObjectOnGroundProperly(ped)
SetBlockingOfNonTemporaryEvents(ped, true)
data = json.decode(data)
Config.ClothingExport(data, ped)
PlayAnim(charPos.Animation, ped)
table.insert(Peds, {ped = ped, license = license})
end)
else
CreateThread(function()
local randommodels = {
"mp_m_freemode_01",
}
model = joaat(randommodels[math.random(1, #randommodels)])
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
ped = CreatePed(2, model, charPos.Coords.x, charPos.Coords.y, charPos.Coords.z - 1, charPos.Coords.w, false, true)
SetPedComponentVariation(ped, 8, 15, 0, 0)
SetPedComponentVariation(ped, 0, 0, 0, 2)
FreezeEntityPosition(ped, false)
SetEntityInvincible(ped, true)
PlaceObjectOnGroundProperly(ped)
SetBlockingOfNonTemporaryEvents(ped, true)
PlayAnim(charPos.Animation, ped)
table.insert(Peds, {ped = ped, license = license})
end)
end
cb("ok")
end, license)
end
end
local pped = PlayerPedId()
while pped == nil or pped == -1 or pped == 0 do
Wait(1)
pped = PlayerPedId()
end
SetEntityHeading(pped, selectedCamera[1].w)
SetGameplayCamRelativeHeading(0.0)
SetEntityCoords(pped, selectedCamera[1].x, selectedCamera[1].y, selectedCamera[1].z , false, false, false, false)
Wait(20)
local offsetCoords = GetOffsetFromEntityInWorldCoords(pped, 0.0, 2.0, -2.0)
Wait(20)
SetEntityCoords(pped, offsetCoords.x, offsetCoords.y, offsetCoords.z, false, false, false, false)
SetEntityInvincible(pped, true)
FreezeEntityPosition(pped, true)
SetEntityVisible(pped, false, false)
Wait(500)
Cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
PointCamAtCoord(Cam, selectedCamera[3].x, selectedCamera[3].y, selectedCamera[3].z)
SetCamActive(Cam, true)
SetCamFov(Cam, 45.0)
SetCamCoord(Cam, selectedCamera[2].x, selectedCamera[2].y, selectedCamera[2].z)
RenderScriptCams(true, true, 50000, true, false)
cb("ok")
DoScreenFadeIn(1000)
Wait(1000)
while true do
Wait(1)
if Spawned or Deleted then
Deleted = false
return
end
if not Creating and not Spawned then
timeOut = timeOut - 1
if timeOut <= 0 then
camId = camId + 1
selectedCamera = SelectedScene.Camera[camId]
DoScreenFadeOut(1000)
Wait(1000)
if selectedCamera == nil then
camId = 1
selectedCamera = SelectedScene.Camera[camId]
end
DestroyCam(Cam, true)
RenderScriptCams(false, false, 0, false, false)
SetEntityHeading(pped, selectedCamera[1].w)
SetGameplayCamRelativeHeading(0.0)
SetEntityCoords(pped, selectedCamera[1].x, selectedCamera[1].y, selectedCamera[1].z, false, false, false, false)
Wait(20)
local offsetCoords = GetOffsetFromEntityInWorldCoords(pped, 0.0, 2.0, -2.0)
Wait(20)
SetEntityCoords(pped, offsetCoords.x, offsetCoords.y, offsetCoords.z, false, false, false, false)
Wait(10)
Cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
PointCamAtCoord(Cam, selectedCamera[3].x, selectedCamera[3].y, selectedCamera[3].z)
SetCamActive(Cam, true)
SetCamFov(Cam, 45.0)
SetCamCoord(Cam, selectedCamera[2].x, selectedCamera[2].y, selectedCamera[2].z)
RenderScriptCams(true, true, 50000, true, true)
Wait(1000)
DoScreenFadeIn(1000)
timeOut = 4000
Selected = false
end
end
end
end)
RegisterNuiCallback("playerSelected", function (license)
local pedCoords = nil
local selectedCoord = nil
for k, v in pairs(Peds) do
if v.license == license then
Selected = true
timeOut = 4000
selectedCoord = GetOffsetFromEntityInWorldCoords(v.ped, 0.0, 3.0, 0.5)
pedCoords = GetEntityCoords(v.ped)
end
end
while not selectedCoord or not pedCoords do
Wait(1)
end
DoScreenFadeOut(500)
Wait(500)
DestroyCam(Cam, true)
Cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
PointCamAtCoord(Cam, pedCoords.x, pedCoords.y, pedCoords.z)
SetCamActive(Cam, true)
SetCamFov(Cam, 45.0)
SetCamCoord(Cam, selectedCoord.x, selectedCoord.y, selectedCoord.z)
RenderScriptCams(true, false, 1, true, true)
DoScreenFadeIn(500)
end)
RegisterNUICallback('selectCharacter', function(license)
Spawned = true
DoScreenFadeOut(500)
Wait(500)
DestroyCam(Cam, true)
SetNuiFocus(false, false)
Cam = nil
local cData = nil
for _, a in pairs(Players) do
if Config.Framework == "qb" then
if a.citizenid == license then
cData = a
end
else
if a.identifier == license then
cData = a
end
end
end
if Config.Framework == "qb" then
TriggerServerEvent('hp_multichar:qb:loadUserData', cData)
else
TriggerServerEvent('hp_multichar:esx:loadUserData', cData)
end
for k, v in pairs(Peds) do
DeletePed(v.ped)
end
DisplayRadar(true)
end)
RegisterNuiCallback("playHoverAnimation", function (license)
if not Selected then
for k, v in pairs(Peds) do
if v.license == license then
Hovered = true
SelectedPlayerCoords = GetEntityCoords(v.ped)
end
end
end
end)
RegisterNuiCallback("hoverOut", function ()
Hovered = false
SelectedPlayerCoords = nil
end)
RegisterNuiCallback("deleteChar", function (license, cb)
Deleted = true
timeOut = 4000
TriggerServerCallback('hp_multichar:server:deleteCharacter', function (response)
-- print(response.purchasedSlots)
MySlots = response.purchasedSlots or 0
cb({
charData = response.charData or {},
slots = Config.Slots,
payedSlots = Config.PayedSlots,
purchasedSlots = MySlots
})
end, license)
end)
RegisterNuiCallback("playCreateAnimation", function (data)
timeOut = 4000
Selected = false
Creating = true
Wait(100)
DoScreenFadeOut(500)
Wait(500)
DestroyCam(Cam, true)
Cam = nil
local hash = GetHashKey("mp_m_freemode_01")
RequestModel(hash)
while not HasModelLoaded(hash) do
Wait(0)
end
CreatedPed = CreatePed(2, hash, SelectedScene.CreationCoord.x, SelectedScene.CreationCoord.y, SelectedScene.CreationCoord.z - 1, SelectedScene.CreationCoord.w, false, true)
FreezeEntityPosition(CreatedPed, true)
SetPedComponentVariation(CreatedPed, 8, 15, 0, 0)
SetEntityInvincible(CreatedPed, true)
local pedOffset = GetOffsetFromEntityInWorldCoords(CreatedPed, -0.2, 1.5, 0.5)
Cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
PointCamAtCoord(Cam, SelectedScene.CreationCoord.x + -0.2, SelectedScene.CreationCoord.y, SelectedScene.CreationCoord.z + 0.5)
SetCamActive(Cam, true)
SetCamFov(Cam, 45.0)
SetCamCoord(Cam, pedOffset.x, pedOffset.y, pedOffset.z)
RenderScriptCams(true, false, 1, true, true)
Wait(500)
DoScreenFadeIn(500)
end)
RegisterNuiCallback("loaded", function (data)
uiLoaded = true
end)
RegisterNuiCallback("stopCreateAnim", function ()
timeOut = 0
Creating = false
Wait(1000)
DeletePed(CreatedPed)
end)
RegisterNuiCallback("notify", function (msg)
Config.Notify(msg)
end)
RegisterNuiCallback("genderUpdate", function (gender)
DeleteEntity(CreatedPed)
local hash = gender == "m" and "mp_m_freemode_01" or "mp_f_freemode_01"
RequestModel(hash)
while not HasModelLoaded(hash) do
Wait(0)
end
CreatedPed = CreatePed(2, GetHashKey(hash), SelectedScene.CreationCoord.x, SelectedScene.CreationCoord.y, SelectedScene.CreationCoord.z - 1, SelectedScene.CreationCoord.w, false, true)
SetPedComponentVariation(CreatedPed, 8, 15, 0, 0)
FreezeEntityPosition(CreatedPed, true)
SetEntityInvincible(CreatedPed, true)
end)
RegisterNuiCallback("createCharacter", function (data, cb)
if Config.Framework == "qb" then
TriggerServerEvent('hp_multichar:qb:createCharacter', data, oldBucket)
else
TriggerServerEvent('hp_multichar:esx:createCharacter', data, oldBucket)
end
DestroyCam(Cam, true)
Cam = nil
SetNuiFocus(false, false)
RenderScriptCams(false, false, 0, false, false)
Spawned = true
timeOut = 20000
Selected = false
SelectedPlayerCoords = nil
Hovered = false
Creating = false
CreatedPed = nil
for k, v in pairs(Peds) do
DeletePed(v.ped)
end
cb("ok")
DisplayRadar(true)
end)
RegisterNuiCallback("submitCode", function (code, cb)
TriggerServerCallback("hp_multichar:codeUsed", function (response)
if response then
cb({
charData = Players,
slots = Config.Slots,
payedSlots = Config.PayedSlots,
tebexLink = Config.TebexLink,
purchasedSlots = MySlots
})
else
cb(nil)
end
end, code)
end)
CreateThread(function ()
while true do
Wait(1)
if Hovered then
DrawMarker(2, SelectedPlayerCoords.x, SelectedPlayerCoords.y, SelectedPlayerCoords.z + 1.0, 0, 0, 0, 0, 180.0, 0, 0.3, 0.5, 0.5, 255, 255, 255, 255, false, false, false, true)
end
end
end)
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() then
DeletePed(CreatedPed)
for k, v in pairs(Peds) do
DeletePed(v.ped)
end
end
end)