Documentation › Mushrooms › Features › Drying Rack

Drying Rack

Player-placed drying racks, stars over time, rotting and no-rack zones.

Players place their own drying rack in the world, hang mushrooms on it and come back later. The longer a mushroom dries, the more stars it gets. Dried mushrooms sell for more than raw ones.

How players use it

Place

Use the drying_rack item. A ghost preview follows the crosshair: mouse wheel / Q E rotate (Shift = fine), LMB / Enter place, RMB / Backspace cancel. The preview turns red when the spot is not allowed: too far, too steep, in water, something in the way, too close to another rack, in a vehicle, or inside a no-rack zone.

Hang mushrooms

Target the rack → Dry mushrooms. The camera moves to the rack. Drag raw mushrooms from the tray onto the 12 slots; the mouse wheel moves the camera up and down to reach the lower row.

Check progress

Hover a slot to see the mushroom, its state (drying / ready / rotten), progress, time left, current stars and when it gets the next star.

Collect

Click a ready slot to take the dried mushroom. A rotten one is thrown away.

Pick up rack packs it back into the inventory (the rack must be empty). One rack per player.

Racks are saved in MySQL, survive restarts and every player within streamDistance sees them with the mushrooms hanging on them.

Stars over time

lua
-- config_economy.lua
Config.DryingQuality = {
    steps = { 1.0, 1.5, 2.0 },     -- star N after dryTime * steps[N]
    driedPriceMultiplier = 1.8,    -- dried price = raw base price x this
}

With dryTime = 60 a mushroom is 1★ after 60 s, 2★ after 90 s and 3★ after 120 s. A dried mushroom never ends up below the quality of the raw one. rotTime counts from the last step (0 = never rots).

Configuration

lua
-- config_drying_rack.lua
Config.EnableDryingRack = true
Config.DryingRack = {
    rackItem          = 'drying_rack',
    requireForestZone = false,   -- true = only inside a forest
    rackProp          = 's_drying_rack_m',
    enablePlacement   = true,    -- false = placed in front of the player
    placementMaxDist  = 4.0,
    placementRotStep  = 2.0,
    maxSlope          = 30.0,
    minRackDistance   = 2.0,
    placeTime         = 2500,
    pickupTime        = 2500,
    streamDistance    = 80.0,
    propZOffset       = 0.0,     -- + if the prop sinks, - if it floats
}

Config.DryingRackDry = {
    maxSlots = 12,
    camOffset = { x = 0.0, y = -1.20, z = 1.80 }, camLookAt = { x = 0.0, y = 0.0, z = 0.55 }, camFov = 50.0,
    camLiftMin = -0.6, camLiftMax = 0.4,
    dropMaxDist = 0.22,
    tray  = { ... },   -- where raw mushrooms lie
    slots = { ... },   -- 12 hanging positions
    items = {
        { raw = 'boletus', dried = 'dried_boletus', prop = 'borowik', dryTime = 60, rotTime = 0 },
        -- leccinum, russula, coprinus, clitocybe, morchella, lactarius, spring king
    },
}

No-rack zones

Admins draw zones where racks can't be placed: Admin panel → Rack zones.

  • Polygon – walk around, aim with the camera, E adds a point, Backspace undo, Enter save
  • Circle – E sets the centre, mouse wheel changes the radius (Shift faster), Enter save

Zones are stored in data/rack_zones.json and can also be edited by hand; the server picks up file changes within about 5 seconds.

json
[
  { "id": "z1", "name": "Legion Square", "type": "poly",
    "points": [[195.0, -930.0], [240.0, -860.0], [150.0, -800.0]], "minZ": 20.0, "maxZ": 90.0 },
  { "id": "z2", "name": "Pillbox Hospital", "type": "circle", "center": [300.0, -590.0, 43.0], "radius": 60.0 }
]

Racks that already stand inside a new zone are not removed automatically. Use Remove drying rack on the player in the admin panel.