Configuration
Overview
shared/config.lua: Global behavior, language, theme, interaction ranges, features, progression, blueprints, portable stations, fuel and durability defaultsshared/config_models.lua: Station model presets, bench prop, screen texture placement, per-model cameraserver/config_server.lua: Discord webhooks
Stations, recipes, categories, blueprints and custom station models are not defined in the config. They live in the database and are built from the in-game admin panel (/craftadmin). Where the same setting exists in both places, fuel, durability, pickup rules, queue limits, the value saved in the admin panel takes priority over the config default.
General
1Config.Debug = false
2Config.Language = 'en'
3Config.Theme = 'default'
4Config.MainColor = nil
5Config.Command = 'craftadmin'Debug: Console output for troubleshooting, including the/craftpooldumpdiagnostic commandLanguage: Locale code, must match a file inlocales/.Theme: Interface theme:'default','wasteland','cyberpunk','noir','fantasy'MainColor: Hex accent color override.niluses the theme default. Individual benches can override it again with a tint color from the admin panelCommand: Chat command that opens the admin editor
Interaction & Streaming
1Config.Interaction = {
2 TargetDistance = 2.5,
3 SpawnDistance = 80.0,
4 DuiActivation = 12.0,
5 MaxOperationRange = 5.0,
6}
7
8Config.Stream = {
9 Radius = 200.0,
10 OutRadius = 250.0,
11 ReloadDistance = 100.0,
12 PollMinInterval = 1500,
13 PollMaxInterval = 4000,
14}TargetDistance: Range in meters to interact with a benchSpawnDistance: Distance at which bench props spawn and despawnDuiActivation: Distance at which the screen content starts renderingMaxOperationRange: Server-side maximum distance for any crafting action. Requests from further away are rejectedRadius/OutRadius: Benches insideRadiusenter the client cache, benches beyondOutRadiusdrop from it. KeepOutRadiuslarger thanRadiusReloadDistance: Meters of player movement before the client asks the server for benches againPollMinInterval/PollMaxInterval: Position poll interval in ms, faster while moving, slower while standing still
Feature Toggles
1Config.Features = {
2 Spotlight = true,
3 PortableStations = true,
4 Blueprints = true,
5 QueuedCrafting = true,
6 PropPreview = true,
7 CraftAnimations = true,
8 DamageInterrupt = true,
9 MultipleCrafters = false,
10 Invincibility = false,
11}Spotlight: Light above the bench while a player uses itPortableStations: Player-placeable benches via inventory itemBlueprints: Blueprint requirement system (item or permanent unlock)QueuedCrafting: Timed crafting queue, start a craft, walk away, collect laterPropPreview: 3D preview of the result item floating above the bench while craftingCraftAnimations: Player animation during the craftDamageInterrupt: Taking damage interrupts the craft in progressMultipleCrafters: Allow several players on the same bench at once. Whenfalse, a bench lock keeps it to one user at a timeInvincibility: Player cannot be damaged while crafting. Only applies whenMultipleCrafters = false
Internal Progression
Used only when Config.ExternalSkills.Enabled = false. Levels and XP are stored per player in the database.
1Config.Progression = {
2 Enabled = false,
3 GlobalXp = {
4 Base = 100,
5 Scaling = 1.4,
6 MaxLevel = 50,
7 },
8 CategoryXp = {
9 Base = 50,
10 Scaling = 1.3,
11 MaxLevel = 30,
12 },
13 Points = {
14 PerLevelUp = 1,
15 PerCategoryLevelUp = 1,
16 },
17}GlobalXp: XP needed per level followsBase * (Scaling ^ (level - 1)).Scaling = 1.0is linear, above1.0grows exponentially, capped atMaxLevelCategoryXp: Same formula per recipe category, each category levels separatelyPoints: Points granted on level up
External Skills (ml_skills)
1Config.ExternalSkills = {
2 Enabled = true,
3 Resource = 'ml_skills',
4 Mapping = {
5 Category = '',
6 XpMultiplier = 1.0,
7 PerCategory = {},
8 },
9}Enabled: Delegate levels, skill checks and XP to ml_skills. Setfalseto use the internal progression aboveResource: Name of the external skills resourceMapping.Category: Fixed ml_skills category for all crafting XP. Leave empty to auto-route by recipe category or by the recipe's required skill (recommended)Mapping.XpMultiplier: Multiplier applied to recipe XP before it is sent to ml_skillsMapping.PerCategory: Explicit map of ml_crafting category id to ml_skills category UID, for when the names differ
Recipe Display & Limits
1Config.Recipes = {
2 HideUnavailable = true,
3 HideMissingBlueprint = true,
4 ShowLockedPreview = false,
5 MaxQueueSize = 3,
6 MaxBatchSize = 0,
7}HideUnavailable: Hide recipes the player cannot craft yetHideMissingBlueprint: Hide recipes whose blueprint the player does not ownShowLockedPreview: Show locked recipes as a preview without allowing the craftMaxQueueSize: Maximum queued crafts per player across all benches.0= unlimited. Bench types can set their own queue limit in the admin panelMaxBatchSize: Maximum quantity per single craft operation.0= unlimited
Crafting Queue
1Config.Queue = {
2 CleanupEnabled = true,
3 CleanupAfterDays = 7,
4 CleanupCheckInterval = 3600,
5 SharedView = true,
6 AllowSteal = true,
7}CleanupEnabled/CleanupAfterDays: Uncollected ready crafts are removed after this many daysCleanupCheckInterval: Cleanup check interval in secondsSharedView: Everyone at the bench sees everyone else's queue entriesAllowSteal: Players can collect other players' finished crafts. Every theft is logged throughBridge.Log
Blueprints
1Config.Blueprints = {
2 GenericItemName = 'ml_blueprint',
3 DynamicPrefix = 'blueprint_',
4 StrictMode = false,
5 ConsumeOnCraft = false,
6 Durability = {
7 Enabled = false,
8 DefaultUses = 5,
9 },
10}GenericItemName: One shared inventory item that carriesmetadata.blueprint = '<blueprint id>'. Works with metadata-capable inventoriesDynamicPrefix: Alternative pattern, one dedicated item per blueprint, namedblueprint_<label>(a custom item name can also be set per blueprint in the admin panel)StrictMode: Every recipe requires a blueprint, even recipes without one assignedConsumeOnCraft: Remove the blueprint item after craftingDurability.Enabled/DefaultUses: Give blueprints a number of uses instead of a single consume. Only active together withConsumeOnCraft = true. Permanent unlocks always bypass consumption
Portable Stations
1Config.PortableStations = {
2 GenericItemName = 'ml_workstation',
3 DynamicSuffix = '_workstation',
4 MaxPerPlayer = 5,
5 PlacementRange = 5.0,
6 DefaultPickupRule = 'owner',
7 DefaultPickupTimeOwner = 5,
8 DefaultPickupTimeTheft = 15,
9 TheftAnimation = 'mini@repair',
10 TheftAnimationName = 'fixing_a_ped',
11 LogTheft = true,
12 DeleteOld = 10,
13 DeleteOptions = {
14 DeleteOnlyIfNotCrafting = true,
15 DeleteOnlyIfNoFuel = true,
16 DeleteOnlyIfBroken = false,
17 },
18 RequireAnchor = {
19 Enabled = false,
20 Radius = 5.0,
21 Props = {
22 2139035592,
23 -1933224451,
24 -1924811947,
25 -1668132370,
26 },
27 },
28 PickupCooldown = 0,
29}GenericItemName: Base placeable item. The bench type it deploys comes frommetadata.stationType. Bench types can also bind their own dedicated item in the admin panelMaxPerPlayer: Placed stations allowed per playerPlacementRange: Maximum placement distance from the player in metersDefaultPickupRule: Who can pick a station up:'owner','everyone', or a list of job names. Overridable per bench type in the admin panelDefaultPickupTimeOwner/DefaultPickupTimeTheft: Seconds of progress bar to pick up your own station versus someone else'sTheftAnimation/TheftAnimationName: Animation played during a theft pickupLogTheft: Send theft attempts to the webhook logDeleteOld: Days without interaction before an abandoned station is deleted.falsedisables the cleanupDeleteOptions: Extra conditions, keep the station if it still has an active queue, remaining fuel, or intact durabilityRequireAnchor: When enabled, placement requires one of the listed prop models (signed int32 hashes) withinRadiusmeters, for example, restrict stations to a basePickupCooldown: Seconds after placement before pickup is allowed.0= disabled
Admin Permissions
1Config.Admin = {
2 Permission = 'admin',
3 AcePermission = nil,
4 FullAccess = true,
5}Permission:Bridge.HasPermissiongroup required for the admin panel and admin commands. Set it to the staff group name of your frameworkAcePermission: When set (for example'mlcraft.admin'), an ACE permission check is used instead of the framework groupFullAccess: Admins can use every bench and recipe regardless of restrictions
Screen & Camera
1Config.DUI = {
2 Range = 8.0,
3 MaxActive = 16,
4 Width = 1920,
5 Height = 1080,
6}
7
8Config.Camera = {
9 OffsetX = 0.0,
10 OffsetY = -1.10,
11 OffsetZ = 0.65,
12 LookZ = -1.05,
13 Fov = 58.0,
14 TransitionMs = 500,
15}Range: Distance at which a bench screen turns on and offMaxActive: Maximum bench screens rendering at the same timeWidth/Height: Screen render resolutionCamera: Default focus camera when a player uses a bench, offsets relative to the bench, look pitch, field of view and transition time. Station model presets and individual benches can override it
Live Craft Prop
The hologram of the result item shown above the bench while crafting. Removed on completion or failure. Uses the recipe's prop model override, or the first result item's model as fallback.
1Config.LiveCraftProp = {
2 Enabled = true,
3 Alpha = 150,
4 OffsetRight = 0.16,
5 OffsetForward = 0.46,
6 OffsetZ = 0.18,
7 DefaultRotX = 0.0,
8 DefaultRotY = 0.0,
9 DefaultRotZ = 0.0,
10 Spin = 25.0,
11 DefaultScale = 1.0,
12 AutoFit = true,
13 AutoFitMode = 'both',
14 AutoFitThreshold = 0.30,
15 AutoFitTarget = 0.22,
16 AutoFitMinScale = 0.10,
17 AutoFitPushPerM = 0.35,
18 AutoFitGroundZ = 0.0,
19}Alpha: Prop transparency, 0-255. Around150reads as a hologramOffsetRight/OffsetForward/OffsetZ: Default position in the bench's local frame. Overridable per recipe (prop_offset)DefaultRotX/Y/Z: Default rotation in degrees, overridable per recipe (prop_rotation)Spin: Continuous yaw spin in degrees per second.0= offDefaultScale: Starting scale. A per-recipeprop_scaleoverrides auto-fit entirelyAutoFit: Automatically shrink or push back oversized props (furniture, crates, heavy weapons) so they fit above the bench.AutoFitModepicks the strategy:'scale','push'or'both'AutoFitThreshold/AutoFitTarget/AutoFitMinScale/AutoFitPushPerM/AutoFitGroundZ: Size above which auto-fit triggers, the target size after shrinking, the minimum allowed scale, how far residual oversize is pushed back, and the target height of the prop's base
Fuel
Fuel is optional and set per bench type. The usual place to configure it is the admin panel, whose values take priority. The config can seed defaults per bench type id:
1Config.Fuel = {
2 -- ['campfire'] = {
3 -- enabled = true,
4 -- max_fuel = 1800,
5 -- items = {
6 -- ['wood'] = { required = 1, amount = 300 },
7 -- ['charcoal'] = { required = 1, amount = 600 },
8 -- }
9 -- }
10
11 mlFuel = {
12 enabled = false,
13 hintItems = {},
14 acceptedFuelTypes = {
15 'diesel',
16 },
17 typeLabels = {
18 ['fuel'] = 'Gasoline',
19 ['diesel'] = 'Diesel',
20 ['biofuel'] = 'Biofuel',
21 ['ethanol'] = 'Ethanol',
22 ['kerosene'] = 'Kerosene',
23 ['electricity'] = 'Electricity',
24 },
25 litersToSeconds = 60,
26 },
27}['<bench_type>']: Consumable fuel for that bench type,max_fuelcapacity in seconds anditemsmapping each fuel item to the seconds it addsmlFuel.enabled: Accept refillable jerrycans. Any item withmetadata.fuelAmount(liters) andmetadata.fuelTypeis recognized; the item stays in the inventory and only its metadata is decrementedmlFuel.hintItems: Container items shown in the bench fuel list even when empty, so players know what to refill. Replace with your inventory's item namesmlFuel.acceptedFuelTypes: Fuel types the bench accepts. Must matchConfig.FuelTypesin ml_fuelmlFuel.typeLabels: Display label per fuel type. A missing key falls back to the raw type namemlFuel.litersToSeconds: Bench runtime seconds granted per liter
Each bench type also has a fuel mode in the admin panel: consumable items only, jerrycans only, or both.
Durability
1Config.Durability = {
2 -- ['campfire'] = {
3 -- enabled = true,
4 -- max_health = 72,
5 -- repair_items = {
6 -- ['steel'] = { required = 1, repair = 50 },
7 -- ['wood'] = { required = 3, repair = 25 },
8 -- }
9 -- }
10}max_health: Hours of active crafting before the station stops workingrepair_items: Items accepted for repair and the percentage each restores
Like fuel, durability is normally configured per bench type in the admin panel, which overrides these defaults.
Station Models
shared/config_models.lua defines the model presets selectable when creating a bench. Each preset combines a bench prop, the screen placement, and an optional camera.
1Config.StationModels = {
2 ["woodbench"] = {
3 Title = 'Wood Bench',
4 SpawnMode = 'bench_screen',
5 Bench = {
6 Model = 'prop_tool_bench02_ld',
7 },
8 Screen = {
9 Texture = 'script_rt_sturm1',
10 Offset = vec3(0.12, 0.01, 0.959),
11 Rotation = vec3(0.0, 0.0, 88.8),
12 Scale = 0.8,
13 },
14 Camera = {
15 OffsetX = 0.0,
16 OffsetY = -0.31,
17 OffsetZ = 0.7,
18 AimMode = 'lookat',
19 LookAtX = -0.01,
20 LookAtY = 0.0,
21 LookAtZ = 0.0,
22 Fov = 78.0,
23 },
24 },
25}SpawnMode:'screen_only'(floating screen, no bench prop),'bench_only'(interface drawn on the bench's own texture),'bench_screen'(bench prop plus a screen above it)Bench.Model: Any prop model name. This is configurableScreen.Texture: Texture name on the prop that the interface replaces. For the shipped screen this is'script_rt_sturm1'; for'bench_only'presets, name a texture of the bench model itselfScreen.Offset/Rotation/Scale: Screen placement relative to the benchCamera: Per-model camera.nilfalls back toConfig.Camera
The screen prop itself is managed by the script and ships with the resource; a Screen.Model value set here is ignored. You control the bench prop, the texture, and the screen's offset, rotation and scale. New model presets can also be built entirely in-game with the admin panel's model builder, which saves them to the database.
Discord Webhooks
1Config.Webhooks = {
2 crafting = '',
3 craft_start = '',
4 craft_complete = '',
5 craft_failed = '',
6 craft_refund = '',
7 theft = '',
8 exploit = '',
9 admin_editor = '',
10 admin_bench = '',
11 admin_recipe = '',
12 admin_blueprint = '',
13 admin_import = '',
14}crafting: Fallback channel. Any action whose own webhook is empty logs herecraft_start/craft_complete/craft_failed/craft_refund: Craft lifecycle, failures and ingredient refundstheft: Station theft and queue stealsexploit: Rejected requests, distance violations, token mismatches, denied admin actionsadmin_editor/admin_bench/admin_recipe/admin_blueprint/admin_import: Admin panel activity with before/after diffs