Skip to content

Commit

Permalink
Version 1.0.4
Browse files Browse the repository at this point in the history
  • Loading branch information
Pappu100code committed Jun 26, 2024
1 parent 239e26b commit f933d63
Show file tree
Hide file tree
Showing 4 changed files with 297 additions and 103 deletions.
226 changes: 162 additions & 64 deletions client/main.lua
Original file line number Diff line number Diff line change
@@ -1,21 +1,70 @@
local cam = nil
local charPed = nil
local loadScreenCheckState = false
local QBCore = exports['qb-core']:GetCoreObject()
local cached_player_skins = {}

local randommodels = { -- models possible to load when choosing empty slot
'mp_m_freemode_01',
'mp_f_freemode_01',
}

-- Joaat function definition
local function joaat(key)
local str = string.upper(key)
local hash, i = 0, 1
while i <= #str do
hash = hash + string.byte(str, i)
hash = hash + (hash << 10)
hash = hash ~ (hash >> 6)
i = i + 1
end
hash = hash + (hash << 3)
hash = hash ~ (hash >> 11)
hash = hash + (hash << 15)
return hash
end

-- Main Thread

CreateThread(function()
while true do
Wait(0)
if NetworkIsSessionStarted() then
TriggerEvent('pappu-multicharacter:client:chooseChar')
return
end
end
while true do
Wait(0)
if NetworkIsSessionStarted() then
TriggerEvent('pappu-multicharacter:client:chooseChar')
return
end
end
end)

-- Functions

local function loadModel(model)
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
end


local function initializePedModel(model, data)
CreateThread(function()
if not model then
model = joaat(randommodels[math.random(#randommodels)])
end
loadModel(model)
charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true)
SetPedComponentVariation(charPed, 0, 0, 0, 2)
FreezeEntityPosition(charPed, false)
SetEntityInvincible(charPed, true)
PlaceObjectOnGroundProperly(charPed)
SetBlockingOfNonTemporaryEvents(charPed, true)
if data then
TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed)
end
end)
end

local function skyCam(bool)
TriggerEvent('qb-weathersync:client:DisableSync')
if bool then
Expand All @@ -34,6 +83,7 @@ local function skyCam(bool)
FreezeEntityPosition(PlayerPedId(), false)
end
end

local function openCharMenu(bool)
QBCore.Functions.TriggerCallback("pappu-multicharacter:server:GetNumberOfCharacters", function(result)
local translations = {}
Expand Down Expand Up @@ -102,10 +152,62 @@ RegisterNetEvent('pappu-multicharacter:client:chooseChar', function()
openCharMenu(true)
end)

AddEventHandler('onResourceStart', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then
return
end

print('working #pappu-multicharacter')
end)


RegisterNetEvent('pappu-multicharacter:client:spawnLastLocation', function(coords, cData)
QBCore.Functions.TriggerCallback('apartments:GetOwnedApartment', function(result)
if result then
TriggerEvent("apartments:client:SetHomeBlip", result.type)
local ped = PlayerPedId()
SetEntityCoords(ped, coords.x, coords.y, coords.z)
SetEntityHeading(ped, coords.w)
FreezeEntityPosition(ped, false)
SetEntityVisible(ped, true)
local PlayerData = QBCore.Functions.GetPlayerData()
local insideMeta = PlayerData.metadata["inside"]
DoScreenFadeOut(500)

if insideMeta.house then
TriggerEvent('qb-houses:client:LastLocationHouse', insideMeta.house)
elseif insideMeta.apartment.apartmentType and insideMeta.apartment.apartmentId then
TriggerEvent('qb-apartments:client:LastLocationHouse', insideMeta.apartment.apartmentType, insideMeta.apartment.apartmentId)
else
SetEntityCoords(ped, coords.x, coords.y, coords.z)
SetEntityHeading(ped, coords.w)
FreezeEntityPosition(ped, false)
SetEntityVisible(ped, true)
end

TriggerServerEvent('QBCore:Server:OnPlayerLoaded')
TriggerEvent('QBCore:Client:OnPlayerLoaded')
Wait(2000)
DoScreenFadeIn(250)
end
end, cData.citizenid)
end)

-- NUI Callbacks

RegisterNUICallback('closeUI', function(_, cb)
local cData = data.cData
DoScreenFadeOut(10)
TriggerServerEvent('pappu-multicharacter:server:loadUserData', cData)
openCharMenu(false)
SetEntityAsMissionEntity(charPed, true, true)
DeleteEntity(charPed)
if Config.SkipSelection then
SetNuiFocus(false, false)
skyCam(false)
else
openCharMenu(false)
end
cb("ok")
end)

Expand All @@ -116,86 +218,81 @@ RegisterNUICallback('disconnectButton', function(_, cb)
cb("ok")
end)

RegisterNUICallback('selectCharacter', function(data, cb)
-- NUI Callbacks

RegisterNUICallback('closeUI', function(_, cb)
local cData = data.cData
DoScreenFadeOut(10)
TriggerServerEvent('pappu-multicharacter:server:loadUserData', cData)
openCharMenu(false)
SetEntityAsMissionEntity(charPed, true, true)
DeleteEntity(charPed)
if Config.SkipSelection then
SetNuiFocus(false, false)
skyCam(false)
else
openCharMenu(false)
end
cb("ok")
end)

AddEventHandler('onResourceStart', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then
return
end

print('working #pappu-multicharacter')
RegisterNUICallback('disconnectButton', function(_, cb)
SetEntityAsMissionEntity(charPed, true, true)
DeleteEntity(charPed)
TriggerServerEvent('pappu-multicharacter:server:disconnect')
cb("ok")
end)


RegisterNUICallback('selectCharacter', function(data, cb)
local cData = data.cData
DoScreenFadeOut(10)
TriggerServerEvent('pappu-multicharacter:server:loadUserData', cData)
openCharMenu(false)
SetEntityAsMissionEntity(charPed, true, true)
DeleteEntity(charPed)
cb("ok")
end)

RegisterNUICallback('cDataPed', function(nData, cb)
local cData = nData.cData
SetEntityAsMissionEntity(charPed, true, true)
DeleteEntity(charPed)
if cData ~= nil then
QBCore.Functions.TriggerCallback('pappu-multicharacter:server:getSkin', function(model, data)
model = model ~= nil and tonumber(model) or false
if model ~= nil then
CreateThread(function()
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true)
local RandomAnimins = {
"WORLD_HUMAN_HANG_OUT_STREET",
"WORLD_HUMAN_STAND_IMPATIENT",
"WORLD_HUMAN_STAND_MOBILE",
"WORLD_HUMAN_SMOKING_POT",
"WORLD_HUMAN_LEANING",
"WORLD_HUMAN_DRUG_DEALER_HARD"
}
local PlayAnimin = RandomAnimins[math.random(#RandomAnimins)]
SetPedCanPlayAmbientAnims(charPed, true)
TaskStartScenarioInPlace(charPed, PlayAnimin, 0, true)
SetPedComponentVariation(charPed, 0, 0, 0, 2)
FreezeEntityPosition(charPed, false)
SetEntityInvincible(charPed, true)
PlaceObjectOnGroundProperly(charPed)
SetBlockingOfNonTemporaryEvents(charPed, true)
data = json.decode(data)
TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed)
end)
else
CreateThread(function()
charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true)
SetPedComponentVariation(charPed, 0, 0, 0, 2)
FreezeEntityPosition(charPed, false)
SetEntityInvincible(charPed, true)
PlaceObjectOnGroundProperly(charPed)
SetBlockingOfNonTemporaryEvents(charPed, true)
end)
end
cb("ok")
end, cData.citizenid)
if not cached_player_skins[cData.citizenid] then
local temp_model = promise.new()
local temp_data = promise.new()

QBCore.Functions.TriggerCallback('pappu-multicharacter:server:getSkin', function(model, data)
temp_model:resolve(model)
temp_data:resolve(data)
end, cData.citizenid)

local resolved_model = Citizen.Await(temp_model)
local resolved_data = Citizen.Await(temp_data)

cached_player_skins[cData.citizenid] = {model = resolved_model, data = resolved_data}
end

local model = cached_player_skins[cData.citizenid].model
local data = cached_player_skins[cData.citizenid].data

model = model ~= nil and tonumber(model) or false

if model ~= nil then
initializePedModel(model, json.decode(data))
else
initializePedModel()
end
cb("ok")
else
CreateThread(function()
charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true)
SetPedComponentVariation(charPed, 0, 0, 0, 2)
FreezeEntityPosition(charPed, false)
SetEntityInvincible(charPed, true)
PlaceObjectOnGroundProperly(charPed)
SetBlockingOfNonTemporaryEvents(charPed, true)
end)
initializePedModel()
cb("ok")
end
end)

RegisterNUICallback('setupCharacters', function(_, cb)
QBCore.Functions.TriggerCallback("pappu-multicharacter:server:setupCharacters", function(result)
cached_player_skins = {}
SendNUIMessage({
action = "setupCharacters",
characters = result
Expand Down Expand Up @@ -226,4 +323,5 @@ RegisterNUICallback('removeCharacter', function(data, cb)
TriggerServerEvent('pappu-multicharacter:server:deleteCharacter', data.citizenid)
TriggerEvent('pappu-multicharacter:client:chooseChar')
cb("ok")
end)
end)

2 changes: 1 addition & 1 deletion config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Config.DefaultSpawn = vector3(-1004.36, -477.9, 51.63) -- Default spawn coords i
Config.PedCoords = vector4(-1008.49, -474.51, 50.03, 208.64) -- Create preview ped at these coordinates
Config.HiddenCoords = vector4(-1001.11, -478.06, 50.03, 24.55) -- Hides your actual ped while you are in selection
Config.CamCoords = vector4(-1005.53, -480.73, 50.52, 27.44) -- Camera coordinates for character preview screen
Config.EnableDeleteButton = true -- Define if the player can delete the character or not
Config.EnableDeleteButton = false -- Define if the player can delete the character or not

Config.DefaultNumberOfCharacters = 2 -- Max 4 // Dont Go More Than 4
Config.PlayersNumberOfCharacters = { -- Define maximum amount of player characters by rockstar license (you can find this license in your server's database in the player table)
Expand Down
18 changes: 12 additions & 6 deletions fxmanifest.lua
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
fx_version 'cerulean'
game 'gta5'

lua54 'yes'
author 'pappu'
description 'pappu-multicharacter'
version '1.0.3'
description 'pappu-multicharacter Allows players to create characters'
version '1.0.4'

shared_scripts {
'@qb-core/shared/locale.lua',
'locales/en.lua',
'locales/*.lua',
'config.lua'
}
client_script 'client/main.lua'

client_scripts {
'client/main.lua'
}


server_scripts {
'@oxmysql/lib/MySQL.lua',
'@qb-apartments/config.lua',
Expand All @@ -29,5 +34,6 @@ files {
}

dependencies {
'qb-core'
}
'qb-core',
'qb-spawn'
}
Loading

0 comments on commit f933d63

Please sign in to comment.