Files
red-valley/resources/[framework]/[addons]/[housing]/qs-housing/config/main.lua
2026-03-29 21:41:17 +03:00

1543 lines
80 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
Config = {} -- [CORE] Main configuration table.
--──────────────────────────────────────────────────────────────────────────────
-- Locale Selection [EDIT]
-- [INFO] Choose your preferred language for this script.
-- Files are located in locales/* — you can add your own if missing.
-- Available: 'ar','bg','cs','da','de','en','es','fa','fr','hi',
-- 'hu','it','ja','ko','nl','no','pt','ro','ru','sv','tr','zh-CN'
--──────────────────────────────────────────────────────────────────────────────
Config.Locale = 'en'
Config.Path = 'nui://qs-housing/web/' -- [ADV] Base NUI path (keep if you didn't move /web).
Config.ImagePath = Config.Path .. 'images/' -- [ADV] Asset path for images.
--──────────────────────────────────────────────────────────────────────────────
-- Money Type [EDIT]
-- [INFO] Defines the base money system for quick interactions.
-- [INFO] Large systems (like housing rent) may still use “bank” internally.
--──────────────────────────────────────────────────────────────────────────────
Config.MoneyType = 'money' -- [EDIT] Options: 'money' | 'bank'
Config.EnableQuests = true -- [EDIT] Enable quests
-- If you want to use a custom currency when purchasing a house, add it here and then don't forget to update `RemoveAccountMoney`, `AddAccountMoney`, and `GetAccountMoney` according to your own currency.
Config.MoneyTypes = {
{
name = 'money',
label = 'Cash Money',
},
{
name = 'bank',
label = 'Bank Transfer',
},
}
--──────────────────────────────────────────────────────────────────────────────
-- Framework Detection [AUTO]
-- [INFO] Automatically detects ESX/QB. If renamed, create adapters in:
-- client/custom/framework/* and server/custom/framework/*
-- [ADV] Only modify if you know what you're doing.
--──────────────────────────────────────────────────────────────────────────────
local frameworks = { -- [CORE] Resource name → internal alias
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb'
}
Config.Framework = DependencyCheck(frameworks) or 'standalone' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- FiveGuard / InteractSound [EDIT]
-- [INFO] Set your FiveGuard resource name if used, or false if not.
-- [INFO] You can disable interaction sounds if your anticheat blocks them.
--──────────────────────────────────────────────────────────────────────────────
Config.FiveGuard = false -- [EDIT] false | 'your-resource-name'
Config.DisableInteractSound = false -- [EDIT] true to disable ring doorbell.
-- FurniCreator · Client Graphics & Capture [EDIT]
-- [INFO] Interval between thumbnail captures (increase on low-end PCs).
--──────────────────────────────────────────────────────────────────────────────
Config.FurniCreator = { interval = 300 } -- [EDIT] ms between captures.
Config.FurniCreatorCommand = 'housingfurniture'
--──────────────────────────────────────────────────────────────────────────────
-- Inventory System Detection [AUTO]
-- [INFO] Automatically detects your inventory system.
-- [INFO] To add support for another one, create adapters in:
-- client/custom/inventory/*.lua
--──────────────────────────────────────────────────────────────────────────────
local inventories = { -- [CORE]
['qs-inventory'] = 'qs-inventory',
['qb-inventory'] = 'qb-inventory',
['ps-inventory'] = 'ps-inventory',
['ox_inventory'] = 'ox_inventory',
['core_inventory'] = 'core_inventory',
['codem-inventory'] = 'codem-inventory',
['inventory'] = 'inventory',
['origen_inventory'] = 'origen_inventory',
['jaksam_inventory'] = 'jaksam_inventory',
['tgiann-inventory'] = 'tgiann-inventory',
}
Config.Inventory = DependencyCheck(inventories) or 'default' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Dispatch System Detection [AUTO]
-- [INFO] Detects the active dispatch system for alerts/calls.
-- [INFO] To integrate another, create adapters in:
-- client/custom/dispatch/*.lua
--──────────────────────────────────────────────────────────────────────────────
local dispatch = { -- [CORE]
['qs-dispatch'] = 'qs-dispatch'
}
Config.Dispatch = DependencyCheck(dispatch) or 'default' -- [AUTO]
Config.DefaultRequestModelTimeout = 15000
--──────────────────────────────────────────────────────────────────────────────
-- Phone System Detection [AUTO]
-- [INFO] Handles communication features for sale boards, etc.
-- [INFO] To integrate another phone, use adapters in:
-- server/custom/phone/*.lua
--──────────────────────────────────────────────────────────────────────────────
local phones = { -- [CORE]
['qs-smartphone-pro'] = 'qs-smartphone-pro',
['qs-smartphone'] = 'qs-smartphone',
['lb-phone'] = 'lb-phone',
['gksphone'] = 'gksphone',
['okokPhone'] = 'okokPhone',
['roadphone'] = 'roadphone',
['codem-phone'] = 'codem-phone'
}
Config.Phone = DependencyCheck(phones) or 'default' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Wardrobe / Appearance Detection [AUTO]
-- [INFO] Detects your clothing/appearance system automatically.
-- [INFO] To add support for a new one, create adapters in:
-- client/custom/wardrobe/*.lua
--──────────────────────────────────────────────────────────────────────────────
local wardrobes = { -- [CORE]
['qs-appearance'] = 'qs-appearance',
['qb-clothing'] = 'qb-clothing',
['codem-appearance'] = 'codem-appearance',
['ak47_clothing'] = 'ak47_clothing',
['fivem-appearance'] = 'fivem-appearance',
['illenium-appearance'] = 'illenium-appearance',
['raid_clothes'] = 'raid_clothes',
['rcore_clothes'] = 'rcore_clothes',
['origen_clothing'] = 'origen_clothing',
['rcore_clothing'] = 'rcore_clothing',
['sleek-clothestore'] = 'sleek-clothestore',
['tgiann-clothing'] = 'tgiann-clothing',
['p_appearance'] = 'p_appearance',
['0r-clothingv2'] = '0r-clothingv2'
}
Config.Wardrobe = DependencyCheck(wardrobes) or 'default' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Garage System Detection [AUTO]
-- [INFO] Auto-detects a compatible garage resource. If none is running, the
-- feature falls back to 'standalone' (garages disabled for this asset).
-- [INFO] To integrate a custom one, add adapters in: server/custom/garage/*.lua
--──────────────────────────────────────────────────────────────────────────────
local garages = { -- [CORE] Resource name → internal alias
['qb-garages'] = 'qb-garages',
['qs-advancedgarages'] = 'qs-advancedgarages',
['jg-advancedgarages'] = 'jg-advancedgarages',
['cd_garage'] = 'cd_garage',
['okokGarage'] = 'okokGarage',
['loaf_garage'] = 'loaf_garage',
['rcore_garage'] = 'rcore_garage',
['zerio-garage'] = 'zerio-garage',
['codem-garage'] = 'codem-garage',
['ak47_garage'] = 'ak47_garage',
['ak47_qb_garage'] = 'ak47_qb_garage',
['vms_garagesv2'] = 'vms_garagesv2',
['cs-garages'] = 'cs-garages',
['msk_garage'] = 'msk_garage',
['RxGarages'] = 'RxGarages',
['ws_garage-v2'] = 'ws_garage-v2',
['op-garages'] = 'op-garages',
['op_garages_v2'] = 'op_garages_v2'
}
Config.Garage = DependencyCheck(garages) or 'standalone' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- General Settings [EDIT]
-- [INFO] Core toggles and behaviors for targeting, upgrades, creation flow,
-- limits, menus, pricing, and display. Adjust to fit your server design.
--──────────────────────────────────────────────────────────────────────────────
-- Points must be used from inside their poly? (entry, board, customHouse, shell)
Config.NeedToBeInsidePoints = { -- [EDIT]
['entry'] = true, -- [INFO] Require to be inside entry poly to interact.
['board'] = true, -- [INFO] Require to be inside board poly to interact.
['customHouse'] = false, -- [INFO] Allow custom house actions from outside.
['shell'] = false -- [INFO] Force shell interactions inside shell poly.
}
-- Targeting (qb-target / ox_target). If false, fallback to draw/markers where applicable.
Config.UseTarget = false -- [EDIT] true | false
Config.TargetLength = 5.0 -- [EDIT] Target box length
Config.TargetWidth = 5.0 -- [EDIT] Target box width
-- Upgrade catalog (UI list). Only visual/data; logic is handled internally.
Config.Upgrades = { -- [EDIT]
{
name = 'alarm',
title = 'Security Alarm',
description = 'Advanced security system that alerts authorities when your property is breached. Provides 24/7 monitoring and instant notifications.',
price = 10000
},
{
name = 'camera',
title = 'Security Cameras',
description = 'High-definition surveillance system with night vision and motion detection. Monitor your property from anywhere with remote access.',
price = 35000
},
{
name = 'sensor',
title = 'Motion Sensor',
description = 'Smart motion detection system that can distinguish between humans and animals. Integrates with your security network.',
price = 45000
},
{
name = 'vault',
title = 'Vault Lock',
description = 'Military-grade security vault with biometric access and time-delay mechanisms. Maximum protection for your valuables.',
price = 50000
},
{
name = 'furniture',
title = 'Furniture Upgrade',
description = 'Expand your property\'s furniture capacity from 100 to 150 items. Perfect for larger homes and extensive decoration.',
price = 60000
},
{
name = 'doorbell',
title = 'Custom Doorbell',
description = 'Unlock the ability to customize your doorbell sound. Choose from a variety of unique doorbell sounds to personalize your home.',
price = 15000
},
}
Config.FurnitureLimits = {
normal = 50, -- Default limit
upgrade = 150 -- Upgrade Limit
}
-- Stash access rule
-- [INFO] If true, only owners (or those with the vault code) can open the stash.
-- [INFO] Use this to prevent exploit-based entries into MLO interiors.
Config.StashNeedsKey = false -- [EDIT] true | false
--──────────────────────────────────────────────────────────────────────────────
-- Society / Company Integration [EDIT]
-- [INFO] Choose your society/banking backend for commissions and payouts.
-- Options:
-- 'none','esx_society','ap-government','qb-management','qb-banking',
-- 'Renewed-Banking','okokBanking','zpx-banking','tgg-banking','crm-banking', 'tgiann-bank'
--──────────────────────────────────────────────────────────────────────────────
Config.Society = 'esx_society' -- [EDIT] Pick from list above.
Config.SocietyCommision = 0.3 -- [EDIT] 0.30 = 30% of house price to company.
-- Fees / Taxes (pure functions for clarity)
-- [INFO] Adjust percentages as needed. Use integers for whole-number math, or
-- set Config.UseMathCeilOnFees to round up final fees.
Config.BankFee = function(price) return price / 100 * 10 end -- [EDIT] 10%
Config.BrokerFee = function(price) return price / 100 * 5 end -- [EDIT] 5%
Config.Taxes = function(price) return price / 100 * 5 end -- [EDIT] 5%
-- Round up fee totals?
Config.UseMathCeilOnFees = true -- [EDIT] true = ceil final computed fees
--──────────────────────────────────────────────────────────────────────────────
-- Fallback Outfit (Naked Safety) [EDIT]
-- [INFO] Applied if outfit fails to load or player is considered "naked".
--──────────────────────────────────────────────────────────────────────────────
Config.NakedPlayerClothes = { -- [EDIT]
Male = {
['hat'] = { item = 0, texture = 0 },
['glass'] = { item = 0, texture = 0 },
['mask'] = { item = 0, texture = 0 },
['t-shirt'] = { item = 15, texture = 0 },
['torso2'] = { item = 15, texture = 0 },
['arms'] = { item = 15, texture = 0 },
['pants'] = { item = 14, texture = 0 },
['shoes'] = { item = 34, texture = 0 },
['vest'] = { item = 0, texture = 0 }
},
Female = {
['hat'] = { item = 0, texture = 0 },
['glass'] = { item = 0, texture = 0 },
['mask'] = { item = 0, texture = 0 },
['t-shirt'] = { item = 2, texture = 0 },
['torso2'] = { item = 18, texture = 0 },
['arms'] = { item = 15, texture = 0 },
['pants'] = { item = 19, texture = 0 },
['shoes'] = { item = 35, texture = 0 },
['vest'] = { item = 0, texture = 0 }
}
}
--──────────────────────────────────────────────────────────────────────────────
-- House Creation Permissions & Limits [EDIT]
-- [INFO] Restrict who can create houses and tweak limits/visuals/behavior.
--──────────────────────────────────────────────────────────────────────────────
Config.CreatorJobs = { -- [EDIT] Allowed jobs for creation mode
{ job = 'realestate', grade = { 0, 1, 2, 3 } },
{ job = 'realestatejob', grade = false }, -- [INFO] All grades
}
Config.AllowAdminsToCreateHouses = true -- [EDIT] Allow admins to create houses
Config.TestRemTime = 1 -- [EDIT] House visit time (minutes)
Config.MinZOffset = 30 -- [EDIT] Minimum shell Z spawn offset
Config.CreatorAlpha = 200 -- [EDIT] Creator ghost alpha (visual aid)
Config.SignTextScale = 0.6 -- [EDIT] For-sale poster text scale
Config.TimeInterior = 23 -- [EDIT] Interior time to avoid shadow flicker
Config.GroupBlips = false -- [EDIT] True = shorter/hidden address on blips
Config.MaxOwnedHouses = 15 -- [EDIT] Per-player ownership limit
Config.SellObjectCommision = 0.3 -- [EDIT] Furniture sale commission (0.30 = 30%)
Config.EnableBoard = false -- [EDIT] Enable/disable sales board feature
Config.BoardObject = 'qs_salesign_01' -- [EDIT] For-sale sign prop
Config.BoardSpawnDistance = 35.0 -- [EDIT] Sign spawn distance
Config.UseDrawTextOnBoard = false -- [EDIT] Use DrawText3D on board
Config.MaxApartmentCount = 50 -- [EDIT] Max apartments per house (performance-sensitive)
Config.DefaultLightIntensity = 20.0 -- [EDIT] Default light intensity inside shells
Config.MaxVaultCodes = 3 -- [EDIT] Vaults per home
Config.MinPointLength = 50.0 -- [EDIT] Minimum polygon length for areas
Config.ShowClosestBlips = true -- [IMPORTANT] If true, the closest blips will be shown on the map. Otherwise after the 70 blip limit is reached, the blip's names will be hidden.
--──────────────────────────────────────────────────────────────────────────────
-- Currency Formatting [EDIT]
-- [INFO] Intl options for price rendering in UI. Purely visual formatting.
--──────────────────────────────────────────────────────────────────────────────
Config.Intl = { -- [EDIT]
locales = 'en-US', -- e.g. 'en-US','pt-BR','es-ES','fr-FR','de-DE','ru-RU','zh-CN'
options = {
style = 'currency', -- 'decimal' | 'currency' | 'percent' | 'unit'
currency = 'USD', -- 'USD','EUR','BRL','RUB','CNY', etc.
minimumFractionDigits = 0 -- 0..5
}
}
--──────────────────────────────────────────────────────────────────────────────
-- Map Blips Configuration [EDIT]
-- [INFO] Controls the display of property-related blips on the map.
--──────────────────────────────────────────────────────────────────────────────
Config.Blip = { -- [EDIT]
forSale = { enabled = true },
owned = { enabled = true, color = 3 },
ownedOther = { enabled = true, color = 3 },
officialOwned = { enabled = true, color = 2 }, -- [INFO] Houses rented by the official owner
rentable = { enabled = true, color = 5 },
purchasable = { enabled = true, color = 4 }
}
Config.DisableAllHouseBlips = false -- [EDIT] true = disables all blips
--──────────────────────────────────────────────────────────────────────────────
-- Keybinds [EDIT]
-- [INFO] Controls which keys open the in-game menus.
--──────────────────────────────────────────────────────────────────────────────
Config.OpenHouseMenu = 'F3' -- [EDIT] Open house internal menu
Config.OpenJobMenu = 'F7' -- [EDIT] Open creation/job menu
Config.EnableF3Shop = true -- [EDIT] Disable decoration purchase from F3
Config.Cleaning = true
Config.JunkObjects = {
'qs_dust_prop_01',
'qs_dust_prop_01',
'qs_garbage_prop_01',
'qs_garbage_prop_02',
'qs_garbage_prop_03'
}
Config.JunkObjectTime = 10 * 60 * 1000 -- 10 minutes
Config.MaxJunkPerHouse = 10 -- Maximum junk objects per house
-- Cleaner Robot Settings [EDIT]
-- [INFO] Settings for the autonomous cleaning robot furniture.
Config.CleanerRobot = {
moveSpeed = 0.012, -- Base movement speed (very slow, realistic)
maxSpeed = 0.024, -- Maximum movement speed
acceleration = 0.0003, -- How fast robot accelerates
deceleration = 0.0008, -- How fast robot decelerates
raycastDistance = 0.8, -- Distance for obstacle detection
junkDetectRadius = 1.0, -- Radius to detect junk to clean
maxDistanceFromDock = 12.0, -- Maximum distance robot can travel from dock (prevents leaving house)
cleaningTimeout = 5 * 60 * 1000, -- Time (ms) before robot auto-returns to dock (5 minutes)
randomDirectionTime = 15000, -- Time (ms) before random direction change
maxStuckTime = 5000, -- Time (ms) before robot tries to unstick itself
wobbleEnabled = true, -- Enable slight wobble for realism
wobbleAmount = 0.15, -- Wobble intensity (degrees)
wobbleSpeed = 0.08, -- Wobble oscillation speed
}
--──────────────────────────────────────────────────────────────────────────────
-- Illegal System Settings [EDIT]
-- [INFO] Configure items, jobs, and requirements for robberies/raids.
--──────────────────────────────────────────────────────────────────────────────
Config.RequiredCop = 0 -- [EDIT] Minimum police required (for lockpicking)
Config.PoliceJobs = { 'police', 'sheriff' } -- [EDIT] Jobs counted as police
Config.EnableRobbery = true -- [EDIT] Enable usable item for robberies
Config.EnableRaid = true -- [EDIT] Enable usable item for raids
Config.RobberyItem = 'lockpick' -- [EDIT] Item to start robbery
Config.StomRamItem = 'police_stormram' -- [EDIT] Item to start police search
Config.RequireOwnerOnline = true -- [EDIT] Require house owner to be online for robbery
--──────────────────────────────────────────────────────────────────────────────
-- Meta Key System [EDIT]
-- [INFO] Meta key system allows players to have physical key items in their
-- inventory. These keys have metadata containing the house ID they belong to.
-- When a player uses the key or tries to enter a house, the system checks
-- if they have a meta key for that specific house in their inventory.
--──────────────────────────────────────────────────────────────────────────────
Config.EnableMetaKey = true -- [EDIT] Enable meta key system
Config.MetaKeyItem = 'housekey' -- [EDIT] The item name for house keys
Config.MetaKeyCheckOnEntry = true -- [EDIT] Check meta key when entering house
Config.MetaKeyCanOpenDoor = true -- [EDIT] Meta key holders can lock/unlock doors
Config.MetaKeyCreatePrice = 500 -- [EDIT] Price to create a meta key (in Config.MoneyType currency)
--──────────────────────────────────────────────────────────────────────────────
-- Rental & Mortgage Configuration [EDIT]
-- [INFO] Defines how rental and mortgage systems behave and charge intervals.
--──────────────────────────────────────────────────────────────────────────────
Config.CreditEnable = true -- [EDIT] Enable mortgage in house contracts
Config.CreditEq = 0.3 -- [EDIT] Loan collection percentage
Config.CreditTime = 5 -- [EDIT] Interval (minutes) for loan collection
Config.HireRenterCommand = 'hireRenter' -- [EDIT] Command to expel tenants (admin)
Config.RentTime = 5 -- [EDIT] Interval (minutes) for rent collection
Config.EnableRentable = true -- [EDIT] Enable rental system
Config.CreatedRentableHousesManageable = false -- [EDIT] If false, realestate cannot cancel leases
Config.Bills = {
Enabled = true,
IntervalHours = 1, -- in hours
Electricity = {
kilowattPerHour = 1.5, -- Hourly kilowatt consumption when lights are on
pricePerKilowatt = 50, -- Price per kilowatt ($)
},
RandomRanges = { -- Random bill amounts
water = { min = 30, max = 150 },
internet = { min = 80, max = 300 }
},
-- Auto eviction system: Remove house owner after X unpaid bills This system can reset the ownership of homes that are not actively used on your server. However, be careful. If the bills for rented homes are not paid, their ownership will also be revoked.
AutoEviction = {
Enabled = true, -- Enable/disable auto eviction system
MaxUnpaidBills = 400, -- Maximum unpaid bills before eviction (default: 400) 400 bills = 20 days (1 hour = 1 bill)
NotifyOwnerAtBills = { 30, 100, 200, 300, 400 }, -- Notify owner when unpaid bills reach these counts
NotifyOnEviction = true, -- Notify owner when evicted
}
}
-- Invoices and rents are collected after 100 data, regardless of whether they are paid. Therefore, they are automatically deleted so they don't clutter your database.
Config.Cleanup = {
Enabled = true,
IntervalHours = 1, -- How often to run cleanup (hours)
Bills = {
KeepDays = 30, -- Keep paid bills for X days
},
Rent = {
KeepDays = 30, -- Keep paid rent records for X days
}
}
Config.ManagementButtons = {
wardrobe = true, -- [EDIT] Show/hide wardrobe button
storage = true, -- [EDIT] Show/hide storage button
charge = true, -- [EDIT] Show/hide charge button (requires qs-smartphone-pro)
music = true, -- [EDIT] Show/hide music button
decorate = true, -- [EDIT] Show/hide decorate button
rent = true, -- [EDIT] Show/hide rent button
cancelRent = true, -- [EDIT] Show/hide cancel rent button
sellBank = true, -- [EDIT] Show/hide sell to bank button
sellPlayer = true, -- [EDIT] Show/hide sell to player button
cancelSellHouse = true, -- [EDIT] Show/hide cancel sell house button
leave = true, -- [EDIT] Show/hide leave button
toggleDoor = true, -- [EDIT] Show/hide toggle door button
fixDoor = true, -- [EDIT] Show/hide fix door button
changeTheme = true, -- [EDIT] Show/hide change theme button
createMetaKey = true, -- [EDIT] Show/hide create meta key button (requires Config.EnableMetaKey = true)
}
Config.DoorBellSounds = {
{ label = 'Doorbell', value = 'doorbell' },
{ label = 'Doorbell 2', value = 'doorbell2' },
{ label = 'Doorbell 3', value = 'doorbell3' },
{ label = 'Doorbell 4', value = 'doorbell4' },
{ label = 'Doorbell 5', value = 'doorbell5' },
{ label = 'Doorbell 6', value = 'doorbell6' },
{ label = 'Doorbell 7', value = 'doorbell7' }
}
--──────────────────────────────────────────────────────────────────────────────
-- Decoration & Stash Configuration [EDIT]
-- [INFO] Controls decorating access and stash system per property.
--──────────────────────────────────────────────────────────────────────────────
Config.SpawnDistance = 100.0 -- [EDIT] Object spawn radius (meters)
Config.MaximumDistanceForDecorate = 350.0 -- [EDIT] Max decorate distance or false to disable
Config.DecorateOnlyAccessForOwner = true -- [EDIT] Only owner can decorate
Config.DefaultStashData = { -- [EDIT] Default stash size for houses
maxweight = 1000000,
slots = 30,
}
Config.Music = 'decorate' -- [EDIT] false to disable music
Config.MusicVolume = 0.05 -- [EDIT] Music volume (0.01.0)
--──────────────────────────────────────────────────────────────────────────────
-- Shells & Interior Models [EDIT]
-- [INFO] Define available interior shells (MLO replacements or instanced).
-- [INFO] Each shell can include custom stash settings.
--──────────────────────────────────────────────────────────────────────────────
Config.Shells = { -- [EDIT]
-- SubhamPRO Colab Shells
{
model = 'mv_sh_01_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(-6.0, 15.639, 2.300),
animationOffset = vec4(-6.0, 15.639, 1.112, 260.764)
},
sink = {
ptfxOffset = vec3(-6.2, 12.620, 1.08),
animationOffset = vec4(-5.688, 12.683, 1.040, 176.396),
},
cooking = {
animationOffset = vec4(2.283, 2.628, 1.040, 20.58),
recipes = Config.CookingRecipes
},
toilet = {
-- default (-5.720, 13.954, 1.040, 136.999
ptfxOffset = vec3(-5.720, 13.954, 1.040),
animationOffset = vec4(-5.8, 13.918, 0.872, 180.427),
}
},
{
model = 'mv_sh_02_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(-0.740, -5.059, 4.939),
animationOffset = vec4(-0.740, -5.059, 3.739, -95.915)
},
sink = {
ptfxOffset = vec3(0.955, -2.797, 3.698),
animationOffset = vec4(0.955, -2.797, 3.698, -3.518),
},
cooking = {
animationOffset = vec4(-2.344, -3.053, 3.698, -1.552),
recipes = Config.CookingRecipes
},
toilet = {
ptfxOffset = vec3(-0.352, -3.046, 3.698),
animationOffset = vec4(-0.352, -3.046, 3.698, -183.579),
}
},
{ model = 'm_sh_01_subhampro_tebex_io', stash = { maxweight = 1000000, slots = 5 } },
{ model = 'm_sh_02_subhampro_tebex_io', stash = { maxweight = 1000000, slots = 5 } },
{ model = 'm_sh_03_subhampro_tebex_io', stash = { maxweight = 1000000, slots = 5 } },
{
model = 'm_sh_04_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(-1.540, 12.319, 2.500),
animationOffset = vec4(-1.540, 12.319, 1.335, -273.424)
},
sink = {
ptfxOffset = vec3(2.616, 11.784, 1.293),
animationOffset = vec4(2.616, 11.784, 1.293, -268.504),
},
toilet = {
ptfxOffset = vec3(0.327, 10.127, 2.015),
animationOffset = vec4(0.437, 10.760, 1.293, -86.416),
}
},
{
model = 'm_sh_05_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(11.600, 0.673, 2.242),
animationOffset = vec4(11.600, 0.673, 1.042, -2.045)
},
sink = {
ptfxOffset = vec3(8.135, 5.857, 1.055),
animationOffset = vec4(8.135, 5.857, 1.055, -267.979),
},
toilet = {
ptfxOffset = vec3(11.048, 6.612, 1.378),
animationOffset = vec4(11.026, 5.858, 1.042, 89.050),
}
},
{ model = 'm_sh_06_subhampro_tebex_io', stash = { maxweight = 1000000, slots = 5 } },
{
model = 'm_sh_07_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(0.418, 10.911, 2.443),
animationOffset = vec4(0.418, 10.911, 1.243, -357.594)
},
cooking = {
animationOffset = vec4(7.377, -12.090, 1.182, -90.973),
recipes = Config.CookingRecipes
}
},
{
model = 'm_sh_08_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(8.148, 6.933, 10.028),
animationOffset = vec4(8.148, 6.933, 11.828, -357.893)
},
sink = {
ptfxOffset = vec3(2.568, 10.106, 11.828),
animationOffset = vec4(2.568, 10.106, 11.828, -270.582),
},
cooking = {
animationOffset = vec4(-3.333, 2.839, 7.396, -84.002),
recipes = Config.CookingRecipes
},
toilet = {
ptfxOffset = vec3(-0.677, 9.846, 12.319),
animationOffset = vec4(-0.173, 9.804, 11.828, 175.883),
}
},
{
model = 'm_sh_09_subhampro_tebex_io',
stash = { maxweight = 1000000, slots = 5 },
shower = {
ptfxOffset = vec3(-10.636, 1.814, 3.0),
animationOffset = vec4(-10.636, 1.814, 1.837, -264.619)
},
sink = {
ptfxOffset = vec3(-7.883, 5.023, 1.795),
animationOffset = vec4(-7.883, 5.023, 1.795, -270.620),
},
cooking = {
animationOffset = vec4(-1.818, 16.028, 1.795, -0.140),
recipes = Config.CookingRecipes
},
toilet = {
ptfxOffset = vec3(-8.010, 1.430, 1.795),
animationOffset = vec4(-8.010, 1.430, 1.795, -90.884),
}
},
-- NavyPanda Colab Shells
{ model = 'd3_shell_shellv1', stash = { maxweight = 1000000, slots = 5 } },
{ model = 'd3_shell_shellv2', stash = { maxweight = 1000000, slots = 5 } },
{ model = 'd3_shell_shellv3', stash = { maxweight = 1000000, slots = 5 } },
-- Maruii Colab Shells
{ model = 'mv13_shell_demo1', stash = { maxweight = 1000000, slots = 5 } },
{ model = 'mv13_shell_demo2', stash = { maxweight = 1000000, slots = 5 } },
{ model = 'mv13_shell_demo3', stash = { maxweight = 1000000, slots = 5 } },
}
Config.DeliveriesEnabled = true -- [EDIT] true | false Enable/disable the food delivery system
Config.DancersEnabled = true -- [EDIT] true | false Enable/disable the private dancer system
Config.Deliveries = {
{
title = 'Urban Sandwich',
description = 'Freshly made sandwiches, simple, fast and always tasty',
price = 80,
items = {
'sandwich'
},
-- Delivery time in minutes
-- Can be a number (fixed time) or table with min and max (random time)
deliveryTime = 0.05 -- Random between 1-2 minutes
-- deliveryTime = 7 -- Fixed 7 minutes
},
{
title = 'Burger Shot',
description = 'Classic burgers, fries and fast food',
price = 120,
items = {
'burger',
'fries'
},
deliveryTime = { min = 2, max = 4 }
},
{
title = 'Pizza This',
description = 'Hot pizza delivered straight to your door',
price = 150,
items = {
'pizza_slice'
},
deliveryTime = { min = 3, max = 5 }
},
{
title = 'Bean Machine',
description = 'Fresh coffee and sweet pastries',
price = 90,
items = {
'coffee',
'donut'
},
deliveryTime = { min = 1, max = 3 }
},
{
title = 'Cluckin Bell',
description = 'Fast chicken meals for hungry citizens',
price = 110,
items = {
'chickenwrap'
},
deliveryTime = { min = 2, max = 4 }
},
{
title = 'Up-n-Atom',
description = 'Atomic burgers with explosive flavor',
price = 140,
items = {
'burger',
'cola'
},
deliveryTime = { min = 3, max = 6 }
},
{
title = 'Taco Bomb',
description = 'Mexican food with extra spice',
price = 130,
items = {
'taco'
},
deliveryTime = { min = 2, max = 5 }
},
{
title = 'Healthy Life',
description = 'Healthy meals and fresh salads',
price = 160,
items = {
'salad',
'water'
},
deliveryTime = { min = 3, max = 6 }
}
}
Config.Dancers = {
{
title = 'Velvet Rose',
description = 'An experienced private dancer who knows exactly how to set the mood.',
price = 700,
pedModel = 's_f_y_stripper_01',
anim = {
dict = 'mp_safehouse',
name = 'lap_dance_girl'
},
image = Config.ImagePath .. 'dancers/s_f_y_stripper_01.png',
time = 10 * 60 * 1000, -- 10 minutes
--deliveryTime = 0.05 -- Random between 1-2 minutes
deliveryTime = { min = 3, max = 10 } -- Random between 3-10 minutes
},
{
title = 'Scarlet Desire',
description = 'A premium dancer offering an exclusive and unforgettable private show.',
price = 1500,
pedModel = 's_f_y_stripper_02',
anim = {
dict = 'mp_safehouse',
name = 'lap_dance_girl'
},
image = Config.ImagePath .. 'dancers/s_f_y_stripper_02.png',
time = 15 * 60 * 1000, -- 15 minutes
deliveryTime = { min = 2, max = 8 } -- Random between 2-8 minutes
}
}
Config.CookingRecipes = {
{
title = 'Toast',
description = 'Simple toasted bread. Fast and easy to prepare.',
ingredients = {
['bread'] = 1,
},
rewards = {
['toast'] = 1,
},
time = 35000
},
{
title = 'Sandwich',
description = 'A classic homemade sandwich, prepared in seconds.',
ingredients = {
['bread'] = 2,
['cheese'] = 1,
},
rewards = {
['sandwich'] = 1,
},
time = 26000
},
{
title = 'Hot Dog',
description = 'Quick grilled sausage in a soft bun.',
ingredients = {
['bread'] = 1,
['sausage'] = 1,
},
rewards = {
['hotdog'] = 1,
},
time = 26000
},
{
title = 'Cheese Burger',
description = 'Juicy burger with melted cheese, cooked fast at home.',
ingredients = {
['bread'] = 1,
['meat'] = 1,
['cheese'] = 1,
},
rewards = {
['burger'] = 1,
},
time = 27000
},
{
title = 'Pasta',
description = 'Simple pasta dish with a basic tomato sauce.',
ingredients = {
['pasta'] = 1,
['tomato'] = 2,
},
rewards = {
['pasta_plate'] = 1,
},
time = 18000
},
{
title = 'Pizza',
description = 'Fresh homemade pizza, straight from the oven.',
ingredients = {
['dough'] = 1,
['cheese'] = 2,
['tomato'] = 2,
},
rewards = {
['pizza'] = 1,
},
time = 29000
},
{
title = 'Grilled Steak',
description = 'Perfectly grilled steak, ready in minutes.',
ingredients = {
['meat'] = 2,
},
rewards = {
['steak'] = 1,
},
time = 28000
},
{
title = 'Chicken Meal',
description = 'Quick roasted chicken meal, filling and tasty.',
ingredients = {
['chicken'] = 1,
['spices'] = 1,
},
rewards = {
['chicken_meal'] = 1,
},
time = 29000
},
{
title = 'Luxury Dinner',
description = 'High-end homemade dinner prepared surprisingly fast.',
ingredients = {
['meat'] = 2,
['wine'] = 1,
['spices'] = 2,
},
rewards = {
['luxury_dinner'] = 1,
},
time = 10000
},
{
title = 'Salad',
description = 'Fresh and healthy homemade salad. Light but refreshing.',
ingredients = {
['lettuce'] = 1,
['tomato'] = 1,
},
rewards = {
['salad'] = 1,
},
time = 5000
},
{
title = 'Omelette',
description = 'Simple egg omelette cooked in minutes. Perfect for breakfast.',
ingredients = {
['egg'] = 2,
['cheese'] = 1,
},
rewards = {
['omelette'] = 1,
},
time = 36000
},
{
title = 'Fish & Chips',
description = 'Crispy fried fish with golden fries. A classic comfort meal.',
ingredients = {
['fish'] = 1,
['potato'] = 2,
},
rewards = {
['fish_chips'] = 1,
},
time = 29000
}
}
Config.Robbery = {
enabled = true,
sell = {
enabled = true,
location = vec4(40.167038, -1022.545044, 29.515747, 68.031494),
pedModel = 'g_m_m_chigoon_02',
anim = {
dict = 'anim@amb@business@bgen@bgen_no_work@',
name = 'stand_phone_phoneputdown_idle_nowork'
},
blip = {
enabled = true,
sprite = 176,
color = 4,
scale = 0.7,
display = 4,
highDetail = true,
text = 'Robbery Sell'
},
price = 0.1 -- 10% del precio
}
}
Config.RealeStateNPC = {
enabled = true,
location = vec4(-253.978027, -970.457153, 31.217529, 161.574799), -- [EDIT] NPC location coordinates
pedModel = 'a_m_m_business_01', -- [EDIT] Business / real estate agent ped
anim = {
dict = 'amb@world_human_stand_guard@male@idle_a', -- [EDIT] Arms crossed, professional guard stance
name = 'idle_a'
},
blip = {
enabled = true,
sprite = 374, -- [INFO] Real Estate icon
color = 3,
scale = 0.8,
text = 'Real Estate'
}
}
Config.HouseBrowserCommand = true -- [EDIT] Enable/disable housebrowser command
--──────────────────────────────────────────────────────────────────────────────
-- Optional Insurance Integration [AUTO]
-- [INFO] Automatically detects if 'm-insurance' is running.
--──────────────────────────────────────────────────────────────────────────────
Config.MInsurance = GetResourceState('m-insurance') == 'started' -- [AUTO]
--──────────────────────────────────────────────────────────────────────────────
-- Shared Export [CORE]
-- [INFO] Provides shell data to other scripts when requested.
--──────────────────────────────────────────────────────────────────────────────
exports('getShells', function()
return Config.Shells
end)
--──────────────────────────────────────────────────────────────────────────────
-- World Objects: Houses [EDIT]
-- [INFO] Static exterior objects used by the system. Extend as needed.
--──────────────────────────────────────────────────────────────────────────────
Config.HouseObjects = {
[1] = { model = 'lf_house_04_' },
[2] = { model = 'lf_house_05_' },
[3] = { model = 'lf_house_07_' },
[4] = { model = 'lf_house_08_' },
[5] = { model = 'lf_house_09_' },
[6] = { model = 'lf_house_10_' },
[7] = { model = 'lf_house_11_' },
[8] = { model = 'lf_house_13_' },
[9] = { model = 'lf_house_15_' },
[10] = { model = 'lf_house_16_' },
[11] = { model = 'lf_house_17_' },
[12] = { model = 'lf_house_18_' },
[13] = { model = 'lf_house_19_' },
[14] = { model = 'lf_house_20_' },
}
--──────────────────────────────────────────────────────────────────────────────
-- World Objects: Islands [EDIT]
-- [INFO] Floating/island props for special placements.
--──────────────────────────────────────────────────────────────────────────────
Config.Islands = {
[1] = { model = 'qs_pineisland_01' },
[2] = { model = 'qs_pineisland_02' },
[3] = { model = 'qs_pineisland_03' },
[4] = { model = 'qs_treeisland_01' },
[5] = { model = 'qs_treeisland_02' },
[6] = { model = 'qs_treeisland_03' },
[7] = { model = 'qs_tropiisland_01' },
[8] = { model = 'qs_tropiisland_02' },
[9] = { model = 'qs_tropiisland_03' },
-- Subham Collections
[10] = { model = 'qs_island_01' },
[11] = { model = 'qs_island_02' },
[12] = { model = 'qs_island_03' },
[13] = { model = 'qs_island_04' },
[14] = { model = 'qs_island_05' },
[15] = { model = 'qs_island_06' },
[16] = { model = 'qs_island_07' },
}
--──────────────────────────────────────────────────────────────────────────────
-- IPL Interiors & Themes [EDIT]
-- [INFO] Preconfigured IPL entries (coords, themes, stash). Add/remove freely.
-- [INFO] For bob74_ipl entries, export returns the related IPL object.
--──────────────────────────────────────────────────────────────────────────────
Config.IplData = {
{
-- Apartment
export = function()
return exports['bob74_ipl']:GetExecApartment1Object()
end,
defaultTheme = 'seductive',
themes = {
{ label = 'Modern', value = 'modern', price = 500, image = Config.ImagePath .. 'management/themes/apartment/modern.png' },
{ label = 'Moody', value = 'moody', price = 500, image = Config.ImagePath .. 'management/themes/apartment/moody.png' },
{ label = 'Vibrant', value = 'vibrant', price = 500, image = Config.ImagePath .. 'management/themes/apartment/vibrant.png' },
{ label = 'Monochrome', value = 'monochrome', price = 500, image = Config.ImagePath .. 'management/themes/apartment/monochrome.png' },
{ label = 'Seductive', value = 'seductive', price = 500, image = Config.ImagePath .. 'management/themes/apartment/seductive.png' },
{ label = 'Regal', value = 'regal', price = 500, image = Config.ImagePath .. 'management/themes/apartment/regal.png' },
{ label = 'Aqua', value = 'aqua', price = 500, image = Config.ImagePath .. 'management/themes/apartment/aqua.png' },
-- { label = 'Sharp', value = 'sharp', price = 500, image = './assets/img/management/themes/apartment/sharp.png' }
},
exitCoords = vec3(-787.44, 315.81, 217.64),
iplCoords = vec3(-787.78050000, 334.92320000, 215.83840000),
stash = { maxweight = 1000000, slots = 10 },
shower = {
ptfxOffset = vec3(0.760, 15.928, 5.837),
animationOffset = vec4(0.760, 15.928, 4.637, 175.785)
},
sink = {
ptfxOffset = vec3(-3.025, 17.0, 4.579),
animationOffset = vec4(-2.561, 17.011, 4.600, 175.747),
},
cooking = {
animationOffset = vec4(-5.337, -5.332, 1.200, 91.176),
recipes = Config.CookingRecipes
},
toilet = {
ptfxOffset = vec3(-2.954, 19.387, 5.113),
animationOffset = vec4(-2.249, 19.414, 4.600, 177.101),
}
},
{
-- Office
export = function()
return exports['bob74_ipl']:GetFinanceOffice1Object()
end,
defaultTheme = 'warm',
themes = {
{ label = 'Warm', value = 'warm', price = 500, image = Config.ImagePath .. 'management/themes/office/warm.png' },
{ label = 'Classical', value = 'classical', price = 500, image = Config.ImagePath .. 'management/themes/office/classical.png' },
{ label = 'Vintage', value = 'vintage', price = 500, image = Config.ImagePath .. 'management/themes/office/vintage.png' },
{ label = 'Contrast', value = 'contrast', price = 500, image = Config.ImagePath .. 'management/themes/office/contrast.png' },
{ label = 'Rich', value = 'rich', price = 500, image = Config.ImagePath .. 'management/themes/office/rich.png' },
{ label = 'Cool', value = 'cool', price = 500, image = Config.ImagePath .. 'management/themes/office/cool.png' },
{ label = 'Ice', value = 'ice', price = 500, image = Config.ImagePath .. 'management/themes/office/ice.png' },
{ label = 'Conservative', value = 'conservative', price = 500, image = Config.ImagePath .. 'management/themes/office/conservative.png' },
{ label = 'Polished', value = 'polished', price = 500, image = Config.ImagePath .. 'management/themes/office/polished.png' }
},
exitCoords = vec3(-141.1987, -620.913, 168.8205),
iplCoords = vec3(-141.1987, -620.913, 168.8205),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- Clubhouse 1
exitCoords = vec3(1121.037354, -3152.782471, -37.074707),
iplCoords = vec3(1107.04, -3157.399, -37.51859),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- Clubhouse 2
exitCoords = vec3(997.028564, -3158.136230, -38.911377),
iplCoords = vec3(998.4809, -3164.711, -38.90733),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- Penthouse Casino
exitCoords = vec3(980.83, 56.51, 116.16),
iplCoords = vec3(976.636, 70.295, 115.164),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- NightClub Warehouse
exitCoords = vec3(-1520.88, -2978.54, -80.45),
iplCoords = vec3(-1505.783, -3012.587, -80.000),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- Vehicle Warehouse
exitCoords = vec3(956.12, -2987.24, -39.65),
iplCoords = vec3(994.5925, -3002.594, -39.64699),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- 2133 Mad Wayne Thunder
exitCoords = vec3(-1289.89, 449.83, 97.9),
iplCoords = vec3(-1288, 440.748, 97.69459),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- 2868 Hillcrest Avenue
exitCoords = vec3(-758.3676, 619.0331, 144.1516),
iplCoords = vec3(-763.107, 615.906, 144.1401),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- Del Perro Heights, Apt 7
exitCoords = vec3(-1453.86, -517.64, 56.93),
iplCoords = vec3(-1477.14, -538.7499, 55.5264),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- 4 Integrity Way, Apt 28
exitCoords = vec3(-30.5111, -595.2331, 80.0309),
iplCoords = vec3(-9.9887, -582.3750, 79.4308),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- 4 Integrity Way, Apt 30
exitCoords = vec3(-18.4784, -591.8953, 90.1148),
iplCoords = vec3(-29.0499, -574.6309, 88.7123),
stash = { maxweight = 1000000, slots = 10 },
},
{
-- Eclipse Towers, Apt 3
exitCoords = vec3(-785.2117, 323.7787, 211.9972),
iplCoords = vec3(-773.407, 341.766, 211.397),
stash = { maxweight = 1000000, slots = 10 },
},
--Uncomment if you're going to use the experimental version
--[[ {
-- 3717 Mansion 1
exitCoords = vec3(537.4049072265625, 749.0591430664062, 202.4766540527344),
iplCoords = vec3(533.525269, 725.169250, 202.293823),
stash = { maxweight = 1000000, slots = 10 },
zone = {
points = {
vec3(546.3588256835938, 809.3697509765625, 200.2849273681641),
vec3(605.490478515625, 768.5374755859375, 203.1336212158203),
vec3(540.7081909179688, 663.1214599609375, 162.0594940185547),
vec3(466.2291259765625, 740.6036376953125, 198.61166381835935)
}
}
},
{
-- 3717 Mansion 2
exitCoords = vec3(-1666.8931884765625, 477.24078369140625, 129.33653259277344),
iplCoords = vec3(-1630.219727, 469.938477, 129.131836),
stash = { maxweight = 1000000, slots = 10 },
zone = {
points = {
vec3(-1709.6185302734375, 489.9075927734375, 129.32821655273438),
vec3(-1643.3818359375, 528.0819091796875, 129.74615478515625),
vec3(-1586.5408935546875, 427.3875122070313, 107.04544830322266),
vec3(-1669.523193359375, 391.99224853515625, 89.07738494873047)
}
}
},
{
-- 3717 Mansion 3
exitCoords = vec3(-2587.67724609375, 1911.02001953125, 167.4906005859375),
iplCoords = vec3(-2602.984619, 1874.663696, 167.296753),
stash = { maxweight = 1000000, slots = 10 },
zone = {
points = {
vec3(-2610.777099609375, 1940.5137939453127, 171.35894775390625),
vec3(-2531.7802734375, 1935.3734130859375, 171.43614196777344),
vec3(-2548.482177734375, 1858.4361572265625, 171.41339111328125),
vec3(-2665.338623046875, 1859.841552734375, 171.62115478515625)
}
}
}, ]]
}
--──────────────────────────────────────────────────────────────────────────────
-- Construction System [EDIT]
-- [INFO] Enables timed/animated construction zones with worker NPCs.
-- [INFO] Durations are interpreted by the script (do not change units unless you know how its read).
--──────────────────────────────────────────────────────────────────────────────
Config.Construction = false -- [EDIT] Enable construction timer/animations?
---@type table<string, Construction>
Config.Constructions = { -- [EDIT] Per-model construction presets
['lf_house_04_'] = {
duration = 10 * 60, -- [EDIT]
model = 'prop_pighouse2', -- [EDIT] Temporary construction model
peds = { -- [EDIT] Worker NPCs (add as needed)
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_05_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_07_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_08_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_09_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_10_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_11_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_13_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_15_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_16_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_17_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_18_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_19_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
['lf_house_20_'] = {
duration = 10 * 60,
model = 'prop_pighouse2',
peds = {
{ model = 's_m_m_dockwork_01', offsets = vec3(0.0, 0.3, 0.0), heading = 65.54, anim = 'base', dict = 'anim@amb@office@boardroom@boss@male@' },
{ model = 's_m_m_gardener_01', offsets = vec3(1.0, 2.0, 0.0), heading = 179.27, anim = 'idle_a', dict = 'amb@world_human_picnic@female@idle_a' },
}
},
}
--──────────────────────────────────────────────────────────────────────────────
-- Shell / IPL / MLO Editor Controls [EDIT]
-- [INFO] Keybinds used in edit modes for interiors and placement tools.
--──────────────────────────────────────────────────────────────────────────────
ActionControls = {
leftClick = { label = 'Left Click', codes = { 24 } },
forward = { label = 'Forward +/-', codes = { 33, 32 } },
right = { label = 'Right +/-', codes = { 35, 34 } },
up = { label = 'Up +/-', codes = { 52, 51 } },
add_point = { label = 'Add Point', codes = { 24 } },
undo_point = { label = 'Undo Last', codes = { 25 } },
rotate_z = { label = 'RotateZ +/-', codes = { 20, 73 } },
rotate_z_scroll = { label = 'RotateZ +/-', codes = { 17, 16 } },
offset_z = { label = 'Offset Z +/-', codes = { 44, 46 } },
boundary_height = { label = 'Z Boundary +/-', codes = { 20, 73 } },
done = { label = 'Done', codes = { 191 } },
cancel = { label = 'Cancel', codes = { 194 } },
arrow_left = { label = 'Previous', codes = { 174 } },
arrow_right = { label = 'Next', codes = { 175 } },
-- Decorate (Modern Mode)
place_object_on_ground = { label = 'Place Object on Ground', codes = { 47 } },
toggle_free_mode = { label = 'Toggle Free Mode', codes = { 167 } },
toggle_cursor = { label = 'Toggle Cursor', codes = { 166 } },
toggle_editor_mode = { label = 'Toggle Translate/Rotate', codes = { 311 } },
toggle_gizmo_mode = { label = 'Toggle Gizmo Mode', codes = { 244 } },
toggle_free_camera = { label = 'Toggle Free Camera', codes = { 170 } },
focus_free_camera = { label = 'Focus Object', codes = { 49 } },
zoom = { label = 'Zoom +/-', codes = { 17, 16 } },
-- DEPREACTED NEED TO CHECK
set_any = { label = 'Set', codes = { 24 } },
set_position = { label = 'Set Position', codes = { 24 } },
add_garage = { label = 'Add Garage', codes = { 24 } },
increase_z = { label = 'Z Boundary +/-', codes = { 180, 181 } },
decrease_z = { label = 'Z Boundary +/-', codes = { 21, 180, 181 } },
change_player = { label = 'Player +/-', codes = { 82, 81 } },
change_shell = { label = 'Change Shell +/-', codes = { 189, 190 } },
select_player = { label = 'Select Player', codes = { 191 } },
change_outfit = { label = 'Outfit +/-', codes = { 82, 81 } },
delete_outfit = { label = 'Delete Outfit', codes = { 178 } },
select_vehicle = { label = 'Vehicle +/-', codes = { 82, 81 } },
spawn_vehicle = { label = 'Spawn Vehicle', codes = { 191 } },
leftApt = { label = 'Previous Apartment', codes = { 174 } },
rightApt = { label = 'Next Apartment', codes = { 175 } },
testPos = { label = 'Test Pos', codes = { 47 } },
}
--──────────────────────────────────────────────────────────────────────────────
-- NUI Decorate Keybinds [EDIT]
-- [INFO] JavaScript key names for the decoration UI (browser/NUI side).
-- These must match KeyboardEvent.key values.
-- See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
--──────────────────────────────────────────────────────────────────────────────
Config.DecorateKeybinds = {
toggle_cursor = 'F5', -- [EDIT] Show/hide cursor
toggle_hide_decorate = 'F6', -- [EDIT] Show/hide decoration UI
place_object_on_ground = 'g', -- [EDIT] Place furniture on ground
toggle_editor_mode = 'k', -- [EDIT] Toggle translate/rotate mode
toggle_space_mode = 'q', -- [EDIT] Toggle world/local space
toggle_gizmo_mode = 'm', -- [EDIT] Toggle gizmo mode
toggle_free_camera = 'F3', -- [EDIT] Toggle free camera
buy_object = 'Enter', -- [EDIT] Confirm / buy object
}
--──────────────────────────────────────────────────────────────────────────────
-- Door Logic [EDIT]
-- [INFO] Interaction distances and duplicate detection.
--──────────────────────────────────────────────────────────────────────────────
Config.DoorDistance = 1.5 -- [EDIT] Interaction distance for doors
Config.DoorDuplicateDistance = 3.0 -- [EDIT] Merge doors if closer than this
--──────────────────────────────────────────────────────────────────────────────
-- Dynamic Doors & Credit Toggle [EDIT]
-- [INFO] Dynamic doors require: setr game_enableDynamicDoorCreation "true" in server.cfg
--──────────────────────────────────────────────────────────────────────────────
Config.DynamicDoors = true -- [EDIT] Enable dynamic doors?
Config.CreditToggleActiveInDefault = false -- [EDIT] Default credit toggle state
--──────────────────────────────────────────────────────────────────────────────
-- Free Camera Options [EDIT]
-- [INFO] Tuning for editor/preview camera movement.
--──────────────────────────────────────────────────────────────────────────────
CameraOptions = { -- [EDIT]
lookSpeedX = 1000.0, -- Horizontal camera speed.
lookSpeedY = 1000.0, -- Vertical camera speed.
moveSpeed = 20.0, -- Free-move speed.
climbSpeed = 10.0, -- Up/down speed.
rotateSpeed = 20.0, -- Rotation speed.
}
--──────────────────────────────────────────────────────────────────────────────
-- Custom House Creation [ADV]
-- [INFO] Manual house definitions. Prefer the in-game creator (F7) unless you
-- know exactly what youre doing.
--──────────────────────────────────────────────────────────────────────────────
CreatingHouse = {} -- [CORE] Runtime buffer (leave as is)
---@type table<string, House>
Config.Houses = { -- [EDIT] Add manual houses here (advanced)
-- Example (keep commented as reference):
-- ['Test House'] = {
-- id = 1, owned = 0, price = 0, locked = true, address = 'Nikola p1', tier = 1,
-- coords = {
-- enter = { x=1303.0059, y=-527.4684, z=71.4657, h=311.8610 },
-- PolyZone = {
-- usePolyZone = true, thickness = 25.0,
-- points = {
-- { x=1303.5743, y=-500.4180, z=71.0 },
-- { x=1293.0419, y=-537.6561, z=71.0 },
-- { x=1311.5504, y=-544.9465, z=71.0 },
-- { x=1327.7316, y=-498.8352, z=71.0 },
-- }
-- },
-- cam = { x=1303.0059, y=-527.4684, z=71.4657, h=311.8610, yaw=-10.0 },
-- exit = { x=1264.6019, y=-545.8494, z=27.5634, h=246.8610 },
-- interiorCoords = { x=1266.7444, y=-544.3600, z=26.5542, w=311.8610 },
-- shellCoords = { x=1266.7444, y=-544.3600, z=26.5542, h=311.8610 },
-- },
-- garage = {
-- max = 4, access = {},
-- slots = {
-- [1] = { x=-125.6479, y=-1297.6467, z=29.4452, h=93.5560 },
-- },
-- coords = { x=-228.8, y=-990.41, z=29.34, h=267.02 },
-- },
-- }
}
--──────────────────────────────────────────────────────────────────────────────
-- Free Mode Keys [EDIT]
-- [INFO] Key table and bindings for free-move/edit modes (placement/rotation).
--──────────────────────────────────────────────────────────────────────────────
Keys = {
['ESC'] = 322,
['F1'] = 288,
['F2'] = 289,
['F3'] = 170,
['F5'] = 166,
['F6'] = 167,
['F7'] = 168,
['F8'] = 169,
['F9'] = 56,
['F10'] = 57,
['~'] = 243,
['1'] = 157,
['2'] = 158,
['3'] = 160,
['4'] = 164,
['5'] = 165,
['6'] = 159,
['7'] = 161,
['8'] = 162,
['9'] = 163,
['-'] = 84,
['='] = 83,
['BACKSPACE'] = 177,
['TAB'] = 37,
['Q'] = 44,
['W'] = 32,
['E'] = 38,
['R'] = 45,
['T'] = 245,
['Y'] = 246,
['U'] = 303,
['P'] = 199,
['['] = 39,
[']'] = 40,
['ENTER'] = 18,
['CAPS'] = 137,
['A'] = 34,
['S'] = 8,
['D'] = 9,
['F'] = 23,
['G'] = 47,
['H'] = 74,
['K'] = 311,
['L'] = 182,
['LEFTSHIFT'] = 21,
['Z'] = 20,
['X'] = 73,
['C'] = 26,
['V'] = 0,
['B'] = 29,
['N'] = 249,
['M'] = 244,
[','] = 82,
['.'] = 81,
['LEFTCTRL'] = 36,
['LEFTALT'] = 19,
['SPACE'] = 22,
['RIGHTCTRL'] = 70,
['HOME'] = 213,
['PAGEUP'] = 10,
['PAGEDOWN'] = 11,
['DELETE'] = 178,
['LEFT'] = 174,
['RIGHT'] = 175,
['TOP'] = 27,
['DOWN'] = 173,
['NENTER'] = 201,
['N4'] = 108,
['N5'] = 60,
['N6'] = 107,
['N+'] = 96,
['N-'] = 97,
['N7'] = 117,
['N8'] = 61,
['N9'] = 118
}
--──────────────────────────────────────────────────────────────────────────────
-- Debug [EDIT]
-- [INFO] Verbose logging. Keep disabled on production servers.
--──────────────────────────────────────────────────────────────────────────────
Config.Debug = false -- [EDIT] Debug mode
Config.ZoneDebug = false -- [EDIT] Zone/poly debug