Config File

Config = {}

Config.TestMode = true -- Set to true to allow self-proposal for testing
Config.Debug = false -- Set to true for debug prints

-- Integration with envi-forever-rings  -- Download Here: https://envi-scripts.tebex.io/package/6545241

Config.EnviForeverRings = true

Config.RemoveDivorcePapersAfterUse = true     -- NEW: Set to true to remove divorce papers after a divorce has been finalized
Config.PlayProposalAnimation = true           -- NEW: Uses the PlayProposalAnimation function in client/client_open.lua. Edit that as you wish
Config.StartCeremonyCommand = 'startCeremony' -- NEW: Command to start the ceremony used by the minister

-- When enabled:
-- - Ring configurations will be imported from envi-forever-rings
-- - This ensures consistent ring models/textures between both resources
-- - The engagement rings in Config.Rings below will be ignored if this is enabled

Config.Rings = {      -- you will need to set clothing numbers to match your server's clothing layouts
                      -- if using rings provided in envi-forever-rings, the component numbers will be 10 and the models should be towards the end of 'Decals' section
    Male = {          -- NOTE: This needs to exactly match (spelling and casing) the gender translations in Lang.lua
        Engagement = {
            ['simple_diamond'] = {
                name = 'Diamond Engagement Ring',
                component = 10,
                model = 197,
                texture = 0,
                description = 'A beautiful engagement ring'
            },
        },
        Wedding = {
            ['gold_band'] = {
                name = 'Gold Wedding Band',
                component = 10,
                model = 196,
                texture = 0,
                description = 'A beautiful wedding ring'
            }
        }
    },
    Female = {        -- NOTE: This needs to exactly match (spelling and casing) the gender translations in Lang.lua
        Engagement = {
            ['simple_diamond'] = {
                name = 'Diamond Engagement Ring',
                component = 10,
                model = 197,
                texture = 0,
                description = 'A beautiful engagement ring'
            },
        },
        Wedding = {
            ['gold_band'] = {
                name = 'Gold Wedding Band',
                component = 10,
                model = 196,
                texture = 0,
                description = 'A beautiful wedding ring'
            },
        }
    }
}

Config.WeddingLocations = {
    ['BEACH'] = {
        label = 'Beach Venue',
        coords = vector3(1300.9360, 6606.3979, 2.2333),
        effects = {
            confetti = {
                dict = 'scr_xs_celebration',
                effect = 'scr_xs_confetti_burst',
                duration = 60000, -- time in ms effect lasts
                locations = {  -- will loop through these locations and set off confetti at end of ceremony!
                    {
                        coords = vector3(1314.2679, 6617.8608, 2.00),
                        size = 2.0,
                    },
                    {
                        coords = vector3(1317.0389, 6617.8555, 2.00),
                        size = 2.0,
                    },
                    {
                        coords = vector3(1316.5802, 6612.3066, 2.00),
                        size = 2.0,
                    },
                    {
                        coords = vector3(1313.7825, 6612.4546, 2.00),
                        size = 2.0,
                    },
                }
            }
        },
        zones = {
            guestBook = {
                coords = vector3(1300.9360, 6606.3979, 2.2333),
                radius = 2.0,
                label = 'Guest Book',
                description = 'Initial check-in location'
            },
            altar = {
                coords = vector3(1315.8501, 6619.9023, 2.1275),
                radius = 3.0,
                label = 'Altar',
                description = 'Final check-in location'
            },
            bridalEntry = {
                coords = vector3(1351.0010, 6572.8740, 11.5543),
                radius = 4.0,
                label = 'Bridal Entry',
                description = 'Bridal preparation area'
            },
            bar = {
                coords = vec3(1299.66, 6597.62, 2.24),
                radius = 2.0,
                label = 'Open Bar',
                description = 'Grab something to drink!'
            },
            music = {
                coords = vec3(1325.6455, 6614.9902, 2.3442),
                radius = 3.0,
                label = 'DJ Booth',
                description = 'Control the wedding music',
                defaultSong = {
                    name = 'Wedding Music',
                    url = 'https://www.youtube.com/watch?v=lgh9XTkQTDI',
                    volume = 1.0,
                    position = vec3(1322.5869, 6610.7554, 2.1380)
                },
                playlist = {
                    maxSongs = 10,
                }
            },
        }
    },
}

Config.Roles = {
    minister = {
        label = 'Minister',
        description = 'Officiates the ceremony',
        required = true,
        appointedBy = {'bride', 'groom', 'planner'},
        checkInStages = {
            {zone = 'altar', label = 'At Altar'}
        }
    },
    bestMan = {
        label = 'Best Man',
        description = 'Stands with the groom',
        required = false,
        appointedBy = {'groom', 'planner'},
    },
    maidOfHonor = {
        label = 'Maid of Honor',
        description = 'Stands with the bride',
        required = false,
        appointedBy = {'bride', 'planner'},
    },
    planner = {
        label = 'Wedding Planner',
        description = 'Helps with the planning of the wedding and assinging of Roles',
        required = false,
        appointedBy = {'bride', 'groom'},
    },
    usher = {
        label = 'Usher',
        description = 'Helps with the ceremony',
        required = false,
        appointedBy = {'bride', 'groom', 'planner'},
    },
    bride = {
        label = 'Bride',
        description = 'The bride',
        required = true,
        checkInStages = {
            {zone = 'bridalEntry', label = 'Ready to Walk'},
            {zone = 'altar', label = 'At Altar'}
        }
    },
    groom = {
        label = 'Groom',
        description = 'The groom',
        required = true,
        checkInStages = {
            {zone = 'altar', label = 'Waiting at Altar'},
            {zone = 'altar', label = 'Final Position'}
        }
    },
    dj = {
        label = 'DJ',
        description = 'Controls the music for the ceremony',
        required = false,
        appointedBy = {'bride', 'groom', 'planner'}
    }
}

Config.OpenBar = {
    items = {
        { itemName = 'beer', label = 'Beer', price = 10, },
        { itemName = 'wine', label = 'Wine', price = 10, },
    }
}

Config.AfterPartyTime = 30 -- Time in minutes that the wedding will still be active after the ceremony (bar, dj booth etc)

Config.TutorialNotify = {
    enabled = true,
    reminderInterval = 20000, -- 20 seconds
    messages = {
        setup = {
            needMinister = "A minister needs to be assigned. Visit the Guest Book to appoint one.",
            needBestMan = "You can assign a Best Man at the Guest Book.",
            ministerNeeded = "Waiting for the minister to arrive at the altar to begin.",
            ministerReady = "The minister is ready. Groom should proceed to the altar.",
            groomNeeded = "Waiting for the groom to take position at the altar.",
            groomFirstPosition = "Groom needs to take final position at the altar.",
            groomReady = "The groom is ready. Bride can proceed to the entry point.",
            brideEntry = "Bride should check in at the entry point when ready.",
            brideFinalWalk = "The bride can now proceed to the altar.",
            readyToStart = "All participants are in position. The ceremony will soon begin."
        },
        roleSpecific = {
            minister = {
                initial = "Head to the altar to begin ceremony preparations.",
                atAltar = "Wait for the groom to arrive at the altar.",
                readyToStart = "When everyone is in position, use /startCeremony to begin the wedding."
            },
            groom = {
                initial = "Wait for the minister to arrive at the altar.",
                afterMinister = "Proceed to the altar for your initial position.",
                finalPosition = "Take your final position at the altar.",
                waitingBride = "Wait for the bride to arrive."
            },
            bride = {
                initial = "Wait for the groom to take position at the altar.",
                readyToWalk = "Proceed to the bridal entry point when ready.",
                finalWalk = "You may now walk to the altar.",
                inPosition = "The ceremony will begin shortly."
            }
        }
    }
}

-- Forever Rings Integration
CreateThread(function()
    if not Config.EnviForeverRings then
        return
    end

    local timeoutForForeverRingsStartup = 15000
    while not GetResourceState('envi-forever-rings') == 'started' do
        if timeoutForForeverRingsStartup <= 0 then
            print('[envi-weddings] Timed out waiting for Forever Rings to start')
            break
        end
        timeoutForForeverRingsStartup = timeoutForForeverRingsStartup - 100
        Wait(100)
    end

    if GetResourceState('envi-forever-rings') == 'started' then
        local ringConfigs = exports['envi-forever-rings']:GetRingConfigs()
        if ringConfigs then
            Config.Rings.Male.Engagement = {}
            Config.Rings.Female.Engagement = {}

            for key, ring in pairs(ringConfigs.Male) do
                Config.Rings.Male.Engagement[key] = {
                    name = ring.name .. ' Engagement Ring',
                    model = ring.model,
                    texture = ring.texture,
                    component = ring.component,
                    description = 'A beautiful ' .. ring.name .. ' engagement ring',
                    image = ring.image,
                    cost = ring.cost
                }
            end

            for key, ring in pairs(ringConfigs.Female) do
                Config.Rings.Female.Engagement[key] = {
                    name = ring.name .. ' Engagement Ring',
                    model = ring.model,
                    texture = ring.texture,
                    component = ring.component,
                    description = 'A beautiful ' .. ring.name .. ' engagement ring',
                    image = ring.image,
                    cost = ring.cost
                }
            end
        end
        if Config.Debug then
            print('[envi-weddings] Finished loading Forever Rings integration') 
            print(json.encode(Config.Rings, {indent = true}))
        end
    end
end)

Last updated