# Open files preview

{% hint style="success" %}
This script is customizable, there is a total of 4 files accessible for you.
{% endhint %}

## config/config.lua

<details>

<summary>Click here to see a preview config.lua</summary>

```lua
Config = {}
-- _____       _                  _____          _                                     _          _   _                    __   ___  
-- |  __ \    (_)                / ____|        | |                                   (_)        | | (_)                  /_ | / _ \ 
-- | |__) |__  _ ___  ___  _ __ | |     ___   __| | ___     ___  _ __ __ _  __ _ _ __  _ ______ _| |_ _  ___  _ __  ___    | || | | |
-- |  ___/ _ \| / __|/ _ \| '_ \| |    / _ \ / _` |/ _ \   / _ \| '__/ _` |/ _` | '_ \| |_  / _` | __| |/ _ \| '_ \/ __|   | || | | |
-- | |  | (_) | \__ \ (_) | | | | |___| (_) | (_| |  __/  | (_) | | | (_| | (_| | | | | |/ / (_| | |_| | (_) | | | \__ \   | || |_| |
-- |_|   \___/|_|___/\___/|_| |_|\_____\___/ \__,_|\___|   \___/|_|  \__, |\__,_|_| |_|_/___\__,_|\__|_|\___/|_| |_|___/   |_(_)___/ 
--                                                                    __/ |                                                          
--                                                                   |___/                                                                                                    
-- © PoisonCode 
-- Discord: https://discord.gg/rNJ8cHXCsN
-- Tebex: https://poisoncode.tebex.io

--   __  __       _                          __ _       
--  |  \/  |     (_)                        / _(_)      
--  | \  / | __ _ _ _ __     ___ ___  _ __ | |_ _  __ _ 
--  | |\/| |/ _` | | '_ \   / __/ _ \| '_ \|  _| |/ _` |
--  | |  | | (_| | | | | | | (_| (_) | | | | | | | (_| |
--  |_|  |_|\__,_|_|_| |_|  \___\___/|_| |_|_| |_|\__, |
--                                                 __/ |
--                                                |___/ 

Config.clientDebug = false -- Enables additional debug messages on the client side console (F8), we recommend turning this off while not debugging
Config.serverDebug = true -- Enables additional debug messages on the server side console, you can keep it on if these messages don't bother you
-- *Error and security messages will be print anyway*

Config.integrations = {
    -- Mandatory
    ox_inventory = GetResourceState('ox_inventory') == 'started' or false,
    -- Optional
    pc_notifications = GetResourceState('pc_notifications') == 'started' or false,
    pc_skills = GetResourceState('pc_skills') == 'started' or false,
}

-- Here you can turn on or off specific modules, we recommend keeping them all on for best experience
Config.modules = {
    zones = true, -- enables zones module
    drugwars = true, -- enables drugwars module
}

-- Here you can choose which options should be available in ox_target
-- You can still control the access to these options with permissions in Config.Permissions
Config.target = {
    tablet = true, -- enables opening the tablet with ox_target
    safeCheck = true, -- enables checking the organization's safe with ox_target
    safeDeposit = true, -- enables depositing and withdrawing money from the organization's safe with ox_target
    safeWithdraw = true, -- enables withdrawing money from the organization's safe with ox_target
    warehouse = true, -- enables opening the warehouse with ox_target
    wardrobe = true, -- enables opening the wardrobe with ox_target
    wardrobeAdd = true, -- enables adding outfits to the wardrobe with ox_target
    wardrobeRemove = true, -- enables removing an outfit from the wardrobe with ox_target
}

-- Default values all organizations start with
Config.defaultValues = {
    ["membersCount"] = 7, -- example: each organization starts with max. 7 members (In slots)
    ["warehouseSlots"] = 1, -- (In slots (ox_inventory))
    ["warehouseWeight"] = 500, -- (In kg (ox_inventory))
    ["drugwarsTax"] = 10, -- (In % of sale)
}

-- Price for each upgrade
Config.upgradesPrice = {
    ["membersCount"] = 50000, -- example: 1 upgrade = 50000$ from organization's safe
    ["warehouseSlots"] = 25000,
    ["warehouseWeight"] = 15000,
    ["drugwarsTax"] = 50000,
}

-- How much each upgrade adds
Config.upgradesIncrements = {
    ["membersCount"] = 1, -- example: 1 upgrade = 1 additional member slot
    ["warehouseSlots"] = 1,
    ["warehouseWeight"] = 5,
    ["drugwarsTax"] = 1,
}

-- Max values for each upgrade
Config.upgradesMaxValues = {
    ["membersCount"] = 20, -- example: maximum 20 members in each organization
    ["warehouseSlots"] = 200,
    ["warehouseWeight"] = 500000,
    ["drugwarsTax"] = 20,
}

-- Feel free to change permission LABEL. Changing permission NAME WILL BREAK THE SCRIPT.
Config.Permissions = {
    {name = "permissionsManage", label = "managing permissions"},
    {name = "hireMembers", label = "recruiting members"},
    {name = "fireMember", label = "firing members"},
    {name = "upgrades", label = "managing upgrades"},
    {name = "noteAdd", label = "adding notes"},
    {name = "noteRemove", label = "removing notes"},
    {name = "safe", label = "safe access"},
    {name = "warehouse", label = "warehouse access"},
    {name = "wardrobeOpen", label = "wardrobe access "},
    {name = "wardrobeAdd", label = "adding outfits"},
    {name = "wardrobeRemove", label = "removing outfits"},
    {name = "webhookModify", label = "webhook changes"}
}

-- You can configure organizations here:
Config.Organizations = {
    ["families"] = {
        label = "Families",
        Blip = vec3(-157.0381, -1616.7047, 32.6994),
        Safe = {
            coords = vector3(-163.93, -1619.61, 33.85),
            size = vector3(0.6, 0.6, 0.6),
            rotation = 340.0
        },
        Storage = {
            coords = vector3(-158.96, -1608.36, 33.65),
            size = vector3(2.2, 0.6, 2.0),
            rotation = 340.0
        },
        Wardrobe = {
            coords = vector3(-162.9, -1613.6, 33.65),
            size = vector3(2.8, 0.6, 2.0),
            rotation = 340.0
        }
    },
    ["lost"] = {
        label = "Lost",
        Blip = vec3(974.3788, -119.4971, 73.3864),
        Safe = {
            coords = vector3(977.59, -104.65, 74.65),
            size = vector3(1.0, 0.8, 1.2),
            rotation = 310.0
        },
        Storage = {
            coords = vector3(987.35, -93.43, 74.85),
            size = vector3(0.8, 2.2, 2.0),
            rotation = 315.0
        },
        Wardrobe = {
            coords = vector3(972.17, -97.62, 74.87),
            size = vector3(0.4, 3.8, 2.0),
            rotation = 310.0
        }
    },
    ["marabunta"] = {
        label = "Marabunta",
        Blip = vec3(1258.1376, -1570.7284, 57.4016),
        Safe = {
            coords = vector3(1251.25, -1580.72, 58.55),
            size = vector3(0.6, 0.6, 0.6),
            rotation = 305.0
        },
        Storage = {
            coords = vector3(1254.59, -1572.07, 58.75),
            size = vector3(1, 2.6, 2.0),
            rotation = 305.0
        },
        Wardrobe = {
            coords = vector3(1254.62, -1576.37, 58.15),
            size = vector3(0.6, 1.4, 1.0),
            rotation = 305.0
        }
    },
    ["cartel"] = {
        label = "De La Cosa",
        Blip = vec3(1403.78, 1144.02, 114.33),
        Safe = {
            coords = vector3(1394.74, 1150.37, 115.33),
            size = vector3(0.8, 1.6, 2),
            rotation = 0.0
        },
        Storage = {
            coords = vector3(1403.78, 1144.02, 114.33),
            size = vector3(0.6, 3.0, 2.0),
            rotation = 0.0
        },
        Wardrobe = {
            coords = vector3(1400.4, 1139.73, 114.33),
            size = vector3(1.4, 0.6, 2.2),
            rotation = 0.0
        }
    },
    ["mafia"] = {
        label = "La Cosa Nostra",
        Blip = vec3(1096.7808, -3099.2991, -39.0000),
        Safe = {
            coords = vector3(1087.7452, -3101.2766, -38.9614),
            size = vector3(1.0, 1.6, 1),
            rotation = 310.0
        },
        Storage = {
            coords = vector3(1100.9728, -3102.2998, -39.0000),
            size = vector3(0.6, 1.4, 2.0),
            rotation = 40.0
        },
        Wardrobe = {
            coords = vector3(1104.0432, -3102.3225, -39.0000),
            size = vector3(0.8, 3.4, 2.2),
            rotation = 40.0
        }
    },
    ["sinister"] = {
        label = "The Sinister",
        Blip = vector3(568.26, -2780.87, 6.09),
        Safe = {
            coords = vector3(519.56, -2757.89, 6.64),
            size = vector3(2.6, 1, 1),
            rotation = 330.0
        },
        Storage = {
            coords = vector3(506.36, -2756.69, 3.07),
            size = vector3(4.0, 1, 2.0),
            rotation = 330.0
        },
        Wardrobe = {
            coords = vector3(568.26, -2780.87, 6.09),
            size = vector3(3.0, 1, 2.2),
            rotation = 330.0
        }
    },
}


--   ______                                        __ _       
--  |___  /                                       / _(_)      
--     / / ___  _ __   ___  ___    ___ ___  _ __ | |_ _  __ _ 
--    / / / _ \| '_ \ / _ \/ __|  / __/ _ \| '_ \|  _| |/ _` |
--   / /_| (_) | | | |  __/\__ \ | (_| (_) | | | | | | | (_| |
--  /_____\___/|_| |_|\___||___/  \___\___/|_| |_|_| |_|\__, |
--                                                       __/ |
--                                                      |___/ 


Config.zoneSettings = {
    auto = true,
    autoStart = 1200, --- (seconds) How quickly the first zone after restarting the script/server appear
    autoDelay = 1800, --- (seconds) How quickly the next zone appears (the timer starts right after the previous zone is created)

    zoneCaptureTime = 20, --- (seconds) How long it takes to capture the zone
    zoneDuration = 600, --- (seconds) How long the zone is active 
    zoneCaptureDelay = 20, --- How quickly can you capture the zone after canceling the capture (seconds)
    zonePrepareTime = 20, --- (seconds) How long it takes to prepare the zone before it appears
    zoneSize = 150.0,
    captureSize = 6.0,
}


-- Possible loot tables for zone rewards, only one table will be chosen, at random
-- When using minCount and maxCount, it will pick a random number in that range
-- When using count, it will always use that number
Config.zoneRewards = {
    { 
        {item = 'meth', minCount = 3, maxCount = 20},
        {item = 'weed', minCount = 8, maxCount = 25},
    },
-- OR
    { 
        {item = 'black_money', minCount = 5000, maxCount = 25000},
    },
-- OR
    { 
        {item = 'WEAPON_MACHETE', minCount = 1, maxCount = 2},
        {item = 'WEAPON_KNIFE', minCount = 1, maxCount = 2},  
    },
-- OR
    { 
        {item = 'WEAPON_SNSPISTOL', count = 1},
    }
}


Config.zoneLocations = {
    {
        coords = vector3(-2527.5723, 2699.8335, -22.838), -- Center of the zone
        propCoords = { -- Crate location, only one of the values below will be choosen (at random).
            vector3(-2527.5723, 2699.8335, 1.838), 
            vector3(-2522.7871, 2733.1943, 1.8316),
            vector3(-2475.4683, 2731.6782, 1.8716),    
        }
    },

    {
        coords = vector3(383.3146, 2893.9709, -20.5480), -- Center of the zone
        propCoords = { -- Crate location, only one of the values below will be choosen (at random).
            vector3(398.6463, 2980.2148, 39.9499), 
            vector3(268.5528, 2867.1343, 73.1748),
            vector3(319.3150, 2884.2703, 48.0229),      
        }
    },

    {
        coords = vector3(1075.9691, 2366.7412, -18.2522), -- Center of the zone
        propCoords = { -- Crate location, only one of the values below will be choosen (at random).
            vector3(1089.4799, 2309.3499, 44.5132), 
            vector3(1006.8578, 2360.2310, 54.5715),
            vector3(1026.1266, 2440.3679, 43.9705),  
        }
    },

    {
        coords = vector3(1500.9552, 3549.1238, 35.6549), -- Center of the zone
        propCoords = { -- Crate location, only one of the values below will be choosen (at random).
            vector3(1516.6475, 3577.0632, 41.8550), 
            vector3(1559.3889, 3522.0605, 35.0679),
            vector3(1594.8564, 3586.1721, 38.0666),  
        }
    },

    {
        coords = vector3(978.2614, -3136.7349, -20.9008), -- Center of the zone
        propCoords = { -- Crate location, only one of the values below will be choosen (at random).
            vector3(930.9222, -3097.9087, 16.1479), 
            vector3(1029.9514, -3131.3235, 4.9008),
            vector3(959.0121, -3097.4951, 4.9008),  
        }
    }
}


-- _____                                                               __ _       
-- |  __ \                                                             / _(_)      
-- | |  | |_ __ _   _  __ _  __      ____ _ _ __ ___    ___ ___  _ __ | |_ _  __ _ 
-- | |  | | '__| | | |/ _` | \ \ /\ / / _` | '__/ __|  / __/ _ \| '_ \|  _| |/ _` |
-- | |__| | |  | |_| | (_| |  \ V  V / (_| | |  \__ \ | (_| (_) | | | | | | | (_| |
-- |_____/|_|   \__,_|\__, |   \_/\_/ \__,_|_|  |___/  \___\___/|_| |_|_| |_|\__, |
--                     __/ |                                                  __/ |
--                    |___/                                                  |___/ 
Config.warsSettings = {
    auto = true, -- should the war be started automatically
    autoStart = 1200, --- (seconds) How quickly the first war appears (after restart/start)
    autoDelay = 10800, --- (seconds) How quickly the next war appears (the timer starts right after the previous war is *created*)
    warDuration = 1800, --- (seconds) How long the war is active
}

Config.baseSellChance = 40 -- (in %) Base chance to sell drugs, without skill multiplier

-- Used only when using pc_skills resource
Config.pc_skills = {
    skillName = "skill4", -- which skill is used for drug selling
    saleXP = 10, -- how much xp you gain for each sold drug (for each piece)
    copTipoffLvl = 5, -- when player reaches this level, he will recieve tip-off if the client called cops
    lvlBonus = 1, -- how much higher is the chance to sell drugs, for each level (in %), for example each lvl = 1% added to baseSellChance
}

Config.moneyType = "black_money" -- type of money that should be given to player selling ("money" or "black_money")

Config.copsRequired = 2 -- How many cops are required to sell the drugs
Config.copsJobs = {'police', 'sheriff'} -- jobs that are counted as cops
-- example: if you have copsRequired = 2, and police and sheriff jobs are counted as cops, if there's 1 police and 1 sheriff on duty, you will be able to sell drugs

Config.blacklistedJobs = {'police', 'sheriff'} -- jobs that are blacklisted from selling drugs

-- Drugs that can be sold to npcs
-- min and max are min and max price the player will recieve
Config.Drugs = {
    ['acid'] = {min = 182, max = 444},
    ['lsd'] = {min = 145, max = 388},
    ['meth'] = {min = 113, max = 338},
    ['coke'] = {min = 125, max = 292},
    ['weed'] = {min = 148, max = 182},
}

-- Informants are only available for organization that captured a zone. When bought, they will check if there's a police officer in the zone,
-- after that they'll notify organization members when a police officer enters the zone.
Config.enableAlertNpcs = true -- Should informants be available

-- zone -- zone in which this infromant is active
-- model -- model of the npc
-- coords -- coords of the npc
-- price -- price for activating the informant
-- duration (seconds) -- how long the informant will be active
-- delay (seconds) -- delay before the informant will alert
Config.alertNpc = {
    -- zone 1
    {zone = 'zone1', model = 'a_m_m_mexlabor_01', coords = vector4(-357.7109, -640.9236, 30.7715, 207.9297), price = 2500, duration = 100, delay = 20},
    {zone = 'zone1', model = 'a_m_m_mexlabor_01', coords = vector4(-1215.3136, -569.2302, 26.3067, 163.3186), price = 5000, duration = 200, delay = 10},

    -- zone 2
    {zone = 'zone2', model = 'a_m_m_mexlabor_01', coords = vector4(963.3970, -944.5385, 41.6625, 270.3664), price = 2500, duration = 100, delay = 20},
    {zone = 'zone2', model = 'a_m_m_mexlabor_01', coords = vector4(729.7922, -992.6858, 22.9715, 3.9504), price = 5000, duration = 200, delay = 10},

    -- zone 3 
    {zone = 'zone3', model = 'a_m_m_mexlabor_01', coords = vector4(748.8958, -1692.4928, 28.3219, 167.1573), price = 2500, duration = 100, delay = 20},
    {zone = 'zone3', model = 'a_m_m_mexlabor_01', coords = vector4(433.7659, -1879.3448, 25.9994, 95.7669), price = 5000, duration = 200, delay = 10},

    -- zone 4
    {zone = 'zone4', model = 'a_m_m_mexlabor_01', coords = vector4(-394.7887, -1881.1279, 19.5278, 346.9869), price = 2500, duration = 100, delay = 20},
    {zone = 'zone4', model = 'a_m_m_mexlabor_01', coords = vector4(-532.8264, -1781.5658, 20.5106, 292.3524), price = 5000, duration = 200, delay = 10},
}

-- List of peds that can't buy drugs from the player
-- You can expand this list if you want
Config.pedBlacklist = {
    "u_f_m_casinocash_01",
    "csb_trafficwarden",
    "u_m_y_burgerdrug_01",
    "u_m_y_tattoo_01",
    "s_m_m_gardener_01",
    "s_m_y_xmech_01",
    "s_m_m_lathandy_01",
    "a_m_y_bevhills_01",
    "a_m_m_indian_01",
    "u_f_y_danceburl_01",
    "ig_andreas",
    "mp_m_shopkeep_01",
    "a_m_y_epsilon_01",
    "a_f_y_topless_01",
    "cs_paper",
    "u_m_m_jewelsec_01",
    "a_m_m_business_01",
    "a_m_y_business_02",
    "s_m_m_autoshop_01",
    "s_m_m_doctor_01",
    "mp_m_g_vagfun_01",
    "s_m_m_pilot_01",
    "a_c_cow",
    "a_c_boar",
    "a_c_cat_01",
    "a_c_chickenhawk",
    "a_c_chimp",
    "a_c_chop",
    "a_c_crow",
    "a_c_deer",
    "a_c_husky",
    "a_c_mtlion",
    "a_c_pig",
    "a_c_pigeon",
    "a_c_poodle",
    "ig_trafficwarden",
    "a_f_y_business_01",
    "cs_siemonyetarian",
    "u_m_y_chip",
    "s_f_m_fembarber",
    "mp_m_weapexp_01",
    "a_c_pug",
    "a_c_rabbit_01",
    "a_c_rat",
    "a_c_retriever",
    "a_c_rhesus",
    "a_c_rottweiler",
    "a_c_seagull",
    "a_c_shepherd",
    "a_f_y_business_02",
    "a_c_westy",
}
```

</details>

## config/translations.lua

<details>

<summary>Click here to see a preview translations.lua</summary>

```lua
-- _____                          _____          _      
-- |  __ \    (_)                / ____|        | |     
-- | |__) |__  _ ___  ___  _ __ | |     ___   __| | ___ 
-- |  ___/ _ \| / __|/ _ \| '_ \| |    / _ \ / _` |/ _ \
-- | |  | (_) | \__ \ (_) | | | | |___| (_) | (_| |  __/
-- |_|   \___/|_|___/\___/|_| |_|\_____\___/ \__,_|\___|
-- © PoisonCode 
-- Discord: https://discord.gg/rNJ8cHXCsN
-- Tebex: https://poisoncode.tebex.io

Translations = {
    -- General
    organization = "Organization",
    balanceCheck = "Check balance",
    deposit = "Deposit cash",
    withdraw = "Withdraw cash",
    openStorage = "Open storage",
    savedOutfits = "Saved outfits",
    orgOutfits = "Organization outfits",
    addOutfit = "Add organization outfit",
    outfitName = "Outfit name",
    outfitNameDesc = "Provide a name for the outfit",
    removeOutfit = "Remove organization outfit",
    hideout = "Organization hideout",
    noOutfits = "No organization outfits saved",
    wardrobe = "Wardrobe",
    setName = "Set a name",
    outfitAdded = "Outfit added",
    outfitRemoved = "Outfit removed",
    safe = "Safe",
    depositMoney = "Deposit cash",
    depositMoneyDesc = "How much cash do you want to deposit?",
    withdrawMoney = "Withdraw cash",
    withdrawMoneyDesc = "How much cash do you want to withdraw?",
    safeMoney = "There is %s $ in the safe",
    notEnoughMoney = "You don't have enough cash",
    depositSuccess = "Cash deposited, there is now %s $ in the safe",
    notEnoughMoneySafe = "There is not enough cash in the safe",
    withdrawSuccess = "Cash withdrawn, there is now %s $ in the safe",
    notEnoughSlots = "Maximum members reached",
    maxUpgrade = "Maximum upgrade reached",
    upgradeBought = "Upgrade bought",
    noteAdded = "Note added",
    webhookModified = "Webhook modified",
    itemSwaped = "Item swaped",
    itemOut = "Item taken",
    itemIn = "Item put",
    openTablet = "Open tablet",


    -- Logs
    logOutfitAdded = "%s %s added an outfit named: %s",
    logOutfitRemoved = "%s %s removed an outfit named: %s",
    logSafeDeposit = "%s %s deposited %s $ into the safe",
    logSafeWithdraw = "%s %s withdrew %s $ from the safe",
    logMemberFired = "%s %s fired %s %s",
    logMemberHired = "%s %s hired %s %s",
    logUpgradeBought = "%s %s upgraded %s by %s",
    logNoteAdded = "%s %s added a note",
    logNoteRemoved = "%s %s removed a note",
    logWebhookModified = "%s %s modified the organization webhook",
    logItemOut = "Took",
    logItemIn = "Put",

    logZoneCreated = "Zone created",
    logZoneCreatedDesc = "A new zone has been created. \nType:%s\nLocation:%s\nBox:%s",
    logZoneReward = "Zone captured",
    logZoneRewardDesc = "A zone has been captured by %s.\nRewards: `%s`",

    logDrugsSold = "Drugs sold",
    logDrugsSoldDesc = "Player %s sold: %s x %s for %s$",

    logDrugwarsTax = "Drug sale tax",
    logDrugwarsTaxDesc = "Organization received drug sale tax of %s$",


    -- HTML (Tablet)
    permissions = "Permissions",
    save = "Save",
    cancel = "Cancel",
    noPeopleNerby = "No people nearby",
    warEndsIn = "Drug war ends in",
    warStartIn = "Drug war starts in",
    noWar = "There is no drug war",
    remove = "Remove",
    fireMember = "Fire",
    home = "Home",
    members = "Members",
    upgrades = "Upgrades",
    drugWars = "Drug wars",
    logs = "Logs",
    close = "Close",
    info = "Info",
    orgName = "name",
    finances = "Finances",
    moneyOwned = "Cash",
    notes = "Notes",
    newNote = "New note",
    noteAddTitle = "adding a note",
    confirm = "Confirm",
    hire = "Recruit",
    name = "Name",
    actions = "Actions",
    drug = "Drug",
    map = "City map",
    leaderboard = "Leaderboard",
    maxMembers = "Max members count",
    maxMembersDesc = "Increase maximum members amount",
    slot = "Slot",
    price = "Price",
    buy = "Buy",
    warehouseSlots = "Warehouse slots",
    warehouseSlotsDesc = "Increase warehouse slots amount",
    warehouseWeight = "Warehouse weight",
    warehouseWeightDesc = "Increase maximum warehouse weight",
    kg = "Kg",
    drugwarsTax = "Drugwars tax",
    drugwarsTaxDesc = "Increase the amount you get from sold drugs",
    percent = "%",
    webhook = "Webhook",
    date = "Date",
    webhookLink = "Provide a webhook link",
    membersOnline = "Members online",


    -- Zones
    zone = "Zone",
    fists = "[Fists]",
    melee = "[Melee]",
    guns = "[Guns]",
    collect = "Collect chest",
    newZoneIn = "A new zone will appear in %s seconds.",
    newZoneStart = "A new zone appeared!",
    vehicleEnter = "You can't enter the zone in a vehicle!",
    wrongWeapon = "You can't use this weapon in this zone type!",
    inVehicle = "You can't do this while in a vehicle!",
    zoneBusy = "Someone else is already capturing this zone!",
    cooldown = "You have to wait %s seconds before you can capture this zone again!",
    captureStart = "You started capturing the zone!",
    captureCancelTooFar = "Zone capture canceled. You moved too far!",
    captureCancelDamage = "Zone capture canceled. You took damage!",
    captureSuccess = "You captured the zone!",


    -- Drug wars
    trySellDrugs = "Sell drugs",
    drugDealingTitle = "Drug dealing",
    drugDealingNoItems = "You don't have any items to sell",
    drugDealingNotEnough = "You don't have enough items to sell",
    drugDealingNotEnoughCops = "Not enough cops on duty. Required at least %s",
    drugDealingFailed = "Client refused to buy the drugs",
    drugDealingFailedPolice = "Client refused to buy the drugs and called the police",
    drugDealingBlacklistedJob = "You can't sell drugs",
    drugDealingXP = "You recieved %s XP points",
    drugDealingTaxPaid = "You sold drugs in zone controlled by %s. Tax paid: %s$",

    informantBuyTitle = "Buy informant",
    informantBuyText = "Do you want to buy an informant for %s$ ? \n You will receive a message when the police enters the zone.",
    informantTitle = "Informant",
    informantWar = "There is an active war in this zone",
    infromantMoney = "You don't have enough cash",
    informantOrg = "This zone doesn't belong to your organization",
    informantActive = "There is already an active informant in this zone",
    informantBought = "Informant bought!",
    informantEnd = "Informant services ended!",
    informantPoliceEnter = "Cops entered the zone, be careful!",
    informantPolicePresent = "There are cops in the zone!",
}
```

</details>

## client/utils.lua

<details>

<summary>Click here to see a preview translations.lua</summary>

```lua
-- _____                          _____          _      
-- |  __ \    (_)                / ____|        | |     
-- | |__) |__  _ ___  ___  _ __ | |     ___   __| | ___ 
-- |  ___/ _ \| / __|/ _ \| '_ \| |    / _ \ / _` |/ _ \
-- | |  | (_) | \__ \ (_) | | | | |___| (_) | (_| |  __/
-- |_|   \___/|_|___/\___/|_| |_|\_____\___/ \__,_|\___|
-- © PoisonCode 
-- Discord: https://discord.gg/rNJ8cHXCsN
-- Tebex: https://poisoncode.tebex.io

-------------------------------------------------------------------------------------------------------------------
--- GENERAL
-------------------------------------------------------------------------------------------------------------------

function sendNotification(title, text, time, type)
    if Config.integrations.pc_notifications then
        exports['pc_notifications']:Notify(type, title, text, time, true)
    else
        
    end
end

-------------------------------------------------------------------------------------------------------------------
--- DRUGWARS
-------------------------------------------------------------------------------------------------------------------
local alertBlips = {}
RegisterNetEvent('pc_organizations:client:drugwars.alertCops', function(location)

    sendNotification("Drug dealing", "Drug deal in progress! Location pinged on map.", 10000, "info")

    local newBlip = AddBlipForCoord(location)
    SetBlipSprite(newBlip, 3)
    SetBlipDisplay(newBlip, 4)
    SetBlipScale(newBlip, 0.9)
    SetBlipAsShortRange(newBlip, true)
    BeginTextCommandSetBlipName('STRING')
    AddTextComponentString("Drug deal in progress!") 
    EndTextCommandSetBlipName(newBlip)

    table.insert(alertBlips, newBlip)

    SetTimeout(60000, function()
        if #alertBlips > 0 then
            RemoveBlip(alertBlips[1])
            table.remove(alertBlips, 1)
        end
    end)
end)
```

</details>

## server/utils.lua

<details>

<summary>Click here to see a preview translations.lua</summary>

```lua
-- _____                          _____          _      
-- |  __ \    (_)                / ____|        | |     
-- | |__) |__  _ ___  ___  _ __ | |     ___   __| | ___ 
-- |  ___/ _ \| / __|/ _ \| '_ \| |    / _ \ / _` |/ _ \
-- | |  | (_) | \__ \ (_) | | | | |___| (_) | (_| |  __/
-- |_|   \___/|_|___/\___/|_| |_|\_____\___/ \__,_|\___|
-- © PoisonCode 
-- Discord: https://discord.gg/rNJ8cHXCsN
-- Tebex: https://poisoncode.tebex.io
-------------------------------------------------------------------------------------------------------------------
--- MAIN
-------------------------------------------------------------------------------------------------------------------
-- Function responsible for sending client notification
function sendClientNotification(id, title, text, time, type)
    if Config.integrations.pc_notifications then
        TriggerClientEvent('pc_notifications:Notify', id, type, title, text, time, true)
    else

    end
end

-------------------------------------------------------------------------------------------------------------------
--- COMMANDS
-------------------------------------------------------------------------------------------------------------------
-- Command for adding player to an organization will all permissions
ESX.RegisterCommand('setorg', {'admin'}, function(xPlayer, args, showError)
    if args.job == "unemployed" or Config.Organizations[args.job] then
        local permissions = {}
        for i = 1, #(Config.Permissions) do
            permissions[Config.Permissions[i].name] = true
        end

        args.playerId.set("org", {name = args.job, permissions = permissions})
        TriggerClientEvent('pc_organizations:client:main.setOrg', args.playerId.source, {name = args.job, permissions = permissions})
        MySQL.prepare('UPDATE `users` SET `org` = ?, `org_permissions` = ? WHERE `identifier` = ?', {args.job, json.encode(permissions), args.playerId.identifier})
    end
end, true, {help = ('Add player to organization (with all permissions!)'), validate = true, arguments = {
    {name = 'playerId', help = ('Player ID'), type = 'player'},
    {name = 'job', help = ('Organization name or "unemployed" to remove'), type = 'string'}
}})

-- A command for resetting an organization, all members will be removed, inventory will be cleared and upgrades will be reset
ESX.RegisterCommand('resetorg', {'admin'}, function(xPlayer, args, showError)
    local orgName = args.orgName
    local xPlayers = ESX.GetExtendedPlayers()
    
    for i = 1, #(xPlayers) do
        local xPlayer = xPlayers[i]
        if xPlayer.get("org").name == orgName then
            xPlayer.set("org", {name = "unemployed", permissions = {}})
            TriggerClientEvent('pc_organizations:client:main.setOrg', xPlayer.source, {name = "unemployed", permissions = {}})
        end
    end
    
    exports.ox_inventory:ClearInventory(orgName)
    exports.ox_inventory:SetSlotCount(orgName, Config.defaultValues.warehouseSlots)
    exports.ox_inventory:SetMaxWeight(orgName, Config.defaultValues.warehouseWeight)

    Organizations[orgName] = {account = 0, members_limit = Config.defaultValues.membersCount, warehouse_slots = Config.defaultValues.warehouseSlots, warehouse_weight = Config.defaultValues.warehouseWeight, drugwars_tax = Config.defaultValues.drugwarsTax} 
    
    MySQL.prepare('UPDATE `users` SET `org` = ?, `org_permissions` = ? WHERE `org` = ?', {"unemployed", json.encode({}), orgName})
    MySQL.prepare('UPDATE `organizations` SET `account` = 0, `members_limit` = ?, `warehouse_slots` = ?, `warehouse_weight` = ?, `drugwars_tax` = ? WHERE `name` = ?', {Config.defaultValues.membersCount, Config.defaultValues.warehouseSlots, Config.defaultValues.warehouseWeight, Config.defaultValues.drugwarsTax, orgName})
    MySQL.query.await('DELETE FROM `organizations_clothes` WHERE `org` = ?', {orgName})
    MySQL.query.await('DELETE FROM `organizations_logs` WHERE `org` = ?', {orgName})
    MySQL.query.await('DELETE FROM `organizations_notes` WHERE `org` = ?', {orgName})

end, true, {help = ('Reset organization to default'), validate = true, arguments = {
    {name = 'orgName', help = ('Organization name'), type = 'string'}
}})

ESX.RegisterCommand('orgmenu', {'user'}, function(xPlayer, args, showError)
    if exports["pc_organizations"]:hasOrgJob(xPlayer.source) then
        TriggerClientEvent("pc_organizations:OpenTablet", xPlayer.source)
    end
end, true, {help = ('Opens organizations tablet')})
-------------------------------------------------------------------------------------------------------------------
--- WEBHOOKS
-------------------------------------------------------------------------------------------------------------------
local adminWebhook = ""
local zonesWebhook = ""
local drugwarsWebhook = ""

-- These functions are responsible for sending the admin webhook
-- All organizations's actions will be posted to these webhooks for mods/admins
function sendAdminWebhook(org, title, content)
    local content = json.encode({
        avatar_url = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
        username = "PoisonCode organizations ADMIN",  
        embeds = {{
            ["title"] = org.." - "..title,
            ["color"] = 248250,
            ["fields"] = {
                {
                    ["name"] = " ",
                    ["value"] = content,
                    ["inline"] = false
                },
            },
            ["footer"] = {
                ["text"] = org.." @ pc_organizations • "..os.date("%H:%M  %d/%m/%Y"),
                ["icon_url"] = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
            },
        }},
    })

    PerformHttpRequest(adminWebhook, function(err, text, headers) end, 'POST', content, { ['Content-Type'] = 'application/json' })
end

function sendZonesWebhook(title, content)
    local content = json.encode({
        avatar_url = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
        username = "PoisonCode organizations ZONES",  
        embeds = {{
            ["title"] = title,
            ["color"] = 248250,
            ["fields"] = {
                {
                    ["name"] = " ",
                    ["value"] = content,
                    ["inline"] = false
                },
            },
            ["footer"] = {
                ["text"] = "pc_organizations zones • "..os.date("%H:%M  %d/%m/%Y"),
                ["icon_url"] = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
            },
        }},
    })

    PerformHttpRequest(zonesWebhook, function(err, text, headers) end, 'POST', content, { ['Content-Type'] = 'application/json' })
end

function sendDrugwarsWebhook(title, content)
    local content = json.encode({
        avatar_url = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
        username = "PoisonCode organizations DRUGWARS",  
        embeds = {{
            ["title"] = title,
            ["color"] = 248250,
            ["fields"] = {
                {
                    ["name"] = " ",
                    ["value"] = content,
                    ["inline"] = false
                },
            },
            ["footer"] = {
                ["text"] = "pc_organizations drugwars • "..os.date("%H:%M  %d/%m/%Y"),
                ["icon_url"] = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
            },
        }},
    })

    PerformHttpRequest(drugwarsWebhook, function(err, text, headers) end, 'POST', content, { ['Content-Type'] = 'application/json' })
end

-- This function is reposponsible for sending the organization's "private" webhook
-- Only this specific organization's actions will be posted
-- Organization A won't be able to see Organization B's actions
function sendOrgWebhook(org, webhook, title, content)
    local content = json.encode({
        avatar_url = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
        username = "PoisonCode organizations",  
        embeds = {{
            ["title"] = title,
            ["color"] = 248250,
            ["fields"] = {
                {
                    ["name"] = " ",
                    ["value"] = content,
                    ["inline"] = false
                },
            },
            ["footer"] = {
                ["text"] = org.." @ pc_organizations • "..os.date("%H:%M  %d/%m/%Y"),
                ["icon_url"] = "https://github.com/PoisonCodeDEV/images/blob/main/logoneon3.png?raw=true",
            },
        }},
    })

    PerformHttpRequest(webhook, function(err, text, headers) end, 'POST', content, { ['Content-Type'] = 'application/json' })
end
-------------------------------------------------------------------------------------------------------------------
--- ZONES
-------------------------------------------------------------------------------------------------------------------
-- Function responsible for adding items to the player after capturing the zone
function addItem(xPlayer)
    local items = {}

    for i, itemData in ipairs(Config.zoneRewards[math.random(#Config.zoneRewards)]) do
        local count = nil

        if itemData.count then 
            count = itemData.count 
        else 
            count = math.random(itemData.minCount, itemData.maxCount) 
        end

        table.insert(items, {item = itemData.item, count = count})

        xPlayer.addInventoryItem(itemData.item, count)
    end

    return items
end
```

</details>

{% hint style="info" %}
If you encounter any problems during configuration, you can create a support ticket on our discord.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.poisoncode.com/scripts/pc_organizations/open-files-preview.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
