503 lines
15 KiB
Lua
503 lines
15 KiB
Lua
|
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)
|