├── html ├── click.wav ├── musica.mp3 ├── reset.css ├── profanity.js ├── index.html ├── script.js └── style.css ├── fxmanifest.lua ├── README.md ├── config.lua ├── server └── main.lua ├── client └── main.lua └── LICENSE /html/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OwenT1/qb-multicharacter/HEAD/html/click.wav -------------------------------------------------------------------------------- /html/musica.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OwenT1/qb-multicharacter/HEAD/html/musica.mp3 -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | 4 | description 'QB-Multicharacter OwenT' 5 | version '1.1.0' 6 | 7 | shared_script 'config.lua' 8 | client_script 'client/main.lua' 9 | server_scripts { 10 | '@oxmysql/lib/MySQL.lua', 11 | 'server/main.lua' 12 | } 13 | 14 | ui_page 'html/index.html' 15 | 16 | files { 17 | 'html/index.html', 18 | 'html/style.css', 19 | 'html/reset.css', 20 | 'html/profanity.js', 21 | 'html/script.js', 22 | 'html/musica.mp3', 23 | 'html/click.wav', 24 | 'html/qb-pixel.png', 25 | } 26 | 27 | dependencies { 28 | 'qb-core', 29 | 'qb-spawn' 30 | } 31 | 32 | lua54 'yes' 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Redesign of Multi Character QBCore 2 | 3 | This is my official edit of the original script QB-Multicharacter 4 | 5 | I have spent a while editing this script and making it look fire for you all to use in your city 6 | 7 | https://discord.gg/MnHRK2DBtU 8 | 9 | 10 | For this to work you must have QB-Spawn 11 | 12 | Credits: 13 | 14 | QBCore - Original Script 15 | Marcostom32 - Original Script 16 | Owen T - Edited Script 17 | 18 | Preview 1: https://streamable.com/9a2eg4 19 | 20 | Preview 2: https://streamable.com/z2pxnr 21 | 22 | This is my second script I have edited if you enjoy these edits please join the Discord! 23 | 24 | Steps to install: 25 | 26 | Drag and drop the resource to your resources folder Ensure you have started the resource in your server.cfg Restart your server and enjoy 27 | 28 | You can edit the LOGO By going into Index.html and opening it edit the src image link If you need help join the discord and I will help you do this! 29 | -------------------------------------------------------------------------------- /config.lua: -------------------------------------------------------------------------------- 1 | Config = {} 2 | Config.StartingApartment = true -- Enable/disable starting apartments (make sure to set default spawn coords) 3 | Config.Interior = vector3(-8.88, 512.91, 174.63) -- Interior to load where characters are previewed 4 | Config.DefaultSpawn = vector3(-1035.71, -2731.87, 12.86) -- Default spawn coords if you have start apartments disabled 5 | Config.PedCoords = vector4(-8.55, 508.84, 174.63, 19.81) -- Create preview ped at these coordinates 6 | Config.HiddenCoords = vector4(3.3, 523.88, 170.62, 70.87) -- Hides your actual ped Ma-cro guapo while you are in selection 7 | Config.CamCoords = vector4(-8.88, 512.91, 174.63, 185.5) -- Camera coordinates for character preview screen 8 | Config.EnableDeleteButton = true -- Define if the player can delete the character or not 9 | 10 | Config.DefaultNumberOfCharacters = 2 -- Define maximum amount of default characters (maximum 5 characters defined by default) 11 | Config.PlayersNumberOfCharacters = { -- Define maximum amount of player characters by rockstar license (you can find this license in your server's database in the player table) 12 | { license = "license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", numberOfChars = 2 }, 13 | } 14 | -------------------------------------------------------------------------------- /html/reset.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, ol, ul, li, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | margin: 0; 15 | padding: 0; 16 | border: 0; 17 | font-size: 100%; 18 | font: inherit; 19 | vertical-align: baseline; 20 | font-family: 'Roboto'; 21 | overflow: hidden !important; 22 | } 23 | /* HTML5 display-role reset for older browsers */ 24 | article, aside, details, figcaption, figure, 25 | footer, header, hgroup, menu, nav, section { 26 | display: block; 27 | } 28 | body { 29 | line-height: 1; 30 | } 31 | ol, ul { 32 | list-style: none; 33 | } 34 | blockquote, q { 35 | quotes: none; 36 | } 37 | blockquote:before, blockquote:after, 38 | q:before, q:after { 39 | content: ''; 40 | content: none; 41 | } 42 | table { 43 | border-collapse: collapse; 44 | border-spacing: 0; 45 | } -------------------------------------------------------------------------------- /server/main.lua: -------------------------------------------------------------------------------- 1 | local QBCore = exports['qb-core']:GetCoreObject() 2 | 3 | -- Functions 4 | 5 | local function GiveStarterItems(source) 6 | local src = source 7 | local Player = QBCore.Functions.GetPlayer(src) 8 | 9 | for k, v in pairs(QBCore.Shared.StarterItems) do 10 | local info = {} 11 | if v.item == "id_card" then 12 | info.citizenid = Player.PlayerData.citizenid 13 | info.firstname = Player.PlayerData.charinfo.firstname 14 | info.lastname = Player.PlayerData.charinfo.lastname 15 | info.birthdate = Player.PlayerData.charinfo.birthdate 16 | info.gender = Player.PlayerData.charinfo.gender 17 | info.nationality = Player.PlayerData.charinfo.nationality 18 | elseif v.item == "driver_license" then 19 | info.firstname = Player.PlayerData.charinfo.firstname 20 | info.lastname = Player.PlayerData.charinfo.lastname 21 | info.birthdate = Player.PlayerData.charinfo.birthdate 22 | info.type = "Class C Driver License" 23 | end 24 | Player.Functions.AddItem(v.item, v.amount, false, info) 25 | end 26 | end 27 | 28 | local function loadHouseData() 29 | local HouseGarages = {} 30 | local Houses = {} 31 | local result = MySQL.Sync.fetchAll('SELECT * FROM houselocations', {}) 32 | if result[1] ~= nil then 33 | for k, v in pairs(result) do 34 | local owned = false 35 | if tonumber(v.owned) == 1 then 36 | owned = true 37 | end 38 | local garage = v.garage ~= nil and json.decode(v.garage) or {} 39 | Houses[v.name] = { 40 | coords = json.decode(v.coords), 41 | owned = v.owned, 42 | price = v.price, 43 | locked = true, 44 | adress = v.label, 45 | tier = v.tier, 46 | garage = garage, 47 | decorations = {}, 48 | } 49 | HouseGarages[v.name] = { 50 | label = v.label, 51 | takeVehicle = garage, 52 | } 53 | end 54 | end 55 | TriggerClientEvent("qb-garages:client:houseGarageConfig", -1, HouseGarages) 56 | TriggerClientEvent("qb-houses:client:setHouseConfig", -1, Houses) 57 | end 58 | 59 | -- Commands 60 | 61 | QBCore.Commands.Add("logout", "Logout of Character (Admin Only)", {}, false, function(source) 62 | local src = source 63 | QBCore.Player.Logout(src) 64 | TriggerClientEvent('qb-multicharacter:client:chooseChar', src) 65 | end, "admin") 66 | 67 | QBCore.Commands.Add("closeNUI", "Close Multi NUI", {}, false, function(source) 68 | local src = source 69 | TriggerClientEvent('qb-multicharacter:client:closeNUI', src) 70 | end) 71 | 72 | -- Events 73 | 74 | RegisterNetEvent('qb-multicharacter:server:disconnect', function() 75 | local src = source 76 | DropPlayer(src, "You have disconnected from QBCore") 77 | end) 78 | 79 | RegisterNetEvent('qb-multicharacter:server:loadUserData', function(cData) 80 | local src = source 81 | if QBCore.Player.Login(src, cData.citizenid) then 82 | print('^2[qb-core]^7 '..GetPlayerName(src)..' (Citizen ID: '..cData.citizenid..') has succesfully loaded!') 83 | QBCore.Commands.Refresh(src) 84 | loadHouseData() 85 | TriggerClientEvent('apartments:client:setupSpawnUI', src, cData) 86 | TriggerEvent("qb-log:server:CreateLog", "joinleave", "Loaded", "green", "**".. GetPlayerName(src) .. "** ("..(QBCore.Functions.GetIdentifier(src, 'discord') or 'undefined') .." | ||" ..(QBCore.Functions.GetIdentifier(src, 'ip') or 'undefined') .. "|| | " ..(QBCore.Functions.GetIdentifier(src, 'license') or 'undefined') .." | " ..cData.citizenid.." | "..src..") loaded..") 87 | end 88 | end) 89 | 90 | RegisterNetEvent('qb-multicharacter:server:createCharacter', function(data) 91 | local src = source 92 | local newData = {} 93 | newData.cid = data.cid 94 | newData.charinfo = data 95 | if QBCore.Player.Login(src, false, newData) then 96 | if Config.StartingApartment then 97 | local randbucket = (GetPlayerPed(src) .. math.random(1,999)) 98 | SetPlayerRoutingBucket(src, randbucket) 99 | print('^2[qb-core]^7 '..GetPlayerName(src)..' has succesfully loaded!') 100 | QBCore.Commands.Refresh(src) 101 | loadHouseData() 102 | TriggerClientEvent("qb-multicharacter:client:closeNUI", src) 103 | TriggerClientEvent('apartments:client:setupSpawnUI', src, newData) 104 | GiveStarterItems(src) 105 | else 106 | print('^2[qb-core]^7 '..GetPlayerName(src)..' has succesfully loaded!') 107 | QBCore.Commands.Refresh(src) 108 | loadHouseData() 109 | TriggerClientEvent("qb-multicharacter:client:closeNUIdefault", src) 110 | GiveStarterItems(src) 111 | end 112 | end 113 | end) 114 | 115 | RegisterNetEvent('qb-multicharacter:server:deleteCharacter', function(citizenid) 116 | local src = source 117 | print(src, citizenid) 118 | QBCore.Player.DeleteCharacter(src, citizenid) 119 | 120 | end) 121 | 122 | -- Callbacks 123 | 124 | QBCore.Functions.CreateCallback('qb-multi:server:GetCurrentPlayers', function(source, cb) 125 | local TotalPlayers = 0 126 | for k, v in pairs(QBCore.Functions.GetPlayers()) do 127 | TotalPlayers = TotalPlayers + 1 128 | end 129 | cb(TotalPlayers) 130 | end) 131 | 132 | QBCore.Functions.CreateCallback("qb-multicharacter:server:GetUserCharacters", function(source, cb) 133 | local src = source 134 | local license = QBCore.Functions.GetIdentifier(src, 'license') 135 | 136 | MySQL.Async.execute('SELECT * FROM players WHERE license = ?', {license}, function(result) 137 | cb(result) 138 | end) 139 | end) 140 | 141 | QBCore.Functions.CreateCallback("qb-multicharacter:server:GetServerLogs", function(source, cb) 142 | MySQL.Async.execute('SELECT * FROM server_logs', {}, function(result) 143 | cb(result) 144 | end) 145 | end) 146 | 147 | QBCore.Functions.CreateCallback("qb-multicharacter:server:GetNumberOfCharacters", function(source, cb) 148 | local src = source 149 | local license = QBCore.Functions.GetIdentifier(src, 'license') 150 | local numOfChars = 0 151 | 152 | if next(Config.PlayersNumberOfCharacters) then 153 | for i, v in pairs(Config.PlayersNumberOfCharacters) do 154 | if v.license == license then 155 | numOfChars = v.numberOfChars 156 | break 157 | else 158 | numOfChars = Config.DefaultNumberOfCharacters 159 | end 160 | end 161 | else 162 | numOfChars = Config.DefaultNumberOfCharacters 163 | end 164 | cb(numOfChars) 165 | end) 166 | 167 | QBCore.Functions.CreateCallback("qb-multicharacter:server:setupCharacters", function(source, cb) 168 | local license = QBCore.Functions.GetIdentifier(source, 'license') 169 | local plyChars = {} 170 | MySQL.Async.fetchAll('SELECT * FROM players WHERE license = ?', {license}, function(result) 171 | for i = 1, (#result), 1 do 172 | result[i].charinfo = json.decode(result[i].charinfo) 173 | result[i].money = json.decode(result[i].money) 174 | result[i].job = json.decode(result[i].job) 175 | plyChars[#plyChars+1] = result[i] 176 | end 177 | cb(plyChars) 178 | end) 179 | end) 180 | 181 | QBCore.Functions.CreateCallback("qb-multicharacter:server:getSkin", function(source, cb, cid) 182 | local result = MySQL.Sync.fetchAll('SELECT * FROM playerskins WHERE citizenid = ? AND active = ?', {cid, 1}) 183 | if result[1] ~= nil then 184 | cb(result[1].model, result[1].skin) 185 | else 186 | cb(nil) 187 | end 188 | end) 189 | -------------------------------------------------------------------------------- /html/profanity.js: -------------------------------------------------------------------------------- 1 | // Bad word list found from: https://github.com/MauriceButler/badwords/blob/master/array.js 2 | const profList = [ 3 | "4r5e", 4 | "5h1t", 5 | "5hit", 6 | "a55", 7 | "anal", 8 | "anus", 9 | "ar5e", 10 | "arrse", 11 | "arse", 12 | "ass", 13 | "ass-fucker", 14 | "asses", 15 | "assfucker", 16 | "assfukka", 17 | "asshole", 18 | "assholes", 19 | "asswhole", 20 | "a_s_s", 21 | "b!tch", 22 | "b00bs", 23 | "b17ch", 24 | "b1tch", 25 | "ballbag", 26 | "balls", 27 | "ballsack", 28 | "bastard", 29 | "beastial", 30 | "beastiality", 31 | "bellend", 32 | "bestial", 33 | "bestiality", 34 | "bi+ch", 35 | "biatch", 36 | "bitch", 37 | "bitcher", 38 | "bitchers", 39 | "bitches", 40 | "bitchin", 41 | "bitching", 42 | "bloody", 43 | "blow job", 44 | "blowjob", 45 | "blowjobs", 46 | "boiolas", 47 | "bollock", 48 | "bollok", 49 | "boner", 50 | "boob", 51 | "boobs", 52 | "booobs", 53 | "boooobs", 54 | "booooobs", 55 | "booooooobs", 56 | "breasts", 57 | "buceta", 58 | "bugger", 59 | "bum", 60 | "bunny fucker", 61 | "butt", 62 | "butthole", 63 | "buttmuch", 64 | "buttplug", 65 | "c0ck", 66 | "c0cksucker", 67 | "carpet muncher", 68 | "cawk", 69 | "chink", 70 | "cipa", 71 | "cl1t", 72 | "clit", 73 | "clitoris", 74 | "clits", 75 | "cnut", 76 | "cock", 77 | "cock-sucker", 78 | "cockface", 79 | "cockhead", 80 | "cockmunch", 81 | "cockmuncher", 82 | "cocks", 83 | "cocksuck", 84 | "cocksucked", 85 | "cocksucker", 86 | "cocksucking", 87 | "cocksucks", 88 | "cocksuka", 89 | "cocksukka", 90 | "cok", 91 | "cokmuncher", 92 | "coksucka", 93 | "coon", 94 | "cox", 95 | "crap", 96 | "cum", 97 | "cummer", 98 | "cumming", 99 | "cums", 100 | "cumshot", 101 | "cunilingus", 102 | "cunillingus", 103 | "cunnilingus", 104 | "cunt", 105 | "cuntlick", 106 | "cuntlicker", 107 | "cuntlicking", 108 | "cunts", 109 | "cyalis", 110 | "cyberfuc", 111 | "cyberfuck", 112 | "cyberfucked", 113 | "cyberfucker", 114 | "cyberfuckers", 115 | "cyberfucking", 116 | "d1ck", 117 | "damn", 118 | "dick", 119 | "dickhead", 120 | "dildo", 121 | "dildos", 122 | "dink", 123 | "dinks", 124 | "dirsa", 125 | "dlck", 126 | "dog-fucker", 127 | "doggin", 128 | "dogging", 129 | "donkeyribber", 130 | "doosh", 131 | "duche", 132 | "dyke", 133 | "ejaculate", 134 | "ejaculated", 135 | "ejaculates", 136 | "ejaculating", 137 | "ejaculatings", 138 | "ejaculation", 139 | "ejakulate", 140 | "f u c k", 141 | "f u c k e r", 142 | "f4nny", 143 | "fag", 144 | "fagging", 145 | "faggitt", 146 | "faggot", 147 | "faggs", 148 | "fagot", 149 | "fagots", 150 | "fags", 151 | "fanny", 152 | "fannyflaps", 153 | "fannyfucker", 154 | "fanyy", 155 | "fatass", 156 | "fcuk", 157 | "fcuker", 158 | "fcuking", 159 | "feck", 160 | "fecker", 161 | "felching", 162 | "fellate", 163 | "fellatio", 164 | "fingerfuck", 165 | "fingerfucked", 166 | "fingerfucker", 167 | "fingerfuckers", 168 | "fingerfucking", 169 | "fingerfucks", 170 | "fistfuck", 171 | "fistfucked", 172 | "fistfucker", 173 | "fistfuckers", 174 | "fistfucking", 175 | "fistfuckings", 176 | "fistfucks", 177 | "flange", 178 | "fook", 179 | "fooker", 180 | "fuck", 181 | "fucka", 182 | "fucked", 183 | "fucker", 184 | "fuckers", 185 | "fuckhead", 186 | "fuckheads", 187 | "fuckin", 188 | "fucking", 189 | "fuckings", 190 | "fuckingshitmotherfucker", 191 | "fuckme", 192 | "fucks", 193 | "fuckwhit", 194 | "fuckwit", 195 | "fudge packer", 196 | "fudgepacker", 197 | "fuk", 198 | "fuker", 199 | "fukker", 200 | "fukkin", 201 | "fuks", 202 | "fukwhit", 203 | "fukwit", 204 | "fux", 205 | "fux0r", 206 | "f_u_c_k", 207 | "gangbang", 208 | "gangbanged", 209 | "gangbangs", 210 | "gaylord", 211 | "gaysex", 212 | "goatse", 213 | "God", 214 | "god-dam", 215 | "god-damned", 216 | "goddamn", 217 | "goddamned", 218 | "hardcoresex", 219 | "hell", 220 | "heshe", 221 | "hoar", 222 | "hoare", 223 | "hoer", 224 | "homo", 225 | "hore", 226 | "horniest", 227 | "horny", 228 | "hotsex", 229 | "jack-off", 230 | "jackoff", 231 | "jap", 232 | "jerk-off", 233 | "jism", 234 | "jiz", 235 | "jizm", 236 | "jizz", 237 | "kawk", 238 | "knob", 239 | "knobead", 240 | "knobed", 241 | "knobend", 242 | "knobhead", 243 | "knobjocky", 244 | "knobjokey", 245 | "kock", 246 | "kondum", 247 | "kondums", 248 | "kum", 249 | "kummer", 250 | "kumming", 251 | "kums", 252 | "kunilingus", 253 | "l3i+ch", 254 | "l3itch", 255 | "labia", 256 | "lust", 257 | "lusting", 258 | "m0f0", 259 | "m0fo", 260 | "m45terbate", 261 | "ma5terb8", 262 | "ma5terbate", 263 | "masochist", 264 | "master-bate", 265 | "masterb8", 266 | "masterbat*", 267 | "masterbat3", 268 | "masterbate", 269 | "masterbation", 270 | "masterbations", 271 | "masturbate", 272 | "mo-fo", 273 | "mof0", 274 | "mofo", 275 | "mothafuck", 276 | "mothafucka", 277 | "mothafuckas", 278 | "mothafuckaz", 279 | "mothafucked", 280 | "mothafucker", 281 | "mothafuckers", 282 | "mothafuckin", 283 | "mothafucking", 284 | "mothafuckings", 285 | "mothafucks", 286 | "mother fucker", 287 | "motherfuck", 288 | "motherfucked", 289 | "motherfucker", 290 | "motherfuckers", 291 | "motherfuckin", 292 | "motherfucking", 293 | "motherfuckings", 294 | "motherfuckka", 295 | "motherfucks", 296 | "muff", 297 | "mutha", 298 | "muthafecker", 299 | "muthafuckker", 300 | "muther", 301 | "mutherfucker", 302 | "n1gga", 303 | "n1gger", 304 | "nazi", 305 | "nigg3r", 306 | "nigg4h", 307 | "nigga", 308 | "niggah", 309 | "niggas", 310 | "niggaz", 311 | "nigger", 312 | "niggers", 313 | "nob", 314 | "nob jokey", 315 | "nobhead", 316 | "nobjocky", 317 | "nobjokey", 318 | "numbnuts", 319 | "nutsack", 320 | "orgasim", 321 | "orgasims", 322 | "orgasm", 323 | "orgasms", 324 | "p0rn", 325 | "pawn", 326 | "pecker", 327 | "penis", 328 | "penisfucker", 329 | "phonesex", 330 | "phuck", 331 | "phuk", 332 | "phuked", 333 | "phuking", 334 | "phukked", 335 | "phukking", 336 | "phuks", 337 | "phuq", 338 | "pigfucker", 339 | "pimpis", 340 | "piss", 341 | "pissed", 342 | "pisser", 343 | "pissers", 344 | "pisses", 345 | "pissflaps", 346 | "pissin", 347 | "pissing", 348 | "pissoff", 349 | "poop", 350 | "porn", 351 | "porno", 352 | "pornography", 353 | "pornos", 354 | "prick", 355 | "pricks", 356 | "pron", 357 | "pube", 358 | "pusse", 359 | "pussi", 360 | "pussies", 361 | "pussy", 362 | "pussys", 363 | "rectum", 364 | "retard", 365 | "rimjaw", 366 | "rimming", 367 | "s hit", 368 | "s.o.b.", 369 | "sadist", 370 | "schlong", 371 | "screwing", 372 | "scroat", 373 | "scrote", 374 | "scrotum", 375 | "semen", 376 | "sex", 377 | "sh!+", 378 | "sh!t", 379 | "sh1t", 380 | "shag", 381 | "shagger", 382 | "shaggin", 383 | "shagging", 384 | "shemale", 385 | "shi+", 386 | "shit", 387 | "shitdick", 388 | "shite", 389 | "shited", 390 | "shitey", 391 | "shitfuck", 392 | "shitfull", 393 | "shithead", 394 | "shiting", 395 | "shitings", 396 | "shits", 397 | "shitted", 398 | "shitter", 399 | "shitters", 400 | "shitting", 401 | "shittings", 402 | "shitty", 403 | "skank", 404 | "slut", 405 | "sluts", 406 | "smegma", 407 | "smut", 408 | "snatch", 409 | "son-of-a-bitch", 410 | "spac", 411 | "spunk", 412 | "s_h_i_t", 413 | "t1tt1e5", 414 | "t1tties", 415 | "teets", 416 | "teez", 417 | "testical", 418 | "testicle", 419 | "tit", 420 | "titfuck", 421 | "tits", 422 | "titt", 423 | "tittie5", 424 | "tittiefucker", 425 | "titties", 426 | "tittyfuck", 427 | "tittywank", 428 | "titwank", 429 | "tosser", 430 | "turd", 431 | "tw4t", 432 | "twat", 433 | "twathead", 434 | "twatty", 435 | "twunt", 436 | "twunter", 437 | "v14gra", 438 | "v1gra", 439 | "vagina", 440 | "viagra", 441 | "vulva", 442 | "w00se", 443 | "wang", 444 | "wank", 445 | "wanker", 446 | "wanky", 447 | "whoar", 448 | "whore", 449 | "willies", 450 | "willy", 451 | "xrated", 452 | "xxx", 453 | ]; 454 | -------------------------------------------------------------------------------- /client/main.lua: -------------------------------------------------------------------------------- 1 | local cam = nil 2 | local charPed = nil 3 | local QBCore = exports['qb-core']:GetCoreObject() 4 | 5 | -- Main Thread 6 | 7 | CreateThread(function() 8 | while true do 9 | Wait(0) 10 | if NetworkIsSessionStarted() then 11 | TriggerEvent('qb-multicharacter:client:chooseChar') 12 | return 13 | end 14 | end 15 | end) 16 | 17 | -- Functions 18 | 19 | local function skyCam(bool) 20 | TriggerEvent('qb-weathersync:client:DisableSync') 21 | if bool then 22 | DoScreenFadeIn(1000) 23 | SetTimecycleModifier('hud_def_blur') 24 | SetTimecycleModifierStrength(1.0) 25 | FreezeEntityPosition(PlayerPedId(), false) 26 | cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", Config.CamCoords.x, Config.CamCoords.y, Config.CamCoords.z, 0.0 ,0.0, Config.CamCoords.w, 60.00, false, 0) 27 | SetCamActive(cam, true) 28 | RenderScriptCams(true, false, 1, true, true) 29 | else 30 | SetTimecycleModifier('default') 31 | SetCamActive(cam, false) 32 | DestroyCam(cam, true) 33 | RenderScriptCams(false, false, 1, true, true) 34 | FreezeEntityPosition(PlayerPedId(), false) 35 | end 36 | end 37 | 38 | local function openCharMenu(bool) 39 | QBCore.Functions.TriggerCallback("qb-multicharacter:server:GetNumberOfCharacters", function(result) 40 | QBCore.Functions.TriggerCallback("qb-multi:server:GetCurrentPlayers", function(Players) 41 | SetNuiFocus(bool, bool) 42 | SendNUIMessage({ 43 | action = "ui", 44 | toggle = bool, 45 | nChar = result, 46 | enableDeleteButton = Config.EnableDeleteButton, 47 | players = Players, 48 | }) 49 | skyCam(bool) 50 | end) 51 | end) 52 | end 53 | 54 | -- Events 55 | 56 | AddEventHandler('QBCore:Client:OnPlayerLoaded', function() 57 | SendNUIMessage({ 58 | action = "stopMusic" 59 | }) 60 | end) 61 | 62 | RegisterNetEvent('qb-multicharacter:client:closeNUIdefault', function() -- This event is only for no starting apartments 63 | DeleteEntity(charPed) 64 | SetNuiFocus(false, false) 65 | DoScreenFadeOut(500) 66 | Wait(2000) 67 | SetEntityCoords(PlayerPedId(), Config.DefaultSpawn.x, Config.DefaultSpawn.y, Config.DefaultSpawn.z) 68 | TriggerServerEvent('QBCore:Server:OnPlayerLoaded') 69 | TriggerEvent('QBCore:Client:OnPlayerLoaded') 70 | TriggerServerEvent('qb-houses:server:SetInsideMeta', 0, false) 71 | TriggerServerEvent('qb-apartments:server:SetInsideMeta', 0, 0, false) 72 | Wait(500) 73 | openCharMenu() 74 | SetEntityVisible(PlayerPedId(), true) 75 | Wait(500) 76 | DoScreenFadeIn(250) 77 | TriggerEvent('qb-weathersync:client:EnableSync') 78 | TriggerEvent('qb-clothes:client:CreateFirstCharacter') 79 | end) 80 | 81 | RegisterNetEvent('qb-multicharacter:client:closeNUI', function() 82 | DeleteEntity(charPed) 83 | SetNuiFocus(false, false) 84 | end) 85 | 86 | RegisterNetEvent('qb-multicharacter:client:chooseChar', function() 87 | SetNuiFocus(false, false) 88 | DoScreenFadeOut(10) 89 | Wait(1000) 90 | local interior = GetInteriorAtCoords(Config.Interior.x, Config.Interior.y, Config.Interior.z - 18.9) 91 | LoadInterior(interior) 92 | while not IsInteriorReady(interior) do 93 | Wait(1000) 94 | end 95 | FreezeEntityPosition(PlayerPedId(), true) 96 | SetEntityCoords(PlayerPedId(), Config.HiddenCoords.x, Config.HiddenCoords.y, Config.HiddenCoords.z) 97 | Wait(1500) 98 | ShutdownLoadingScreen() 99 | ShutdownLoadingScreenNui() 100 | openCharMenu(true) 101 | end) 102 | 103 | -- NUI Callbacks 104 | 105 | RegisterNUICallback('closeUI', function(_, cb) 106 | openCharMenu(false) 107 | cb("ok") 108 | end) 109 | 110 | RegisterNUICallback('disconnectButton', function(_, cb) 111 | SetEntityAsMissionEntity(charPed, true, true) 112 | DeleteEntity(charPed) 113 | TriggerServerEvent('qb-multicharacter:server:disconnect') 114 | cb("ok") 115 | end) 116 | 117 | RegisterNUICallback('selectCharacter', function(data, cb) 118 | local cData = data.cData 119 | DoScreenFadeOut(10) 120 | TriggerServerEvent('qb-multicharacter:server:loadUserData', cData) 121 | openCharMenu(false) 122 | SetEntityAsMissionEntity(charPed, true, true) 123 | DeleteEntity(charPed) 124 | cb("ok") 125 | end) 126 | 127 | RegisterNUICallback('cDataPed', function(data, cb) 128 | local cData = data.cData 129 | SetEntityAsMissionEntity(charPed, true, true) 130 | DeleteEntity(charPed) 131 | if cData ~= nil then 132 | QBCore.Functions.TriggerCallback('qb-multicharacter:server:getSkin', function(model, data) 133 | model = model ~= nil and tonumber(model) or false 134 | if model ~= nil then 135 | CreateThread(function() 136 | RequestModel(model) 137 | while not HasModelLoaded(model) do 138 | Wait(0) 139 | end 140 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 141 | 142 | local RandomAnims = { 143 | "WORLD_HUMAN_HANG_OUT_STREET", 144 | "WORLD HUMAN STAND IMPATIENT", 145 | "WORLD_HUMAN_STAND_MOBILE", 146 | "WORLD_HUMAN_SMOKING_POT", 147 | "WORLD_HUMAN_LEANING", 148 | "WORLD_HUMAN_DRUG DEALER_HARD", 149 | "WORLD_HUMAN_SUPERHERO", 150 | "WORLD_HUMAN_TOURIST_MAP", 151 | "WORLD_HUMAN YOGA", 152 | "WORLD_HUMAN_BINOCULARS", 153 | "WORLD HUMAN BUM WASH", 154 | "WORLD_HUMAN_CONST_DRILL", 155 | "WORLD_HUMAN_MOBILE_FILM_SHOCKING", 156 | "WORLD HUMAN MUSCLE FLEX", 157 | "WORLD_HUMAN_MUSICIAN", 158 | "WORLD_HUMAN_PAPARAZZI", 159 | "WORLD_HUMAN_PARTYING", 160 | } 161 | local PlayAnim = RandomAnims[math.random(#RandomAnims)] 162 | SetPedCanPlayAmbientAnims(charPed, true) 163 | TaskStartScenarioInPlace(charPed, PlayAnim, 0, true) 164 | 165 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 166 | FreezeEntityPosition(charPed, false) 167 | SetEntityInvincible(charPed, true) 168 | PlaceObjectOnGroundProperly(charPed) 169 | SetBlockingOfNonTemporaryEvents(charPed, true) 170 | data = json.decode(data) 171 | TriggerEvent('qb-clothing:client:loadPlayerClothing', data, charPed) 172 | end) 173 | else 174 | CreateThread(function() 175 | local randommodels = { 176 | "mp_m_freemode_01", 177 | "mp_f_freemode_01", 178 | } 179 | local model = GetHashKey(randommodels[math.random(1, #randommodels)]) 180 | RequestModel(model) 181 | while not HasModelLoaded(model) do 182 | Wait(0) 183 | end 184 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 185 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 186 | FreezeEntityPosition(charPed, false) 187 | SetEntityInvincible(charPed, true) 188 | PlaceObjectOnGroundProperly(charPed) 189 | SetBlockingOfNonTemporaryEvents(charPed, true) 190 | end) 191 | end 192 | cb("ok") 193 | end, cData.citizenid) 194 | else 195 | CreateThread(function() 196 | local randommodels = { 197 | "mp_m_freemode_01", 198 | "mp_f_freemode_01", 199 | } 200 | local model = GetHashKey(randommodels[math.random(1, #randommodels)]) 201 | RequestModel(model) 202 | while not HasModelLoaded(model) do 203 | Wait(0) 204 | end 205 | charPed = CreatePed(2, model, Config.PedCoords.x, Config.PedCoords.y, Config.PedCoords.z - 0.98, Config.PedCoords.w, false, true) 206 | SetPedComponentVariation(charPed, 0, 0, 0, 2) 207 | FreezeEntityPosition(charPed, false) 208 | SetEntityInvincible(charPed, true) 209 | PlaceObjectOnGroundProperly(charPed) 210 | SetBlockingOfNonTemporaryEvents(charPed, true) 211 | end) 212 | cb("ok") 213 | end 214 | end) 215 | 216 | RegisterNUICallback('setupCharacters', function(data, cb) 217 | QBCore.Functions.TriggerCallback("qb-multicharacter:server:setupCharacters", function(result) 218 | SendNUIMessage({ 219 | action = "setupCharacters", 220 | characters = result 221 | }) 222 | cb("ok") 223 | end) 224 | end) 225 | 226 | RegisterNUICallback('removeBlur', function(data, cb) 227 | SetTimecycleModifier('default') 228 | cb("ok") 229 | end) 230 | 231 | RegisterNUICallback('createNewCharacter', function(data, cb) 232 | local cData = data 233 | DoScreenFadeOut(150) 234 | if cData.gender == "Male" then 235 | cData.gender = 0 236 | elseif cData.gender == "Female" then 237 | cData.gender = 1 238 | end 239 | TriggerServerEvent('qb-multicharacter:server:createCharacter', cData) 240 | Wait(500) 241 | cb("ok") 242 | end) 243 | 244 | RegisterNUICallback('removeCharacter', function(data, cb) 245 | TriggerServerEvent('qb-multicharacter:server:deleteCharacter', data.citizenid) 246 | TriggerEvent('qb-multicharacter:client:chooseChar') 247 | cb("ok") 248 | end) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Multi Character 15 | 16 | 17 | 18 |
19 |
20 |
21 |

22 |
23 | 72 | 143 |
144 |
145 | 146 |
147 |
148 |
149 |
150 |

Loading data

151 |
152 | 154 |
155 | 156 | 157 | 158 | 169 | 176 | 177 | 178 | 179 |
180 |
181 |

182 | Welcome, 183 |

184 | 185 |
    186 |
  • please
  • 187 |
  • choose
  • 188 |
  • your
  • 189 |
  • character
  • 190 |
191 |
192 |
193 | Empty Character Slot 194 |
195 |
196 | Empty Character Slot 197 |
198 |
199 | Empty Character Slot 200 |
201 |
202 | Empty Character Slot 203 |
204 |
205 | Empty Character Slot 206 |
207 |

Select a character

208 |

Select a character

209 |
210 | 211 |
212 |
infoInformation about character
213 |
214 | Select a Character Slot to see all the information about that character. 215 |
216 |
217 | 218 |
219 |
220 |

Character Registration

221 | close 222 |
223 |
224 | 225 | 226 | 227 | 228 | 232 |
233 |

Confirm data

234 |
235 | 236 |
237 |
238 |

Remove character

239 | close 240 |
241 | 242 |

Are you sure you want to delete this character?

243 |
244 |

All your character data will be deleted and cannot be recovered.

245 | 246 |

Remove character

247 |

Back

248 |
249 |
250 |
251 | 252 | 253 | 254 | -------------------------------------------------------------------------------- /html/script.js: -------------------------------------------------------------------------------- 1 | var selectedChar = null; 2 | var WelcomePercentage = "30vh" 3 | QBulticharacters = {} 4 | var Loaded = false; 5 | 6 | $(document).ready(function (){ 7 | window.addEventListener('message', function (event) { 8 | var data = event.data; 9 | 10 | if (data.action == "ui") { 11 | if (data.toggle) { 12 | $('.container').show(); 13 | $(".welcomescreen").fadeIn(150); 14 | QBulticharacters.resetAll(); 15 | 16 | var originalText = "Retrieve player information"; 17 | var loadingProgress = 0; 18 | var loadingDots = 0; 19 | $("#loading-text").html(originalText); 20 | var DotsInterval = setInterval(function() { 21 | $("#loading-text").append("."); 22 | loadingDots++; 23 | loadingProgress++; 24 | if (loadingProgress == 3) { 25 | originalText = "Validate player data" 26 | $("#loading-text").html(originalText); 27 | } 28 | if (loadingProgress == 4) { 29 | originalText = "Retrieve player characters" 30 | $("#loading-text").html(originalText); 31 | } 32 | if (loadingProgress == 6) { 33 | originalText = "Validate player characters" 34 | $("#loading-text").html(originalText); 35 | } 36 | if(loadingDots == 4) { 37 | $("#loading-text").html(originalText); 38 | loadingDots = 0; 39 | } 40 | }, 500); 41 | 42 | setTimeout(function(){ 43 | $.post('https://QB-multicharacter/setupCharacters'); 44 | setTimeout(function(){ 45 | clearInterval(DotsInterval); 46 | loadingProgress = 0; 47 | originalText = "Retrieve data"; 48 | $(".welcomescreen").fadeOut(150); 49 | QBulticharacters.fadeInDown('.character-info', '20%', 400); 50 | QBulticharacters.fadeInDown('.characters-list', '20%', 400); 51 | $.post('https://QB-multicharacter/removeBlur'); 52 | }, 2000); 53 | }, 2000); 54 | } else { 55 | $('.container').fadeOut(250); 56 | QBulticharacters.resetAll(); 57 | } 58 | } 59 | 60 | if (data.action == "setupCharacters") { 61 | setupCharacters(event.data.characters) 62 | } 63 | 64 | if (data.action == "setupCharInfo") { 65 | setupCharInfo(event.data.chardata) 66 | } 67 | }); 68 | 69 | $('.datepicker').datepicker(); 70 | }); 71 | 72 | $('.continue-btn').click(function(e){ 73 | e.preventDefault(); 74 | 75 | // QBulticharacters.fadeOutUp('.welcomescreen', undefined, 400); 76 | // QBulticharacters.fadeOutDown('.server-log', undefined, 400); 77 | // setTimeout(function(){ 78 | // QBulticharacters.fadeInDown('.characters-list', '20%', 400); 79 | // QBulticharacters.fadeInDown('.character-info', '20%', 400); 80 | // $.post('https://QB-multicharacter/setupCharacters'); 81 | // }, 400) 82 | }); 83 | 84 | $('.disconnect-btn').click(function(e){ 85 | e.preventDefault(); 86 | 87 | $.post('https://QB-multicharacter/closeUI'); 88 | $.post('https://QB-multicharacter/disconnectButton'); 89 | }); 90 | 91 | function setupCharInfo(cData) { 92 | if (cData == 'empty') { 93 | $('.character-info-valid').html('The selected character slot is not yet in use.

This character has no information yet.
'); 94 | } else { 95 | var gender = "" 96 | if (cData.charinfo.gender == "man") { gender = "Man" } 97 | if (cData.charinfo.gender == "woman") { gender = "Woman" } 98 | $('.character-info-valid').html( 99 | '
Name: '+cData.charinfo.firstname+' '+cData.charinfo.lastname+'
' + 100 | '
Date of birth: '+cData.charinfo.birthdate+'
' + 101 | '
Sex: '+gender+'
' + 102 | '
Nationality: '+cData.charinfo.nationality+'
' + 103 | '
Job: '+cData.job.label+'
' + 104 | '
Cash: $ '+cData.money.cash+'
' + 105 | '
Bank: $ '+cData.money.bank+'

' + 106 | '
Phone Number: '+cData.charinfo.phone+'
' + 107 | '
Account number: '+cData.charinfo.account+'
'); 108 | } 109 | } 110 | 111 | function setupCharacters(characters) { 112 | $.each(characters, function(index, char){ 113 | $('#char-'+char.cid).html(""); 114 | $('#char-'+char.cid).data("citizenid", char.citizenid); 115 | setTimeout(function(){ 116 | $('#char-'+char.cid).html(''+char.charinfo.firstname+' '+char.charinfo.lastname+'' + char.citizenid + ''); 117 | $('#char-'+char.cid).data('cData', char) 118 | $('#char-'+char.cid).data('cid', char.cid) 119 | }, 100) 120 | }) 121 | } 122 | 123 | $(document).on('click', '#close-log', function(e){ 124 | e.preventDefault(); 125 | selectedLog = null; 126 | $('.welcomescreen').css("filter", "none"); 127 | $('.server-log').css("filter", "none"); 128 | $('.server-log-info').fadeOut(250); 129 | logOpen = false; 130 | }); 131 | 132 | $(document).on('click', '.character', function(e) { 133 | var cDataPed = $(this).data('cData'); 134 | e.preventDefault(); 135 | if (selectedChar === null) { 136 | selectedChar = $(this); 137 | if ((selectedChar).data('cid') == "") { 138 | $(selectedChar).addClass("char-selected"); 139 | setupCharInfo('empty') 140 | $("#play-text").html("Create"); 141 | $("#play").css({"display":"block"}); 142 | $("#delete").css({"display":"none"}); 143 | $.post('https://QB-multicharacter/cDataPed', JSON.stringify({ 144 | cData: cDataPed 145 | })); 146 | } else { 147 | $(selectedChar).addClass("char-selected"); 148 | setupCharInfo($(this).data('cData')) 149 | $("#play-text").html("Play"); 150 | $("#delete-text").html("Delete"); 151 | $("#play").css({"display":"block"}); 152 | $("#delete").css({"display":"block"}); 153 | $.post('https://QB-multicharacter/cDataPed', JSON.stringify({ 154 | cData: cDataPed 155 | })); 156 | } 157 | } else if ($(selectedChar).attr('id') !== $(this).attr('id')) { 158 | $(selectedChar).removeClass("char-selected"); 159 | selectedChar = $(this); 160 | if ((selectedChar).data('cid') == "") { 161 | $(selectedChar).addClass("char-selected"); 162 | setupCharInfo('empty') 163 | $("#play-text").html("Create"); 164 | $("#play").css({"display":"block"}); 165 | $("#delete").css({"display":"none"}); 166 | $.post('https://QB-multicharacter/cDataPed', JSON.stringify({ 167 | cData: cDataPed 168 | })); 169 | } else { 170 | $(selectedChar).addClass("char-selected"); 171 | setupCharInfo($(this).data('cData')) 172 | $("#play-text").html("Play"); 173 | $("#delete-text").html("Delete"); 174 | $("#play").css({"display":"block"}); 175 | $("#delete").css({"display":"block"}); 176 | $.post('https://QB-multicharacter/cDataPed', JSON.stringify({ 177 | cData: cDataPed 178 | })); 179 | } 180 | } 181 | }); 182 | 183 | var entityMap = { 184 | '&': '&', 185 | '<': '<', 186 | '>': '>', 187 | '"': '"', 188 | "'": ''', 189 | '/': '/', 190 | '': '`', 191 | '=': '=' 192 | }; 193 | 194 | function escapeHtml(string) { 195 | return String(string).replace(/[&<>"'=/]/g, function (s) { 196 | return entityMap[s]; 197 | }); 198 | } 199 | function hasWhiteSpace(s) { 200 | return /\s/g.test(s); 201 | } 202 | 203 | $(document).on('click', '#create', function(e){ 204 | e.preventDefault(); 205 | 206 | let firstname= escapeHtml($('#first_name').val()) 207 | let lastname= escapeHtml($('#last_name').val()) 208 | let nationality= escapeHtml($('#nationality').val()) 209 | let birthdate= escapeHtml($('#birthdate').val()) 210 | let gender= escapeHtml($('select[name=gender]').val()) 211 | let cid = escapeHtml($(selectedChar).attr('id').replace('char-', '')) 212 | 213 | if (!firstname || !lastname || !nationality || !birthdate || hasWhiteSpace(firstname) || hasWhiteSpace(lastname)|| hasWhiteSpace(nationality) ){ 214 | console.log("FIELDS REQUIRED") 215 | }else{ 216 | $.post('https://QB-multicharacter/createNewCharacter', JSON.stringify({ 217 | firstname: $('#first_name').val(), 218 | lastname: $('#last_name').val(), 219 | nationality: $('#nationality').val(), 220 | birthdate: $('#birthdate').val(), 221 | gender: $('select[name=gender]').val(), 222 | cid: $(selectedChar).attr('id').replace('char-', ''), 223 | })); 224 | $(".container").fadeOut(150); 225 | $('.characters-list').css("filter", "none"); 226 | $('.character-info').css("filter", "none"); 227 | QBulticharacters.fadeOutDown('.character-register', '125%', 400); 228 | refreshCharacters() 229 | } 230 | }); 231 | 232 | $(document).on('click', '#accept-delete', function(e){ 233 | $.post('https://QB-multicharacter/removeCharacter', JSON.stringify({ 234 | citizenid: $(selectedChar).data("citizenid"), 235 | })); 236 | $('.character-delete').fadeOut(150); 237 | $('.characters-block').css("filter", "none"); 238 | refreshCharacters() 239 | }); 240 | 241 | $(document).on('click', '#cancel-delete', function(e){ 242 | e.preventDefault(); 243 | $('.characters-block').css("filter", "none"); 244 | $('.character-delete').fadeOut(150); 245 | }); 246 | 247 | function refreshCharacters() { 248 | $('.characters-list').html('
Empty Slot
Empty Slot
Empty Slot
Empty Slot
Empty Slot

Select a character

Select a character

') 249 | setTimeout(function(){ 250 | $(selectedChar).removeClass("char-selected"); 251 | selectedChar = null; 252 | $.post('https://QB-multicharacter/setupCharacters'); 253 | $("#delete").css({"display":"none"}); 254 | $("#play").css({"display":"none"}); 255 | QBulticharacters.resetAll(); 256 | }, 100) 257 | } 258 | 259 | $("#close-reg").click(function (e) { 260 | e.preventDefault(); 261 | $('.characters-list').css("filter", "none") 262 | $('.character-info').css("filter", "none") 263 | QBulticharacters.fadeOutDown('.character-register', '125%', 400); 264 | }) 265 | 266 | $("#close-del").click(function (e) { 267 | e.preventDefault(); 268 | $('.characters-block').css("filter", "none"); 269 | $('.character-delete').fadeOut(150); 270 | }) 271 | 272 | $(document).on('click', '#play', function(e) { 273 | e.preventDefault(); 274 | var charData = $(selectedChar).data('cid'); 275 | 276 | if (selectedChar !== null) { 277 | if (charData !== "") { 278 | $.post('https://QB-multicharacter/selectCharacter', JSON.stringify({ 279 | cData: $(selectedChar).data('cData') 280 | })); 281 | // QBulticharacters.fadeInDown('.welcomescreen', WelcomePercentage, 400); 282 | // QBulticharacters.fadeInDown('.server-log', '25%', 400); 283 | setTimeout(function(){ 284 | QBulticharacters.fadeOutDown('.characters-list', "-40%", 400); 285 | QBulticharacters.fadeOutDown('.character-info', "-40%", 400); 286 | QBulticharacters.resetAll(); 287 | }, 1500); 288 | } else { 289 | $('.characters-list').css("filter", "blur(2px)") 290 | $('.character-info').css("filter", "blur(2px)") 291 | QBulticharacters.fadeInDown('.character-register', '25%', 400); 292 | } 293 | } 294 | }); 295 | 296 | $(document).on('click', '#delete', function(e) { 297 | e.preventDefault(); 298 | var charData = $(selectedChar).data('cid'); 299 | 300 | if (selectedChar !== null) { 301 | if (charData !== "") { 302 | $('.characters-block').css("filter", "blur(2px)") 303 | $('.character-delete').fadeIn(250); 304 | } 305 | } 306 | }); 307 | 308 | QBulticharacters.fadeOutUp = function(element, time) { 309 | $(element).css({"display":"block"}).animate({top: "-80.5%",}, time, function(){ 310 | $(element).css({"display":"none"}); 311 | }); 312 | } 313 | 314 | QBulticharacters.fadeOutDown = function(element, percent, time) { 315 | if (percent !== undefined) { 316 | $(element).css({"display":"block"}).animate({top: percent,}, time, function(){ 317 | $(element).css({"display":"none"}); 318 | }); 319 | } else { 320 | $(element).css({"display":"block"}).animate({top: "103.5%",}, time, function(){ 321 | $(element).css({"display":"none"}); 322 | }); 323 | } 324 | } 325 | 326 | QBulticharacters.fadeInDown = function(element, percent, time) { 327 | $(element).css({"display":"block"}).animate({top: percent,}, time); 328 | } 329 | 330 | QBulticharacters.resetAll = function() { 331 | $('.characters-list').hide(); 332 | $('.characters-list').css("top", "-40"); 333 | $('.character-info').hide(); 334 | $('.character-info').css("top", "-40"); 335 | // $('.welcomescreen').show(); 336 | $('.welcomescreen').css("top", WelcomePercentage); 337 | $('.server-log').show(); 338 | $('.server-log').css("top", "25%"); 339 | } -------------------------------------------------------------------------------- /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=Righteous&display=swap'); 7 | 8 | .container { 9 | display: none; 10 | } 11 | 12 | .main-screen { 13 | position: absolute; 14 | height: 100vh; 15 | width: 100vw; 16 | left: 0; 17 | z-index: 100; 18 | } 19 | 20 | .characters-block { 21 | display: none; 22 | position: absolute; 23 | width: 800px; 24 | height: 550px; 25 | background-color: rgba(0, 0, 0, 0.9); 26 | top: -80%; 27 | margin: 0 auto; 28 | left: 0; 29 | right: 0; 30 | border-bottom: 2px solid #b12424; 31 | box-shadow: 0px 0px 6px 1px rgba(0,0,0,0.25); 32 | box-shadow: inset 0px 0px 150px 0px rgba(255, 255, 255, 0.1); 33 | overflow: visible !important; 34 | } 35 | 36 | .characters-block-header { 37 | position: relative; 38 | top: 0; 39 | width: 100%; 40 | height: 30px; 41 | background-color: #881a1a; 42 | border-bottom: 2px solid #fff; 43 | font-family: 'Righteous', cursive; 44 | box-shadow: inset 0px 0px 150px 0px rgba(255, 255, 255, 0.1); 45 | } 46 | 47 | .disconnect-server-btn { 48 | position: absolute; 49 | width: 80px; 50 | height: 60%; 51 | background-color: rgba(32, 32, 32, 0.822); 52 | left: 10px; 53 | bottom: 8px; 54 | border: 1px solid rgb(236, 236, 236); 55 | border-radius: 3px; 56 | transition: all 0.2s ease; 57 | } 58 | 59 | #close-reg { 60 | position: absolute; 61 | right: 8px; 62 | bottom: 6px; 63 | color: rgba(0, 0, 0, 1.0); 64 | background: rgb(214, 50, 50); 65 | border-radius: 50%; 66 | font-size: 18px; 67 | } 68 | 69 | #close-log { 70 | position: absolute; 71 | right: 8px; 72 | top: 8px; 73 | color: rgb(214, 50, 50); 74 | background: rgb(226, 226, 226); 75 | border-radius: 50%; 76 | } 77 | 78 | #close-del { 79 | position: absolute; 80 | right: 8px; 81 | bottom: 6px; 82 | color: rgba(0, 0, 0, 1.0); 83 | background: rgb(214, 50, 50); 84 | border-radius: 50%; 85 | font-size: 18px; 86 | } 87 | 88 | .disconnect-server-btn:hover { 89 | background-color: rgba(51, 51, 51, 0.89); 90 | border-radius: 4px; 91 | } 92 | 93 | .disconnect-server-btn > p { 94 | color: rgb(255, 255, 255); 95 | font-size: 13px; 96 | padding-top: 5%; 97 | padding-left: 6px; 98 | } 99 | 100 | .characters-block-header > p { 101 | text-align: center; 102 | color: white; 103 | line-height: 24px; 104 | font-family: 'Righteous', cursive; 105 | } 106 | 107 | .characters-list { 108 | display: none; 109 | position: absolute; 110 | width: 22%; 111 | height: auto; 112 | left: 13%; 113 | top: -40%; 114 | overflow: visible !important; 115 | 116 | -webkit-transform: perspective(1200px) rotateY(30deg) !important; 117 | -moz-transform: perspective(1200px) rotateY(30deg) !important; 118 | -ms-transform: perspective(1200px) rotateY(30deg) !important; 119 | -o-transform: perspective(1200px) rotateY(30deg) !important; 120 | transform: perspective(1200px) rotateY(30deg) !important; 121 | 122 | -webkit-transform-origin: 110% 25%; 123 | -moz-transform-origin: 110% 25%; 124 | -ms-transform-origin: 110% 25%; 125 | -o-transform-origin: 110% 25%; 126 | transform-origin: 110% 25%; 127 | 128 | padding: 20px; 129 | } 130 | 131 | .character-list-header { 132 | position: absolute; 133 | top: -20px; 134 | width: 100%; 135 | height: 8%; 136 | right: 0; 137 | } 138 | 139 | .character-list-header > p { 140 | text-align: center; 141 | line-height: 37px; 142 | font-family: 'Righteous', cursive; 143 | letter-spacing: 2px; 144 | font-weight: bold; 145 | color: white; 146 | } 147 | 148 | .character { 149 | /* background: url(https://cdn.discordapp.com/attachments/336575770917076993/788068590758658088/images.jpg),linear-gradient(-45deg, #ff000038, #ff000038, #ff000038, #ff000038); */ 150 | position: relative; 151 | width: 100%; 152 | height: 75px; 153 | margin-top: 15px; 154 | border: 2px solid #fff; 155 | background-color: rgba(0, 0, 0, 0.75); 156 | font-family: 'Righteous', cursive; 157 | border-bottom: 4px solid #74aa3200; 158 | transition: .1s linear; 159 | border-radius: .2vh; 160 | display: inline-block; 161 | vertical-align: middle; 162 | -webkit-animation: AnimationName 10s ease infinite; 163 | -moz-animation: AnimationName 10s ease infinite; 164 | animation: AnimationName 10s ease infinite; 165 | -webkit-transform: perspective(1px) translateZ(0); 166 | transform: perspective(1px) translateZ(0); 167 | position: relative; 168 | -webkit-transition-duration: 0.3s; 169 | transition-duration: 0.3s; 170 | -webkit-transition-property: transform; 171 | transition-property: transform 172 | } 173 | 174 | 175 | @media only screen and (max-height: 900px) { 176 | .character { 177 | /* background: url(https://cdn.discordapp.com/attachments/336575770917076993/788068590758658088/images.jpg),linear-gradient(-45deg, #ff000038, #ff000038, #ff000038, #ff000038); */ 178 | position: relative; 179 | width: 100%; 180 | height: 55px; 181 | margin-top: 15px; 182 | border: 2px solid #fff; 183 | background-color: rgba(0, 0, 0, 0.75); 184 | font-family: 'Righteous', cursive; 185 | border-bottom: 4px solid #74aa3200; 186 | transition: .1s linear; 187 | border-radius: .2vh; 188 | display: inline-block; 189 | vertical-align: middle; 190 | -webkit-animation: AnimationName 10s ease infinite; 191 | -moz-animation: AnimationName 10s ease infinite; 192 | animation: AnimationName 10s ease infinite; 193 | -webkit-transform: perspective(1px) translateZ(0); 194 | transform: perspective(1px) translateZ(0); 195 | position: relative; 196 | -webkit-transition-duration: 0.3s; 197 | transition-duration: 0.3s; 198 | -webkit-transition-property: transform; 199 | transition-property: transform 200 | } 201 | } 202 | 203 | 204 | .character:before { 205 | pointer-events: none; 206 | position: absolute; 207 | z-index: -1; 208 | content: ''; 209 | top: 100%; 210 | left: 5%; 211 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); 212 | height: 10px; 213 | width: 90%; 214 | /* background: url(https://cdn.discordapp.com/attachments/336575770917076993/788068590758658088/images.jpg),linear-gradient(-45deg, #ff000038, #ff000038, #ff000038, #ff000038); */ 215 | -webkit-transition-duration: 0.3s; 216 | transition-duration: 0.3s; 217 | -webkit-transition-property: transform, opacity; 218 | transition-property: transform, opacity; 219 | } 220 | .character:hover, .character:focus, .character:active { 221 | -webkit-transform: translateY(-5px); 222 | transform: translateY(-5px); 223 | /* background: url(https://cdn.discordapp.com/attachments/336575770917076993/788068590758658088/images.jpg),linear-gradient(-45deg, #ff000038, #ff000038, #ff000038, #ff000038); */ 224 | /* move the element up by 5px */ 225 | } 226 | .character:hover:before, .character:focus:before, .character:active:before { 227 | -webkit-transform: translateY(5px); 228 | transform: translateY(5px); 229 | /* background: url(https://cdn.discordapp.com/attachments/336575770917076993/788068590758658088/images.jpg),linear-gradient(-45deg, #ff000038, #ff000038, #ff000038, #ff000038); */ 230 | /* move the element down by 5px (it will stay in place because it's attached to the element that also moves up 5px) */ 231 | } 232 | 233 | .character > span { 234 | color: rgb(255, 255, 255); 235 | font-family: 'Righteous', cursive; 236 | } 237 | 238 | #cid { 239 | position: relative; 240 | float: right; 241 | font-size: 11px; 242 | right: 35px; 243 | line-height: 80px; 244 | } 245 | 246 | .char-selected { 247 | background-color: #832b2bde; 248 | } 249 | 250 | .disabled { 251 | background-color: rgba(0, 0, 0, 0.691); 252 | } 253 | 254 | #slot-name { 255 | position: relative; 256 | color: rgb(255, 255, 255); 257 | font-size: 17px; 258 | line-height: 80px; 259 | left: 20px; 260 | font-family: 'Righteous', cursive; 261 | } 262 | 263 | .character-btn { 264 | position: relative; 265 | width: 30%; 266 | height: 50px; 267 | top: 65%; 268 | transition: 0.2s; 269 | float: left; 270 | margin-top: 10px; 271 | margin-right: 10px; 272 | } 273 | 274 | .character-btn > p { 275 | color: white; 276 | text-align: center; 277 | text-transform: uppercase; 278 | line-height: 50px; 279 | } 280 | 281 | #play { 282 | display: none; 283 | background-color: #44bd32; 284 | border-radius: 4px; 285 | transition: all 0.2s ease; 286 | } 287 | 288 | #play:hover { 289 | background-color: #54d441; 290 | border-radius: 8px; 291 | } 292 | 293 | #delete { 294 | display: none; 295 | background-color: #c02b2b; 296 | border-radius: 4px; 297 | transition: all 0.2s ease; 298 | } 299 | 300 | #delete:hover { 301 | background-color: #eb3434; 302 | border-radius: 8px; 303 | } 304 | 305 | .character-info { 306 | /* background: url(https://cdn.discordapp.com/attachments/336575770917076993/788068602401914930/1514254114ad11fd0cbe2d42a8b85181.png),linear-gradient(-45deg, #73737326, #73737326, #73737326, #73737326); */ 307 | border: 2px solid #fff; 308 | display: none; 309 | position: absolute; 310 | width: 25%; 311 | height: 60%; 312 | right: 14%; 313 | top: -40%; 314 | -webkit-animation: AnimationName 10s ease infinite; 315 | -moz-animation: AnimationName 10s ease infinite; 316 | animation: AnimationName 10s ease infinite; 317 | background-color: rgba(0, 0, 0, 0.5); 318 | overflow: visible !important; 319 | -webkit-transform: perspective(1200px) rotateY(-25deg) !important; 320 | -moz-transform: perspective(1200px) rotateY(-25deg) !important; 321 | -ms-transform: perspective(1200px) rotateY(-25deg) !important; 322 | -o-transform: perspective(1200px) rotateY(-25deg) !important; 323 | transform: perspective(1200px) rotateY(-25deg) !important; 324 | 325 | -webkit-transform-origin: 110% 25%; 326 | -moz-transform-origin: 110% 25%; 327 | -ms-transform-origin: 110% 25%; 328 | -o-transform-origin: 110% 25%; 329 | transform-origin: 110% 25%; 330 | } 331 | 332 | @-webkit-keyframes AnimationName { 333 | 0%{background-position:0% 50%} 334 | 50%{background-position:100% 50%} 335 | 100%{background-position:0% 50%} 336 | } 337 | @-moz-keyframes AnimationName { 338 | 0%{background-position:0% 50%} 339 | 50%{background-position:100% 50%} 340 | 100%{background-position:0% 50%} 341 | } 342 | @keyframes AnimationName { 343 | 0%{background-position:0% 50%} 344 | 50%{background-position:100% 50%} 345 | 100%{background-position:0% 50%} 346 | } 347 | 348 | #char-info-icon { 349 | position: relative; 350 | font-size: 28px; 351 | color: white; 352 | right: 20px; 353 | overflow: visible !important; 354 | } 355 | 356 | #char-info-titel { 357 | position: absolute; 358 | font-size: 17px; 359 | color: white; 360 | top: 7px; 361 | left: 14px; 362 | overflow: visible !important; 363 | } 364 | 365 | #no-char { 366 | position: absolute; 367 | color: rgb(255, 255, 255); 368 | font-size: 16px; 369 | top: 30%; 370 | text-align: center; 371 | } 372 | 373 | .char-info-titel { 374 | position: relative; 375 | left: 28%; 376 | top: 3%; 377 | overflow: visible !important; 378 | } 379 | 380 | .character-info-valid { 381 | position: relative; 382 | top: 10%; 383 | overflow: visible !important; 384 | } 385 | 386 | .character-info-box { 387 | position: relative; 388 | color: white; 389 | font-family: 'Righteous', cursive; 390 | font-size: 16px; 391 | width: 100%; 392 | height: 20px; 393 | border-bottom: 2px solid #fff; 394 | margin-bottom: 12px; 395 | } 396 | 397 | .char-info-js { 398 | position: absolute; 399 | left: 50%; 400 | } 401 | 402 | #info-label { 403 | margin-left: 10px; 404 | } 405 | 406 | .character-delete { 407 | display: none; 408 | position: absolute; 409 | width: 500px; 410 | height: 250px; 411 | top: 200px; 412 | left: 70px; 413 | right: 0; 414 | margin-left: auto; 415 | margin-right: auto; 416 | border-bottom: 4px solid #b12424; 417 | background-color: rgba(0, 0, 0, 0.7); 418 | box-shadow: 0px 0px 19px 1px rgba(0,0,0,0.54); 419 | text-align: center; 420 | color: white; 421 | font-family: 'Righteous', cursive; 422 | overflow: visible !important; 423 | } 424 | 425 | .characters-delete-block-header { 426 | position: absolute; 427 | background-color: rgba(0, 0, 0, 0.7); 428 | width: 100%; 429 | height: 11%; 430 | color: rgb(255, 255, 255); 431 | text-align: center; 432 | font-size: 11px; 433 | line-height: 29px; 434 | font-family: 'Righteous', cursive; 435 | border-bottom: 2px solid #b12424; 436 | overflow: visible !important; 437 | } 438 | 439 | .characters-delete-block-header > p { 440 | font-family: 'Righteous', cursive; 441 | overflow: visible !important; 442 | } 443 | 444 | .character-delete > p { 445 | padding-top: 50px; 446 | font-size: 16px; 447 | overflow: visible !important; 448 | } 449 | 450 | #yeet { 451 | font-size: 12px; 452 | overflow: visible !important; 453 | } 454 | 455 | .character-acceptdel-btn { 456 | position: absolute; 457 | width: 43%; 458 | height: 13%; 459 | bottom: 0; 460 | left: 5%; 461 | margin-bottom: 15px; 462 | background-color: #78ca2c; 463 | border-radius: 4px; 464 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 465 | transition: 0.2s; 466 | overflow: visible !important; 467 | } 468 | 469 | .character-acceptdel-btn:hover { 470 | background-color: #67af25; 471 | } 472 | 473 | .character-canceldel-btn { 474 | position: absolute; 475 | width: 43%; 476 | height: 13%; 477 | bottom: 0; 478 | right: 5%; 479 | margin-bottom: 15px; 480 | background-color: #ca382c; 481 | border-radius: 4px; 482 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 483 | transition: 0.2s; 484 | overflow: visible !important; 485 | } 486 | 487 | .character-canceldel-btn:hover { 488 | background-color: #aa3126; 489 | } 490 | 491 | .character-acceptdel-btn > p { 492 | color: white; 493 | text-align: center; 494 | padding-top: 7px; 495 | font-family: 'Righteous', cursive; 496 | overflow: visible !important; 497 | } 498 | 499 | .character-canceldel-btn > p { 500 | color: white; 501 | text-align: center; 502 | padding-top: 7px; 503 | font-family: 'Righteous', cursive; 504 | overflow: visible !important; 505 | } 506 | 507 | .character-register { 508 | display: none; 509 | position: relative; 510 | width: 25%; 511 | height: 28%; 512 | top: 125%; 513 | margin-left: auto; 514 | margin-right: auto; 515 | left: 32px; 516 | background-color: rgba(0, 0, 0, 0.7); 517 | box-shadow: 0px 0px 19px 1px rgba(0,0,0,0.54); 518 | font-family: 'Righteous', cursive; 519 | border-bottom: 4px solid #b12424; 520 | } 521 | 522 | .characters-register-block-header { 523 | position: absolute; 524 | background-color: rgba(0, 0, 0, 0.7); 525 | width: 100%; 526 | height: 11%; 527 | color: rgb(255, 255, 255); 528 | text-align: center; 529 | font-size: 11px; 530 | line-height: 29px; 531 | font-family: 'Righteous', cursive; 532 | border-bottom: 2px solid #b12424; 533 | } 534 | 535 | .char-register-inputs { 536 | position: absolute; 537 | top: 15%; 538 | left: 12%; 539 | overflow: visible !important; 540 | } 541 | 542 | .char-reg-input { 543 | position: relative; 544 | float: left; 545 | margin-left: 35px; 546 | margin-top: 13px; 547 | border: none; 548 | background-color: rgba(0, 0, 0, 0.808); 549 | outline: none; 550 | width: 120px; 551 | height: 30px; 552 | color: white; 553 | max-width: 100%; 554 | padding: 4px; 555 | border-radius: 2px 2px 4px 4px; 556 | box-shadow: inset 0px 0px 10px 0px rgba(255, 255, 255, 0.1); 557 | border: 1px solid #b12424bb; 558 | font-family: 'Righteous', cursive; 559 | text-align: center; 560 | transition: all 0.2s ease-in-out; 561 | } 562 | 563 | .char-reg-input:hover { 564 | background-color: rgba(34, 34, 34, 0.808); 565 | } 566 | 567 | .char-reg-input:focus { 568 | background-color: rgba(34, 34, 34, 0.808); 569 | border: 1px solid #b12424; 570 | } 571 | 572 | select { 573 | position: absolute; 574 | border: none; 575 | background-color: rgba(0, 0, 0, 0.808); 576 | outline: none; 577 | width: 295px; 578 | height: 30px; 579 | top: 120px; 580 | left: 35px; 581 | color: white; 582 | max-width: 100%; 583 | padding: 4px; 584 | border-radius: 2px 2px 4px 4px; 585 | box-shadow: inset 0px 0px 10px 0px rgba(255, 255, 255, 0.1); 586 | border: 1px solid #b12424bb; 587 | font-family: 'Righteous', cursive; 588 | text-align-last: center; 589 | -webkit-appearance: none; 590 | -moz-appearance: none; 591 | text-indent: 1px; 592 | text-overflow: ''; 593 | transition: all 0.2s ease-in-out; 594 | } 595 | 596 | select:hover { 597 | background-color: rgba(34, 34, 34, 0.808); 598 | } 599 | 600 | select:focus { 601 | background-color: rgba(34, 34, 34, 0.808); 602 | border: 1px solid #b12424; 603 | } 604 | 605 | #gender option { 606 | background-color: transparent; 607 | border: none; 608 | outline: none; 609 | } 610 | 611 | select::placeholder { 612 | text-align: center; 613 | } 614 | 615 | select::-ms-expand { 616 | display: none; 617 | } 618 | 619 | .char-reg-input::placeholder { 620 | color: rgba(255, 255, 255, 0.52); 621 | } 622 | 623 | input[type="date"] { 624 | color: white; 625 | font-family: 'Righteous', cursive; 626 | text-align: center; 627 | } 628 | 629 | input[type=date]::-webkit-calendar-picker-indicator{ 630 | display: none; 631 | } 632 | 633 | input[type=date]::-webkit-inner-spin-button, 634 | input[type=date]::-webkit-outer-spin-button { 635 | -webkit-appearance: none; 636 | margin: 0; 637 | } 638 | 639 | input[type="date"]::-webkit-input-placeholder{ 640 | visibility: hidden !important; 641 | } 642 | 643 | input[type="date"]::-webkit-clear-button { 644 | display: none; 645 | } 646 | 647 | #birthdate { 648 | color: white; 649 | text-align: center; 650 | font-family: 'Righteous', cursive;: 'Lato', monospace; 651 | } 652 | 653 | .character-reg-btn { 654 | position: absolute; 655 | width: auto; 656 | max-width: 50%; 657 | height: 36px; 658 | background-color: #ca382c; 659 | border-radius: 4px; 660 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 661 | bottom: 5%; 662 | margin: 0 auto; 663 | left: 0; 664 | right: 0; 665 | } 666 | 667 | .character-reg-btn > p { 668 | text-align: center; 669 | line-height: 34px; 670 | color: white; 671 | font-family: 'Righteous', cursive; 672 | font-size: 13px; 673 | } 674 | 675 | .bars div{ 676 | animation-name: an-height; 677 | animation-duration: .6s; 678 | z-index: 101; 679 | } 680 | @keyframes an-height { 681 | from{ height: 0px; } 682 | } 683 | .topbar { 684 | position: absolute; 685 | background: url(); 686 | background-size: cover; 687 | top: 0; 688 | left: 0; 689 | width: 100%; 690 | height: 23%; 691 | text-align: center; 692 | line-height: 5vh; 693 | font-family: 'Righteous', cursive; 694 | font-weight: bolder; 695 | font-size: 1.75vh; 696 | color: white; 697 | /* border-bottom: 3px solid #b12424; */ 698 | } 699 | 700 | 701 | .bottombar { 702 | position: absolute; 703 | background-color: rgb(0, 0, 0); 704 | bottom: 0; 705 | left: 0; 706 | width: 100%; 707 | height: 7%; 708 | border-top: 3px solid #b12424; 709 | } 710 | 711 | .server-log { 712 | position: relative; 713 | width: 30%; 714 | height: 28%; 715 | top: 25%; 716 | margin-left: auto; 717 | margin-right: auto; 718 | background-color: rgba(0, 0, 0, 0.7); 719 | box-shadow: 0px 0px 19px 1px rgba(0,0,0,0.54); 720 | font-family: 'Righteous', cursive; 721 | border-bottom: 4px solid #b12424; 722 | border-radius: 0px 0px 10px 10px; 723 | } 724 | 725 | .server-log-header { 726 | position: absolute; 727 | background-color: rgba(0, 0, 0, 0.7); 728 | width: 100%; 729 | height: 10%; 730 | color: rgb(255, 255, 255); 731 | text-align: center; 732 | font-size: 11px; 733 | line-height: 30px; 734 | font-family: 'Righteous', cursive; 735 | border-bottom: 2px solid #b12424; 736 | } 737 | 738 | .log { 739 | position: relative; 740 | top: 30px; 741 | color: rgb(255, 255, 255); 742 | font-family: 'Righteous', cursive; 743 | margin-top: 20px; 744 | } 745 | 746 | #log-date { 747 | color: #ff4646; 748 | font-size: 12px; 749 | padding-left: 10px; 750 | text-shadow: 0px 0px 4px rgba(0,0,0,0.35); 751 | font-family: 'Righteous', cursive; 752 | } 753 | 754 | #log-changes { 755 | position: relative; 756 | top: 10px; 757 | left: 30px; 758 | font-size: 10px; 759 | text-shadow: 0px 0px 4px rgba(0,0,0,0.35); 760 | font-family: 'Righteous', cursive; 761 | } 762 | 763 | .welcomescreen { 764 | display: block; 765 | position: absolute; 766 | margin: 0 auto; 767 | left: 0; 768 | right: 0; 769 | top: 1%; 770 | height: 28%; 771 | width: 30%; 772 | overflow: visible !important; 773 | } 774 | 775 | .welcomescreen > p { 776 | position: relative; 777 | color: #ffffff; 778 | text-align: center; 779 | overflow: visible !important; 780 | } 781 | 782 | #welcome-titel { 783 | position: relative; 784 | top: 45px; 785 | left: 20px; 786 | font-size: 30px; 787 | font-family: 'Righteous', cursive; 788 | font-weight: bolder; 789 | } 790 | 791 | #unwind-logo { 792 | position: absolute; 793 | width: 60px; 794 | top: 10.5%; 795 | left: 21%; 796 | } 797 | 798 | .continue-btn { 799 | position: absolute; 800 | left: 3.5%; 801 | width: 45%; 802 | top: 75%; 803 | height: 3.6vh; 804 | background-color: #ca382c; 805 | border-radius: .2vh; 806 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 807 | transition: .1s linear; 808 | } 809 | 810 | .continue-btn:hover { 811 | background-color: #fa4b3b; 812 | } 813 | 814 | .continue-btn > p { 815 | text-align: center; 816 | line-height: 3.6vh; 817 | color: white; 818 | text-transform: uppercase; 819 | font-family: 'Righteous', cursive; 820 | } 821 | 822 | .disconnect-btn { 823 | position: absolute; 824 | right: 3.5%; 825 | width: 45%; 826 | top: 75%; 827 | height: 3.6vh; 828 | background-color: #ca382c; 829 | border-radius: .2vh; 830 | box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.342); 831 | transition: .1s linear; 832 | } 833 | 834 | .disconnect-btn:hover { 835 | background-color: #fa4b3b; 836 | } 837 | 838 | .disconnect-btn > p { 839 | text-align: center; 840 | line-height: 3.6vh; 841 | color: white; 842 | text-transform: uppercase; 843 | font-family: 'Righteous', cursive;; 844 | } 845 | 846 | ::-webkit-scrollbar-track 847 | { 848 | background-color: #F5F5F5; 849 | } 850 | 851 | ::-webkit-scrollbar 852 | { 853 | width: 3px; 854 | background-color: #b12424e5; 855 | } 856 | 857 | ::-webkit-scrollbar-thumb 858 | { 859 | background-color: #b12424e5; 860 | } 861 | 862 | .loading-rondje { 863 | position: absolute; 864 | margin: 0 auto; 865 | left: 0; 866 | right: 0; 867 | top: 50%; 868 | width: 150px; 869 | height: 150px; 870 | transform: translateY(-50%); 871 | text-align: center; 872 | padding: 1vh; 873 | } 874 | 875 | .loading-rondje > p { 876 | color: white; 877 | margin-top: 1vh; 878 | font-family: 'Righteous', cursive; 879 | text-shadow: 1px 1px 0px #00000085; 880 | } 881 | 882 | .lds-ring { 883 | display: inline-block; 884 | position: relative; 885 | width: 80px; 886 | height: 80px; 887 | } 888 | 889 | .lds-ring div { 890 | box-sizing: border-box; 891 | display: block; 892 | position: absolute; 893 | width: 64px; 894 | height: 64px; 895 | border: 8px solid #fff; 896 | border-radius: 50%; 897 | animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; 898 | border-color: #fff transparent transparent transparent; 899 | } 900 | 901 | .lds-ring div:nth-child(1) { 902 | animation-delay: -0.45s; 903 | } 904 | 905 | .lds-ring div:nth-child(2) { 906 | animation-delay: -0.3s; 907 | } 908 | 909 | .lds-ring div:nth-child(3) { 910 | animation-delay: -0.15s; 911 | } 912 | 913 | @keyframes lds-ring { 914 | 0% { 915 | transform: rotate(0deg); 916 | } 917 | 100% { 918 | transform: rotate(360deg); 919 | } 920 | } 921 | 922 | 923 | .content { 924 | position: absolute; 925 | top: 50%; 926 | left: 50%; 927 | -webkit-transform: translate(-50%, -50%); 928 | transform: translate(-50%, -50%); 929 | height: 160px; 930 | overflow: hidden; 931 | font-family: 'Righteous', cursive; 932 | font-size: 55px; 933 | color: #fff; 934 | } 935 | .content__container { 936 | font-weight: 600; 937 | font-family: 'Righteous', cursive; 938 | overflow: hidden; 939 | height: 40px; 940 | padding: 0 40px; 941 | } 942 | .content__container:before { 943 | content: '['; 944 | left: 0; 945 | } 946 | .content__container:after { 947 | content: ']'; 948 | position: absolute; 949 | right: 0; 950 | } 951 | .content__container:after, .content__container:before { 952 | position: absolute; 953 | top: 24px; 954 | color: #ff0000; 955 | font-size: 42px; 956 | line-height: 40px; 957 | -webkit-animation-name: opacity; 958 | -webkit-animation-duration: 2s; 959 | -webkit-animation-iteration-count: infinite; 960 | animation-name: opacity; 961 | animation-duration: 2s; 962 | animation-iteration-count: infinite; 963 | } 964 | .content__container__text { 965 | display: inline; 966 | font-family: 'Righteous', cursive; 967 | color: #fff; 968 | font-size: 30px; 969 | float: left; 970 | margin: 0; 971 | } 972 | .content__container__list { 973 | margin-top: -10px; 974 | font-family: 'Righteous', cursive; 975 | padding-left: 40px; 976 | text-align: left; 977 | list-style: none; 978 | -webkit-animation-name: change; 979 | -webkit-animation-duration: 10s; 980 | -webkit-animation-iteration-count: infinite; 981 | animation-name: change; 982 | animation-duration: 10s; 983 | animation-iteration-count: infinite; 984 | } 985 | .content__container__list__item { 986 | font-family: 'Righteous', cursive; 987 | line-height: 50px; 988 | color: #fff; 989 | font-size: 30px; 990 | margin: 0; 991 | } 992 | 993 | @-webkit-keyframes opacity { 994 | 0%, 100% { 995 | opacity: 0; 996 | } 997 | 50% { 998 | opacity: 1; 999 | } 1000 | } 1001 | @-webkit-keyframes change { 1002 | 0%, 12.66%, 100% { 1003 | -webkit-transform: translate3d(0, 0, 0); 1004 | transform: translate3d(0, 0, 0); 1005 | } 1006 | 16.66%, 29.32% { 1007 | -webkit-transform: translate3d(0, -25%, 0); 1008 | transform: translate3d(0, -25%, 0); 1009 | } 1010 | 33.32%,45.98% { 1011 | -webkit-transform: translate3d(0, -50%, 0); 1012 | transform: translate3d(0, -50%, 0); 1013 | } 1014 | 49.98%,62.64% { 1015 | -webkit-transform: translate3d(0, -75%, 0); 1016 | transform: translate3d(0, -75%, 0); 1017 | } 1018 | 66.64%,79.3% { 1019 | -webkit-transform: translate3d(0, -50%, 0); 1020 | transform: translate3d(0, -50%, 0); 1021 | } 1022 | 83.3%,95.96% { 1023 | -webkit-transform: translate3d(0, -25%, 0); 1024 | transform: translate3d(0, -25%, 0); 1025 | } 1026 | } 1027 | @keyframes opacity { 1028 | 0%, 100% { 1029 | opacity: 0; 1030 | } 1031 | 50% { 1032 | opacity: 1; 1033 | } 1034 | } 1035 | @keyframes change { 1036 | 0%, 12.66%, 100% { 1037 | -webkit-transform: translate3d(0, 0, 0); 1038 | transform: translate3d(0, 0, 0); 1039 | } 1040 | 16.66%, 29.32% { 1041 | -webkit-transform: translate3d(0, -25%, 0); 1042 | transform: translate3d(0, -25%, 0); 1043 | } 1044 | 33.32%,45.98% { 1045 | -webkit-transform: translate3d(0, -50%, 0); 1046 | transform: translate3d(0, -50%, 0); 1047 | } 1048 | 49.98%,62.64% { 1049 | -webkit-transform: translate3d(0, -75%, 0); 1050 | transform: translate3d(0, -75%, 0); 1051 | } 1052 | 66.64%,79.3% { 1053 | -webkit-transform: translate3d(0, -50%, 0); 1054 | transform: translate3d(0, -50%, 0); 1055 | } 1056 | 83.3%,95.96% { 1057 | -webkit-transform: translate3d(0, -25%, 0); 1058 | transform: translate3d(0, -25%, 0); 1059 | } 1060 | } 1061 | --------------------------------------------------------------------------------