Config = Config or {} Config.Debug = false -- Set to true for Debugging (Keep false for live server) --------------------------------------------------------------------------------------- -- SCRIPT INTEGRATIONS -- --------------------------------------------------------------------------------------- -- Which third-party script the phone talks to. "auto" detects the running one. Config.Framework = "es_extended" -- auto, es_extended, qb-core, qbx_core, standalone Config.Inventory = "ox_inventory" -- auto, codem-inventory, qb-inventory, ox_inventory, core_inventory, qs-inventory, tgiann-inventory, framework, custom Config.BankScript = "M-Banking" -- auto, qb-banking, Renewed-Banking, okokBanking, fd_banking, ps-banking, esx_society, M-Banking, framework, custom Config.GarageScript = "jg-advancedgarages" -- auto, framework, esx_garage, qb-garages, cd_garage, jg-advancedgarages, loaf_garage, qs-advancedgarages, custom Config.HouseScript = "bcs_housing" -- auto, none, loaf_housing, bcs_housing, vms_housing, qs-housing, ps-housing, rtx_housing, qb-houses, esx_property Config.LicenseScript = "bcs_licensemanager" -- auto, framework, esx_license, bcs_licensemanager, cs_license, qs-licenses, custom Config.VoiceScript = "pma-voice" -- auto, none, pma-voice, mumble-voip, saltychat, yaca-voice --------------------------------------------------------------------------------------- -- DATABASE SETTINGS -- --------------------------------------------------------------------------------------- Config.DatabaseAutoSetup = true -- Automatically create database tables (Recommended: true) Config.DatabaseAutoFix = true -- false: write the changes to database_fix.sql instead of applying them (Recommended: true) --------------------------------------------------------------------------------------- -- GENERAL PHONE SETTINGS -- --------------------------------------------------------------------------------------- Config.DefaultLocale = "en" -- Default Language (en, tr, de, fr, es, etc.) Config.Locales = {"af", "ar", "cs", "de", "en", "es", "fr", "id", "nl", "pt-PT", "ro", "sv", "th", "tr", "uk", "zh-TW"} Config.OpenPhone = "F1" -- Key to open phone Config.RegisterCommandName = "iphone" -- Command to open phone (/phone) Config.KeyMapping = false -- Enable key mapping (Recommended: true) Config.WaitPhone = 2 -- ms between control-block passes while the phone is open; 0 is per frame -- Item Settings Config.ItemRequire = true -- Is an item required to use the phone? Config.DefaultPhoneModel = "iphone" -- Default phone model if ItemRequire is false (iphone or phone) Config.SetupScreen = true -- Show setup screen on first use? (false: skips setup) Config.PinLength = 4 -- Phone lock PIN length: 4 or 6 -- Phone Models and Item Names -- These names MUST match the item names in your inventory! Config.ItemName = { ["iphone"] = "ios", -- "iphone" item opens iOS interface ["phone"] = "android" -- "phone" item opens Android interface } -- Phone Props (Objects) Config.PropName = { ["iphone"] = "patoche_iphone_15_gkphone", ["phone"] = "patoche_galaxy_s23_gkphone" } Config.PropActive = true -- Show phone prop in hand when using? -- Other Settings Config.SerialNumberPrefix = "GKS" -- Prefix for phone serial numbers Config.AirSharePlayerName = true -- Show player names in AirShare (False: shows ID) Config.MetaItem = false -- Use metadata for phones? (If inventory supports it) Config.AutoDeleteData = true -- Auto-delete old data? Config.AutoDeleteDays = 5 -- Delete data older than X days Config.deleteCharacter = false -- Delete phone data when character is deleted? (WARNING: Deletes messages etc.) Config.UnderWaterCheck = false -- Prevent phone usage underwater? Config.RealApplication = false -- Enable if you purchased Real APP Integration Config.RealAppJoinCode = "" -- Only the code part from cfx.re/join/xxxxx (e.g. "a8q9z5"); required for RealApp QR login Config.allowPhoneWhileCuffed = false -- Allow phone usage while cuffed? Config.allowPhoneWhileDead = false -- Allow phone usage while dead? Config.PerformanceModeDefault = false -- Start new phones with Performance Mode on? (turns glass/blur off) --------------------------------------------------------------------------------------- -- BIOMETRIC UNLOCK -- --------------------------------------------------------------------------------------- -- Look ID unlock. PIN always stays available as fallback. Config.Biometric = { FaceId = { BlockWhenMasked = true, -- false = a mask no longer blocks Look ID; the player's own setting still decides the PIN MaskComponent = 1, -- Mask component slot NoMaskDrawable = 0, -- Drawable meaning "no mask" -- Mask slot also holds earpieces, bandanas, gang flags. Fill one list. -- /faceidcheck (Config.Debug) shows the ids you wear. Empty = all masks. NotMasks = { -- All masks except these male = {}, -- e.g. { 51, 52, 53 } female = {} }, MaskDrawables = { -- Only these are masks (wins if filled) male = {}, female = {} }, BlockWhenHelmet = false, -- Treat helmets as face coverings too HelmetProp = 0, -- Hat/helmet prop slot ObstructingHelmets = { -- Props covering the face (empty = all) male = {}, -- e.g. { 16, 17, 18 } female = {} }, FailChance = 0 -- 0-100 random failure chance }, -- ### FAILED ATTEMPTS ### -- Lockout = { MaxAttempts = 5, -- Failures before a cooldown starts LockoutSeconds = 30, -- First cooldown length EscalationFactor = 2, -- Each further cooldown multiplies by this MaxLockoutSeconds = 300 -- Cooldown ceiling } } --------------------------------------------------------------------------------------- -- SCREEN DAMAGE / REPAIR -- --------------------------------------------------------------------------------------- -- Screen health 0-100, stored per phone. Cosmetic only unless Restrictions.Enabled. Config.ScreenDamage = { Enabled = true, -- Master toggle for the whole system -- ### DAMAGE SEVERITY ### -- -- Screen health thresholds. Health at or below the value uses that level. Severity = { Light = 75, -- 76-100 pristine (no overlay), 46-75 light Medium = 45, -- 16-45 medium cracks Heavy = 15 -- 0-15 heavy cracks }, -- ### DAMAGE TRIGGERS ### -- -- Chance is 0-100 percent. Amount is the screen health lost. Triggers = { Death = { Enabled = true, Chance = 35, -- Chance the screen cracks on death Amount = { min = 10, max = 30 } }, VehicleCrash = { Enabled = true, Chance = 50, Amount = { min = 15, max = 35 }, SpeedThreshold = 90.0, -- km/h; slower crashes are ignored SpeedDrop = 40.0 -- km/h lost in one tick to count as a crash }, Fall = { Enabled = true, Chance = 40, Amount = { min = 10, max = 25 }, MinHeight = 8.0 -- Metres fallen before it can crack }, Water = { Enabled = true, Chance = 60, Amount = { min = 5, max = 15 }, SecondsUnderwater = 6 -- Time submerged before damage applies } }, -- ### REPAIR ### -- Repair = { PricePerPoint = 12, -- Cost per missing health point MinPrice = 150, WaterDamageSurcharge = 500, -- Extra cost when water damaged Jobs = { "mechanic", "electronic" }, -- Jobs that can repair others' phones AllowSelfRepair = true, -- Players may repair their own phone SelfRepairFactor = 1.75, -- Markup for self repair Duration = 15, -- Seconds a repair takes Cooldown = 60 -- Seconds before the same player repairs again }, -- ### FUNCTIONAL RESTRICTIONS ### -- Restrictions = { Enabled = false, -- Master toggle for gameplay restrictions BlockAppsOnHeavy = false, -- Heavy damage prevents opening apps AlwaysAllowed = { "contacts", "dispatch", "settings" } -- Never blocked } } --------------------------------------------------------------------------------------- -- PHONE HEALTH -- --------------------------------------------------------------------------------------- -- Battery health, shown on the Phone Health page. Wears with charge cycles. Config.PhoneHealth = { Enabled = true, -- Master toggle for the health page Battery = { -- ### WEAR ### -- Degradation = { Enabled = true, LossPerCycle = 0.5, -- Health lost per full charge cycle PointsPerCycle = 100 -- Charge points that make one cycle }, -- ### CONDITION TIERS ### -- -- Health at or below the value uses that tier. Thresholds = { Fair = 85, -- 86-100 good, 66-85 fair Poor = 65, -- 46-65 poor Service = 45 -- 0-45 needs service }, -- ### GAMEPLAY EFFECT ### -- DrainScaling = { Enabled = true, -- Worn batteries drain faster MaxMultiplier = 2.0 -- Drain rate at 0% health }, -- ### REPLACEMENT ### -- Replacement = { Price = 2500, -- Cost of a new battery Jobs = {}, -- Empty: follows ScreenDamage.Repair.Jobs AllowSelfReplace = true, SelfReplaceFactor = 1.5, -- Markup for doing it yourself Duration = 20 -- Seconds the swap takes at the NPC } } } --------------------------------------------------------------------------------------- -- TARGET (EYE) SETTINGS -- --------------------------------------------------------------------------------------- Config.EyeTarget = true -- Enable ox_target or qb-target support --------------------------------------------------------------------------------------- -- APP SETTINGS -- --------------------------------------------------------------------------------------- -- ### PHONE NUMBER ### -- Config.PhoneNumber = {} Config.PhoneNumber.Length = 5 -- Phone number length (Excluding area code) Config.PhoneNumber.Prefixes = { -- AREA CODES (Add your own) "386", } -- ### BANKING ### -- Config.BankTransferTax = 10 -- Transfer tax (%) Config.OfflineBankTransfer = false -- Allow transfers to offline players? Config.MetaBankTransfer = false -- Allow accessing bank from another player's phone? -- ### VALET & GARAGE ### -- Config.ValePrice = 100 -- Valet price Config.ValespawnRadius = 150.0 -- Distance for valet spawn point from player (capped at 300m in code) Config.ValeNPC = true -- Enable Valet NPC? Config.ValeNPCModel = "s_m_y_valet_01" -- Valet NPC model Config.ImpoundVale = true -- Allow bring impounded vehicles via valet? (True: Cannot bring) Config.ValeFixTakeOut = false -- Repair vehicle upon retrieval? Config.ServerSideSpawnVehicle = false -- true: server spawns (OneSync-correct), false: client spawns Config.ValeBlaclistCars = { -- Vehicles NOT calllable via Valet "police", "police2", "police3", "ambulance", } Config.ValeMaxOffRoadDistance = 30.0 -- Max distance from road for valet delivery (if player is further, valet will not deliver) Config.ValeSpawnClearance = 3.0 -- Min free space around the spawn point (0 disables the check) Config.ValeMaxDeliverySeconds = 180 -- Max time the valet NPC may take to deliver (min 30) -- ### CAR SELLER ### -- Config.CarSellerAppFee = 10 -- Car sale tax (%) Config.SellerBlaclistCars = { -- Vehicles that CANNOT be sold "police", "police2", "police3", "ambulance", } -- ### ADVERTISING ### -- Config.AdvertisingPrice = 1000 -- Price to post an ad Config.AdvertisingCooldown = 5 -- Cooldown between ads (Minutes) -- ### TWITTER (X) ### -- Config.TwitterVerifyCommand = "twitterverify" -- Command for verified badge (Admin) Config.TwitterSendBlockCommand = "blocktwitter" -- Command to block user (Admin) Config.TwitterSendBanCommand = "bantwitter" -- Command to ban user (Admin) Config.TwitterSubsDate = 5 -- Twitter Blue duration (Days) Config.TwitterSubsPay = 15 -- Twitter Blue price (Game Money) -- ### CRYPTO & STOCK ### -- Config.StockMarket = false -- Enable Stock Market? Config.Qbit = false -- Enable QBit? (Requires qb-crypto & qb-core) -- Fictional Stocks (FiveM Compliant) Config.Stocks = { } Config.StockUpdateInterval = 60 -- Price update interval in minutes Config.StockMaxHolding = 500 -- Max shares a player can hold per stock (0 = unlimited) Config.StockMaxBuyPerTransaction = 100 -- Max shares per single buy transaction (0 = unlimited) Config.StockPriceMaxChange = 0.005 -- Max price change per update cycle (0.005 = 0.5%) Config.StockPriceCeiling = 2.0 -- Max price multiplier of initial_price (2.0 = 2x) Config.StockPriceFloor = 0.5 -- Min price multiplier of initial_price (0.5 = 50%) Config.RefundActive = false -- Enable refund system? (If true, it will refund the old crypto prices) Config.RefundRates = { } -- ### LIVE STREAM ### -- Config.LiveStreamCoinTax = 10 -- Tax taken when coin is sold for money (%) Config.LiveStreamCheerRate = 1.0 -- How much cheer $1 buys Config.LiveStreamMinCoinSell = 250 -- Least coin that can be sold at once -- Gifts, their prices and their overlays live in config/livestream.json -- Simulated viewers and tips. Names come from config/livestream.json. Config.LiveStreamNpcAudience = { Enabled = false, -- Leave off unless streaming should pay on its own ViewerRange = { 3, 40 }, -- How many NPCs a stream draws GiftInterval = { 90, 300 }, -- Seconds between one tip and the next GiftPool = {}, -- Gift ids from livestream.json; empty means any MaxCoinPerHour = 500, -- Most coin one stream can earn this way in an hour MinRealViewers = 0, -- Real viewers needed before NPCs start tipping AfkTimeout = 600 -- Seconds without moving before the tips stop } -- ### MUSIC APP ### -- Config.MusicUploadEnabled = true -- Allow users to upload music? Config.MusicMaxDuration = 600 -- Maximum music duration in seconds (600 = 10 minutes) Config.MusicAllowedFormats = { "mp3", "ogg" } -- Allowed audio file formats -- ### MDT (POLICE TABLET) ### -- Config.MDTApp = false -- Enable MDT App? (Integrated with qb-core) -- ### PHONE BOOTHS ### -- Config.PhoneBox = false -- Enable phone booths? Config.PhoneBoxKey = "E" -- Key to use Config.PhoneBoxRegCom = "phonebox" -- Command to create booth Config.PhoneBootNumber = "22222" -- Booth number Config.PhoneBoothMoney = { actived = true, money = 500 } -- Usage fee Config.PhoneBoothModel = { -- Booth models [1281992692] = true, [1158960338] = true, [295857659] = true, [-78626473] = true, [-2103798695] = true, [1511539537] = true, [-1559354806] = true } --------------------------------------------------------------------------------------- -- SIM & OPERATORS -- --------------------------------------------------------------------------------------- Config.UseSIMPackage = false -- Enable SIM package system? Config.LimitPhoneNumbers = 3 -- Max numbers per player Config.DefaultOperator = "GKS" -- Default Operator Config.DefaultPackage = 1 -- Default Package ID -- Data usage (MB) per action when SIM packages are enabled (Config.UseSIMPackage = true) Config.UseSIMData = { ["AdvertisingPost"] = 20, ["AdvertisingDelete"] = 10, ["CarSellerAdd"] = 20, ["CarSellerDelete"] = 10, ["CarSellerBuy"] = 20, ["CryptoBuy"] = 20, ["CryptoSell"] = 30, ["CryptoTransfer"] = 20, ["DarkChatNewChannel"] = 20, ["DarkChatRemoveChannel"] = 10, ["DarkChatGetMessage"] = 50, ["DarkChatSendMessage"] = 30, ["DispatchSendChatMessage"] = 20, ["DispatchSendReport"] = 30, ["GamesScoreSave"] = 5, ["LiveStreamCreate"] = 100, ["LiveStreamWatch"] = 100, ["MailSend"] = 10, ["PlaytubeSearch"] = 50, ["SquawkPost"] = 20, ["SquawkLike"] = 5, ["SquawkRetweet"] = 5, ["SquawkPostDelete"] = 5, ["TaxiCall"] = 10, ["TaxijobAccept"] = 10, ["SendMessage"] = 1 } -- ### OPERATOR LIST ### -- Config.Operators = { ["GKS"] = { ["name"] = "GKS", ["label"] = "GKS Turkcell", ["sms"] = 1, ["call"] = 1, ["internet"] = 1, ["newnumber"] = 1000 }, ["GMobile"] = { ["name"] = "GKS", ["label"] = "GMobile Vodafone", ["sms"] = 1, ["call"] = 1, ["internet"] = 1, ["newnumber"] = 1000 }, ["GCellular"] = { ["name"] = "GKS", ["label"] = "GCellular Avea", ["sms"] = 1, ["call"] = 1, ["internet"] = 1, ["newnumber"] = 1000 } } -- ### SIM PACKAGES ### -- Config.SIMPackages = { ["GKS"] = { { ["package_name"] = "Young 1", ["package_price"] = 100, ["package_sms"] = 1000, ["package_call"] = 1000, ["package_internet"] = 1000 }, { ["package_name"] = "Young 2", ["package_price"] = 200, ["package_sms"] = 2000, ["package_call"] = 2000, ["package_internet"] = 2000 }, { ["package_name"] = "Ultra", ["package_price"] = 400, ["package_sms"] = 4000, ["package_call"] = 4000, ["package_internet"] = 4000 } }, ["GMobile"] = { { ["package_name"] = "Economy", ["package_price"] = 100, ["package_sms"] = 1000, ["package_call"] = 1000, ["package_internet"] = 1000 }, { ["package_name"] = "Medium", ["package_price"] = 200, ["package_sms"] = 2000, ["package_call"] = 2000, ["package_internet"] = 2000 }, { ["package_name"] = "Pro", ["package_price"] = 400, ["package_sms"] = 4000, ["package_call"] = 4000, ["package_internet"] = 4000 } }, ["GCellular"] = { { ["package_name"] = "Starter", ["package_price"] = 100, ["package_sms"] = 1000, ["package_call"] = 1000, ["package_internet"] = 1000 }, { ["package_name"] = "Retired", ["package_price"] = 200, ["package_sms"] = 2000, ["package_call"] = 2000, ["package_internet"] = 2000 }, { ["package_name"] = "Full", ["package_price"] = 400, ["package_sms"] = 4000, ["package_call"] = 4000, ["package_internet"] = 4000 } } } --------------------------------------------------------------------------------------- -- BILLING SYSTEM -- --------------------------------------------------------------------------------------- Config.UseBillingCommission = false -- Enable billing commission system? Config.AutoPaidBillDelete = true -- Auto-delete paid bills? Config.UnpaidBillInterest = false -- Add interest to unpaid bills? Config.BillInterest = { day = 7, percent = 20 } -- 20% interest after 7 days -- Job Commission Rates (Percentage going to the player issuing the bill) Config.BillingCommissions = { mechanic = 0.10, -- 10% police = 0.20 -- 20% } -- Who receives the payment? (true = player, false = society account) Config.BillPlayerFeeJobs = { ["police"] = false, -- Goes to police society ["taxi"] = true, -- Goes to taxi driver } --------------------------------------------------------------------------------------- -- TAXI JOB SETTINGS -- --------------------------------------------------------------------------------------- Config.TaxiPaymentMethod = "billing" -- Payment method: billing or bank Config.TaxiPrice = 100 -- Price per KM Config.TaxiJobCode = "taxi" -- Job name in database Config.JobRequirement = false -- Require job to be a taxi driver? Config.TaxiVehicleWhitelist = {} -- Empty: any vehicle with 3+ seats. Add model names to allow only specific vehicles. -- Example: Config.TaxiVehicleWhitelist = { "taxi", "stretch", "baller" } Config.AITaxi = true -- Enable AI Taxi if no players online? Config.AITaxiCarModel = "taxi" -- AI Taxi vehicle Config.TaxiCustomerNPC = true -- Enable NPC missions? Config.TaxiPenaltyMin = 2 -- Penalty time if mission cancelled (Minutes) Config.TaxiTipNPC = math.random(5, 30) -- NPC tip amount Config.TaxiTipChance = 60 -- Tip chance (%) Config.TaxiBlips = { customer = { blip = 280, colour = 3, routeColour = 3, scale = 0.7, text = "Taxi Customer" }, destination = { blip = 1, colour = 5, routeColour = 5, scale = 0.7, text = "Destination" }, AITaxi = { blip = 198, colour = 5, scale = 0.7, text = "AI Taxi" } } -- ### NPC TAXI ROUTES ### -- Config.TaxiRoutesNPC = { { coord = vec4(-1378.91, -74.53, 51.29, 12.09), street = "ROCKFORD HILLS", npcName = "Bailey Sykes" }, { coord = vec4(-352.58, -1445.13, 28.43, 5.09), street = "LA PUERTA", npcName = "Aroush Goodwin" }, { coord = vec4(374.12, -415.62, 44.97, 36.24), street = "ALTA", npcName = "Tom Warren" }, { coord = vec4(-2111.71, -351.48, 13.01, 154.43), street = "PACIFIC BLUFFS", npcName = "Abdallah Friedman" }, { coord = vec4(-1412.03, -567.61, 29.37, 216.83), street = "DEL PERRO", npcName = "Lavinia Powell" }, { coord = vec4(285.46, 1092.02, 215.63, 304.25), street = "VINEWOOD HILLS", npcName = "Andrew Delarosa" }, { coord = vec4(150.27, -999.73, 29.36, 162.48), street = "LEGION SQUARE", npcName = "Mira Khan" }, { coord = vec4(1809.97, 3868.91, 33.97, 25.48), street = "SANDY SHORES", npcName = "Adrian Leung" }, { coord = vec4(1681.32, 4822.3, 42.06, 111.86), street = "GRAPESEED", npcName = "Sofia Costa" }, { coord = vec4(-241.61, 6304.86, 31.45, 224.48), street = "PALETO BAY", npcName = "Maya Gaines" }, { coord = vec4(1366.54, -592.7, 74.38, 350.37), street = "MIRROR PARK", npcName = "Leslie Mack" } } Config.TaxiNPCPedModels = { "a_f_m_bevhills_01", "a_f_y_bevhills_03", "a_m_y_beachvesp_01", "a_m_y_hasjew_01", "a_m_y_genstreet_01", "a_m_y_ktown_02", "a_f_y_runner_01", "a_f_o_ktown_01", "a_m_m_business_01", "a_f_y_hippie_01", "a_f_y_tourist_01", "a_m_m_soucent_01", "a_m_y_skater_01", "a_f_m_ktown_01", "a_f_y_beach_01", "a_m_o_soucent_02", "a_m_y_vinewood_01", "a_m_m_hillbilly_01", "a_f_y_scdressy_01", "a_m_y_stbla_02" } --------------------------------------------------------------------------------------- -- MECHANIC REQUEST APP -- --------------------------------------------------------------------------------------- -- Players call a mechanic; mechanics quote a price. No NPC fallback. Config.Mechanic = { Enabled = false, JobCode = "mechanic", -- Main job name in the database -- Extra jobs sharing the same call pool. -- { "bennys", "tuner" } or { ["bennys"] = true } both work. AlternativeJobs = {}, RequireDuty = true, -- Only clocked-in mechanics receive requests BillingDescription = "Mechanic service", -- Uses Config.BillingCommissions -- Allowed quote range; enforced server side. Quote = { Min = 0, Max = 25000, }, CompleteDistance = 20.0, -- How close the mechanic must be to finish RequestTimeout = 600, -- Seconds before an unanswered request expires CancelCooldown = 120, -- Seconds before a caller may request again -- Request types offered to the customer. `label` is a locale key. Types = { { id = "repair", label = "MECHANICAPP.TYPE_REPAIR", icon = "wrench", action = "repair", -- Repairs the customer's vehicle }, { id = "fuel", label = "MECHANICAPP.TYPE_FUEL", icon = "drop", action = "fuel", FuelAmount = 100.0, -- Litres restored; 100 fills the tank }, { id = "tow", label = "MECHANICAPP.TYPE_TOW", icon = "car_fill", action = "none", -- Roleplayed by the mechanic; no auto effect }, }, Blip = { enabled = true, blip = 402, colour = 5, scale = 0.8, text = "Mechanic Request" }, } --------------------------------------------------------------------------------------- -- RESTAURANTS / FOOD ORDER -- --------------------------------------------------------------------------------------- -- Players order food from player-staffed restaurants. Menus live in the -- database; register a restaurant with: -- exports['gksphone']:CreateRestaurant('burgershot', 'Burger Shot') Config.Restaurant = { Enabled = false, RequireDuty = true, -- Only clocked-in staff receive orders MenuEditGrade = 3, -- Job grade needed to edit the menu BillingDescription = "Food order", -- Uses Config.BillingCommissions DeliveryDistance = 20.0, -- How close the courier must be to hand over OrderTimeout = 900, -- Seconds before an unanswered order expires CancelCooldown = 120, -- Seconds before a customer may order again Cart = { MaxPerItem = 10, -- Max quantity per menu line MaxItems = 20, -- Max lines per order }, -- Menu categories offered in the editor. `label` is a locale key. Categories = { { id = "food", label = "RESTAURANTAPP.CATEGORY_FOOD" }, { id = "drink", label = "RESTAURANTAPP.CATEGORY_DRINK" }, { id = "dessert", label = "RESTAURANTAPP.CATEGORY_DESSERT" }, }, -- Sellable food items. Names only; labels and images come from the inventory. Items = { "burger", "sandwich", "hotdog", "pizza", "taco", "donut", "water", "cola", "coffee", "beer", "energydrink", }, -- Item image paths per inventory. Set to false to show no images. ItemImagePath = { ["ox_inventory"] = "nui://ox_inventory/web/images/", ["qb-inventory"] = "nui://qb-inventory/html/images/", ["qs-inventory"] = "nui://qs-inventory/html/images/", ["core_inventory"] = "nui://core_inventory/html/img/", ["tgiann-inventory"] = "nui://tgiann-inventory/html/itemimages/", ["codem-inventory"] = "nui://codem-inventory/html/itemimages/", }, Blip = { enabled = true, blip = 267, colour = 5, scale = 0.8, text = "Food Delivery" }, } --------------------------------------------------------------------------------------- -- COURIER / DELIVERY JOB -- --------------------------------------------------------------------------------------- -- Delivery job open to anyone. Pay scales with depot-to-address distance. Config.Courier = { Enabled = false, AutoNextJob = true, -- Hand out the next job without being asked MaxParcels = 5, -- Parcels a courier may carry from one depot at once Payment = { Base = 120, -- Flat pay per delivery PerKm = 45, -- Added per kilometre MinKm = 0.5, -- Distance floor used for pay MaxPay = 650, -- Ceiling for one delivery }, Limits = { Cooldown = 30, -- Seconds before the next job is offered MaxPerHour = 20, -- Deliveries per hour, per character MinSeconds = 20, -- Minimum run time before hand-over is accepted Timeout = 1800, -- Seconds before a carried parcel is taken back }, -- Distance the server accepts a pickup or hand-over from. Kept loose as a -- latency margin; InteractDistance is what the player actually feels. PickupDistance = 12.0, DeliveryDistance = 12.0, -- How close the courier must stand for the prompt and the E key. InteractDistance = 2.0, -- Parcel pickup points; the nearest is used when a job is offered. Depots = { { label = "Post OP Depot", coords = vector3(69.4, 125.6, 79.1) }, { label = "Cypress Flats Yard", coords = vector3(830.7, -2160.4, 29.6) }, { label = "Elysian Island Docks", coords = vector3(129.0, -3204.5, 5.9) }, { label = "Paleto Bay Depot", coords = vector3(-197.1, 6255.4, 31.5) }, { label = "Sandy Shores Depot", coords = vector3(1698.5, 3585.4, 35.6) }, }, -- Delivery addresses (examples; replace with your own locations). Addresses = { { label = "Vespucci Beach", coords = vector3(-1223.9, -1487.1, 4.4) }, { label = "Mirror Park", coords = vector3(1129.7, -644.9, 56.6) }, { label = "Vinewood Hills", coords = vector3(-174.6, 502.4, 137.4) }, { label = "Little Seoul", coords = vector3(-663.3, -854.9, 24.5) }, { label = "Rockford Hills", coords = vector3(-1287.4, -430.8, 33.7) }, { label = "Strawberry", coords = vector3(281.5, -1974.6, 22.0) }, { label = "Del Perro Pier", coords = vector3(-1608.6, -1015.9, 13.0) }, { label = "La Mesa", coords = vector3(826.2, -1289.5, 28.2) }, { label = "Burton", coords = vector3(-643.9, -12.9, 44.2) }, { label = "Pillbox Hill", coords = vector3(215.8, -810.1, 30.7) }, { label = "Grapeseed", coords = vector3(1698.2, 4924.5, 42.1) }, { label = "Sandy Shores", coords = vector3(1961.1, 3740.5, 32.3) }, { label = "Paleto Bay", coords = vector3(-378.9, 6067.5, 31.5) }, { label = "Harmony", coords = vector3(1207.4, 2660.0, 37.9) }, { label = "Chumash", coords = vector3(-3193.4, 1091.5, 20.8) }, { label = "Banham Canyon", coords = vector3(-3049.5, 736.0, 22.0) }, { label = "Davis", coords = vector3(114.5, -1961.3, 21.3) }, { label = "Mission Row", coords = vector3(441.3, -981.9, 30.7) }, }, Blip = { enabled = true, blip = 478, colour = 27, scale = 0.8, text = "Courier" }, } --------------------------------------------------------------------------------------- -- BLINK (disappearing snaps) -- --------------------------------------------------------------------------------------- -- Snaps are deleted after being watched. Nothing is archived. Config.Blink = { Enabled = false, MaxDuration = 10, -- Max seconds a snap stays on screen MaxRecipients = 10, -- Max recipients per snap UnopenedLifetime = 86400, -- Seconds before an unopened snap is swept StoryLifetime = 86400, -- Seconds before a story expires LocationLifetime = 86400, -- Seconds a map position stays without refresh MaxVideoSeconds = 10, -- Max length of a video snap Chat = { SweepSeconds = 300, -- How often the sweeper runs }, -- Consecutive days two friends have both sent each other a snap. Streaks = { Enabled = true, WindowSeconds = 86400, -- Time to trade snaps before the streak lapses MinimumDays = 3, -- Days before the flame appears WarnSeconds = 14400, -- Time left when the hourglass shows }, } --------------------------------------------------------------------------------------- -- JOB SERVICES & PERMISSIONS -- --------------------------------------------------------------------------------------- Config.IsServicesAutoOpenClose = true -- Auto open/close services based on duty count? -- Jobs to ignore for auto open/close. true = always open, false = follow duty. Config.ServicesAutoIgnoredJobs = { ["police"] = true, ["ambulance"] = true, ["mechanic"] = false, } -- Numeric values are the minimum job grade required for that action. -- isOpen = open on server start, canCall = allow calling the job centre, -- autoCallByDuty = open the call option automatically, Duty = show duty action, -- playerNotifications = notify the other player on Review, -- alternativejobs = extra jobs, jobNumber = dial number, showInList = list it. Config.JOBServices = { ["police"] = { messageView = 1, messageSend = 1, reportView = 1, reportDeleteAll = 1, openClosingAuth = 13, location = vector4(420.4995, -990.2830, 29.4694, 243.1262), label = "Police", isOpen = true, canCall = true, autoCallByDuty = false, Duty = true, playerNotifications = true, alternativejobs= { ["lspd"] = true, ["bcso"] = true, ["sahp"] = true, ["sheriff"] = true, ["fbi"] = true, ["doj"] = true, ["state"] = true }, jobNumber = "113", billing = { view = 13, create = 13, delete = 13, pay = 13, }, employe = { view = 13, changeRank = 13, fire = 13, add = 13, }, jobBalanceView = 1, showInList = true }, ["ambulance"] = { messageView = 1, messageSend = 1, reportView = 1, reportDeleteAll = 1, openClosingAuth = 1, location = vector4(-311.1595, -604.7235, 32.7694, 90.9654), label = "EMS", isOpen = true, canCall = true, autoCallByDuty = false, Duty = true, playerNotifications = true, alternativejobs = { ["ems"] = true, ["hospital"] = true, ["doctor"] = true, ["medic"] = true }, jobNumber = "112", billing = { view = 7, create = 7, delete = 7, pay = 7, }, employe = { view = 7, changeRank = 7, fire = 7, add = 7, }, jobBalanceView = 2, showInList = true }, ["amirkebab"] = { messageView = 2, messageSend = 2, reportView = 2, reportDeleteAll = 2, openClosingAuth = 2, location = vector4(-1273.5879, -1204.0369, 4.9122, 233.1157), label = "Kebab", isOpen = true, canCall = true, autoCallByDuty = false, Duty = true, playerNotifications = true, jobNumber = "111", billing = { view = 4, create = 4, delete = 4, pay = 4, }, employe = { view = 4, changeRank = 4, fire = 4, add = 4, }, jobBalanceView = 3, showInList = true }, ["hayes"] = { messageView = 2, messageSend = 2, reportView = 2, reportDeleteAll = 2, openClosingAuth = 2, location = vector4(263.6761, -1826.1046, 26.7795, 248.5844), label = "Hayes", isOpen = true, canCall = true, autoCallByDuty = false, Duty = true, playerNotifications = true, jobNumber = "110", billing = { view = 4, create = 4, delete = 4, pay = 4, }, employe = { view = 4, changeRank = 4, fire = 4, add = 4, }, jobBalanceView = 4, showInList = true }, ["lscustoms"] = { messageView = 1, messageSend = 1, reportView = 1, reportDeleteAll = 1, openClosingAuth = 1, location = vector4(1143.2579, -772.5074, 57.6500, 236.6009), label = "LS Customs", isOpen = true, canCall = true, autoCallByDuty = false, Duty = true, playerNotifications = true, jobNumber = "109", billing = { view = 4, create = 4, delete = 4, pay = 4, }, employe = { view = 4, changeRank = 4, fire = 4, add = 4, }, jobBalanceView = 5, showInList = true }, } --------------------------------------------------------------------------------------- -- CUSTOM APPS -- --------------------------------------------------------------------------------------- Config.CustomApps = {} --------------------------------------------------------------------------------------- -- CUSTOM WIDGETS -- --------------------------------------------------------------------------------------- -- Third-party home widgets (iframe). Client-only register via: -- exports['gksphone']:AddCustomWidget({ id, widgetUrl, title, icon, size, ... }) Config.CustomWidgets = {} --------------------------------------------------------------------------------------- -- MAP LOCATIONS -- --------------------------------------------------------------------------------------- Config.Locations = { { position = vector2(428.9, -984.5), name = "LSPD", description = "Los Santos Police Department", icon = "https://cdn.discordapp.com/attachments/1535970649078763622/1548078570289500233/Policija.webp?ex=6aa5c005&is=6aa46e85&hm=394136494301d5528c998c775bf3250a771fee9448035c305e4ce4444f005322&", }, { position = vector2(304.2, -587.0), name = "Hospital", description = "Pillbox Hospital", icon = "https://cdn-icons-png.flaticon.com/512/4006/4006511.png", }, { position = vector2(268.9636, -1827.5227), name = "Hayes", description = "Hayes Auto Dealership", }, { position = vector2(16.7261, -1115.8896), name = "Gun Club", description = "Ammu-Nation Gun Club", }, { position = vector2(369.5256, -346.4583), name = "Ariba", description = "Ariba Clothing Store", }, { position = vector2(-1651.6277, -1082.7183), name = "Arcade Bar", description = "Arcade Bar", }, { position = vector2(-1269.6393, -1208.7366), name = "Amir kebab", description = "Amir Kebab Fast Food", }, } --------------------------------------------------------------------------------------- -- PHONE RECOVERY / CRACKER NPC -- --------------------------------------------------------------------------------------- -- NPC service that unlocks phones the player cannot get into. Two modes: -- repair - legal, slower, pricier, no police risk, never wipes data -- hacker - black market, cheaper, takes owner-locked jobs, can alert police -- and wipe the phone on failure -- The player hands over the LAST PHONE THEY CARRIED. Config.PhoneRecovery = { Enabled = true, -- Master toggle for the whole system -- ### PRICE ### -- -- Per security tier, decided by the phone. Price = { open = 250, -- No lock set pin = 1500, -- PIN / password biometric = 4000, -- Look ID ownerLocked = 9000 -- Still bound to another character }, -- ### DURATION ### -- -- Seconds the crack takes, per tier. Duration = { open = 5, pin = 20, biometric = 45, ownerLocked = 90 }, -- ### SUCCESS CHANCE ### -- -- 0.0-1.0. A failed job still charges the player. SuccessChance = { open = 1.0, pin = 0.9, biometric = 0.7, ownerLocked = 0.45 }, -- ### LEGAL REPAIR SHOP ### -- Repair = { PriceMultiplier = 1.0, DurationMultiplier = 1.0, PoliceAlertChance = 0.0, -- Legal work; nobody is called WipeOnFailChance = 0.0, -- Never destroys data MaxSecurityLevel = "biometric", -- Highest tier this NPC accepts Jobs = {} -- Optional job lock; empty = anyone }, -- ### BLACK MARKET HACKER ### -- Hacker = { PriceMultiplier = 0.7, DurationMultiplier = 0.6, PoliceAlertChance = 0.25, -- Chance dispatch is alerted on start WipeOnFailChance = 0.3, -- Chance a failed crack wipes the phone MaxSecurityLevel = "ownerLocked",-- Takes any job Jobs = {}, -- Optional gang/job lock RequiredItem = nil -- Required item, e.g. "hacking_device" }, Cooldown = 600, -- Seconds before the same player returns ZoneDebug = false, -- Draw target zones while placing them -- ### LOCATIONS ### -- -- mode is "repair" or "hacker" and selects the block above. -- type "ped" spawns an NPC, "zone" targets the spot itself (door, desk, -- bench) with no NPC. The box is centred on coords: -- { mode = "repair", type = "zone", coords = ..., size = vector3(1.5, 1.5, 2.0) } Locations = { { mode = "repair", type = "ped", label = "Phone Repair Shop", coords = vector4(-1541.2552, -419.2933, 35.6445, 316.6453), model = "s_m_y_shop_mask", blip = { enabled = false } }, { mode = "hacker", type = "ped", label = "Unknown Contact", coords = vector4(709.32, -966.55, 30.4, 90.0), model = "g_m_y_ballaorig_01", blip = { enabled = false } -- Hidden on purpose } } } --------------------------------------------------------------------------------------- -- CLOCK -- --------------------------------------------------------------------------------------- -- Alarms and world clock run on the player's own clock, not the in-game one. Config.Clock = { Enable = true, Alarms = true, -- false leaves the stopwatch and timer only MaxAlarms = 20, -- per phone Cities = { -- world clock list, in order. zone = IANA name, key = locale key, label = plain text { zone = "Europe/Istanbul", key = "ClockAPP.APP_CLOCK_CITY_ISTANBUL" }, { zone = "Europe/London", key = "ClockAPP.APP_CLOCK_CITY_LONDON" }, { zone = "Europe/Berlin", key = "ClockAPP.APP_CLOCK_CITY_BERLIN" }, { zone = "Asia/Dubai", key = "ClockAPP.APP_CLOCK_CITY_DUBAI" }, { zone = "Asia/Tokyo", key = "ClockAPP.APP_CLOCK_CITY_TOKYO" }, { zone = "Australia/Sydney", key = "ClockAPP.APP_CLOCK_CITY_SYDNEY" }, { zone = "America/New_York", key = "ClockAPP.APP_CLOCK_CITY_NEW_YORK" }, { zone = "America/Los_Angeles", key = "ClockAPP.APP_CLOCK_CITY_LOS_ANGELES" }, }, } --------------------------------------------------------------------------------------- -- CALENDAR -- --------------------------------------------------------------------------------------- -- Real dates, like the alarms above: a plan made for Friday 21:00 is a real evening. Config.Calendar = { Enable = true, Birthday = true, -- Show the character's birthday as a yearly entry MaxEvents = 300, -- per phone WeekStartsOn = 1, -- 1 Monday, 0 Sunday } --------------------------------------------------------------------------------------- -- WEATHER -- --------------------------------------------------------------------------------------- -- Read from the game world. The watch reads this same table. Config.Weather = { Enable = true, Celsius = true, -- false for Fahrenheit -- Degrees Celsius per GTA weather type. Los Santos, so the baseline is warm. Temps = { ["CLEAR"] = 28, ["EXTRASUNNY"] = 34, ["CLOUDS"] = 24, ["OVERCAST"] = 21, ["RAIN"] = 18, ["CLEARING"] = 22, ["THUNDER"] = 19, ["SMOG"] = 26, ["FOGGY"] = 17, ["XMAS"] = 2, ["SNOW"] = 1, ["SNOWLIGHT"] = 3, ["BLIZZARD"] = -4, ["HALLOWEEN"] = 15, ["NEUTRAL"] = 23, }, NightOffset = -6, -- Added to the temperature between the hours below NightStart = 21, NightEnd = 6, ForecastDays = 10, -- Days in the app's forecast list, 0 hides it HourlyHours = 12, -- Hours in the app's hourly strip -- Only the first two hourly entries are real; the rest is derived from the in-game date. ForecastSeed = 20260816, } --------------------------------------------------------------------------------------- -- GKS WATCH -- --------------------------------------------------------------------------------------- -- IMPORTANT: every key here needs a matching entry under "Watch" in config/config.json. -- A key that exists only here silently disables the feature it belongs to. Config.Watch = { Enable = false, -- Master switch for the whole watch ItemRequire = false, -- Does the player need a watch item to open it? DefaultModel = "midnight", -- Model used when ItemRequire is false OpenKey = "F3", -- Key to open/close the watch CommandName = "watch", -- Command to open the watch (/watch) CloseWithPhone = true, -- Watch and phone close each other; only one can hold NUI focus Animation = { Enable = false, -- Play an animation while the watch is open Dict = "anim@random@shop_clothes@watches", Anim = "idle_c", Flag = 49, -- Upper-body looping animation Refresh = 1000, -- Ms; restart if another action interrupts it }, --------------------------------------------------------------------------- -- MODELS --------------------------------------------------------------------------- -- One item per case + strap. No metadata, so it works on every inventory. -- Names must match your inventory. ItemName = { ["watch_silver"] = "silver", ["watch_black"] = "midnight", ["watch_gold"] = "gold", ["watch_sport"] = "sport", ["watch_ultra"] = "ultra", }, PropActive = false, PropBone = 18905, -- SKEL_L_Hand (wrist joint) PropOffset = { pos = vector3(-0.020, -0.004, 0.000), rot = vector3(205.0, 0.0, 85.0) }, PropWear = true, -- Stay on the wrist while the item is carried, not just while open PropWearDistance = 30.0, -- Metres; past this other players' watches are not drawn PropWearPoll = 2000, -- Ms; fallback only, supported inventories react instantly -- Note: with ItemRequire = false no item is needed, so everyone wears DefaultModel. PropName = { ["silver"] = "gks_watch_silver", ["midnight"] = "gks_watch_black", ["gold"] = "gks_watch_gold", ["sport"] = "gks_watch_sport", ["ultra"] = "gks_watch_ultra", }, --------------------------------------------------------------------------- -- WEATHER --------------------------------------------------------------------------- -- Read from the game world. Temperatures live in Config.Weather. Weather = { Enable = true, }, --------------------------------------------------------------------------- -- HEALTH --------------------------------------------------------------------------- -- Entries marked MECHANIC change how the character behaves. Health = { Enable = true, -- Daily goals: kcal burned / active minutes / hours stood Rings = { move = 500, exercise = 30, stand = 12 }, -- Job the SOS countdown alerts. Must match a key in Config.JOBServices. EMSJob = "ambulance", Steps = { Enable = true, StrideMeters = 0.78 }, HeartRate = { Enable = true, Resting = { 60, 80 }, -- Idle range, bpm HighAlert = 160, -- Notify above this Overexertion = { -- MECHANIC Enable = true, Threshold = 180, -- Sustained bpm that counts as overexertion Duration = 20, -- Seconds at that rate before it bites StaminaDrain = 1.5, -- Stamina drain multiplier while overexerted Stumble = true, -- Ragdoll briefly if it keeps going }, }, -- SOS raised by hand from the watch's Control Center ManualSOS = { Enable = true, Countdown = 5 }, CrashDetection = { -- MECHANIC Enable = true, SpeedDelta = 80.0, -- km/h lost in one instant to count as a crash Countdown = 10, -- Seconds to cancel before EMS is called AutoCallEMS = true, }, FallDetection = { -- MECHANIC Enable = true, HeightThreshold = 5.0, -- Metres fallen before SOS triggers Countdown = 10, }, }, } --------------------------------------------------------------------------------------- -- KEY BINDINGS -- --------------------------------------------------------------------------------------- Config.KeyBindings = { openPhone = { enabled = Config.KeyMapping, key = Config.OpenPhone, description = "Open/Close Phone" }, openWatch = { enabled = Config.Watch.Enable, key = Config.Watch.OpenKey, description = "Open/Close Watch" }, toggleCursor = { enabled = true, key = "LMENU", description = "Toggle Mouse Cursor" }, answerCall = { enabled = true, key = "RETURN", description = "Answer Call" }, declineCall = { enabled = true, key = "BACK", description = "Decline Call" }, chargePhone = { enabled = true, key = Config.UseChargeKey or "E", description = "Charge Phone" }, phoneBoxUse = { enabled = true, key = Config.PhoneBoxKey or "E", description = "Use Phone Booth" }, }