What it does
Players with permission walk up to a building, string lights along the roofline, stand a tree in the plaza, hang a lantern by the door, and press play so the block dances to the music. Every piece is tagged with its holiday; the season calendar can turn each holiday's decorations on and off by date, so a city decorated once stays decorated every year.
- Point and click.
/holidayopens a panel. Pick with the mouse; the ghost follows your crosshair; left click places, right click cancels. - String lights on anything. Click points along a roofline, railing or doorway and the string runs between them, sagging like a real one (or not, per string). Six light types: mini, C9, rope, icicle, festoon globes, candle flicker. Seven patterns. Four channels.
- Inflatables. Seventy lawn blow-ups that ship as real game models: turkey, snowman, Santa, reindeer, jack-o-lantern, ghost, bunny, leprechaun, nine walkway arches and more across the holidays. One smooth skin each, lit from inside, casting light on the ground, solid enough to bump into.
- Wreaths. One per holiday, hung flat on the wall you aim at, with lights through them and a bow.
- Rope-light figures. Forty-seven of them: star, snowflake, tree, candy cane, bell, wreath, menorah, heart, shamrock, egg, pumpkin, bat, ring, snowman, reindeer, stocking, gingerbread man, angel, present, dreidel, Star of David, champagne glass, turkey, maple leaf, ghost, spider web, skull and more, hung flat on any wall and sized with the scroll wheel.
- See it before you place it. Every figure, inflatable and wreath has a picture in the panel; point at any row and it appears in the world at your crosshair. Props list what they are and how big.
- Props from the game's own catalog, verified against the object list, plus any streamed prop you add in Settings.
- Light shows. A track and a choreography drive the four channels of a group of lights, in sync for everyone nearby. 27 synthesized tracks ship (public-domain melodies and originals; nothing to license). Add your own.
- Sixteen sets: Christmas, Hanukkah, Kwanzaa, New Year's, Valentine's Day, St. Patrick's Day, Easter, Memorial Day, Independence Day, Labor Day, Halloween, Thanksgiving, and four dateless event sets: Party, Wedding, Birthday, Funeral / Memorial.
- Walkway arches and lit yard pieces. Candy cane, balloon, wedding and other arches that snap into a row along a path; a lit deer, stakes, orbs, lily stands, a candle vigil and more, drawn in game.
- Stationary objects only. Every decoration attaches to the map and to fixed objects. Nothing attaches to a vehicle or to anything that moves (the pier's Ferris wheel included): a string clicked onto one stays where it was clicked.
- No config.lua. Admins change every setting from the panel; changes are validated on the server and applied to everyone at once.
Installation
- Extract the resource into your server's
resources/folder. The folder must be namedsals_kewlholidays. - Add it to
server.cfgafter your framework (and after ox_lib if you use it):ensure sals_kewlholidays
- Grant yourself admin (see section 3) if you are not already an admin of your framework.
- Start the server. The console prints one line confirming what it found:
[sals_kewlholidays] framework: qb | decorations: 0 loaded from data/decorations.json | season: all
- Join, type
/holiday, open Settings, and set the server up from there.
data/ holds every decoration and every setting on your server; the release never ships files under that name, so an upgrade cannot overwrite them.Requirements: none beyond a FiveM server. The framework (qb-core, qbx_core, es_extended or none) is detected at runtime. Notifications use ox_lib, qb-core, ESX or GTA's own feed. Any game build works; props from newer DLCs appear only on builds that have them (sv_enforceGameBuild).
Who may decorate, who is an admin
Every placement, move, removal and show is checked on the server. A player may decorate when any of these is true:
- Settings → Who may decorate → Everyone may decorate is on;
- they hold the decorator ACE (default
holiday.decorate); - their job is in the decorator jobs list (default
admin,realestate,cityhall), on duty if "Jobs must be on duty" is on; - they are an admin.
A player is an admin (Settings tab, remove anything, clear groups, change the season, start shows anywhere) when any of these is true:
- qb-core / qbx: the framework's
adminorgodpermission; ESX: theadminorsuperadmingroup; - they are allowed FXServer's
commandACE (the server-admin permission in the stockserver.cfg); - they hold the admin ACE (default
holiday.admin).
To grant the ACE explicitly, in server.cfg (or the live console):
add_ace group.admin holiday.admin allow # if your admins are members of group.admin add_ace identifier.license:<license> holiday.admin allow # or one person, by identifier add_ace group.admin holiday.decorate allow
add_ace group.admin … only helps players who are actually members of group.admin (via add_principal). qb-core and most frameworks do not put their admins there; they are recognized through the framework check above instead. If an ACE line "does nothing", the player is not a member of the group it names.Decorators who are not admins can only move and remove their own decorations (Settings → "Decorators edit only their own"). Caps per player and for the whole server, and the reach (how far from a spot a player may be while placing or editing), are in the same section.
The decorator panel
/holiday or numpad + opens it; the key, Esc or the × closes it. The key is a FiveM key binding: each player can change it under Settings > Key Bindings > FiveM, and the default comes from Commands.OpenKey (section 12). Recording a video? /holiday record hides the chat window and sends this resource's messages to F8 until /holiday record off. The left border takes the color of the holiday you are working on. The header shows the season mode and which holidays are in season now.
| Tab | What is in it |
|---|---|
| Props | The holiday dropdown (â— marks in season), the holiday's wreaths and wall pieces, a search box, the prop list with a picture, its height and width, and a Place button on each; hover a row for what it is. Props the server's game build does not have are hidden and counted at the bottom. |
| Lights | Colors (swatches), light type, pattern, channel, bulb spacing, sag on/off, then Start stringing. |
| Figures | The figures offered for the holiday as pictures, colors, light type, pattern, channel, size, then Hang on a wall. |
| Inflatables | The holiday's inflatables and arches, each with a picture, a line on what it is and its size, and Place; below them the lit yard pieces. |
| Shows | Your group, what is playing now (with Stop), a choreography picker, and every track with a Play button. In-season tracks first. |
| Edit | Aim and click a decoration (point at it, click, act), the locations on the server with Use and Clear, everything within reach with Move and Remove, plus Undo my last placement. |
| Locations | Every decorated location with Travel; save the current location as a layout with a note; the saved layouts with Travel, Load, Save over, Rename, Delete, and Next location to walk the list. |
| Tips | Decorating tips for the holiday, written for these tools. |
| Settings | My settings (group, channel, light quality, viewing time, mute, off-season preview) for every player; Server settings for admins (section 12). |
Point at a row and it appears in the world. While the panel is open, the prop, figure, inflatable or wreath under the mouse is drawn where your crosshair is (a prop turns slowly so you see every side; a figure hangs on the wall you are aiming at), so a decorator sees what "Snowman (scarf)" is before placing it.
While a tool is up, a tray sits at the bottom of the screen showing what you are placing and the keys. Press Tab to get the mouse cursor and click the tray's buttons (colors, pattern, channel, type, spacing, rotate, Finish, Cancel); Tab or Back to aiming returns to the crosshair.
Placing props
Pick a holiday and a prop, click Place. The panel closes and the ghost appears wherever your crosshair lands.
| Control | Does |
|---|---|
| Aim | Moves the ghost to the surface under the crosshair. Ground props snap to the ground below that point (toggle with R); wall props (lanterns) sit flat on the surface and face out from it. |
| Scroll wheel | Rotates in 5° steps (Shift for 15°). |
| ↠→ | Fine rotation. |
| ↑ ↓ | Raise or lower. |
| Space | Squares the heading to the nearest 90°. |
| E / Pinned | Pins the ghost where it is so you can walk around it; click again to pick it up. |
| Left click | Places it. With Repeat on (the default for new props) the tool stays up for the next one, same prop, same heading. |
| Right click | Ends the run (or cancels, if nothing was placed). |
| Hold Alt | Places free, ignoring alignment for that moment. |
| Tray: Nudge | Moves the pinned ghost 5 cm left, right, forward or back in its own frame. |
Lining things up
With Align to neighbors on (the default; a tray toggle, remembered per player), the ghost snaps to the nearest placed decoration of the same kind within 8 m: it takes that one's heading and height, and sits on the line through it. When two of the same kind already form a row, the next equal-spacing slot along the row is offered: aim near it and the ghost jumps to exactly the right spot, continuing the row's spacing and slope. A guide line is drawn from the neighbor to the ghost and the tray says what it is aligned to and at what spacing. Six jack-o-lanterns up a staircase: place two by hand, then click, click, click, click.
Props are created on each player's own client (not networked): they cost the server nothing, never count toward entity limits, cannot be pushed or picked up, and stream in and out by distance (large pieces from farther away). After placing, the panel comes back for the next one.
String lights
Pick colors, a light type, a pattern, a channel and spacing, then Start stringing. Aim at the first clip point (an eave corner, a railing post, the top of a door frame) and left click. Aim at the next and click again. The string previews live between points, with its real colors and pattern.
| Control | Does |
|---|---|
| Left click | Drops a point on the surface under the crosshair (up to 48 per string by default). |
| Right click | Finishes the string (with two or more points); cancels when there is nothing to finish. |
| Backspace | Removes the last point (in an outline mode: the whole last outline). |
| Delete | Removes the strand under the crosshair. Aim at any part of the string you are building and it turns orange; Delete takes that strand out and leaves the rest. |
| Scroll wheel | Changes the bulb spacing. |
| 1–4 | Changes the channel. |
| G | Switches the mode (below). |
| Tab | Opens the tray: mode, colors, pattern, channel, type, spacing, sag, Undo point, Finish, Cancel. |
Outlining a sign or a roof
Clicking four corners of a sign from the street is slow and never quite square. The tray's Mode has three settings:
| Mode | A left click does |
|---|---|
| Click points | Drops one point, as above. |
| Outline a surface | Aim at a flat face (a sign, a wall, the top of a roof) and click once. The tool feels for the edges of that surface and lays a closed string just inside them. A roof is outlined from its top surface and squares itself to the building, not to the map. |
| Top edge | Aim at a wall or fascia and click: the string runs along its upper edge, which is how a roofline is strung. On a roof top it outlines the whole roof. |
| Building front | Aim at the front wall and click once. The string runs along the wall's top edge and then frames every door, opening and wall-mounted object the tool finds: the wall is scanned with probes, so anything set into it (a doorway, a recessed door, a garage door, a deep window) is found, and any object set against it (a door entity, a sign, an awning) is framed by its footprint on the wall. A frame that reaches the ground is three-sided, like a door frame. Takes a second or two on a big wall. Flush windows painted into the building mesh have no depth and are not found; add those with Click points. |
Each outline click adds its own stroke to the string, so the sign and the roof under it can go in one string and one show channel. Backspace still removes the last point, so a wrong outline is five presses. If the tool cannot find the edges (a curved or broken-up surface) it says so; click the corners instead. The string sits 5 cm inside the edge and follows it exactly when Sag is off.
Light types
| Type | Look | Default spacing |
|---|---|---|
| Mini lights | Small crisp bulbs, the roofline standard. | 0.20 m |
| C9 bulbs | The fat old-fashioned bulbs with a bigger halo. | 0.30 m |
| Rope light | Dense, small, no sag; for outlines and figures. | 0.08 m |
| Icicle lights | Strands of varying length hang from every clip point along the run. | 0.25 m |
| Festoon globes | Large warm globes on a heavy swag; patios and cookouts. | 0.50 m |
| Candle flicker | Each bulb flickers like a flame regardless of the pattern. | 0.30 m |
Patterns
Steady, Twinkle (random winks, identical for every player), Chase (every third bulb walks along the string), Alternate (every other bulb swaps), Fade (the whole string breathes), Wave (a brightness wave travels along it), Flicker (flame). Chase, alternate, fade and wave take their speed from the track's tempo during a show.
Sag
By default a string droops between the points you click, like a real one hung from clips; the droop grows with the span and is capped. Turn Sag between points off (Lights tab, or the tray) for a string that follows the outline exactly. Figures never sag.
Rope-light figures
Pick a figure, colors, a light type (rope is the default) and a channel, click Hang on a wall, then aim at a wall. The figure previews flat on it, sized with the scroll wheel (Shift for bigger steps); ↠→ tilt it; E pins it; left click hangs it; right click ends the run. On a floor or ceiling the figure lies flat. Repeat and Align to neighbors work exactly as for props: hang two snowflakes, and the third snaps to the same height and spacing along the wall.
Figures ship per holiday. Christmas: star, snowflake, tree, candy cane, bell, wreath, snowman, reindeer, Santa hat, stocking, gingerbread man, angel, present, bow, candle. Hanukkah: snowflake, menorah, dreidel, Star of David, present, candle. New Year's: star, snowflake, bell, ring, champagne glass, midnight clock, firework burst, balloon. Valentine's: heart, heart and arrow, rose, tulip, bow, champagne glass. St. Patrick's: shamrock, rainbow and pot of gold, leprechaun hat. Easter: egg, bunny, chick, tulip, angel. Independence Day: star, US flag, firework burst. Halloween: pumpkin, bat, ghost, spider web, skull, witch hat, black cat, crescent moon. Thanksgiving: ring, turkey, maple leaf, pilgrim hat, acorn, candle. Party: star, heart, ring, present, bow, champagne glass, firework burst, balloon, music note, crescent moon. Each is pictured in the panel. A figure is stored as an ordinary string of lights, so shows, channels and editing all apply. Add your own in shared/figures.lua: strokes in a unit square.
Inflatables and wreaths
The game has no lawn inflatables and no wreaths. Inflatables ship as real game models (stream/, seventy of them): each is built from the lit shapes in shared/shapes.lua (a turkey is a brown body, a fanned tail, a head and a wattle, each an ellipsoid) and fused into one smooth vinyl skin, with an emissive shader so it glows at night and a light inside that falls on the ground around it. They are ordinary props to the game: they cast shadows, take its lighting, and you bump into them. The models load with the resource on every game build; no other resource is needed. Wreaths, arches' thin lit variant and the yard pieces are still drawn in game from the same shapes, with nothing spawned.
Inflatables (the Inflatables tab): snowman, Santa, reindeer, penguin, polar bear, candy cane, Christmas tree and gingerbread man; menorah and dreidel; gold star, champagne bottle, birthday cake and disco ball; heart and a bear with a heart; shamrock and leprechaun; bunny, Easter egg and chick; Uncle Sam hat and firecracker; jack-o-lantern, ghost, black cat, spider, bat and witch; turkey, harvest pumpkin, scarecrow and acorn. Pick one, click Place, aim: it is placed like a prop (section 5; scroll rotates, Repeat and Align work), and Page Up / Page Down or the tray's +/− set its height (0.4 to 8 m; each has a sensible default).
Each comes in one size, shown on its card (1.4 to 3 m); a model cannot be resized in game, so Page Up / Page Down do nothing on these. Older drawn inflatables still inflate. One placed with a version before 0.6.0 is still drawn from its shape: it rises out of a heap on the ground over a few seconds when placed, sinks back when removed, and sways a little in the wind while up. Aim at one with the Edit tool (section 11) and the tray offers Deflate or Inflate: a deflated one stays on the lawn as a heap until it is inflated again. With Deflate during the day on (Settings → Inflatables and wreaths), every inflatable lies deflated between the day hours and stands up again at dusk, the way a real yard does.
Wreaths sit at the top of the Props tab, one per holiday: evergreen with warm white lights and a red bow for Christmas, blue and silver for Hanukkah, roses for Valentine's, autumn leaves for Thanksgiving, black branches with orange lights for Halloween, and so on. They hang flat on the wall you aim at and Page Up / Page Down set the diameter (0.3 to 4 m).
Arches (candy cane, top hat, Happy Holidays, rainbow, fireworks, Pan-African, balloon, wedding, and a thin lit arch) are inflatables wide enough to walk through at their default height. Place one over the walk, facing along it. With Align on, an arch's row runs along the path it spans rather than across its face, so the next one snaps into line at the same spacing: a sidewalk takes three clicks.
Lit yard pieces sit below the inflatables in the same tab: a lit deer, a Star of Bethlehem on a pole, lit ornaments and orbs, sunflowers, a snowflake stake, a soldier silhouette, a lit cross, lily stands, a candle vigil, a draped casket. They stand where placed, drawn bright and matte, and do not inflate. Wall pieces sit beside the wreaths at the top of the Props tab: window candles, patriotic and mourning bunting, the Kwanzaa banner.
Each part is a small triangle mesh drawn with plain polygons, back faces culled, parts painted far to near, shaded from its own color so the roundness reads. Both are drawn under a per-frame triangle budget like the lights (nearest first: fine mesh up close, coarse mesh farther, one blob of the main color beyond the detail distance), scaled by each player's quality setting. The light inside is cast only within 60 m. Add your own in shared/shapes.lua: a list of ellipsoids in a unit-tall box, and the panel draws its picture from the same list.
Light shows and music
A show is a track plus a choreography, run against every string in one group. The choreography is a list of steps; each lasts some beats of the track and sets each of the four channels to a pattern. It loops until the track ends. Everyone within hearing distance of the group's lights hears the track and sees the same thing; late arrivals join in sync.
Open Shows, confirm your location, pick a choreography, press Play on a track. Stop the show ends it early. A show for a holiday that is out of season is refused unless you are an admin.
Shipped choreographies
| Show | What it does | Suits |
|---|---|---|
| Classic | Everything twinkles. | Any track |
| Dance | Channels trade off on the beat, chase, wave, pairs, twinkle. | Jingle Bells, Hava Nagila, Yankee Doodle |
| Build | Channels come in one at a time, all four, chase, fade, blackout. | Carol of the Bells, Mountain King, Auld Lang Syne |
| Gentle | Slow fades and waves, then steady. | Silent Night, Ma'oz Tzur, Morning Mood |
| Strobe | Half-beat alternation. Not subtle. | Block Party, Midnight Chimes' last strike |
Put the roofline on channel 1, the windows on 2, the tree on 3 and the door on 4, and Dance and Build play them against each other.
Tracks
27 ship, synthesized from note data: Jingle Bells, Deck the Halls, We Wish You a Merry Christmas, Carol of the Bells, Up on the Housetop, Joy to the World, O Christmas Tree, Silent Night, Ma'oz Tzur, The Dreidel Song, Hava Nagila, Auld Lang Syne, Midnight Chimes, Valentine Waltz, The Irish Washerwoman, Shamrock Reel, Morning Mood, Easter Bells, The Star-Spangled Banner, Yankee Doodle, America the Beautiful, In the Hall of the Mountain King, Graveyard Waltz, Haunted Ambience, Over the River and Through the Wood, Harvest Home, Block Party. The melodies are public domain or original; the arrangements are ours. Nothing needs clearing.
Your own music: drop an .ogg in the resource's audio/ folder, restart the resource once so the file is served, then register it in Settings → Custom tracks (name, label, file, length in seconds, tempo, holiday). Volume is full within the near distance and silent past the far one; players can mute shows for themselves.
The season calendar
Every decoration belongs to a holiday. The season mode (Settings → Season calendar, or /holiday season) decides which holidays' decorations players see:
- all (the shipped default): everything, all year.
- auto: each holiday only inside its date window. Easter is computed per year (two weeks either side of Easter Sunday). The calendar is re-checked every ten minutes, so decorations switch at midnight without a restart.
- none: nothing (decorations are kept, not shown).
- a holiday name: only that holiday, whatever the date.
| Holiday | Shipped window | Holiday | Shipped window |
|---|---|---|---|
| Christmas | Nov 25 – Dec 26 | Easter | Easter Sunday ± 14 days (computed) |
| Hanukkah | Nov 25 – Jan 2 (set the real nights each year) | Independence Day | Jun 25 – Jul 6 |
| New Year's | Dec 27 – Jan 7 | Halloween | Oct 1 – Nov 1 |
| Valentine's Day | Feb 1 – Feb 15 | Thanksgiving | Nov 2 – Nov 30 |
| St. Patrick's Day | Mar 10 – Mar 18 | Party | Always (switchable) |
Windows and on/off per holiday are in Settings → Holiday dates (MM-DD). Overlaps (Christmas, Hanukkah, New Year's) are deliberate: leave the roofline up and swap the palette to gold.
Winter touches (off by default): tire trails and footprints in snow while Christmas is in season. Weather is left alone unless "Force snow weather" is on, because your weather resource owns it.
Editing, locations, layouts and channels
Aim and click. Edit tab → Aim and click a decoration (or /holiday edit). Aim at anything placed: it lights up with its name, holiday, group, owner and distance in the tray. A prop is found by the crosshair hitting it; a string is found by the crosshair ray passing close to its wire, so a string on a roofline is as clickable as a tree; an inflatable or wreath by the ray passing through its box. An inflatable's tray adds Deflate / Inflate. Left click opens its actions: Remove, Move (a prop goes back into the placer, a figure is re-hung) or Edit the string (re-runs the point tool with the points already in it), and Move to group (pick a group chip or type a new name). A string made of several strands (outlines, door frames) highlights the strand you are aiming at in orange and offers Remove this strand beside Remove; pressing Delete while aiming does the same without opening the tray. Back to aiming keeps the tool up for the next one; right click or Leave the tool ends it. Someone else's decoration shows its details but no buttons unless you are an admin.
Edit list: everything within reach, nearest first, with a group dropdown, Move and Remove on each you may edit. Undo my last placement removes the last thing you placed this session. Admins can remove anything; decorators only their own.
Locations: every decoration belongs to a location, your current one when you placed it; default main. Name locations after the place: firehouse, hospital, 247 sandy (spaces are allowed, up to 32 characters). You never have to remember a name: the Shows, Edit, Locations and Settings tabs list every location that exists with its decoration count and how far away it is; click one to make it yours or type a new name and press Use. The Edit tab's list adds Clear for admins (click twice). /holiday locations prints the list; /holiday location 247 sandy sets yours. A show runs against one location, and so does an admin clear, which is the reason to keep a location to one building. (The setting path and the save file still call this field group.)
A location holds a set per holiday. Every decoration keeps the holiday it was placed under, so the firehouse can hold a Christmas set and a Halloween set, and the calendar shows whichever is in season. The Locations tab shows one chip per holiday at each location with its count and a dot when that holiday is in season; an admin clicks a chip twice to clear just that set (/holiday clear firehouse halloween does the same, as does holidayadmin clear firehouse halloween from the console), leaving the other holidays in place. Below the list, admins have Clear every decoration on the server: click Clear, it arms with the total and disarms itself after a few seconds, click again and every location and every holiday comes down at once (/holiday clear all and holidayadmin clear all do the same). Saved layouts are kept, and the server writes a copy of the decorations first, data/decorations.json.before-clear-<time>, so a wrong click is undone by renaming that copy over decorations.json and restarting the resource.
Travel: the Locations tab lists every decorated location with a Travel button: a short fade and you are standing at its nearest decoration, vehicle included. Decorators and admins only.
Layouts, for next year: Save my location as a layout copies everything at your current location under a name, with a note for your future self ("Firehouse 2026: roofline on channel 1, tree by the bay door; check the new awning"). Tick Only this holiday to save one holiday's pieces out of a mixed location. After the holiday, clear the location. Next year, open the Locations tab: each layout shows its count, holidays, who saved it and when, and whether it has been checked this year. Travel there (which stamps it checked), Load (add) puts the saved decorations back beside whatever is there, Load (replace) clears the location first (click twice; a decorator can only replace a location that holds nothing of anyone else's). Then edit with the normal tools (an MLO update may have moved a wall) and Save over. Rename / note and Delete are yours on layouts you saved; admins have them on all. Next location walks the list one Travel at a time. /holiday go <layout> travels from chat. Layouts are kept in data/presets.json, backed up on every write. A loaded decoration is placed as yours and counts against your cap; a prop the catalog no longer has, or a holiday turned off, is skipped and counted in the message.
Channel: every string has a channel 1–4 (My settings sets the default for new strings). A show drives the four channels separately.
Viewing time: My settings → Viewing time (or /holiday time night) sets your own clock so you can see the lights after dark while the server is at noon. Nobody else is affected; /holiday time reset returns to server time.
Settings reference
Settings → Server settings (admins). Every change is validated on the server, saved to data/settings.json, and applied to every player immediately. Reset everything to defaults is at the bottom.
Who may decorate
| Setting | Default | Meaning |
|---|---|---|
| Everyone may decorate | off | Off: only the ACE, the jobs below, or admins. |
| Decorator ACE | holiday.decorate | ACE that grants decorating. |
| Admin ACE | holiday.admin | ACE that grants admin. Also admins: anyone with the command ACE, qb/ESX admins. |
| Decorator jobs | admin, realestate, cityhall | Comma-separated job names. |
| Jobs must be on duty | on | qb/qbx only; ESX and standalone are always on duty. |
| Decorators edit only their own | on | Admins always edit everything. |
| Decorations per player | 80 | Cap per decorator (admins exempt). |
| Decorations on the server | 2000 | Cap for the whole server. |
| Anyone may start a show | off | Lets any player press Play on existing lights. |
| Reach (m) | 60 | How far a player may be from what they place or edit. |
Season calendar
| Setting | Default | Meaning |
|---|---|---|
| Season mode | all | all / auto / none / a holiday. See section 10. |
| Party, Wedding, Birthday and Funeral sets always in season | on | The four dateless event sets. Under auto they are always shown while this is on; off, only when the season mode names them or is all. |
| Winter touches | off | Tire trails and footprints while Christmas or New Year's is in season. |
| Force snow weather | off | Only if nothing else manages weather. |
| Holiday dates | (table) | Per holiday: enabled, from, to (MM-DD). Blank keeps the shipped window. |
Props
| Setting | Default | Meaning |
|---|---|---|
| Spawn props | on | Off: no client spawns any prop (diagnostic). |
| Prop stream distance (m) | 150 | Props spawn on a client within this distance. |
| Large prop stream distance (m) | 400 | For trees, flags and other large pieces. |
| Custom props | (table) | Holiday, model, label, wall mount. Any streamed model. |
Lights
| Setting | Default | Meaning |
|---|---|---|
| Light render distance (m) | 120 | Bulbs beyond this are not drawn. |
| Bulbs per frame (budget) | 3000 | Nearest strings first; the rest wait. Players scale it with their quality setting. |
| Points per string | 24 | Clicks per hand-strung string. |
| Max string length (m) | 120 | Total length of a hand-strung string. |
| Halo size / strength | 3.2 / 110 | The colored glow around each bulb's core. |
| Light renderer | sprite | sprite is the real look. core drops the halo (no textured drawing), marker and off are diagnostics for a client crash. |
| Halo polys per frame (hard cap) | 800 | Textured polys per frame across every string. Bulbs past the cap draw without a halo. The engine's textured buffer is small; overflowing it crashes the client, so this is the number to lower if that ever happens. |
| Sag between points (ratio) | 0.03 | Droop as a fraction of span, capped at 0.30 m. 0 for dead-straight. |
| Draw the wire | on | A thin dark line between bulbs, within 35 m. |
| Halo minimum radius (m) | 0.12 | The glow never shrinks below this, however close you stand. |
| Glow boost within (m) | 12 | The glow strengthens a little as you come within this distance, ramping smoothly. |
| Bulbs cast light on walls | on | With intensity, range and a per-frame cap (0.6 / 2 m / 64), on every fourth bulb. |
| Triangle winding | b | If bulbs are invisible on your build, try a; both always works at twice the cost. |
Inflatables and wreaths
| Setting | Default | Meaning |
|---|---|---|
| Draw inflatables and wreaths | on | Off: none are drawn on any client (diagnostic). |
| Inflatable models are solid | on | On: players and vehicles bump into the inflatable models. Off: everything passes through them, for a server whose doorways and walks keep getting blocked. Takes effect on every client at once. |
| Render distance (m) | 120 | Beyond this nothing is drawn. |
| Detail distance (m) | 70 | Beyond this a shape is one blob of its main color. |
| Fine detail within (m) | 30 | Closer than this a shape gets the fine mesh; beyond it the coarse one. |
| Triangles per frame (budget) | 12000 | A Santa is about 4000 within 8 m, 1200 to the detail distance and 420 beyond. A shape is never drawn partially: if it does not fit at a level it drops a level whole. Nearest first; the rest are blobs. Players scale it with their quality setting. |
| Lights inside, per frame / intensity | 12 / 1.2 | The glow inside each one, nearest first, within 60 m. |
| Inflate time / Deflate time (s) | 4 / 3 | How long a newly placed one takes to stand up, and a removed or switched-off one to go down. |
| Sway in the wind | on | A little lean while up. |
| Deflate during the day | off | Every inflatable lies in a heap between Day starts (8) and Day ends (17) on the game clock, and stands up again at dusk. |
Music
| Setting | Default | Meaning |
|---|---|---|
| Full volume within (m) | 15 | Distance from the group's lights. |
| Silent beyond (m) | 70 | Falls off between the two. |
| Volume ceiling (0–1) | 0.6 | The loudest a show gets. |
| Players may mute | on | My settings → Mute holiday music. |
| Custom tracks | (table) | Name, label, file in audio/, length, BPM, holiday. |
| Shows | (editor) | Copy a shipped choreography to edit, or add one: beats per step, a pattern per channel. |
Updates
| Setting | Default | Meaning |
|---|---|---|
| Check for updates | on | Fetches update.json from the repository at start and every few hours. Nothing happens until a repository is set. |
| GitHub repository | csalvatoreJCRP/sals_kewlholidays | owner/name of the public repository that holds the released resource. Leave it unless you host your own fork. |
| Branch | main | |
| Check every (hours) | 6 | |
| Apply updates automatically | off | Downloads the new files, verifies each by size and checksum before writing anything, never touches data/. A restart loads them. |
| Restart after applying | off | Restarts the resource one minute after an update is applied, when no show is running. |
The Updates row at the top of Server settings shows the running and latest versions with Check now and Apply update; a newer version lists its changelog there. /holidayadmin update check and /holidayadmin update apply do the same from chat or the server console. A resource cannot create folders or delete files: a release that adds a new folder reports the files it could not place (create the folder, apply again), and files a release removed simply stop being loaded.
Other
| Setting | Default | Meaning |
|---|---|---|
| Save delay (s) | 5 | Changes are written to disk this long after the first change of a batch. |
| Rate limits | on | Per-player caps on how often the server is asked to do things. |
| Command name | holiday | Takes effect after a resource restart. |
| Panel key (default binding) | ADD | FiveM key name for the key that opens the panel: ADD is numpad +; F7, HOME, NUMPAD5 and the like also work. Only the default: players who already rebound the key keep their own. Blank disables it. Takes effect after a restart. |
| Debug logging | off | Console detail while diagnosing. |
Commands
Everything in the panel is a click; these exist for admins who prefer typing, for key binds, and for the console.
| Command | Who | What |
|---|---|---|
/holiday | Anyone | Open or close the decorator panel (default key: numpad +) |
/holiday record [on|off] | Anyone | Recording mode: hides the chat window and sends holiday messages to F8 |
/holiday prop <holiday> <model> | Decorators | Place a prop by model name |
/holiday lights <holiday> [palette] [pattern] [type] | Decorators | String lights |
/holiday figure <holiday> <figure> [palette] | Decorators | Hang a figure |
/holiday inflate <holiday> <name> [height] | Decorators | Place an inflatable or a wreath by name (the names are in shared/shapes.lua) |
/holiday edit | Decorators | Aim at a decoration: remove, move, edit or regroup it |
/holiday remove / undo | Decorators | Remove the nearest / your last decoration |
/holiday locations | Anyone | Every location, with counts and distance |
/holiday location <name> | Anyone | The location new decorations join (spaces allowed); group still works |
/holiday go <layout> | Decorators | Travel to a saved layout |
/holiday channel <1-4> | Anyone | The channel new strings use |
/holiday show [track] [show] | Decorators | Start a show in your group |
/holiday stop [group] | Decorators | Stop the show |
/holiday tips [holiday] | Anyone | Decorating tips |
/holiday time [night|dusk|midnight|day|HH:MM|reset] | Anyone | Your own clock, to view lights after dark |
/holiday mute / unmute | Anyone | Holiday music, for you only |
/holiday quality <low|medium|high|ultra> | Anyone | Your light render budget |
/holiday season [mode] | Admins | Show or set the season mode |
/holiday thumbs [holiday] | Admins | Photograph every prop for the panel. Needs the free screenshot-basic resource running; each prop is spawned against the sky, framed, cropped and saved to html/thumbs/. Restart the resource to see them. The shipped release already carries them. |
/holiday clear <location|all> [holiday] | Admins | Remove decorations, or only one holiday's set there |
/holiday status | Admins | Saving health and counts |
/holidayadmin season|clear|status [arg] | Admins, console | The same, also from the server console |
/holidayadmin update check|apply | Admins, console | Check the repository for a newer release, or download and apply it |
/holidayadmin set <Path.Key> <value> / get <Path.Key> | Admins, console | Change or read any setting by its path, e.g. set Lights.Renderer core. Same validation as the panel; saved and applied live. |
Performance
- Props are local, non-networked objects streamed by distance. The server never owns an entity; the entity budget is never touched.
- Lights are rendered under a hard per-frame budget: at most Bulbs per frame bulbs and Cast lights per frame real light sources, nearest strings first, the rest skipped that frame. Bulb positions are computed once per string, not per frame. A separate emergency ceiling on script triangles per frame exists so no combination of strings and previews can overflow the engine's draw buffer.
- Players tune their own cost with the quality setting (low scales the budgets to 35%, medium 70%, high 100%, ultra 160%). A player on a weak PC turns it down without the owner changing anything.
- The server does no per-frame work at all. It validates requests, keeps the registry, times shows, and re-checks the calendar every ten minutes.
Files, saving and backups
Two files, both inside the resource's data/ folder:
decorations.json— every decoration. Written a few seconds after a change, and on a graceful stop.settings.json— what admins changed in game. Written on every change.
Saving follows the same rules as Sal's Kewl Signage: the server never saves before it has loaded the file in this process; it backs up the previous contents to .bak before every write; it reads the file back to verify the write; it keeps the file as it stood at each of the last three boots (.1, .2, .3); and it refuses a save that would shrink the file by more than the removals it was told about (the refused contents are kept beside it as .refused-<time>). If the data/ folder is missing it saves beside fxmanifest.lua instead and says so in the console. /holiday status reports saving health.
Keep data/ when you upgrade. The release never ships files under those names.
Decorating tips
Christmas. Outline the roofline first: one long string along the eave, pinned at each corner. Roofline on channel 1, windows on 2, tree on 3, door on 4. Warm white reads as classy, multicolor as fun; pick one per building. 0.30 m spacing on a roof, 0.20 m around a door. Wind a string around the big outdoor tree by clicking points in a spiral. Candy cane palette on Chase makes a stripe that walks. Silent Night stays on Gentle.
Hanukkah. Blue and white, and not too much of it: one string over the doorway, candles in the window. The tall, medium and short candles together read as a menorah from a distance, or hang the menorah figure. Set the real nights each year in Holiday dates.
New Year's. Gold and silver on Build. Balloons at the ends of a railing, the confetti cannon by the door, fireworks props clustered on the lawn. Midnight Chimes is twelve strikes; start it at 11:59.
Valentine's. Red and pink on a slow Fade around a doorway or an arch, nothing on the roof. Flowers and candles on a table under the Rose palette makes a date spot of any patio. The heart figure over the door.
St. Patrick's. Green and gold on Chase around the bar sign, Rainbow on the awning, shamrocks by the door. Keep it to one building.
Easter. Pastel on Wave, kept low: railings, planters, a gazebo. Eggs spaced out in the flower beds. Morning Mood with Gentle in the park at dawn.
Independence Day. Red, white and blue on Chase along a railing; the USA palette cycles the three colors. Flags on poles at the ends of a block, small flags on porches, fireworks props on the beach. Picnic benches under warm white.
Halloween. Orange and purple on Twinkle, spaced wide (0.50 m). A jack-o-lantern on each step, gravestones leaning a few degrees off square, a ghost just inside a doorway, spiders near the porch light. Haunted Ambience on Gentle for a slow pulse. Blood palette on Fade over a tomb, in one spot only.
Thanksgiving. Amber and harvest colors, steady or a slow Fade, no chase. A lantern by the door, a woodpile, a bench under warm white, candles on the table. One string, one doorway.
Party. No date. Rainbow on Chase for a club, warm white steady for a wedding, Strobe with Block Party when you want the neighbors to call. Balloons at head height either side of the entrance.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| I strung lights and they vanished when I finished | The holiday is out of season and preview is off for you. Turn on "Show off-season decorations" in My settings, or set the season mode to all or that holiday (admin). |
| The Settings tab says "Admins only" | You are not an admin by any of the three checks in section 3. On qb, make sure your character has the admin/god permission; otherwise grant holiday.admin to your identifier. |
An add_ace group.admin … line did nothing | Your player is not a member of group.admin. Grant to identifier.license:… instead, or add yourself with add_principal. |
| Bulbs are invisible but the wire shows | Triangle winding. Settings → Lights → Triangle winding: try the other letter; both always works. |
| Some props are missing from the list | The server's game build lacks them. The count at the bottom of the Props tab says how many. Raise sv_enforceGameBuild (2023 props need 3095, 2024's 3258/3323, 2025's 3570), or add your own streamed props in Settings. |
| No music during a show | Run /holiday soundtest: if that plays, the sound path works and you are farther than "Silent beyond" from the nearest string of the group, or muted yourself (/holiday unmute). If it does not, the message in chat and F8 says why. A custom track needs its .ogg in audio/ and a resource restart once. |
| Console says decorations are not being saved | data/ is missing or not writable. Create it; the resource cannot create folders. Until then it saves beside fxmanifest.lua. |
| Frame rate drops near a heavily decorated block | Lower your quality (My settings) or, as admin, lower "Bulbs per frame" and "Cast lights per frame". |
| Placement refused with "too far" | You must be within the reach (default 60 m) of what you place or edit. Walk closer. |
For developers
-- Server exports
exports['sals_kewlholidays']:GetActiveHolidays() --> { christmas = true, ... }
exports['sals_kewlholidays']:GetSeasonMode() --> 'all'
exports['sals_kewlholidays']:StartShow(group, track, show) --> boolean
exports['sals_kewlholidays']:StopShow(group) --> boolean
exports['sals_kewlholidays']:IsShowRunning(group) --> boolean
exports['sals_kewlholidays']:GetDecorations() --> list of records
Records: { id, kind = 'prop' | 'lights', holiday, group, by, byName, updated, model, coords, heading } for props; { ..., points, breaks, figure, palette, pattern, spacing, channel, size, sag, length } for lights.
The prop catalog and palettes are in shared/holidays.lua, figure templates in shared/figures.lua, inflatable and wreath templates in shared/shapes.lua, defaults and the settings schema in shared/defaults.lua, all readable. tools/build-audio.py rebuilds every track from note data (numpy and ffmpeg).