├── 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 | 
13 | 
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 |

38 |
39 |
40 |
41 |
42 |
logout
43 |
DESLOGAR
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
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 |
95 |
96 |
97 |
infoInformação do personagem
98 |
99 | Você não tem personagem criado neste slot
100 |
101 |
102 |
103 |
107 |
108 |
126 |
127 |
128 |
129 |
130 |
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 |
141 |
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 = ''
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','');
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('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 |
--------------------------------------------------------------------------------