⚙️Configuration

Check the standard Config!

config.lua
S_CL = {}

S_CL.SpawnCoords = vector3(-1139.2673339844, -2806.7807617188, 27.708736419678) -- Default spawn coordinates
S_CL.Language = "en" -- Set default language to German
S_CL.notifys = "sservice"
S_CL.Settings = {
    inSafezone = false, -- players have to be in the safezone to use the commands / keys
    spectateExitKey = 38, -- https://docs.fivem.net/docs/game-references/controls/
    key = {
        keyCode = "F2", -- https://docs.fivem.net/docs/game-references/controls/
        enable = true
    },
    command = {
        name = "immigration_ipad",
        enable = true
    }
}

S_CL.Safezone = {
    maxRejections = 3, -- Maximum number of rejections for trying to escape the safezone / bubble
    rejectionType = "kick", -- Type of rejection: "kick" or "ban" or "nothing"
    bubble = {
        -- https://docs.fivem.net/natives/?_0x799017F9E3B10112
        radius = 100.0,
        color = {r = 255, g = 255, b = 255, a = 0.5}
    }
}

S_CL.InformSettings = {
    enable = true, -- Enable or disable the information settings
    requireMinimumOfficers = true, -- Enable or disable the requirement of a maximum number of officers
    maximumOfficerCount = 1, -- Marker/Ped is shown only while officer count is less than this value
    type = "ped", -- marker or ped
    interaction = "Press ~INPUT_CONTEXT~ to inform an immigration officer.",
    interactRadius = 1.5,
    keyCode = 38,
    coords = vector3(-1092.1124267578, -2827.5295410156, 27.708730697632),
    marker = {
        type = 2, -- https://docs.fivem.net/docs/game-references/markers/
        size = {1.0, 1.0, 1.0},
        color = {r = 255, g = 255, b = 255, a = 100},
        bobUpAndDown = true,
        faceCamera = false,
        rotate = true
    },
    ped = {
        model = "a_m_m_prolhost_01", -- https://docs.fivem.net/docs/game-references/ped-models/
        heading = 139.54960632324
    }
}

S_CL.Actions = {
    openSkinMenu = function()
        TriggerEvent("esx_skin:openSaveableMenu") -- your custom trigger
    end,
    resetChar = function()
        TriggerEvent("s_einreise:sservice:resetSkin") -- your custom trigger
    end,
    ban = function(targetId, reason)
        TriggerServerEvent("NAME_BAN", targetId, reason) -- your custom trigger
    end
}

S_CL.Outfit = {
    male = {
        {
            key = "tshirt_1",
            value = 6
        },
        {
            key = "tshirt_2",
            value = 0
        },
        {
            key = "torso_1",
            value = 11
        },
        {
            key = "torso_2",
            value = 0
        },
        {
            key = "arms_1",
            value = 11
        },
        {
            key = "arms_2",
            value = 0
        },
        {
            key = "pants_1",
            value = 24
        },
        {
            key = "pants_2",
            value = 1
        },
        {
            key = "shoes_1",
            value = 7
        },
        {
            key = "shoes_2",
            value = 0
        },
        {
            key = "glasses_1",
            value = 5
        },
        {
            key = "glasses_2",
            value = 1
        },
        {
            key = "chain_1",
            value = 125
        },
        {
            key = "chain_2",
            value = 0
        },
        {
            key = "bproof_1",
            value = 0
        },
        {
            key = "bproof_2",
            value = 0
        }
    },
    female = {
        {
            key = "tshirt_1",
            value = 6
        },
        {
            key = "tshirt_2",
            value = 0
        },
        {
            key = "torso_1",
            value = 11
        },
        {
            key = "torso_2",
            value = 0
        },
        {
            key = "arms_1",
            value = 11
        },
        {
            key = "arms_2",
            value = 0
        },
        {
            key = "pants_1",
            value = 24
        },
        {
            key = "pants_2",
            value = 1
        },
        {
            key = "shoes_1",
            value = 7
        },
        {
            key = "shoes_2",
            value = 0
        },
        {
            key = "glasses_1",
            value = 5
        },
        {
            key = "glasses_2",
            value = 1
        },
        {
            key = "chain_1",
            value = 125
        },
        {
            key = "chain_2",
            value = 0
        },
        {
            key = "bproof_1",
            value = 0
        },
        {
            key = "bproof_2",
            value = 0
        }
    }
}
config_server.lua
S_SV = {}

S_SV.Dimension = 1337 -- Dimension for players who have not entered the game yet
S_SV.DefaultDimension = 0 -- Default dimension for players who have entered the game

S_SV.SpawnOnEnter = vector3(-1037.7705078125, -2737.8142089844, 20.1692943573) -- Spawn coordinates for players who got accepted into the game

S_SV.EnterBypass = {} -- Groups that automaticly enter the game without passing the test

S_SV.Ban = function(playerId)
    TriggerEvent("CUSTOM_EVENT:BAN", playerId, "Test not passed") -- => if S_SV.Tests.banOnFail is true, this will be called
end

S_SV.EntryStartup = {
    manualStartOnly = false, -- If true, the entry system must be started manually via an event
    startupEventName = "custom:StartEntry" -- The name of the event to trigger the startup manually
}

S_SV.InformSettings = {
    enableNotify = true, -- Enable or disable the notification settings
    playerJoinNotify = true, -- Notify the player when they join the server
    groups = {"admin", "support"}, -- Groups that get notified ingame
    rateLimit = 30 -- Seconds until the players can inform the officer again
}

S_SV.Commands = {
    {
        name = "enter",
        description = "Teleport to the spawn coordinates",
        groups = {"admin", "support"},
        coords = vector3(-1065.7994384766, -2798.5014648438, 27.708728790283)
    },
    {
        name = "out",
        description = "Teleport to the last position where you entered",
        groups = {"admin", "support"}
    }
}

S_SV.Item = {
    enable = true, -- Enable or disable the item
    name = "immigration_ipad" -- Name of the item (same as in the database)
}

S_SV.ActionPermissions = {
    ["openIpad"] = {"admin", "support"}, -- open the ipad for the player
    ["goto"] = {"admin", "support", notify = true}, -- teleport to the player
    ["bring"] = {"admin", "support", notify = true}, -- teleport the player to you
    ["freeze"] = {"admin", "support", notify = true}, -- freeze the player
    ["charReset"] = {"admin", "support", notify = true}, -- reset the character of the player
    ["skinMenu"] = {"admin", "support", notify = true}, -- open the skin menu for the player
    ["spectate"] = {"admin", "support", notify = true}, -- spectate the player
    ["lock"] = {
        "admin",
        "support",
        duration = 30,
        notify = true -- duration in seconds for the lock
    }, -- lock the player
    ["kick"] = {}, -- kick the player
    ["sendTest"] = {"admin", "support"}, -- send a test to the player
    ["viewTest"] = {"admin", "support"}, -- view the test of the player
    ["enter"] = {
        groups = {"admin", "support"}, -- enter the player into the game
        bypass = {"admin"} -- allow groups to enter the game without passing the test
    },
    ["addNote"] = {"admin", "support"}, -- add a note to the player
    ["updateNote"] = {"admin", "support"}, -- update a note of the player
    ["deleteNote"] = {"admin", "support"}, -- delete a note of the player
    ["PlayerFiring"] = {"admin"} -- allow the player to fire weapons
}

S_SV.DefaultStatuses = {
    -- for the ui and database
    success = "Passed",
    failed = "Failed",
    notFinished = "Unfinished"
}

S_SV.Tests = {
    {
        value = "test1", -- Unique identifier for the test, used in the database
        type = "easy", -- easy, medium, hard for the ui
        timeLimit = 90, -- Seconds
        maxErrors = 3,
        retryAfter = 60, -- Seconds (10 Min)
        ui = {
            title = "Test Nr.1",
            type = "easy" -- easy, medium, hard for the user ui
        },
        questions = {
            {
                question = "What does RP mean?",
                answers = {
                    "Roleplay", -- 1
                    "Real Player", -- 2
                    "Random Player" -- 3
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "Are you allowed to kill someone for no reason?",
                answers = {
                    "Yes",
                    "No"
                },
                correct = {2} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What is Meta Gaming?",
                answers = {
                    "Use information from outside ingame",
                    "A style of play",
                    "Make a mistake ingame"
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What is Fail RP?",
                answers = {
                    "Performing unrealistic actions",
                    "A new server",
                    "An admin command"
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What means OOC?",
                answers = {
                    "Out of Character",
                    "Use information outside the game",
                    "OOC is a shortened word"
                },
                correct = {1, 3} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            }
        }
    },
    {
        value = "test2", -- Unique identifier for the test, used in the database
        type = "medium", -- easy, medium, hard for the ui
        timeLimit = 60, -- Seconds
        maxErrors = 2,
        retryAfter = 60, -- Seconds (10 Min)
        ui = {
            title = "Test Nr.2",
            type = "medium" -- easy, medium, hard for the user ui
        },
        questions = {
            {
                question = "What does RP mean?",
                answers = {
                    "Roleplay", -- 1
                    "Real Player", -- 2
                    "Random Player" -- 3
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "Are you allowed to kill someone for no reason?",
                answers = {
                    "Yes",
                    "No"
                },
                correct = {2} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What is Meta Gaming?",
                answers = {
                    "Use information from outside ingame",
                    "A style of play",
                    "Make a mistake ingame"
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What is Fail RP?",
                answers = {
                    "Performing unrealistic actions",
                    "A new server",
                    "An admin command"
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What means OOC?",
                answers = {
                    "Out of Character",
                    "Use information outside the game",
                    "OOC is a shortened word"
                },
                correct = {1, 3} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            }
        }
    },
    {
        value = "test3", -- Unique identifier for the test, used in the database
        type = "hard", -- easy, medium, hard for the ui
        timeLimit = 30, -- Seconds
        maxErrors = 1,
        retryAfter = 60, -- Seconds (10 Min)
        ui = {
            title = "Test Nr.3",
            type = "hard" -- easy, medium, hard for the user ui
        },
        questions = {
            {
                question = "What does RP mean?",
                answers = {
                    "Roleplay", -- 1
                    "Real Player", -- 2
                    "Random Player" -- 3
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "Are you allowed to kill someone for no reason?",
                answers = {
                    "Yes",
                    "No"
                },
                correct = {2} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What is Meta Gaming?",
                answers = {
                    "Use information from outside ingame",
                    "A style of play",
                    "Make a mistake ingame"
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What is Fail RP?",
                answers = {
                    "Performing unrealistic actions",
                    "A new server",
                    "An admin command"
                },
                correct = {1} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            },
            {
                question = "What means OOC?",
                answers = {
                    "Out of Character",
                    "Use information outside the game",
                    "OOC is a shortened word"
                },
                correct = {1, 3} -- Index for answers starts at 1 (For more than 1 correct answers: {1,2,3})
            }
        }
    }
}

S_SV.Webhook = {
    Enabled = true,
    Username = "Immigration-System",
    Avatar_URL = "https://cdn-icons-png.flaticon.com/512/684/684908.png"
}

S_SV.WebhookTexts = {
    PlayerInformed = function(playerName, playerId)
        return {
            url = "https://discord.com/api/webhooks/1384623544738250923/Vd6Zvyjp90UxcN0MVtwcQo-1jqJ6_MmA2sAd0pbsuLi5Pi8bBPi3mMeqZvJrF2Ervm_r",
            pingRole = true,
            roleId = "1381253912090382366",
            title = "📢 Immigrations Information",
            description = ("**%s [%s]** is waiting for the entry check."):format(playerName, playerId),
            color = 3066993 -- green
        }
    end,
    PlayerJoined = function(playerName, playerId)
        return {
            url = "https://discord.com/api/webhooks/1384623544738250923/Vd6Zvyjp90UxcN0MVtwcQo-1jqJ6_MmA2sAd0pbsuLi5Pi8bBPi3mMeqZvJrF2Ervm_r",
            pingRole = true,
            roleId = "1381253912090382366",
            title = "🛬 A new player has arrived",
            description = ("**%s [%s]** has joined the server and is now at the airport."):format(playerName, playerId),
            color = 3447003 -- blue
        }
    end,
    TestSuccess = function(playerName, playerId, testName)
        return {
            url = "https://discord.com/api/webhooks/1384623544738250923/Vd6Zvyjp90UxcN0MVtwcQo-1jqJ6_MmA2sAd0pbsuLi5Pi8bBPi3mMeqZvJrF2Ervm_r",
            pingRole = true,
            roleId = "1381253912090382366",
            title = "✅ Immigration test passed",
            description = ("**%s [%s]** has successfully passed the test **%s**."):format(
                playerName,
                playerId,
                testName
            ),
            color = 3066993 -- green
        }
    end,
    TestFailed = function(playerName, playerId, testName)
        return {
            url = "https://discord.com/api/webhooks/1384623544738250923/Vd6Zvyjp90UxcN0MVtwcQo-1jqJ6_MmA2sAd0pbsuLi5Pi8bBPi3mMeqZvJrF2Ervm_r",
            pingRole = true,
            roleId = "1381253912090382366",
            title = "❌ Immigration test failed",
            description = ("**%s [%s]** has failed the **%s** test."):format(playerName, playerId, testName),
            color = 15158332 -- red
        }
    end
}


If you find any errors in the configuration and you can't fix them yourself, open a ticket!

Last updated