Docs

kyoEmpireBuilder

Sales, police and wars

Everything on this page is in config/config_labs.lua.

Sale missions

Started from the laptop inside a production lab. The product is loaded into a van that appears at the lab’s vehicle point, and has to be driven to a buyer.

Config.SaleMissions = {
    Cooldown = 600,
    MinUnits = 20,
    Vehicles = {               -- the vehicle depends on the amount sold
        { upTo = 80,   model = 'burrito3' },
        { upTo = 200,  model = 'speedo4' },
        { upTo = 9999, model = 'mule3' },
    },
    Destinations = { ... },    -- one is picked at random
    BlipDelay = 30,            -- seconds before rivals see the van
    PayTo = 'treasury',        -- 'treasury' (organization) or 'player' (the driver)
    PayCurrency = 'dirty',
    PoliceAlertChance = 35,    -- %
    HeatPerMission = 6,
    Thieves = {
        Enabled = true,
        RewardPercent = 0.5,   -- of the cargo value, in dirty money
        DropPoints = { ... },
    },
}

The value of the cargo is units × random(sale.min, sale.max) × quality multiplier.

Thieves: anyone who is not in the organization and not police can steal the van and drive it to a thief drop point, getting part of its value.

/empirecancel cancels the player’s current mission.

Street sales

Config.StreetSales = {
    Enabled = true,
    Currency = 'dirty',
    Items = {
        weed_bag = { min = 140, max = 190, maxPerDeal = 5 },
        meth_bag = { min = 330, max = 420, maxPerDeal = 4 },
        coke_bag = { min = 420, max = 520, maxPerDeal = 4 },
        acid_tab = { min = 210, max = 280, maxPerDeal = 6 },
    },
    Zones = {
        { label = 'Grove Street', coords = vector3(105.50, -1940.60, 20.80), radius = 120.0, priceMult = 1.0 },
        -- ...
    },
    ApproachEvery = { 25, 50 },  -- seconds between buyers in a zone
    ApproachByDefault = true,
    ToggleCommand = 'streetsell',
    OfferKey = 74,               -- H: offer to a pedestrian when no target is used
    ZonePoliceChance = 5,        -- % chance a deal in a zone alerts the police
    Anywhere = {
        Enabled = true,
        AcceptChance = 45,       -- %
        PoliceChance = 20,       -- % when they refuse
        PedCooldown = 600,       -- the same ped can't be offered again
    },
    HotSpots = { ... },          -- near police stations the police chance is much higher
    MinPolice = 0,               -- on-duty police required to sell on the street
}
  • In a zone, NPCs walk up to the player and ask to buy, while /streetsell is on.
  • Outside the zones, players can offer to any pedestrian (target option, or the H key). The pedestrian may refuse and call the police.

Street saturation

Config.StreetSaturation = {
    Enabled = true,
    PerSale = 0.03,          -- the price drops 3% per sale
    MinMultiplier = 0.55,
    RecoverPerMinute = 0.01,
}

Every sale lowers the price in that zone (or in that area of the map, outside zones). It recovers over time, so players have to move around.

Heat and raids

Config.Heat = {
    Max = 100,
    DecayPerHour = 4,
    RaidThreshold = 80,       -- a raid can start from this heat
    RaidChancePerHour = 35,   -- % chance per hour while above the threshold
    MinPolice = 2,            -- police on duty needed for a raid
    RaidWindow = 900,         -- seconds the lab can be breached
    RaidCooldown = 7200,      -- seconds between raids on the same lab
    SeizeProduct = 0.75,      -- part of the stored product seized
    SeizeSupplies = 0.5,
    HeatAfterRaid = 20,
    RaidReward = 15000,       -- paid to each officer inside when seizing (0 = none)
    RaidRewardCurrency = 'bank',
}
  1. Production, sale missions and laundering raise the lab’s heat. The security upgrade reduces it.
  2. Above RaidThreshold, every hour there is a RaidChancePerHour chance of a raid, if enough police are on duty.
  3. Police get an alert through the configured dispatch, with the lab’s location.
  4. An officer with a police_ram breaches the entrance (Config.Police.BreachTime). The lab stays open for RaidWindow seconds.
  5. Inside, police seize the storage. The organization loses part of its product and supplies; each officer inside is paid RaidReward.

Admins can also start and stop a raid from the admin panel.

Lending

Config.Lending = {
    Enabled = true,
    Durations = { 1, 3, 7, 14 }, -- days available in the panel
    MaxPercent = 60,
}
PaymentHow it works
FixedThe borrower pays a fixed amount, which goes to the owner’s treasury
PercentageThe owner keeps a share of everything the borrower produces, collected from the lab
FreeNothing

The owner sends an offer from Lending, the other boss accepts it, and the borrower’s members can enter and produce until it expires or the owner cancels it.

Wars

Config.Wars = {
    Enabled = true,
    DeclarePrice = 250000,      -- paid from the treasury
    Duration = 6,               -- hours
    MinLevel = 3,               -- organization level needed to declare
    Cooldown = 24,              -- hours before the same two organizations can fight again
    BreachItem = 'breach_kit',
    ConsumeBreachItem = true,
    BreachTime = 20,            -- seconds
    LootTime = 15,              -- seconds looting the storage
    LootPercent = 0.35,         -- part of the stored product taken per assault
    AssaultWindow = 600,        -- seconds the lab stays open after a breach
    LabCooldown = 2,            -- hours before the same lab can be assaulted again
    MinDefendersOnline = 2,     -- defending members online needed to assault
    Hours = { from = 18, to = 2 }, -- server time; empty = any time
    WinXP = 3000,
    LoseXP = 500,
}
  1. A member with war_declare declares war from the Wars tab.
  2. The enemy’s labs appear on the map for every member. Members with war_assault can force them.
  3. At the entrance, with a breach_kit, they force the door (BreachTime). The lab stays open for AssaultWindow seconds.
  4. Inside, they loot the storage (LootTime) and take LootPercent of the product, or of the money in a laundering lab.
  5. When the war ends, the side that looted the most value wins WinXP; the other gets LoseXP.

Headquarters cannot be assaulted.

Daily contracts

Config.Contracts = {
    Enabled = true,
    PerDay = 3,
    ResetHour = 6,              -- hour (server time) when contracts change
    Types = {
        { kind = 'produce', label = 'produce', min = 60, max = 160, reward = { money = 60000, xp = 400 } },
        { kind = 'street',  label = 'street',  min = 10, max = 25,  reward = { money = 45000, xp = 350 } },
        { kind = 'supply',  label = 'supply',  min = 2,  max = 4,   reward = { money = 70000, xp = 450 } },
        { kind = 'deliver', label = 'deliver', min = 20, max = 60,  reward = { money = 90000, xp = 600 } },
    },
    DeliverItems = { 'meth_bag', 'coke_bag', 'weed_bag', 'counterfeit_cash', 'fake_id', 'acid_tab' },
    DeliverPoints = { ... },
}
KindGoal
produceProduce X units in any lab
streetMake X street sales
supplyComplete X supply missions
deliverBring X units of an item to a drop point shown on the map

Rewards are paid to the treasury.