├── README.md ├── client ├── main.lua └── main233.lua ├── fxmanifest.lua ├── html ├── html.rar ├── index.html ├── reset.css ├── script.js ├── style.css └── zion.png └── server └── main.lua /README.md: -------------------------------------------------------------------------------- 1 | # qb-multicharacter 2 | Made by scratch, some bugs, but all fine at all. 3 | 4 | ## Dependencies 5 | - [qb-core](https://github.com/qbcore-framework/qb-core) 6 | - [qb-spawn](https://github.com/qbcore-framework/qb-spawn) - Spawn selector 7 | - [qb-apartments](https://github.com/qbcore-framework/qb-apartments) - For giving the player a apartment after creating a character. 8 | - [qb-clothing](https://github.com/qbcore-framework/qb-clothing) - For the character creation and saving outfits. 9 | - [qb-weathersync](https://github.com/qbcore-framework/qb-weathersync) - For adjusting the weather while player is creating a character. 10 | 11 | ## Screenshots 12 | ![Character Selection](https://media.discordapp.net/attachments/860694509318832148/866581379278176276/unknown.png) 13 | ![Character Registration](https://cdn.discordapp.com/attachments/860694509318832148/866581453412630528/unknown.png) 14 | 15 | ## Know's Bug 16 | - When you loggout you still seeing your character information. 17 | - When loggout and you go back you cannot see your character information 18 | 19 | ## Installation 20 | ### Manual 21 | - Download the script and put it in the `[qb]` directory. 22 | - Add the following code to your server.cfg/resouces.cfg 23 | ``` 24 | ensure qb-core 25 | ensure qb-multicharacter 26 | ensure qb-spawn 27 | ensure qb-apartments 28 | ensure qb-clothing 29 | ensure qb-weathersync 30 | ``` 31 | 32 | ## All right's reserved to author of the framework. 33 | -------------------------------------------------------------------------------- /client/main.lua: -------------------------------------------------------------------------------- 1 | 2 | 3 | local charPed = nil 4 | 5 | Citizen.CreateThread(function() 6 | while QBCore == nil do 7 | 8 | Citizen.Wait(0) 9 | end 10 | end) 11 | 12 | Citizen.CreateThread(function() 13 | while true do 14 | Citizen.Wait(0) 15 | if NetworkIsSessionStarted() then 16 | TriggerEvent('qb-multicharacter:client:chooseChar') 17 | return 18 | end 19 | end 20 | end) 21 | 22 | Config = { 23 | PedCoords = vector4(-812.99, 173.29, 76.74, -7.5), 24 | HiddenCoords = vector4(-812.23, 182.54, 76.74, 156.5), 25 | CamCoords = vector4(-814.02, 179.56, 76.74, 198.5), 26 | } 27 | 28 | --- CODE 29 | 30 | local choosingCharacter = false 31 | local cam = nil 32 | 33 | function openCharMenu(bool) 34 | SetNuiFocus(bool, bool) 35 | SendNUIMessage({ 36 | action = "ui", 37 | toggle = bool, 38 | }) 39 | choosingCharacter = bool 40 | skyCam(bool) 41 | end 42 | 43 | RegisterNUICallback('closeUI', function() 44 | openCharMenu(false) 45 | end) 46 | 47 | RegisterNUICallback('disconnectButton', function() 48 | SetEntityAsMissionEntity(charPed, true, true) 49 | DeleteEntity(charPed) 50 | TriggerServerEvent('qb-multicharacter:server:disconnect') 51 | end) 52 | 53 | RegisterNUICallback('selectCharacter', function(data) 54 | local cData = data.cData 55 | DoScreenFadeOut(10) 56 | TriggerServerEvent('qb-multicharacter:server:loadUserData', cData) 57 | openCharMenu(false) 58 | SetEntityAsMissionEntity(charPed, true, true) 59 | DeleteEntity(charPed) 60 | end) 61 | 62 | RegisterNUICallback('asdasdasdsa', function(data) 63 | local cData = data.cData 64 | DeleteEntity(charPed) 65 | end) 66 | 67 | RegisterNetEvent('qb-multicharacter:client:closeNUI') 68 | AddEventHandler('qb-multicharacter:client:closeNUI', function() 69 | SetNuiFocus(false, false) 70 | end) 71 | 72 | local Countdown = 1 73 | 74 | RegisterNetEvent('qb-multicharacter:client:chooseChar') 75 | AddEventHandler('qb-multicharacter:client:chooseChar', function() 76 | DeleteEntity(charPed) 77 | SetTimecycleModifier('hud_def_blur') 78 | SetTimecycleModifierStrength(0.0) 79 | if not IsPlayerSwitchInProgress() then 80 | SwitchOutPlayer(GetPlayerPed(-1), 1, 1) 81 | end 82 | while GetPlayerSwitchState() ~= 5 do 83 | Citizen.Wait(0) 84 | ClearScreen() 85 | disableshit(true) 86 | end 87 | ClearScreen() 88 | Citizen.Wait(0) 89 | SetEntityCoords(GetPlayerPed(-1), Config.HiddenCoords.x, Config.HiddenCoords.y, Config.HiddenCoords.z) 90 | local timer = GetGameTimer() 91 | ShutdownLoadingScreenNui() 92 | FreezeEntityPosition(GetPlayerPed(-1), true) 93 | SetEntityVisible(GetPlayerPed(-1), false, false) 94 | Citizen.CreateThread(function() 95 | RequestCollisionAtCoord(-812.23, 182.54, 76.74, 156.5) 96 | while not HasCollisionLoadedAroundEntity(GetPlayerPed(-1)) do 97 | print('Carregando colisão do interior.') 98 | Wait(0) 99 | end 100 | end) 101 | Citizen.Wait(3500) 102 | 103 | while true do 104 | ClearScreen() 105 | Citizen.Wait(0) 106 | if GetGameTimer() - timer > 5000 then 107 | SwitchInPlayer(GetPlayerPed(-1)) 108 | ClearScreen() 109 | CreateThread(function() 110 | Wait(4000) 111 | end) 112 | 113 | while GetPlayerSwitchState() ~= 12 do 114 | Citizen.Wait(0) 115 | ClearScreen() 116 | end 117 | 118 | break 119 | end 120 | end 121 | NetworkSetTalkerProximity(0.0) 122 | openCharMenu(true) 123 | end) 124 | 125 | function ClearScreen() 126 | SetCloudHatOpacity(cloudOpacity) 127 | HideHudAndRadarThisFrame() 128 | SetDrawOrigin(0.0, 0.0, 0.0, 0) 129 | end 130 | 131 | function disableshit(bool) 132 | if bool then 133 | print('a') 134 | TriggerEvent('close:ui:hud') 135 | openCharMenu(false) 136 | SetEntityAsMissionEntity(charPed, true, true) 137 | DeleteEntity(charPed) 138 | else 139 | TriggerEvent('open:ui:hud') 140 | openCharMenu(true) 141 | end 142 | end 143 | 144 | function selectChar() 145 | openCharMenu(true) 146 | end 147 | 148 | RegisterNUICallback('cDataPed', function(data) 149 | local cData = data.cData 150 | SetEntityAsMissionEntity(charPed, true, true) 151 | DeleteEntity(charPed) 152 | 153 | if cData ~= nil then 154 | QBCore.Functions.TriggerCallback('qb-multicharacter:server:getSkin', function(model, data) 155 | model = model ~= nil and tonumber(model) or false 156 | if model ~= nil then 157 | Citizen.CreateThread(function() 158 | RequestModel(model) 159 | while not HasModelLoaded(model) do 160 | Citizen.Wait(0) 161 | end 162 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 163 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 164 | FreezeEntityPosition(charPed, false) 165 | SetEntityInvincible(charPed, true) 166 | PlaceObjectOnGroundProperly(charPed) 167 | SetBlockingOfNonTemporaryEvents(charPed, true) 168 | data = json.decode(data) 169 | TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed) 170 | TaskGoStraightToCoord(charPed, -813.8,176.14,76.74, 1.0, -1, 1.0, 786603, 1.0) 171 | Wait(5000) 172 | TaskPlayAnim(charPed,"misscarsteal4@aliens","rehearsal_base_idle_director",1.0,-1.0, -1, 1, 1, true, true, true) 173 | FreezeEntityPosition(charPed, true) 174 | end) 175 | else 176 | Citizen.CreateThread(function() 177 | local randommodels = { 178 | "mp_m_freemode_01", 179 | "mp_f_freemode_01", 180 | } 181 | local model = GetHashKey(randommodels[math.random(1, #randommodels)]) 182 | RequestModel(model) 183 | while not HasModelLoaded(model) do 184 | Citizen.Wait(0) 185 | end 186 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 187 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 188 | FreezeEntityPosition(charPed, false) 189 | SetEntityInvincible(charPed, true) 190 | PlaceObjectOnGroundProperly(charPed) 191 | SetBlockingOfNonTemporaryEvents(charPed, true) 192 | end) 193 | end 194 | end, cData.citizenid) 195 | else 196 | Citizen.CreateThread(function() 197 | local randommodels = { 198 | "mp_m_freemode_01", 199 | "mp_f_freemode_01", 200 | } 201 | local model = GetHashKey(randommodels[math.random(1, #randommodels)]) 202 | RequestModel(model) 203 | while not HasModelLoaded(model) do 204 | Citizen.Wait(0) 205 | end 206 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 207 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 208 | FreezeEntityPosition(charPed, false) 209 | SetEntityInvincible(charPed, true) 210 | PlaceObjectOnGroundProperly(charPed) 211 | SetBlockingOfNonTemporaryEvents(charPed, true) 212 | end) 213 | end 214 | end) 215 | 216 | RegisterNUICallback('setupCharacters', function() 217 | QBCore.Functions.TriggerCallback("test:yeet", function(result) 218 | SendNUIMessage({ 219 | action = "setupCharacters", 220 | characters = result 221 | }) 222 | end) 223 | end) 224 | 225 | RegisterNUICallback('removeBlur', function() 226 | SetTimecycleModifier('default') 227 | end) 228 | 229 | RegisterNUICallback('createNewCharacter', function(data) 230 | local cData = data 231 | DoScreenFadeOut(150) 232 | if cData.gender == "Homem" then 233 | cData.gender = 0 234 | elseif cData.gender == "Mulher" then 235 | cData.gender = 1 236 | elseif cData.gender == "Não-binário" then 237 | cData.gender = 1 238 | end 239 | 240 | TriggerServerEvent('qb-multicharacter:server:createCharacter', cData) 241 | TriggerServerEvent('qb-multicharacter:server:GiveStarterItems') 242 | Citizen.Wait(500) 243 | end) 244 | 245 | RegisterNUICallback('removeCharacter', function(data) 246 | TriggerServerEvent('qb-multicharacter:server:deleteCharacter', data.citizenid) 247 | TriggerEvent('qb-multicharacter:client:chooseChar') 248 | end) 249 | 250 | function skyCam(bool) 251 | SetRainLevel(0.0) 252 | TriggerEvent('qb-weathersync:client:DisableSync') 253 | SetWeatherTypePersist('EXTRASUNNY') 254 | SetWeatherTypeNow('EXTRASUNNY') 255 | SetWeatherTypeNowPersist('EXTRASUNNY') 256 | NetworkOverrideClockTime(12, 0, 0) 257 | 258 | if bool then 259 | DoScreenFadeIn(1000) 260 | SetTimecycleModifier('hud_def_blur') 261 | SetTimecycleModifierStrength(1.0) 262 | FreezeEntityPosition(GetPlayerPed(-1), false) 263 | cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", -813.46, 178.95, 76.85, 0.0 ,0.0, 174.5, 60.00, false, 0) 264 | SetCamActive(cam, true) 265 | RenderScriptCams(true, false, 1, true, true) 266 | else 267 | SetTimecycleModifier('default') 268 | SetCamActive(cam, false) 269 | DestroyCam(cam, true) 270 | RenderScriptCams(false, false, 1, true, true) 271 | FreezeEntityPosition(GetPlayerPed(-1), false) 272 | end 273 | end 274 | 275 | RegisterNetEvent('QBCore:Client:OnPlayerLoaded') 276 | AddEventHandler('QBCore:Client:OnPlayerLoaded', function() 277 | ShutdownLoadingScreenNui() 278 | choosingCharacter = true 279 | SetCanAttackFriendly(GetPlayerPed(-1), true, false) 280 | NetworkSetFriendlyFireOption(true) 281 | end) 282 | 283 | RegisterNetEvent('QBCore:Client:OnPlayerUnload') 284 | AddEventHandler('QBCore:Client:OnPlayerUnload', function() 285 | choosingCharacter = false 286 | TriggerEvent('qb-multicharacter:client:chooseChar') 287 | end) 288 | 289 | 290 | -- Logout Function -- 291 | RegisterNetEvent('multichar:logout') 292 | AddEventHandler('multichar:logout', function(data) 293 | SetTimecycleModifier('hud_def_blur') 294 | SetTimecycleModifierStrength(0.0) 295 | if not IsPlayerSwitchInProgress() then 296 | SwitchOutPlayer(PlayerPedId(), 1, 1) 297 | end 298 | while GetPlayerSwitchState() ~= 5 do 299 | Citizen.Wait(0) 300 | ClearScreen() 301 | disableshit(true) 302 | end 303 | ClearScreen() 304 | Citizen.Wait(0) 305 | SetEntityCoords(GetPlayerPed(-1), Config.HiddenCoords.x, Config.HiddenCoords.y, Config.HiddenCoords.z) 306 | local timer = GetGameTimer() 307 | ShutdownLoadingScreenNui() 308 | FreezeEntityPosition(GetPlayerPed(-1), true) 309 | SetEntityVisible(GetPlayerPed(-1), false, false) 310 | Citizen.CreateThread(function() 311 | RequestCollisionAtCoord(-1453.29, -551.6, 72.84) 312 | while not HasCollisionLoadedAroundEntity(GetPlayerPed(-1)) do 313 | print('[Liq-multicharacter] Loading spawn collision.') 314 | Wait(0) 315 | end 316 | end) 317 | Citizen.Wait(3500) 318 | 319 | while true do 320 | ClearScreen() 321 | Citizen.Wait(0) 322 | if GetGameTimer() - timer > 5000 then 323 | SwitchInPlayer(PlayerPedId()) 324 | ClearScreen() 325 | CreateThread(function() 326 | Wait(4000) 327 | end) 328 | 329 | while GetPlayerSwitchState() ~= 12 do 330 | Citizen.Wait(0) 331 | ClearScreen() 332 | end 333 | 334 | break 335 | end 336 | end 337 | NetworkSetTalkerProximity(0.0) 338 | SetNuiFocus(true, true) 339 | SendNUIMessage({ 340 | action = "logout", 341 | toggle = true, 342 | }) 343 | choosingCharacter = true 344 | skyCam(true) 345 | end) 346 | -------------------------------------------------------------------------------- /client/main233.lua: -------------------------------------------------------------------------------- 1 | QBCore = nil 2 | 3 | local charPed = nil 4 | 5 | Citizen.CreateThread(function() 6 | while QBCore == nil do 7 | TriggerEvent('QBCore:GetObject', function(obj) QBCore = obj end) 8 | Citizen.Wait(200) 9 | end 10 | end) 11 | 12 | Citizen.CreateThread(function() 13 | while true do 14 | Citizen.Wait(0) 15 | if NetworkIsSessionStarted() then 16 | TriggerEvent('qb-multicharacter:client:chooseChar') 17 | return 18 | end 19 | end 20 | end) 21 | 22 | Config = { 23 | PedCoords = vector4(-813.97, 176.22, 76.74, -7.5), 24 | HiddenCoords = vector4(-812.23, 182.54, 76.74, 156.5), 25 | CamCoords = vector4(-814.02, 179.56, 76.74, 198.5), 26 | } 27 | 28 | --- CODE 29 | 30 | local choosingCharacter = false 31 | local cam = nil 32 | 33 | function openCharMenu(bool) 34 | SetNuiFocus(bool, bool) 35 | SendNUIMessage({ 36 | action = "ui", 37 | toggle = bool, 38 | }) 39 | choosingCharacter = bool 40 | skyCam(bool) 41 | end 42 | 43 | RegisterNUICallback('closeUI', function() 44 | openCharMenu(false) 45 | end) 46 | 47 | RegisterNUICallback('disconnectButton', function() 48 | SetEntityAsMissionEntity(charPed, true, true) 49 | DeleteEntity(charPed) 50 | TriggerServerEvent('qb-multicharacter:server:disconnect') 51 | end) 52 | 53 | RegisterNUICallback('selectCharacter', function(data) 54 | local cData = data.cData 55 | DoScreenFadeOut(10) 56 | TriggerServerEvent('qb-multicharacter:server:loadUserData', cData) 57 | openCharMenu(false) 58 | SetEntityAsMissionEntity(charPed, true, true) 59 | DeleteEntity(charPed) 60 | end) 61 | 62 | RegisterNetEvent('qb-multicharacter:client:closeNUI') 63 | AddEventHandler('qb-multicharacter:client:closeNUI', function() 64 | SetNuiFocus(false, false) 65 | end) 66 | 67 | local Countdown = 1 68 | 69 | RegisterNetEvent('qb-multicharacter:client:chooseChar') 70 | AddEventHandler('qb-multicharacter:client:chooseChar', function() 71 | SetNuiFocus(false, false) 72 | DoScreenFadeOut(10) 73 | Citizen.Wait(1000) 74 | local interior = GetInteriorAtCoords(-814.89, 181.95, 76.85 - 18.9) 75 | LoadInterior(interior) 76 | while not IsInteriorReady(interior) do 77 | Citizen.Wait(1000) 78 | end 79 | FreezeEntityPosition(PlayerPedId(), true) 80 | SetEntityCoords(PlayerPedId(), Config.HiddenCoords.x, Config.HiddenCoords.y, Config.HiddenCoords.z) 81 | Citizen.Wait(1500) 82 | ShutdownLoadingScreenNui() 83 | openCharMenu(true) 84 | end) 85 | 86 | function selectChar() 87 | openCharMenu(true) 88 | end 89 | 90 | RegisterNUICallback('cDataPed', function(data) 91 | local cData = data.cData 92 | SetEntityAsMissionEntity(charPed, true, true) 93 | DeleteEntity(charPed) 94 | 95 | if cData ~= nil then 96 | QBCore.Functions.TriggerCallback('qb-multicharacter:server:getSkin', function(model, data) 97 | model = model ~= nil and tonumber(model) or false 98 | if model ~= nil then 99 | Citizen.CreateThread(function() 100 | RequestModel(model) 101 | while not HasModelLoaded(model) do 102 | Citizen.Wait(0) 103 | end 104 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 105 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 106 | FreezeEntityPosition(charPed, false) 107 | SetEntityInvincible(charPed, true) 108 | PlaceObjectOnGroundProperly(charPed) 109 | SetBlockingOfNonTemporaryEvents(charPed, true) 110 | data = json.decode(data) 111 | TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed) 112 | end) 113 | else 114 | Citizen.CreateThread(function() 115 | local randommodels = { 116 | "mp_m_freemode_01", 117 | "mp_f_freemode_01", 118 | } 119 | local model = GetHashKey(randommodels[math.random(1, #randommodels)]) 120 | RequestModel(model) 121 | while not HasModelLoaded(model) do 122 | Citizen.Wait(0) 123 | end 124 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 125 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 126 | FreezeEntityPosition(charPed, false) 127 | SetEntityInvincible(charPed, true) 128 | PlaceObjectOnGroundProperly(charPed) 129 | SetBlockingOfNonTemporaryEvents(charPed, true) 130 | end) 131 | end 132 | end, cData.citizenid) 133 | else 134 | Citizen.CreateThread(function() 135 | local randommodels = { 136 | "mp_m_freemode_01", 137 | "mp_f_freemode_01", 138 | } 139 | local model = GetHashKey(randommodels[math.random(1, #randommodels)]) 140 | RequestModel(model) 141 | while not HasModelLoaded(model) do 142 | Citizen.Wait(0) 143 | end 144 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 145 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 146 | FreezeEntityPosition(charPed, false) 147 | SetEntityInvincible(charPed, true) 148 | PlaceObjectOnGroundProperly(charPed) 149 | SetBlockingOfNonTemporaryEvents(charPed, true) 150 | end) 151 | end 152 | end) 153 | 154 | RegisterNUICallback('setupCharacters', function() 155 | QBCore.Functions.TriggerCallback("test:yeet", function(result) 156 | SendNUIMessage({ 157 | action = "setupCharacters", 158 | characters = result 159 | }) 160 | end) 161 | end) 162 | 163 | RegisterNUICallback('removeBlur', function() 164 | SetTimecycleModifier('default') 165 | end) 166 | 167 | RegisterNUICallback('createNewCharacter', function(data) 168 | local cData = data 169 | DoScreenFadeOut(150) 170 | if cData.gender == "Male" then 171 | cData.gender = 0 172 | elseif cData.gender == "Female" then 173 | cData.gender = 1 174 | end 175 | 176 | TriggerServerEvent('qb-multicharacter:server:createCharacter', cData) 177 | TriggerServerEvent('qb-multicharacter:server:GiveStarterItems') 178 | Citizen.Wait(500) 179 | end) 180 | 181 | RegisterNUICallback('removeCharacter', function(data) 182 | TriggerServerEvent('qb-multicharacter:server:deleteCharacter', data.citizenid) 183 | TriggerEvent('qb-multicharacter:client:chooseChar') 184 | end) 185 | 186 | function skyCam(bool) 187 | SetRainLevel(0.0) 188 | TriggerEvent('qb-weathersync:client:DisableSync') 189 | SetWeatherTypePersist('EXTRASUNNY') 190 | SetWeatherTypeNow('EXTRASUNNY') 191 | SetWeatherTypeNowPersist('EXTRASUNNY') 192 | NetworkOverrideClockTime(12, 0, 0) 193 | 194 | if bool then 195 | DoScreenFadeIn(1000) 196 | SetTimecycleModifier('hud_def_blur') 197 | SetTimecycleModifierStrength(1.0) 198 | FreezeEntityPosition(PlayerPedId(), false) 199 | cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", -813.46, 178.95, 76.85, 0.0 ,0.0, 174.5, 60.00, false, 0) 200 | SetCamActive(cam, true) 201 | RenderScriptCams(true, false, 1, true, true) 202 | else 203 | SetTimecycleModifier('default') 204 | SetCamActive(cam, false) 205 | DestroyCam(cam, true) 206 | RenderScriptCams(false, false, 1, true, true) 207 | FreezeEntityPosition(PlayerPedId(), false) 208 | end 209 | end 210 | -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | 4 | description 'qb-Multicharacter' 5 | version '1.0.0' 6 | 7 | ui_page "html/index.html" 8 | 9 | client_scripts { 10 | 'client/main.lua' 11 | } 12 | 13 | server_scripts { 14 | 'server/main.lua' 15 | } 16 | 17 | files { 18 | 'html/index.html', 19 | 'html/style.css', 20 | 'html/reset.css', 21 | 'html/script.js', 22 | 'html/zion.png' 23 | } 24 | 25 | shared_script '@qb-core/import.lua' 26 | 27 | 28 | dependencies { 29 | 'qb-core', 30 | 'qb-spawn' 31 | } -------------------------------------------------------------------------------- /html/html.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErgothStudio/qb-multicharacter/e67deed415aa30a357204c45adfd8bd50caf14cd/html/html.rar -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Qbus Multicharacter 15 | 16 | 17 |
18 |
19 |
20 |
21 |

Carregando informação...

22 |
23 | 24 |
25 |
26 | 27 |
28 |
29 |
30 | play_circle_filled 31 |

Conectar

32 |
33 |
34 |
35 | 36 |
37 | Cidade Zion 38 |
39 | 40 | 54 |
55 | 56 |
57 |

Meus personagens

58 | 59 |
60 | account_box 61 | SLOT VAZIO 62 |
63 |
64 | account_box 65 | SLOT VAZIO 66 |
67 |
68 | account_box 69 | SLOT VAZIO 70 |
71 |
72 | account_box 73 | SLOT VAZIO 74 |
75 |
76 | account_box 77 | SLOT VAZIO 78 |
79 |
80 | keyboard_backspace 81 |
82 | 83 |
84 | 85 |
86 |
87 | 88 |
89 |
90 | play_arrow 91 | priority_high 92 | delete 93 |
94 |
95 | 96 |
97 |
infoInformação do personagem
98 |
99 | Você não tem personagem criado neste slot 100 |
101 |
102 | 103 |
104 |

Selecionar personagem

105 |

Selecionar um personagem<

106 |
107 | 108 |
109 |
110 |

ÁREA DE CADASTRO

111 | close 112 |
113 |
114 | 115 | 116 | 117 | 118 | 123 |
124 |

Confirmar

125 |
126 | 127 | 128 | 129 |
130 |
131 |

REMOVER PERSONAGEM

132 | close 133 |
134 |
135 |

Você tem certeza que quer deletar seu personagem?

136 |
137 |

Todos os dados do seu personagem serão apagados e não podem ser recuperados.

138 |
139 | 140 |

REMOVER

141 |

CANCELAR

142 |
143 |
144 |
145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /html/reset.css: -------------------------------------------------------------------------------- 1 | 2 | html, body, span, applet, object, iframe, 3 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 4 | a, abbr, acronym, address, big, cite, code, 5 | del, dfn, em, img, ins, kbd, q, s, samp, 6 | small, strike, strong, sub, sup, tt, var, 7 | b, u, i, center, 8 | dl, dt, dd, ol, ul, li, 9 | fieldset, form, label, legend, 10 | table, caption, tbody, tfoot, thead, tr, th, td, 11 | article, aside, canvas, details, embed, 12 | figure, figcaption, footer, header, hgroup, 13 | menu, nav, output, ruby, section, summary, 14 | time, mark, audio, video { 15 | margin: 0; 16 | padding: 0; 17 | border: 0; 18 | font-size: 100%; 19 | font: inherit; 20 | vertical-align: baseline; 21 | font-family: 'Roboto'; 22 | overflow: hidden !important; 23 | } 24 | /* HTML5 display-role reset for older browsers */ 25 | article, aside, details, figcaption, figure, 26 | footer, header, hgroup, menu, nav, section { 27 | display: block; 28 | } 29 | body { 30 | line-height: 1; 31 | } 32 | ol, ul { 33 | list-style: none; 34 | } 35 | blockquote, q { 36 | quotes: none; 37 | } 38 | blockquote:before, blockquote:after, 39 | q:before, q:after { 40 | content: ''; 41 | content: none; 42 | } 43 | table { 44 | border-collapse: collapse; 45 | border-spacing: 0; 46 | } -------------------------------------------------------------------------------- /html/script.js: -------------------------------------------------------------------------------- 1 | MultiCharacters = {} 2 | var selectedChar = null; 3 | var WelcomePercentage = "30vh" 4 | var Loaded = false; 5 | var clickDisable = false; 6 | 7 | $(document).ready(function (){ 8 | window.addEventListener('message', function (event) { 9 | var data = event.data; 10 | if (data.action == "ui") { 11 | if (data.toggle) { 12 | start() 13 | } else { 14 | $('.container').fadeOut(250); 15 | MultiCharacters.resetAll(); 16 | } 17 | } 18 | if (data.action == "setupCharacters") { 19 | setupCharacters(event.data.characters) 20 | } 21 | if (data.action == "logout") { 22 | refreshCharacters() 23 | start() 24 | } 25 | if (data.action == "setupCharInfo") { 26 | setupCharInfo(event.data.chardata) 27 | } 28 | if (data.action == "activeClick") { 29 | loadingCharacter(false); 30 | } 31 | if (data.action == "activeLoading") { 32 | loadingCharacter(true); 33 | } 34 | }); 35 | $('.datepicker').datepicker(); 36 | }); 37 | 38 | loadingCharacter = function(val) { 39 | if (val) { 40 | $(".welcomescreen").fadeIn(150); 41 | $("#loading-text").html("Carregando personagem..."); 42 | clickDisable = true; 43 | } else { 44 | $(".welcomescreen").fadeOut(150); 45 | $("#loading-text").html(""); 46 | clickDisable = false; 47 | if (selectedChar !== null) { 48 | $('.char-selector').css({"visibility":"visible"}) 49 | } else { 50 | $('.char-selector').css({"visibility":"hidden"}); 51 | resetCharSelector() 52 | } 53 | } 54 | } 55 | 56 | $('.char-selector').click(function(){ 57 | setTimeout(function(){ 58 | if ($('.char-buttons').css("visibility") == "visible") { 59 | $('.char-buttons').css({"visibility":"visible"}).animate({opacity:1.0},1000); 60 | } else { 61 | $('.char-buttons').css({"visibility":"visible"}).animate({opacity:1.0},1000); 62 | } 63 | }, 10000); 64 | }); 65 | 66 | bodyclick = function(){ 67 | if (clickDisable) { 68 | return false; 69 | } 70 | } 71 | 72 | 73 | resetCharSelector = function() { 74 | setTimeout(function(){ 75 | $('.char-selector').css({"visibility":"hidden"}) 76 | $('.char-buttons').css({"visibility":"visible"}).animate({opacity:1.0},1000); 77 | }, 3000); 78 | } 79 | 80 | loadingIcon = function(tiempo) { 81 | $(".welcomescreen").fadeIn(1000); 82 | 83 | var originalText = "Verificando seu passaporte..."; 84 | var loadingProgress = 0; 85 | var loadingDots = 0; 86 | $("#loading-text").html(originalText); 87 | var DotsInterval = setInterval(function() { 88 | $("#loading-text").append("."); 89 | loadingDots++; 90 | loadingProgress++; 91 | if (loadingProgress == 3) { 92 | originalText = "Fazendo um café..." 93 | $("#loading-text").html(originalText); 94 | } 95 | if (loadingProgress == 4) { 96 | originalText = "Verificando informações do(a) jogador(a)..." 97 | $("#loading-text").html(originalText); 98 | } 99 | if (loadingProgress == 6) { 100 | originalText = "Validando personagens do(a) jogador(a)." 101 | $("#loading-text").html(originalText); 102 | } 103 | if(loadingDots == 4) { 104 | $("#loading-text").html(originalText); 105 | loadingDots = 0; 106 | } 107 | }, 500); 108 | 109 | setTimeout(function(){ 110 | clearInterval(DotsInterval); 111 | loadingProgress = 0; 112 | originalText = "Verificando informações..."; 113 | }, tiempo);//2000); 114 | } 115 | 116 | $(document).ready(function(){ 117 | $('.collapsible').collapsible(); 118 | $('.tooltipped').tooltip() 119 | }); 120 | 121 | 122 | let test = true 123 | 124 | start = function() { 125 | $('.container').show(); 126 | $('.bars').fadeOut(0) 127 | $(".welcomescreen").fadeOut(0); 128 | MultiCharacters.resetAll(); 129 | setTimeout(function(){ 130 | SelectionMenu(); 131 | }, test && 1 || 1000); 132 | } 133 | 134 | SelectionMenu = function() { 135 | $('.main-select').fadeIn(100); 136 | setTimeout(() => { 137 | $('.mid-account').css({"display":"block"}).animate({right: 0+"vh",}, test && 1 || 2500); 138 | $('.mid-characters').css({"display":"block"}).animate({left: 0+"vh",}, test && 1 || 2500); 139 | $('.loguito').css({"position":"absolute"}).animate({left: 75+"vh", top: 35+"vh",}, test && 1 || 2500); 140 | }, 300); 141 | } 142 | 143 | $(".pinfodata p").click(function(){ 144 | 145 | }); 146 | 147 | let VipConfig = [ 148 | cola = { 149 | 150 | }, 151 | 152 | ] 153 | 154 | let vipstate = [ 155 | buyed = 'green' 156 | ] 157 | 158 | setPlayerValues = function(data) { 159 | 160 | setAllHide(true) 161 | $('#streamermode').prop('checked', true); 162 | $('.steamname').html("Martu"); 163 | $('.steam').html('No tengo xd'); 164 | $('.discord').html("test"); 165 | $('.icoins').html("0"); 166 | $('.vip').html("Desactivado"); 167 | let htmlinsert = '
  • filter_dramaCola prioritaria4

  • ' 168 | } 169 | 170 | $( "#streamermode" ).change(function() { 171 | let valstreamer = $(this).prop('checked') 172 | setAllHide(valstreamer) 173 | $.post('https://qb-multicharacter/streamermode', JSON.stringify({val: valstreamer})); 174 | }); 175 | 176 | setAllHide = function(val) { 177 | $('.playerinfoslot').each(function(i, obj) { 178 | let inf = $(obj).find( ".pinfodata p" ) 179 | let btn = $(obj).find( ".hidebtn" ) 180 | if (val) { 181 | $(inf).addClass('hideinfo') 182 | $(btn).html('visibility_off') 183 | } else { 184 | $(inf).removeClass('hideinfo') 185 | $(btn).html('visibility') 186 | } 187 | }); 188 | } 189 | 190 | $(".hidebtn").click(function(){ 191 | let val = $('.'+$(this).data("val")) 192 | if (val.hasClass('hideinfo')) { 193 | val.removeClass('hideinfo') 194 | $(this).html('visibility') 195 | } else { 196 | val.addClass('hideinfo') 197 | $(this).html('visibility_off') 198 | } 199 | }); 200 | 201 | $(".mid-account").hover( 202 | function(){ 203 | $('.mid-account .borderSelect').stop().animate({height:100+'vh',}, 500); 204 | }, 205 | function(){ 206 | $('.mid-account .borderSelect').stop().animate({height:0+'vh',}, 500); 207 | } 208 | ); 209 | 210 | $(".mid-characters").hover( 211 | function(){ 212 | $('.mid-characters .borderSelect').stop().animate({height:100+'vh',}, 500); 213 | }, 214 | function(){ 215 | $('.mid-characters .borderSelect').stop().animate({height:0+'vh',}, 500); 216 | } 217 | ); 218 | 219 | $(document).on('click', '.mid-account', function(e) { 220 | $.post('https://qb-multicharacter/Quit'); 221 | }); 222 | 223 | $('.backbtn').click(function(e){ 224 | $.post('https://qb-multicharacter/activeBlur'); 225 | $('.container').hide(400); 226 | $('.char-buttons').fadeOut(300); 227 | setTimeout(() => { 228 | start(); 229 | }, 500); 230 | $(selectedChar).removeClass("char-selected"); 231 | selectedChar = null; 232 | $("#play").css({"display":"none"}); 233 | $("#delete").css({"display":"none"}); 234 | //MultiCharacters.fadeInDown('.character-info', '-80%', 400); 235 | $.post('https://qb-multicharacter/cDataPed', JSON.stringify({ 236 | cData: "delete" 237 | })); 238 | clickDisable = true; 239 | $('.char-buttons').fadeOut(300); 240 | 241 | }); 242 | 243 | let accountOpen = false; 244 | 245 | $('#paccountselect').click(function(e){ 246 | if ($(this).hasClass('blocked')) { 247 | return 248 | } 249 | }); 250 | 251 | $('#pcharselect').click(function(e){ 252 | e.preventDefault(); 253 | $('.main-select').fadeOut(1000); 254 | setTimeout(() => { 255 | loadingIcon(2000); 256 | setTimeout(function(){ 257 | $.post('https://qb-multicharacter/setupCharacters'); 258 | setTimeout(function(){ 259 | MultiCharacters.resetAll(); 260 | $(".welcomescreen").fadeOut(150); 261 | $('.bars').fadeIn(1000) 262 | //MultiCharacters.fadeInDown('.character-info', '20%', 400); 263 | MultiCharacters.fadeInLeft('.characters-list', '7%', 400); 264 | $.post('https://qb-multicharacter/removeBlur'); 265 | }, 2000); 266 | }, 2000); 267 | }, 500); 268 | }); 269 | 270 | $('.disconnect-btn').click(function(e){ 271 | e.preventDefault(); 272 | 273 | $.post('https://qb-multicharacter/closeUI'); 274 | $.post('https://qb-multicharacter/disconnectButton'); 275 | }); 276 | 277 | function setupCharInfo(cData) { 278 | if (cData == 'empty') { 279 | $('a.char-info').attr('data-tooltip','
    You do not have a character created in this slot
    '); 280 | $('.char-info').tooltip(); 281 | $('.char-info').addClass('disabled') 282 | $('.char-delete').addClass('disabled') 283 | } else { 284 | var gender = "Homem" 285 | if (cData.charinfo.gender == 1) { gender = "Mulher" } 286 | $('.char-info').removeClass('disabled') 287 | $('.char-delete').removeClass('disabled') 288 | $('a.char-info').attr('data-tooltip','
    ' + 289 | '
    Nome: '+cData.charinfo.firstname+' '+cData.charinfo.lastname+'
    ' + 290 | '
    Aniversário: '+cData.charinfo.birthdate+'
    ' + 291 | '
    Genero: '+gender+'
    ' + 292 | '
    Nacionalidade: '+cData.charinfo.nationality+'
    ' + 293 | '
    Trabalho: '+cData.job.label+'
    ' + 294 | '
    Ilegal: '+cData.gang.label+'
    ' + 295 | '
    Dinheiro: $ '+cData.money.cash+'
    ' + 296 | '
    Banco: $ '+cData.money.bank+'

    ' + 297 | '
    Telefone: '+cData.charinfo.phone+'
    ' + 298 | '
    Conta corrente: '+cData.charinfo.account+'
    '); 299 | $('.char-info').tooltip(); 300 | } 301 | } 302 | 303 | function setupCharacters(characters) { 304 | $.each(characters, function(index, char){ 305 | $('#char-'+char.cid).html(""); 306 | $('#char-'+char.cid).data("citizenid", char.citizenid); 307 | setTimeout(function(){ 308 | $('#char-'+char.cid).html('account_box'+char.charinfo.firstname+' '+char.charinfo.lastname+''); 309 | $('#char-'+char.cid).data('cData', char) 310 | $('#char-'+char.cid).data('cid', char.cid) 311 | }, 100) 312 | }) 313 | } 314 | 315 | $(document).on('click', '#close-log', function(e){ 316 | e.preventDefault(); 317 | selectedLog = null; 318 | $('.welcomescreen').css("filter", "none"); 319 | $('.server-log').css("filter", "none"); 320 | $('.server-log-info').fadeOut(150); 321 | logOpen = false; 322 | }); 323 | 324 | $(document).on('click', '.character', function(e) { 325 | if ($(this).hasClass('blocked')) { 326 | return 327 | } 328 | 329 | var cDataPed = $(this).data('cData'); 330 | e.preventDefault(); 331 | resetCharSelector(); 332 | 333 | 334 | if (selectedChar === null) { 335 | selectedChar = $(this); 336 | if ((selectedChar).data('cid') == "") { 337 | $(selectedChar).addClass("char-selected"); 338 | setupCharInfo('empty') 339 | $.post('https://qb-multicharacter/cDataPed', JSON.stringify({ 340 | cData: cDataPed 341 | })); 342 | clickDisable = true; 343 | } else { 344 | $(selectedChar).addClass("char-selected"); 345 | setupCharInfo($(this).data('cData')) 346 | $.post('https://qb-multicharacter/cDataPed', JSON.stringify({ 347 | cData: cDataPed 348 | })); 349 | clickDisable = true; 350 | } 351 | setTimeout(function(){ 352 | $('.char-buttons').fadeIn(300); 353 | }, 3000); 354 | } else if ($(selectedChar).attr('id') !== $(this).attr('id')) { 355 | $(selectedChar).removeClass("char-selected"); 356 | selectedChar = $(this); 357 | if ((selectedChar).data('cid') == "") { 358 | $(selectedChar).addClass("char-selected"); 359 | setupCharInfo('empty') 360 | $.post('https://qb-multicharacter/cDataPed', JSON.stringify({ 361 | cData: cDataPed 362 | })); 363 | clickDisable = true; 364 | } else { 365 | $(selectedChar).addClass("char-selected"); 366 | setupCharInfo($(this).data('cData')) 367 | $.post('https://qb-multicharacter/cDataPed', JSON.stringify({ 368 | cData: cDataPed 369 | })); 370 | clickDisable = true; 371 | } 372 | setTimeout(function(){ 373 | $('.char-buttons').fadeIn(300); 374 | }, 3000); 375 | } else if ($(selectedChar).attr('id') === $(this).attr('id')) { 376 | $(selectedChar).removeClass("char-selected"); 377 | selectedChar = null; 378 | $("#play").css({"display":"none"}); 379 | $("#delete").css({"display":"none"}); 380 | //MultiCharacters.fadeInDown('.character-info', '-80%', 400); 381 | $.post('https://qb-multicharacter/cDataPed', JSON.stringify({ 382 | cData: "delete" 383 | })); 384 | clickDisable = true; 385 | $('.char-buttons').fadeOut(300); 386 | } 387 | }); 388 | 389 | $(document).on('click', '#create', function(e){ 390 | e.preventDefault(); 391 | $.post('https://qb-multicharacter/createNewCharacter', JSON.stringify({ 392 | firstname: $('#first_name').val(), 393 | lastname: $('#last_name').val(), 394 | nationality: $('#nationality').val(), 395 | birthdate: $('#birthdate').val(), 396 | gender: $('select[name=gender]').val(), 397 | cid: $(selectedChar).attr('id').replace('char-', ''), 398 | })); 399 | $(".container").fadeOut(150); 400 | $('.characters-list').css("filter", "none"); 401 | $('.character-info').css("filter", "none"); 402 | MultiCharacters.fadeOutDown('.character-register', '125%', 400); 403 | refreshCharacters() 404 | }); 405 | 406 | $(document).on('click', '#accept-delete', function(e){ 407 | $.post('https://qb-multicharacter/removeCharacter', JSON.stringify({ 408 | citizenid: $(selectedChar).data("citizenid"), 409 | })); 410 | $('.character-delete').fadeOut(150); 411 | refreshCharacters() 412 | start() 413 | }); 414 | 415 | 416 | $(document).on('click', '#cancel-delete', function(e){ 417 | e.preventDefault(); 418 | $('.characters-block').css("filter", "none"); 419 | $('.character-delete').fadeOut(150); 420 | }); 421 | 422 | function refreshCharacters() { 423 | $('.characters-list').html('

    Meus personagens

    account_boxSLOT VAZIO
    account_boxSLOT VAZIO
    account_boxSLOT VAZIO
    account_boxSLOT VAZIO
    account_boxSLOT VAZIO
    ') 424 | setTimeout(function(){ 425 | $(selectedChar).removeClass("char-selected"); 426 | selectedChar = null; 427 | $("#delete").css({"display":"none"}); 428 | $("#play").css({"display":"none"}); 429 | $('.char-buttons').fadeOut(300); 430 | MultiCharacters.resetAll(); 431 | $('.char-selector').css({"visibility":"hidden"}); 432 | resetCharSelector() 433 | }, 100) 434 | } 435 | 436 | function closereg(){ 437 | $('.characters-list').css("filter", "none") 438 | $('.character-info').css("filter", "none") 439 | MultiCharacters.fadeOutDown('.character-register', '125%', 400); 440 | } 441 | 442 | function closedel(){ 443 | $('.characters-block').css("filter", "none"); 444 | $('.character-delete').fadeOut(250); 445 | } 446 | 447 | chatplay = function(){ 448 | setTimeout(function(){ 449 | $('.char-buttons').css({"visibility":"hidden"}).animate({opacity:1.0},1000); 450 | }, 3000); 451 | $('.tooltipped').tooltip('close'); 452 | 453 | var charData = $(selectedChar).data('cid'); 454 | if (selectedChar !== null) { 455 | if (charData !== "") { 456 | $.post('https://qb-multicharacter/selectCharacter', JSON.stringify({ 457 | cData: $(selectedChar).data('cData') 458 | })); 459 | setTimeout(function(){ 460 | MultiCharacters.fadeOutDown('.characters-list', "-40%", 400); 461 | MultiCharacters.fadeOutDown('.character-info', "-40%", 400); 462 | $("#delete").css({"display":"none"}); 463 | $("#play").css({"display":"none"}); 464 | MultiCharacters.resetAll(); 465 | }, 1500); 466 | } else { 467 | $('.characters-list').css("filter", "blur(2px)") 468 | $('.character-info').css("filter", "blur(2px)") 469 | MultiCharacters.fadeInDown('.character-register', '25%', 400); 470 | } 471 | } 472 | $('.char-selector').css({"visibility":"hidden"}); 473 | resetCharSelector(); 474 | } 475 | 476 | deletePlayer = function(){ 477 | var charData = $(selectedChar).data('cid'); 478 | if (selectedChar !== null) { 479 | if (charData !== "") { 480 | $('.characters-block').css("filter", "blur(2px)") 481 | $('.character-delete').fadeIn(150); 482 | } 483 | } 484 | } 485 | 486 | MultiCharacters.fadeOutUp = function(element, time) { 487 | $(element).css({"display":"block"}).animate({top: "-80.5%",}, time, function(){ 488 | $(element).css({"display":"none"}); 489 | }); 490 | } 491 | 492 | MultiCharacters.fadeOutDown = function(element, percent, time) { 493 | if (percent !== undefined) { 494 | $(element).css({"display":"block"}).animate({top: percent,}, time, function(){ 495 | $(element).css({"display":"none"}); 496 | }); 497 | } else { 498 | $(element).css({"display":"block"}).animate({top: "103.5%",}, time, function(){ 499 | $(element).css({"display":"none"}); 500 | }); 501 | } 502 | } 503 | 504 | MultiCharacters.fadeInDown = function(element, percent, time) { 505 | $(element).css({"display":"block"}).animate({top: percent,}, time); 506 | } 507 | 508 | MultiCharacters.fadeInLeft = function(element, percent, time) { 509 | $(element).css({"display":"block"}).animate({left: percent,}, time); 510 | } 511 | 512 | MultiCharacters.resetAll = function() { 513 | $('.characters-list').hide(); 514 | $('.characters-list').css("top", "-40"); 515 | $('.character-info').hide(); 516 | $('.character-info').css("top", "-40"); 517 | $('.mid-account').css({"display":"none"}).animate({right: -100+"vh",}, test && 1 || 2500); 518 | $('.mid-characters').css({"display":"none"}).animate({left: -100+"vh",}, test && 1 || 2500); 519 | $('.welcomescreen').css("top", WelcomePercentage); 520 | $('.server-log').show(); 521 | $('.server-log').css("top", "25%"); 522 | } 523 | 524 | if (test) { 525 | start() 526 | } -------------------------------------------------------------------------------- /html/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Roboto&display=swap'); 2 | @import url('https://fonts.googleapis.com/css?family=B612+Mono&display=swap'); 3 | @import url('https://fonts.googleapis.com/css?family=Roboto+Mono&display=swap'); 4 | @import url('https://fonts.googleapis.com/css?family=Lato&display=swap'); 5 | @import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro&display=swap'); 6 | @import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&display=swap'); 7 | 8 | 9 | 10 | body { 11 | user-select: none; 12 | -moz-user-select: none; 13 | } 14 | 15 | .container { 16 | display: none; 17 | } 18 | 19 | 20 | .main-screen { 21 | position: absolute; 22 | height: 100vh; 23 | width: 100vw; 24 | left: 0; 25 | z-index: 100; 26 | } 27 | 28 | .main-select { 29 | position: absolute; 30 | height: 100vh; 31 | width: 100vw; 32 | left: 0; 33 | display: none; 34 | text-align: center; 35 | } 36 | 37 | .mid-account { 38 | position: absolute; 39 | height: 100vh; 40 | width: 10vw; 41 | bottom: 0; 42 | right:-100vh; 43 | display: none; 44 | text-align: center; 45 | background-color: rgba(52, 58, 64, 0.5); 46 | line-height: 100vh; 47 | } 48 | 49 | .mid-characters { 50 | position: absolute; 51 | height: 100vh; 52 | width: 10vw; 53 | bottom: 0; 54 | left: -100vh; 55 | display: none; 56 | text-align: center; 57 | background-color: rgba(52, 58, 64, 0.5); 58 | line-height: 100vh; 59 | } 60 | 61 | .logoqb { 62 | animation: breathing 5s ease-out infinite; 63 | opacity: 0.8; 64 | } 65 | 66 | 67 | @keyframes breathing { 68 | 0% { 69 | -webkit-transform: scale(0.9); 70 | -ms-transform: scale(0.9); 71 | transform: scale(0.9); 72 | } 73 | 74 | 25% { 75 | -webkit-transform: scale(1); 76 | -ms-transform: scale(1); 77 | transform: scale(1); 78 | } 79 | 80 | 60% { 81 | -webkit-transform: scale(0.9); 82 | -ms-transform: scale(0.9); 83 | transform: scale(0.9); 84 | } 85 | 86 | 100% { 87 | -webkit-transform: scale(0.9); 88 | -ms-transform: scale(0.9); 89 | transform: scale(0.9); 90 | } 91 | } 92 | 93 | .borderSelect { 94 | position: absolute; 95 | top: 50%; 96 | height: 0vh; 97 | width: 0.3vw; 98 | background-color: #ffffff; 99 | transform:translate(0%, -50%) 100 | } 101 | 102 | .infoaccount { 103 | position: relative; 104 | background: rgba(0, 0, 0, 0.623); 105 | border-top: white .3vh solid; 106 | border-left: white .3vh solid; 107 | top: 5vh; 108 | left: 22vh; 109 | height: 50vh; 110 | width: 70vh; 111 | border-radius: .5vh; 112 | } 113 | 114 | .infoaccounttitle{ 115 | position: relative; 116 | line-height: 2; 117 | top: 1vh; 118 | font-size: 2.5vh; 119 | font-family: 'Bebas Neue', cursive; 120 | letter-spacing: 0.2vh; 121 | font-weight: bold; 122 | text-align: left; 123 | left: 5vh; 124 | color: white; 125 | } 126 | 127 | .streamermode { 128 | position: absolute; 129 | top: 2vh; 130 | right: 1vh; 131 | width: 20vh; 132 | color: white; 133 | line-height: 1.5; 134 | z-index: 99; 135 | } 136 | 137 | .streamermode p { 138 | font-size: 1.6vh; 139 | font-family: 'Bebas Neue', cursive; 140 | letter-spacing: 0.2vh; 141 | font-weight: bold; 142 | color: white; 143 | } 144 | 145 | .playerinfo { 146 | position: relative; 147 | width: 60vh; 148 | left: 5vh; 149 | height: 45vh; 150 | } 151 | 152 | .playerinfoslot { 153 | position: relative; 154 | width: auto; 155 | float: left; 156 | min-width: 30vh; 157 | margin-right: 10vh; 158 | margin-top: 3vh; 159 | border-bottom: gray solid .1vh; 160 | height: 5vh; 161 | color: white; 162 | } 163 | 164 | .pinfotitle{ 165 | line-height: 1; 166 | color: white; 167 | left: 0; 168 | font-size: 1.5vh; 169 | font-family: 'Bebas Neue', cursive; 170 | letter-spacing: 0.2vh; 171 | font-weight: bold; 172 | text-align: left; 173 | } 174 | 175 | .pinfodata p { 176 | line-height: 3; 177 | left: 0; 178 | width: fit-content; 179 | font-size: 1.4vh; 180 | font-family: 'Bebas Neue', cursive; 181 | letter-spacing: 0.2vh; 182 | text-align: left; 183 | opacity: 0.8; 184 | } 185 | 186 | .hidebtn { 187 | position: absolute; 188 | color: rgb(179, 179, 179); 189 | bottom: .2vh; 190 | right: .2vh; 191 | } 192 | 193 | .hidebtn:hover { 194 | color: #c07334; 195 | } 196 | 197 | .hideinfo { 198 | color: transparent; 199 | text-shadow: rgba(255, 255, 255, 0.95) 0px 0px 10px; 200 | } 201 | 202 | 203 | .pinfodata p:hover { 204 | opacity: 1.0; 205 | } 206 | 207 | .pinfodata p:hover:after { 208 | content: " 📄"; 209 | } 210 | 211 | .vipinfo { 212 | position: relative; 213 | background: rgba(0, 0, 0, 0.623); 214 | border-bottom: white .3vh solid; 215 | border-right: white .3vh solid; 216 | margin-top: 1vh; 217 | top: 5vh; 218 | left: 22vh; 219 | height: 40vh; 220 | width: 70vh; 221 | } 222 | 223 | .infoviptitle{ 224 | position: relative; 225 | line-height: 2; 226 | top: 1vh; 227 | font-size: 2.5vh; 228 | font-family: 'Bebas Neue', cursive; 229 | letter-spacing: 0.2vh; 230 | font-weight: bold; 231 | text-align: right; 232 | right: 5vh; 233 | color: white; 234 | } 235 | 236 | .vip-packs { 237 | position: relative; 238 | width: 65vh; 239 | height: 32vh; 240 | float: right; 241 | right: 2vh; 242 | top: 1vh; 243 | overflow-y: scroll; 244 | } 245 | 246 | .collapsible { 247 | border-radius: .5vh; 248 | } 249 | 250 | .collapsible { 251 | border-radius: .5vh; 252 | } 253 | 254 | .collapsible-header.vipcolap { 255 | background-color: #7952B3; 256 | color: black; 257 | border-bottom: grey 1px solid; 258 | } 259 | 260 | .bodycolap { 261 | height: fit-content; 262 | background-color: #6b6b6b; 263 | } 264 | 265 | .bodycolap p { 266 | line-height: 0; 267 | } 268 | 269 | .chartext:hover> p { 270 | visibility: visible; 271 | } 272 | 273 | .chartext:hover> p { 274 | visibility: visible; 275 | } 276 | 277 | 278 | .chartext:hover>i.iconselect { 279 | color: #7952B3; 280 | } 281 | .chartext:hover>i.iconselect { 282 | color: #7952B3; 283 | } 284 | 285 | .chartext { 286 | position: absolute; 287 | top: 43vh; 288 | width: 10vw; 289 | height: 100vh; 290 | line-height: 2vh; 291 | text-align: center; 292 | } 293 | 294 | .chartext p { 295 | font-size: 1.5vh; 296 | font-family: 'Bebas Neue', cursive; 297 | letter-spacing: 0.2vh; 298 | font-weight: bold; 299 | color: white; 300 | visibility: hidden; 301 | } 302 | 303 | .chartext i { 304 | position: relative; 305 | color: white; 306 | font-size: 8vh; 307 | } 308 | 309 | .characters-block { 310 | display: none; 311 | position: absolute; 312 | width: 800px; 313 | height: 550px; 314 | background-color: rgba(52, 58, 64, 0.5); 315 | top: -80%; 316 | margin: 0 auto; 317 | left: 0; 318 | right: 0; 319 | border-bottom: 2px solid #b12424; 320 | box-shadow: 0px 0px 6px 1px rgba(52, 58, 64, 0.5); 321 | box-shadow: inset 0px 0px 150px 0px rgba(255, 255, 255, 0.1); 322 | overflow: visible !important; 323 | } 324 | 325 | .characters-block-header { 326 | position: relative; 327 | top: 0; 328 | width: 100%; 329 | height: 30px; 330 | background-color: #881a1a; 331 | border-bottom: 2px solid #fff; 332 | font-family: 'Lato' monospace; 333 | box-shadow: inset 0px 0px 150px 0px rgba(255, 255, 255, 0.1); 334 | } 335 | 336 | .disconnect-server-btn { 337 | position: absolute; 338 | width: 80px; 339 | height: 60%; 340 | background-color: rgba(32, 32, 32, 0.822); 341 | left: 10px; 342 | bottom: 8px; 343 | border: 1px solid rgb(236, 236, 236); 344 | border-radius: 3px; 345 | transition: all 0.2s ease; 346 | } 347 | 348 | #close-reg { 349 | position: absolute; 350 | right: .8vh; 351 | top: 1vh; 352 | color: rgba(64, 6, 88, 0.473); 353 | background: rgb(214, 50, 50); 354 | font-size: 3vh; 355 | } 356 | 357 | #close-log { 358 | position: absolute; 359 | right: .8vh; 360 | top: 1vh; 361 | color: rgba(64, 6, 88, 0.473); 362 | background: rgb(214, 50, 50); 363 | font-size: 3vh; 364 | } 365 | 366 | #close-del { 367 | position: absolute; 368 | right: .8vh; 369 | top: 1vh; 370 | color: rgba(64, 6, 88, 0.473); 371 | background: rgb(214, 50, 50); 372 | font-size: 3vh; 373 | } 374 | 375 | .disconnect-server-btn:hover { 376 | background-color: rgba(51, 51, 51, 0.89); 377 | border-radius: 4px; 378 | } 379 | 380 | .disconnect-server-btn > p { 381 | color: rgb(255, 255, 255); 382 | font-size: 1.3vh; 383 | padding-top: 5%; 384 | padding-left: 6px; 385 | } 386 | 387 | .characters-block-header > p { 388 | text-align: center; 389 | color: white; 390 | line-height: 24px; 391 | font-family: 'Bebas Neue', cursive; 392 | } 393 | 394 | .characters-list { 395 | display: none; 396 | position: absolute; 397 | width: 150vh; 398 | height: auto; 399 | left: -14%; 400 | top: 80vh; 401 | overflow: visible !important; 402 | /* background-color: rgba(0, 0, 0, 0.15); */ 403 | padding: 1.0vh; 404 | } 405 | 406 | .character-list-header { 407 | position: absolute; 408 | top: 0vh; 409 | width: 100%; 410 | height: auto; 411 | } 412 | 413 | .character-list-header > p { 414 | text-align: left; 415 | font-size: 1.5vh; 416 | font-family: 'Bebas Neue', cursive; 417 | letter-spacing: 0.2vh; 418 | font-weight: bold; 419 | color: white; 420 | } 421 | 422 | .character { 423 | position: relative; 424 | display: inline-block; 425 | width: 10vh; 426 | height: 10vh; 427 | margin-top: 1.5vh; 428 | background-color: rgba(52, 58, 64, 0.5); 429 | font-family: 'Lato' monospace; 430 | border-bottom: 0.4vh solid #c5c5c5c5; 431 | transition: .3s linear; 432 | border-radius: .2vh; 433 | } 434 | 435 | .tooltipchar { 436 | width: fit-content; 437 | height: fit-content; 438 | } 439 | 440 | .char-selector { 441 | position: absolute; 442 | width: 15vh; 443 | height: 40vh; 444 | top: 30vh; 445 | left: 80vh; 446 | visibility: hidden; 447 | } 448 | 449 | .char-selector:hover>.char-arrow { 450 | visibility: visible; 451 | } 452 | 453 | .char-arrow { 454 | position: absolute; 455 | top: -7vh; 456 | left: 2.5vh; 457 | visibility: hidden; 458 | } 459 | 460 | .char-arrow i { 461 | color: #ffffff; 462 | font-size: 10vh; 463 | } 464 | 465 | .char-buttons { 466 | position: absolute; 467 | right: -17vh; 468 | width: 5vh; 469 | top: 3vh; 470 | visibility: hidden; 471 | opacity: 0.0; 472 | } 473 | 474 | .char-buttons a { 475 | margin-bottom: 1vh; 476 | } 477 | 478 | .backbtn { 479 | position: absolute; 480 | display: inline-block; 481 | left: -12vh; 482 | width: 10vh; 483 | height: 10vh; 484 | margin-top: 1.5vh; 485 | background-color: rgba(52, 58, 64, 0.5); 486 | border-bottom: 0.4vh solid #c5c5c5c5; 487 | transition: .3s linear; 488 | } 489 | 490 | .backbtn:hover { 491 | border-bottom: 0.4vh solid #7952B3; 492 | } 493 | 494 | .backbtn i{ 495 | color: #7952B3; 496 | position: relative; 497 | font-size: 5vh; 498 | top: 2.5vh; 499 | left: 2.5vh; 500 | padding-right: 2vh; 501 | padding-bottom: 4vh; 502 | } 503 | 504 | .character:hover { 505 | width: 30vh; 506 | background-color: rgba(58, 58, 58, 0.75); 507 | } 508 | 509 | .character:hover > #slot-name { 510 | font-size: 1.7vh; 511 | } 512 | 513 | .char-selected > #slot-name { 514 | font-size: 1.7vh; 515 | } 516 | 517 | .character:hover > #slot-icon { 518 | color: #6e6e6e; 519 | } 520 | 521 | 522 | .character > span { 523 | color: rgb(255, 255, 255); 524 | font-family: 'Lato' monospace !important; 525 | } 526 | 527 | #cid { 528 | position: relative; 529 | float: right; 530 | font-size: 1.1vh; 531 | right: 35px; 532 | line-height: 80px; 533 | } 534 | 535 | .char-selected { 536 | /* background-color: #9c88ffde; */ 537 | width: 30vh; 538 | border-bottom: 0.4vh solid #7952B3; 539 | box-shadow: rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px; 540 | } 541 | 542 | .disabled { 543 | background-color: rgba(0, 0, 0, 0.691); 544 | } 545 | 546 | #slot-name { 547 | position: absolute; 548 | color: rgb(255, 255, 255); 549 | font-size: 0vh; 550 | top: 4.0vh; 551 | left: 8.0vh; 552 | font-family: 'Bebas Neue', cursive; 553 | } 554 | 555 | #slot-icon { 556 | position: relative; 557 | font-size: 5vh; 558 | top: 2.5vh; 559 | left: 2.5vh; 560 | padding-right: 2vh; 561 | padding-bottom: 4vh; 562 | } 563 | 564 | #slot-icon2 { 565 | position: relative; 566 | font-size: 5vh; 567 | top: 2.5vh; 568 | left: 2.5vh; 569 | padding-right: 2vh; 570 | padding-bottom: 4vh; 571 | color: #7952B3; 572 | } 573 | 574 | .character-btn { 575 | position: relative; 576 | width: 45vh; 577 | height: 5vh; 578 | 579 | transition: 0.2s; 580 | margin-top: 1vh; 581 | 582 | } 583 | 584 | .character-btn > p { 585 | color: white; 586 | text-align: center; 587 | text-transform: uppercase; 588 | padding-top: 1.7vh; 589 | } 590 | 591 | .character-buttons { 592 | position: absolute; 593 | width: 45vh; 594 | top: 80vh; 595 | float: right; 596 | right: 20vh; 597 | } 598 | 599 | #play { 600 | display: none; 601 | background-color: #44bd32; 602 | border-radius: 4px; 603 | transition: all 0.2s ease; 604 | } 605 | 606 | #play:hover { 607 | background-color: #54d441; 608 | border-radius: 8px; 609 | } 610 | 611 | #delete { 612 | display: none; 613 | background-color: #c02b2b; 614 | border-radius: 4px; 615 | transition: all 0.2s ease; 616 | } 617 | 618 | #delete:hover { 619 | background-color: #eb3434; 620 | border-radius: 8px; 621 | } 622 | 623 | .character-info { 624 | display: none; 625 | position: absolute; 626 | width: 45vh; 627 | height: 60vh; 628 | right: 20vh; 629 | top: -40%; 630 | background-color: rgba(0, 0, 0, 0.5); 631 | overflow: visible !important; 632 | } 633 | 634 | #char-info-icon { 635 | position: relative; 636 | font-size: 2.8vh; 637 | color: white; 638 | right: 2vh; 639 | overflow: visible !important; 640 | } 641 | 642 | #char-info-titel { 643 | position: absolute; 644 | font-size: 1.7vh; 645 | color: white; 646 | top: 0.7vh; 647 | left: 1.4vh; 648 | overflow: visible !important; 649 | } 650 | 651 | #no-char { 652 | position: absolute; 653 | color: rgb(255, 255, 255); 654 | font-size: 1.6vh; 655 | top: 30%; 656 | text-align: center; 657 | left: 1.4vh; 658 | } 659 | 660 | .char-info-titel { 661 | position: relative; 662 | left: 28%; 663 | top: 3%; 664 | overflow: visible !important; 665 | } 666 | 667 | .character-info-valid { 668 | position: relative; 669 | top: 10%; 670 | overflow: visible !important; 671 | } 672 | 673 | .character-info-box { 674 | position: relative; 675 | color: white; 676 | font-size: 1.4vh; 677 | width: fit-content; 678 | height: 2vh; 679 | margin-bottom: 1vh; 680 | /* border-bottom: .1vh solid white; */ 681 | font-family: 'Bebas Neue', cursive; 682 | letter-spacing: 0.1vh; 683 | text-align: left; 684 | } 685 | 686 | .btn-floating.btn-tam { 687 | width: 4vh; 688 | height: 4vh; 689 | padding: 0; 690 | } 691 | 692 | .btn-floating.btn-tam i { 693 | line-height: 4vh; 694 | font-size: 2.5vh; 695 | } 696 | .btn-tam i { 697 | font-size: 4vh; 698 | } 699 | 700 | #info-label { 701 | font-weight: bold; 702 | margin-left: 1vh; 703 | } 704 | 705 | .character-delete { 706 | display: none; 707 | position: absolute; 708 | width: 50vh; 709 | height: 30vh; 710 | top: 420px; 711 | left: 220px; 712 | margin-left: auto; 713 | margin-right: auto; 714 | border-bottom: .5vh solid #7952B3; 715 | background-color: rgba(0, 0, 0, 0.7); 716 | box-shadow: 0px 0px 19px 1px rgba(0,0,0,0.54); 717 | text-align: center; 718 | color: white; 719 | font-family: 'Bebas Neue', cursive; 720 | border-radius: 1vh; 721 | } 722 | 723 | 724 | 725 | .characters-delete-block-header { 726 | position: absolute; 727 | background-color: rgba(0, 0, 0, 0.7); 728 | width: 100%; 729 | height: 19%; 730 | color: rgb(255, 255, 255); 731 | text-align: center; 732 | font-size: 1.8vh; 733 | line-height: 29px; 734 | font-family: 'Bebas Neue', cursive; 735 | border-bottom: 2px solid #7952B3; 736 | } 737 | 738 | .characters-delete-block-header > p { 739 | font-family: 'Bebas Neue', cursive; 740 | } 741 | 742 | .character-delete > p { 743 | padding-top: 50px; 744 | font-size: 1.6vh; 745 | } 746 | 747 | #yeet { 748 | font-size: 1.2vh; 749 | } 750 | 751 | .character-acceptdel-btn { 752 | position: absolute; 753 | width: 43%; 754 | height: 13%; 755 | bottom: 0; 756 | left: 5%; 757 | margin-bottom: 15px; 758 | background-color: #0e0e0e; 759 | border-radius: 4px; 760 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 761 | transition: 0.2s; 762 | } 763 | 764 | .character-acceptdel-btn:hover { 765 | background-color: #7952b3; 766 | } 767 | 768 | .character-canceldel-btn { 769 | position: absolute; 770 | width: 43%; 771 | height: 13%; 772 | bottom: 0; 773 | right: 5%; 774 | margin-bottom: 15px; 775 | background-color: #0e0e0e; 776 | border-radius: 4px; 777 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 778 | transition: 0.2s; 779 | overflow: visible !important; 780 | } 781 | 782 | .character-canceldel-btn:hover { 783 | background-color: #7952b3; 784 | } 785 | 786 | .character-acceptdel-btn > p { 787 | color: white; 788 | text-align: center; 789 | padding-top: 13px; 790 | font-family: 'Bebas Neue', cursive; 791 | overflow: visible !important; 792 | } 793 | 794 | .character-canceldel-btn > p { 795 | color: white; 796 | text-align: center; 797 | padding-top: 13px; 798 | font-family: 'Bebas Neue', cursive; 799 | overflow: visible !important; 800 | } 801 | 802 | .character-register { 803 | display: none; 804 | position: absolute; 805 | width: 50vh; 806 | height: 50vh; 807 | top: 100vh; 808 | left: 20vh; 809 | /* padding-top: 2vh; */ 810 | background-color: rgba(0, 0, 0, 0.7); 811 | box-shadow: 0px 0px 19px 1px rgba(0,0,0,0.54); 812 | font-family: 'Bebas Neue', cursive; 813 | border-bottom: .5vh solid #7952b3; 814 | font-size: 1.6vh; 815 | border-radius: 1vh; 816 | } 817 | 818 | .characters-register-block-header { 819 | position: absolute; 820 | background-color: rgba(0, 0, 0, 0.7); 821 | width: 100%; 822 | height: 11%; 823 | color: rgb(255, 255, 255); 824 | text-align: center; 825 | font-size: 1.8vh; 826 | line-height: 5vh; 827 | font-family: 'Bebas Neue', cursive; 828 | border-bottom: .3vh solid #7952b3; 829 | } 830 | 831 | .characters-delete-block-header > p { 832 | padding-top: 14px; 833 | } 834 | 835 | .textdelete > p { 836 | padding-top: 90px; 837 | } 838 | 839 | .char-register-inputs { 840 | position: absolute; 841 | top: 15%; 842 | overflow: visible !important; 843 | } 844 | 845 | .char-reg-input { 846 | position: relative; 847 | margin-top: 1.3vh; 848 | border: none; 849 | background-color: rgba(0, 0, 0, 0.808); 850 | outline: none; 851 | width: 50vh; 852 | height: 3vh; 853 | color: white; 854 | max-width: 100%; 855 | padding: .4vh; 856 | border-radius: 2px 2px 4px 4px; 857 | box-shadow: inset 0px 0px 10px 0px rgba(255, 255, 255, 0.1); 858 | border: 1px solid #7952b3; 859 | font-family: 'Bebas Neue', cursive; 860 | text-align: center; 861 | transition: all 0.2s ease-in-out; 862 | } 863 | 864 | #first_name,#last_name,#nationality,#birthdate { 865 | font-size: 1.6vh; 866 | height: 5vh; 867 | border-bottom: .1vh solid #9e9e9e; 868 | } 869 | 870 | #first_name:focus,#last_name:focus,#nationality:focus,#birthdate:focus { 871 | border-bottom: .2vh solid #7952b3; 872 | } 873 | 874 | .char-reg-input:hover { 875 | background-color: rgba(34, 34, 34, 0.808); 876 | } 877 | 878 | .char-reg-input:focus { 879 | background-color: rgba(34, 34, 34, 0.808); 880 | border: 1px solid #7952b3; 881 | } 882 | 883 | .char-register-inputs select { 884 | position: absolute; 885 | border: none; 886 | background-color: rgba(0, 0, 0, 0.808); 887 | outline: none; 888 | width: 30vh; 889 | height: 3vh; 890 | top: 27vh; 891 | left: 10vh; 892 | color: white; 893 | max-width: 100%; 894 | padding: .4vh; 895 | border-radius: 2px 2px 4px 4px; 896 | box-shadow: inset 0px 0px 10px 0px rgba(255, 255, 255, 0.1); 897 | border: 1px solid #7952b3; 898 | font-family: 'Bebas Neue', cursive; 899 | text-align-last: center; 900 | -webkit-appearance: none; 901 | -moz-appearance: none; 902 | text-indent: 1px; 903 | text-overflow: ''; 904 | transition: all 0.2s ease-in-out; 905 | display: inline; 906 | } 907 | 908 | select:hover { 909 | background-color: rgba(34, 34, 34, 0.808); 910 | } 911 | 912 | select:focus { 913 | background-color: rgba(34, 34, 34, 0.808); 914 | border: 1px solid #7952b3; 915 | } 916 | 917 | #gender option { 918 | background-color: transparent; 919 | border: none; 920 | outline: none; 921 | } 922 | 923 | select::placeholder { 924 | text-align: center; 925 | } 926 | 927 | select::-ms-expand { 928 | display: none; 929 | } 930 | 931 | .char-reg-input::placeholder { 932 | color: rgba(255, 255, 255, 0.52); 933 | } 934 | 935 | input[type="date"] { 936 | color: white; 937 | font-family: 'Bebas Neue', cursive; 938 | text-align: center; 939 | } 940 | 941 | input[type=date]::-webkit-calendar-picker-indicator{ 942 | display: none; 943 | } 944 | 945 | input[type=date]::-webkit-inner-spin-button, 946 | input[type=date]::-webkit-outer-spin-button { 947 | -webkit-appearance: none; 948 | margin: 0; 949 | } 950 | 951 | input[type="date"]::-webkit-input-placeholder{ 952 | visibility: hidden !important; 953 | } 954 | 955 | input[type="date"]::-webkit-clear-button { 956 | display: none; 957 | } 958 | 959 | #birthdate { 960 | color: white; 961 | text-align: center; 962 | font-family: 'Bebas Neue', cursive; 963 | } 964 | 965 | .character-reg-btn { 966 | position: absolute; 967 | width: auto; 968 | max-width: 50%; 969 | height: 36px; 970 | background-color: #0e0e0e; 971 | border-radius: 4px; 972 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 973 | bottom: 5%; 974 | margin: 0 auto; 975 | left: 0; 976 | right: 0; 977 | } 978 | 979 | .character-reg-btn:hover { 980 | background-color: #7952b3; 981 | } 982 | 983 | .character-reg-btn > p { 984 | text-align: center; 985 | line-height: 34px; 986 | color: white; 987 | font-family: 'B612 Mono', monospace; 988 | font-size: 1.3vh; 989 | } 990 | 991 | .bars div{ 992 | animation-name: an-height; 993 | animation-duration: .6s; 994 | z-index: 101; 995 | } 996 | @keyframes an-height { 997 | from{ height: 0px; } 998 | } 999 | 1000 | .bars { 1001 | position: absolute; 1002 | text-align: center; 1003 | left: 42%; 1004 | } 1005 | 1006 | 1007 | .bottombar { 1008 | position: absolute; 1009 | background-color: rgb(0, 0, 0); 1010 | bottom: 0; 1011 | left: 0; 1012 | width: 100%; 1013 | height: 7%; 1014 | border-top: 3px solid #40737c; 1015 | } 1016 | 1017 | .server-log { 1018 | position: relative; 1019 | width: 30%; 1020 | height: 28%; 1021 | top: 25%; 1022 | margin-left: auto; 1023 | margin-right: auto; 1024 | background-color: rgba(0, 0, 0, 0.7); 1025 | box-shadow: 0px 0px 19px 1px rgba(0,0,0,0.54); 1026 | font-family: 'Bebas Neue', cursive; 1027 | border-bottom: 4px solid #40737c; 1028 | border-radius: 0px 0px 10px 10px; 1029 | } 1030 | 1031 | .server-log-header { 1032 | position: absolute; 1033 | background-color: rgba(0, 0, 0, 0.7); 1034 | width: 100%; 1035 | height: 10%; 1036 | color: rgb(255, 255, 255); 1037 | text-align: center; 1038 | font-size: 1.1vh; 1039 | line-height: 30px; 1040 | font-family: 'Bebas Neue', cursive; 1041 | border-bottom: 2px solid #b12424; 1042 | } 1043 | 1044 | .log { 1045 | position: relative; 1046 | top: 30px; 1047 | color: rgb(255, 255, 255); 1048 | font-family: 'Bebas Neue', cursive; 1049 | margin-top: 20px; 1050 | } 1051 | 1052 | #log-date { 1053 | color: #ff4646; 1054 | font-size: 1.2vh; 1055 | padding-left: 10px; 1056 | text-shadow: 0px 0px 4px rgba(0,0,0,0.35); 1057 | font-family: 'Bebas Neue', cursive; 1058 | } 1059 | 1060 | #log-changes { 1061 | position: relative; 1062 | top: 10px; 1063 | left: 30px; 1064 | font-size: 1.0vh; 1065 | text-shadow: 0px 0px 4px rgba(0,0,0,0.35); 1066 | font-family: 'Bebas Neue', cursive; 1067 | } 1068 | 1069 | .welcomescreen { 1070 | display: block; 1071 | position: absolute; 1072 | right: 1vh; 1073 | bottom: 0; 1074 | height: 125vh; 1075 | width: 50vh; 1076 | overflow: visible !important; 1077 | } 1078 | 1079 | .welcomescreen > p { 1080 | position: relative; 1081 | color: #ffffff; 1082 | text-align: center; 1083 | overflow: visible !important; 1084 | } 1085 | 1086 | #welcome-titel { 1087 | position: relative; 1088 | top: 45px; 1089 | left: 20px; 1090 | font-size: 3.0vh; 1091 | font-family: 'Bebas Neue', cursive; 1092 | font-weight: bolder; 1093 | } 1094 | 1095 | 1096 | .disconnect-btn { 1097 | position: absolute; 1098 | right: 3.5%; 1099 | width: 45%; 1100 | top: 75%; 1101 | height: 3.6vh; 1102 | background-color: #40737c; 1103 | border-radius: .2vh; 1104 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 1105 | transition: .1s linear; 1106 | } 1107 | 1108 | .disconnect-btn:hover { 1109 | background-color: #40737c; 1110 | } 1111 | 1112 | .disconnect-btn > p { 1113 | text-align: center; 1114 | line-height: 3.6vh; 1115 | color: white; 1116 | text-transform: uppercase; 1117 | font-family: 'Source Sans Pro', monospace; 1118 | } 1119 | 1120 | ::-webkit-scrollbar-track 1121 | { 1122 | margin-top: 1vh; 1123 | background-color: #333333; 1124 | } 1125 | 1126 | ::-webkit-scrollbar 1127 | { 1128 | width: 2px; 1129 | background-color: #333333; 1130 | } 1131 | 1132 | ::-webkit-scrollbar-thumb 1133 | { 1134 | background-color: #F5F5F5; 1135 | } 1136 | 1137 | .loading-rondje { 1138 | position: absolute; 1139 | margin: 0 auto; 1140 | left: 0; 1141 | right: 0; 1142 | top: 50%; 1143 | width: 350px; 1144 | height: 150px; 1145 | transform: translateY(-50%); 1146 | text-align: center; 1147 | padding: 1vh; 1148 | } 1149 | 1150 | .loading-rondje > p { 1151 | color: white; 1152 | margin-bottom: -1vh; 1153 | font-family: 'Lato'; 1154 | text-shadow: 1px 1px 0px #00000085; 1155 | } 1156 | 1157 | 1158 | .lds-ellipsis { 1159 | display: inline-block; 1160 | position: relative; 1161 | width: 80px; 1162 | height: 80px; 1163 | } 1164 | .lds-ellipsis div { 1165 | position: absolute; 1166 | top: 33px; 1167 | width: 13px; 1168 | height: 13px; 1169 | border-radius: 50%; 1170 | background: #fff; 1171 | animation-timing-function: cubic-bezier(0, 1, 1, 0); 1172 | } 1173 | .lds-ellipsis div:nth-child(1) { 1174 | left: 8px; 1175 | animation: lds-ellipsis1 0.6s infinite; 1176 | } 1177 | .lds-ellipsis div:nth-child(2) { 1178 | left: 8px; 1179 | animation: lds-ellipsis2 0.6s infinite; 1180 | } 1181 | .lds-ellipsis div:nth-child(3) { 1182 | left: 32px; 1183 | animation: lds-ellipsis2 0.6s infinite; 1184 | } 1185 | .lds-ellipsis div:nth-child(4) { 1186 | left: 56px; 1187 | animation: lds-ellipsis3 0.6s infinite; 1188 | } 1189 | @keyframes lds-ellipsis1 { 1190 | 0% { 1191 | transform: scale(0); 1192 | } 1193 | 100% { 1194 | transform: scale(1); 1195 | } 1196 | } 1197 | @keyframes lds-ellipsis3 { 1198 | 0% { 1199 | transform: scale(1); 1200 | } 1201 | 100% { 1202 | transform: scale(0); 1203 | } 1204 | } 1205 | @keyframes lds-ellipsis2 { 1206 | 0% { 1207 | transform: translate(0, 0); 1208 | } 1209 | 100% { 1210 | transform: translate(24px, 0); 1211 | } 1212 | } 1213 | -------------------------------------------------------------------------------- /html/zion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErgothStudio/qb-multicharacter/e67deed415aa30a357204c45adfd8bd50caf14cd/html/zion.png -------------------------------------------------------------------------------- /server/main.lua: -------------------------------------------------------------------------------- 1 | RegisterServerEvent('qb-multicharacter:server:disconnect') 2 | AddEventHandler('qb-multicharacter:server:disconnect', function() 3 | local src = source 4 | 5 | DropPlayer(src, "Você desconectou de QBCore") 6 | end) 7 | 8 | RegisterServerEvent('qb-multicharacter:server:loadUserData') 9 | AddEventHandler('qb-multicharacter:server:loadUserData', function(cData) 10 | local src = source 11 | if QBCore.Player.Login(src, cData.citizenid) then 12 | print('^2[qb-core]^7 '..GetPlayerName(src)..' (Citizen ID: '..cData.citizenid..') has succesfully loaded!') 13 | QBCore.Commands.Refresh(src) 14 | loadHouseData() 15 | --TriggerEvent(QBCore:Server:OnPlayerLoaded')- 16 | --TriggerClientEvent('QBCore:Client:OnPlayerLoaded', src) 17 | 18 | TriggerClientEvent('apartments:client:setupSpawnUI', src, cData) 19 | TriggerEvent("qb-log:server:CreateLog", "joinleave", "Loaded", "green", "**".. GetPlayerName(src) .. "** ("..cData.citizenid.." | "..src..") loaded..") 20 | end 21 | end) 22 | 23 | RegisterServerEvent('qb-multicharacter:server:createCharacter') 24 | AddEventHandler('qb-multicharacter:server:createCharacter', function(data) 25 | local src = source 26 | local newData = {} 27 | newData.cid = data.cid 28 | newData.charinfo = data 29 | --QBCore.Player.CreateCharacter(src, data) 30 | if QBCore.Player.Login(src, false, newData) then 31 | print('^2[qb-core]^7 '..GetPlayerName(src)..' has succesfully loaded!') 32 | QBCore.Commands.Refresh(src) 33 | loadHouseData() 34 | 35 | TriggerClientEvent("qb-multicharacter:client:closeNUI", src) 36 | TriggerClientEvent('apartments:client:setupSpawnUI', src, newData) 37 | GiveStarterItems(src) 38 | end 39 | end) 40 | 41 | function GiveStarterItems(source) 42 | local src = source 43 | local Player = QBCore.Functions.GetPlayer(src) 44 | 45 | for k, v in pairs(QBCore.Shared.StarterItems) do 46 | local info = {} 47 | if v.item == "id_card" then 48 | info.citizenid = Player.PlayerData.citizenid 49 | info.firstname = Player.PlayerData.charinfo.firstname 50 | info.lastname = Player.PlayerData.charinfo.lastname 51 | info.birthdate = Player.PlayerData.charinfo.birthdate 52 | info.gender = Player.PlayerData.charinfo.gender 53 | info.nationality = Player.PlayerData.charinfo.nationality 54 | elseif v.item == "driver_license" then 55 | info.firstname = Player.PlayerData.charinfo.firstname 56 | info.lastname = Player.PlayerData.charinfo.lastname 57 | info.birthdate = Player.PlayerData.charinfo.birthdate 58 | info.type = "A1-A2-A | AM-B | C1-C-CE" 59 | end 60 | Player.Functions.AddItem(v.item, 1, false, info) 61 | end 62 | end 63 | 64 | RegisterServerEvent('qb-multicharacter:server:deleteCharacter') 65 | AddEventHandler('qb-multicharacter:server:deleteCharacter', function(citizenid) 66 | local src = source 67 | QBCore.Player.DeleteCharacter(src, citizenid) 68 | end) 69 | 70 | QBCore.Functions.CreateCallback("qb-multicharacter:server:GetUserCharacters", function(source, cb) 71 | local license = QBCore.Functions.GetIdentifier(source, 'license') 72 | 73 | exports['ghmattimysql']:execute('SELECT * FROM players WHERE license=@license', {['@license'] = license}, function(result) 74 | cb(result) 75 | end) 76 | end) 77 | 78 | QBCore.Functions.CreateCallback("qb-multicharacter:server:GetServerLogs", function(source, cb) 79 | exports['ghmattimysql']:execute('SELECT * FROM server_logs', function(result) 80 | cb(result) 81 | end) 82 | end) 83 | 84 | QBCore.Functions.CreateCallback("test:yeet", function(source, cb) 85 | local license = QBCore.Functions.GetIdentifier(source, 'license') 86 | local plyChars = {} 87 | 88 | exports['ghmattimysql']:execute('SELECT * FROM players WHERE license = @license', {['@license'] = license}, function(result) 89 | for i = 1, (#result), 1 do 90 | result[i].charinfo = json.decode(result[i].charinfo) 91 | result[i].money = json.decode(result[i].money) 92 | result[i].job = json.decode(result[i].job) 93 | 94 | table.insert(plyChars, result[i]) 95 | end 96 | cb(plyChars) 97 | end) 98 | end) 99 | 100 | QBCore.Commands.Add("logout", "Logout of Character (Admin Only)", {{name="id", help="Player ID"},{name="item", help="Name of the item (not a label)"}, {name="amount", help="Amount of items"}}, false, function(source, args) 101 | QBCore.Player.Logout(source) 102 | TriggerClientEvent('qb-multicharacter:client:chooseChar', source) 103 | end, "admin") 104 | 105 | QBCore.Commands.Add("closeNUI", "Close Multi NUI", {{name="id", help="Player ID"},{name="item", help="Name of the item (not a label)"}, {name="amount", help="Amount of items"}}, false, function(source, args) 106 | TriggerClientEvent('qb-multicharacter:client:closeNUI', source) 107 | end) 108 | 109 | QBCore.Functions.CreateCallback("qb-multicharacter:server:getSkin", function(source, cb, cid) 110 | local src = source 111 | 112 | exports.ghmattimysql:execute('SELECT * FROM playerskins WHERE citizenid=@citizenid AND active=@active', {['@citizenid'] = cid, ['@active'] = 1}, function(result) 113 | if result[1] ~= nil then 114 | cb(result[1].model, result[1].skin) 115 | else 116 | cb(nil) 117 | end 118 | end) 119 | end) 120 | 121 | function loadHouseData() 122 | local HouseGarages = {} 123 | local Houses = {} 124 | exports.ghmattimysql:execute('SELECT * FROM houselocations', function(result) 125 | if result[1] ~= nil then 126 | for k, v in pairs(result) do 127 | local owned = false 128 | if tonumber(v.owned) == 1 then 129 | owned = true 130 | end 131 | local garage = v.garage ~= nil and json.decode(v.garage) or {} 132 | Houses[v.name] = { 133 | coords = json.decode(v.coords), 134 | owned = v.owned, 135 | price = v.price, 136 | locked = true, 137 | adress = v.label, 138 | tier = v.tier, 139 | garage = garage, 140 | decorations = {}, 141 | } 142 | HouseGarages[v.name] = { 143 | label = v.label, 144 | takeVehicle = garage, 145 | } 146 | end 147 | end 148 | TriggerClientEvent("qb-garages:client:houseGarageConfig", -1, HouseGarages) 149 | TriggerClientEvent("qb-houses:client:setHouseConfig", -1, Houses) 150 | end) 151 | end 152 | --------------------------------------------------------------------------------