# Configuration

{% code title="config.lua" lineNumbers="true" %}

```lua
Config = {}

--- [[ Markhor Bridge ]] ---
--- [[ Markhor Bridge ]] ---


--- This resource depends on Markhor Bridge.
--- With Markhor Bridge, all necessary settings (such as framework, inventory, interact, etc.) are automatically set.
--- You don't have to do anything except install Markhor Bridge.


--- [[ Markhor Bridge ]] ---
--- [[ Markhor Bridge ]] ---

Config.language = "EN" -- Choose Language -> "EN" / "NL".
Config.minMinutes = 1 -- Minimum number of minutes a user can select.
Config.maxMinutes = 10 -- Maximum number of minutes a user can select.

Config.menuKey = 38 -- Key to open the menu, default: E.
Config.maxTabs = 3 -- Maximum number of tabs in the leaderboard before the tracks are put in the dropdown menu.

-- Check-in place, this is the place where a track can be chosen and a party can be created.
Config.checkIn = {
    vec = vector3(-247.78, -2014.2, 30.15),
    heading = 242.5,
    sprite = 150, 
    color = 8, 
    name = 'airsoft',
    marker = {
        type = 5,
        sizeX = 1.0,
        sizeY = 1.0,
        sizeZ = 1.0,
        drawDistance = 100.0,
        color = {r = 0, g = 255, b = 255, a = 100}
    }
}

-- Grouping point is the place where everyone needs to be to start the match.
Config.groupingPoint = {
    vec = vector3(-272.88, -2032.28, 30.15), 
    heading = 119.08, 
    sprite = 171, 
    color = 2, 
    name = 'Grouping point',
    marker = {
        type = 1,
        sizeX = 15.0,
        sizeY = 15.0,
        sizeZ = 1.0,
        drawDistance = 100.0,
        color = {r = 0, g = 255, b = 0, a = 100}
    }
}

-- Rewards that take place after the end of the game. You can add random items or money. Weapons are not possible.
-- The TDM rewards will be awarded to each player on the winning team. Only the winner receives the FFA reward.
Config.enableRewards = true -- Enable or disable the rewards
Config.minPlayersReward = 1 -- Minimum players to give rewards
Config.rewards = {
    ["TDM"] = {
        {item = 'bank', type = 'account', label = 'Bank', min = 100, max = 500},
        {item = 'water', type = 'item', label = 'Water', min = 2, max = 15},
    },
    ["FFA"] = {
        {item = 'bank', type = 'account', label = 'Bank', min = 500, max = 1000},
        {item = 'bread', type = 'item', label = 'Bread', min = 5, max = 15},
        {item = 'black_money', type = 'account',  label = 'Black Money', min = 100, max = 500},
    },
}

-- Add all maps like the examples given. Each map must have the following variables:
-- name             -> This name will be the display name of the folder.
-- playerMinLimit   -> Minimum number of players required to play this map.
-- playerMaxLimit   -> Maximum number of players for this map.
-- tdm redspawn     -> Spawn point for the red team in the game mode TDM.
-- tdm bluespawn    -> Spawn point for the blue team in the game mode TDM.
-- ffa spawns       -> Spawn points for the game mode FFA. These points are randomly selected after a respawn.
Config.maps = {
    {
        name = 'Arena',    
        playerMinLimit = 1,
        playerMaxLimit = 20,
        tdm = {
            redSpawn = {vec = vector3(1277.88, 811.027, 2640.73038), heading = 175.04},
            blueSpawn = {vec = vector3(1287.65, 705.13, 2640.74), heading = 359.73},
        },
        ffa = {
            spawns = {
                {vec = vector3(1277.88, 811.027, 2640.73038), heading = 175.04},
                {vec = vector3(1287.65, 705.13, 2640.74), heading = 359.73},
                {vec = vector3(1323.196, 768.4758, 2647.801617), heading = 109.34},

            },
        },
    },
    {
        name = 'Nuketown',

        playerMinLimit = 1,
        playerMaxLimit = 10,
        tdm = {
            redSpawn = {vec = vector3(2982.20, -784.94, 2405.39), heading = 39.42},
            blueSpawn = {vec = vector3(2926.78, -719.04, 2405.38), heading = 234.42},
        },
        ffa = {
            spawns = {
                {vec = vector3(2982.20, -784.94, 2405.39), heading = 39.42},
                {vec = vector3(2926.78, -719.04, 2405.38), heading = 234.42},
                {vec = vector3(2922.34, -769.67, 2405.38), heading = 260.38},
                {vec = vector3(2982.89, -780.91, 2405.39), heading = 74.98},
                {vec = vector3(2964.08, -744.17, 2405.16), heading = 357.41},
                {vec = vector3(2948.58, -791.17, 2405.38), heading = 355.37},
            },
        },
    }
}

-- These are the outfits selected when starting the match
Config.Outfits = {
	ffa = {
		male = {['helmet_1'] = -1, ['tshirst_2'] = 5, ['bags_1'] = 103, ['pants_2'] = 11, ['pants_1'] = 28, ['decals_1'] = 0, ['helmet_2'] = 0, ['shoes_2'] = 5, ['torso_2'] = 4, ['bags_2'] = 1, ['chain_2'] = 0, ['tshirt_1'] = 14, ['chain_1'] = 0, ['bproof_1'] = -1, ['torso_1'] = 69, ['shoes_1'] = 8, ['decals_2'] = 0, ['arms'] = 0},
		female = {['helmet_1'] = -1, ['tshirst_2'] = 7, ['bags_1'] = 110, ['pants_2'] = 1, ['pants_1'] = 23, ['decals_1'] = 0, ['helmet_2'] = 0, ['shoes_2'] = 3, ['torso_2'] = 4, ['bags_2'] = 1, ['chain_2'] = 0, ['tshirt_1'] = 55, ['chain_1'] = 0, ['bproof_1'] = -1, ['torso_1'] = 63, ['shoes_1'] = 58, ['decals_2'] = 0, ['arms'] = 0}
	},
	red = {
		male = {['helmet_1'] = -1, ['tshirst_2'] = 4, ['bags_1'] = 103, ['pants_2'] = 2, ['pants_1'] = 28, ['decals_1'] = 0, ['helmet_2'] = 0, ['shoes_2'] = 11, ['torso_2'] = 3, ['bags_2'] = 3, ['chain_2'] = 0, ['tshirt_1'] = 14, ['chain_1'] = 0, ['bproof_1'] = -1, ['torso_1'] = 69, ['shoes_1'] = 8, ['decals_2'] = 0, ['arms'] = 0},
		female = {['helmet_1'] = -1, ['tshirst_2'] = 2, ['bags_1'] = 110, ['pants_2'] = 7, ['pants_1'] = 23, ['decals_1'] = 0, ['helmet_2'] = 0, ['shoes_2'] = 5, ['torso_2'] = 3, ['bags_2'] = 3, ['chain_2'] = 0, ['tshirt_1'] = 55, ['chain_1'] = 0, ['bproof_1'] = -1, ['torso_1'] = 63, ['shoes_1'] = 58, ['decals_2'] = 0, ['arms'] = 0}
	},
	blue = {
		male = {['helmet_1'] = -1, ['tshirst_2'] = 5, ['bags_1'] = 103, ['pants_2'] = 11, ['pants_1'] = 28, ['decals_1'] = 0, ['helmet_2'] = 0, ['shoes_2'] = 5, ['torso_2'] = 4, ['bags_2'] = 1, ['chain_2'] = 0, ['tshirt_1'] = 14, ['chain_1'] = 0, ['bproof_1'] = -1, ['torso_1'] = 69, ['shoes_1'] = 8, ['decals_2'] = 0, ['arms'] = 0},
		female = {['helmet_1'] = -1, ['tshirst_2'] = 7, ['bags_1'] = 110, ['pants_2'] = 1, ['pants_1'] = 23, ['decals_1'] = 0, ['helmet_2'] = 0, ['shoes_2'] = 3, ['torso_2'] = 4, ['bags_2'] = 1, ['chain_2'] = 0, ['tshirt_1'] = 55, ['chain_1'] = 0, ['bproof_1'] = -1, ['torso_1'] = 63, ['shoes_1'] = 58, ['decals_2'] = 0, ['arms'] = 0}
	}
}

-- Add here all the kits players can choose
Config.Kits = {
    {
        name = 'sb',
        label = 'Switchblade',
        weapon = 'WEAPON_SWITCHBLADE',
    },
    {
        name = 'pistol',
        label = 'Pistol',
        weapon = 'WEAPON_PISTOL_MK2',
    },
    {
        name = 'vp',
        label = 'Vintage pistol',
        weapon = 'WEAPON_VINTAGEPISTOL',
    },
    {
        name = 'sns',
        label = 'SNS pistol',
        weapon = 'WEAPON_ASSAULTRIFLE',
    },
    {
        name = 'mp',
        label = 'Machinepistol',
        weapon = 'WEAPON_MACHINEPISTOL',
    },
    {
        name = 'carbine',
        label = 'Carbine',
        weapon = 'WEAPON_CARBINERIFLE',
    },
    {
        name = 'sc',
        label = 'Special carbine',
        weapon = 'WEAPON_SPECIALCARBINE',
    },
    {
        name = 'ar',
        label = 'Assault rifle',
        weapon = 'WEAPON_ASSAULTRIFLE',
    },
    {
        name = 'br',
        label = 'Bullpup Rifle',
        weapon = 'WEAPON_BULLPUPRIFLE_MK2',
    },
    {
        name = 'gs',
        label = 'Gusenberg sweeper',
        weapon = 'WEAPON_GUSENBERG',
    },
    {
        name = 'bs',
        label = 'Bullpup Shotgun',
        weapon = 'WEAPON_BULLPUPSHOTGUN',
    },
    {
        name = 'sos',
        label = 'Sawn off shotgun',
        weapon = 'WEAPON_SAWNOFFSHOTGUN',
    },
    {
        name = 'hs',
        label = 'Heavy sniper',
        weapon = 'WEAPON_HEAVYSNIPER_MK2',
    },
	    {
        name = 'msmg',
        label = 'Mini SMG',
        weapon = 'WEAPON_MINISMG',
    },
}
```

{% endcode %}

{% code title="language.lua" lineNumbers="true" %}

```lua
Language = {
	['EN'] = {
		["createParty"] = "Press ~INPUT_PICKUP~ to create an airsoft party!",
		["alreadyIn"] = "You're already in a party!",
		["invited"] = "You have received an invite from %s. Use the command ~y~/maaccept~w~ to accept it!",
		["inviteSent"] = "An invite has been sent to player: %s",
		["inviteExpired"] = "The invite has ~y~expired~w~!",
		["inviteAccepted"] = "You have ~g~successfully ~b~accepted~w~ the invite!",
		["playerNotFound"] = "Player not found",
		["noInvite"] = "You've received ~r~no~w~ invite!",
		["partyHelp"] = "Commands: ^2/mastart^7, /mainvite (id), /makick (id), /maclose, /maleave, /malb, /mateam, /makitlist, /makit",	
		["partyLeft"] = "You've left ~y~party ~b~~w~!",
		["groupCircle"] = "You ~r~must~w~ be in the ~g~party circle~w~ to ~b~start~w~ the game!",
		["startMatch"] = "The game will be started!",
		["partyCreated"] = "Party ~g~successful~w~ created!\nUse ~y~/mahelp ~g~ to invite players",
		["invalidMinutes"] = "Incorrect amount of minutes",
		["mapBusy"] = "This map is ~r~occupied~w~!",
		["beenKicked"] = "You've been ~r~kicked~w~ out of the party!",
		["playerKicked"] = "You've successfully ~w~kicked player ~y~%s~g~ out of the party!",
		["partyClosed"] = "You've closed the party ~g~successfully~w~!",
		["playersInCircle"] = "Not all ~y~players~w~ are in the ~g~party circle~w~. Want to ~b~kick~w~ them? ~y~(/forcestart)~w~",
		["fewPlayers"] = "There are too ~r~few ~b~players~w~! (min: %s)",
		["manyPlayers"] = "There are too ~r~many ~b~players~w~! (max: %s)",
		["receivedAccount"] = "You received ~r~$%i %s ~w~. ~g~Congratulations!",
		["receivedItem"] = "You received ~r~%ix %s ~w~. ~g~Congratulations!",
		["lessPlayersReward"] = "Too few players have entered for a reward. Minimum %s needed!",
		["currencyIcon"] = "$",
		["cantSelect"] = "You ~r~can't a ~b~team~w~ team in FFA!",
		["playerShot"] = "You've ~r~shot~w~! ~b~Spawn protection~w~ ~r~disabled~w~!",
		["spawnProtection"] = "You've ~g~5 ~w~seconds ~b~spawn protection~w~!",
		["noProtection"] = "Your ~b~spawn protection~w~ has ~r~expired~w~!",
		["kitSelect"] = "Successfully selected kit: ~y~%s~w~!",
		["kitRespawn"] = "You will respawn with the ~y~%s~w~ kit!",
		["wrongKit"] = "Incorrect kit!",
		["teamChosen"] = "~g~Successful~w~ team ~b~%s~w~ chosen!",
		["notInParty"] = "You're not in an airsoft party!",

		["minuteCount"] = "Number of minutes (%s - %s)",
		["menuTitle"] = "Map selection",
		["menuGamemodeTitle"] = "Gamemode selection",
		["isInReadyCircle"] = "~g~You're in the circle, use ~y~/mahelp ~g~ to see all commands",
		["playerWon"] = "%s wins!",
		["tdm"] = "Team Death Match",
		["ffa"] = "Free For All",
		["teamRed"] = "red",
		["teamBlue"] = "blue",
		["teamRandom"] = "random",
		["WinMessage"] = "Team %s wins!",
		["DrawMessage"] = "It's a draw!",
		["PlayerWin"] = "Player %s wins!",

		-- Command help
		["makickDesc"] = "Kick someone from the party",
		["makickArgDesc"] = "Player ID of the player to be kicked",
		["mainviteDesc"] = "Invite someone to the party",
		["mainviteArgDesc"] = "Player ID of the player to be invited",
		["maacceptDesc"] = "Accept the invitation",
		["mastartDesc"] = "Start the game",
		["macloseDesc"] = "Cancel the party",
		["maleaveDesc"] = "Leave the party",
		["mahelpDesc"] = "Help command for airsoft",
		["makitDesc"] = "Choose a kit",
		["makitArgDesc"] = "Name of the kit, check /makitlist",
		["makitlistDesc"] = "Get the kit options",
		["mateamDesc"] = "Join a team",
		["mateamArgDesc"] = "Choose team blue, red or random",
		["malbDesc"] = "Show leaderboard",

		-- Leaderboard
		["totalStarts"] = "Total times started",
		["totalPlayers"] = "Total players",
		["totalFFA"] = "Total FFA kills",
		["totalTDM"] = "Total TDM kills",
		["totalKills"] = "Total kills",

		["logReceivedAccount"] = "received $%s %s",
		["logReward"] = "received %s %s",
	},

	['NL'] = {
		["createParty"] = "Druk op ~INPUT_PICKUP~ om een kartparty aan te maken!",
		["alreadyIn"] = "Je zit al in een party!",
		["invited"] = "Je hebt een invite van %s ontvangen. Gebruik ~y~/maaccept~w~ om deze te accepteren!",
		["inviteSent"] = "Er is een invite gestuurd naar speler: %s",
		["inviteExpired"] = "De invite is ~y~verlopen~w~!",
		["inviteAccepted"] = "Je hebt de invite ~g~succesvol ~b~geaccepteerd~w~!",
		["playerNotFound"] = "Speler niet gevonden",
		["noInvite"] = "Je hebt ~r~geen~w~ invite ontvangen!",
		["partyHelp"] = "Commands: ^2/mastart^7, /mainvite (id), /makick (id), /maclose, /maleave, /malb, /mateam, /makitlist, /makit",	
		["partyLeft"] = "Je hebt de ~y~party ~b~verlaten~w~!",
		["groupCircle"] = "Je ~r~moet~w~ in de ~g~groeperingscirkel~w~ staan om de match te ~b~starten~w~!",
		["startMatch"] = "De match wordt ~y~geladen",
		["partyCreated"] = "Party ~g~succesvol~w~ aangemaakt!\nGebruik ~y~/mahelp ~w~om mensen te inviten",
		["invalidMinutes"] = "Onjuiste hoeveelheid minuten",
		["mapBusy"] = "Deze map is ~r~bezet~w~!",
		["beenKicked"] = "Je bent ~r~gekicked~w~ uit de party!",
		["playerKicked"] = "Je hebt speler ~y~%s~g~ succesvol ~w~gekicked uit de party!",
		["partyClosed"] = "Je hebt de party ~g~succesvol~w~ gesloten!",
		["playersInCircle"] = "Niet alle ~y~spelers~w~ zitten in de ~g~groeperingscirkel~w~. Wil je ze ~b~kicken~w~? ~y~(/forcestart)~w~",
		["fewPlayers"] = "Je bent met te ~r~weinig ~b~spelers~w~! (min: %s)",
		["manyPlayers"] = "Je bent met te ~r~veel ~b~spelers~w~! (max: %s)",
		["receivedAccount"] = "Je ontving ~r~$%i %s ~w~. ~g~Gefeliciteerd!",
		["receivedItem"] = "Je ontving ~r~%ix %s ~w~. ~g~Gefeliciteerd!",
		["lessPlayersReward"] = "Te weinig spelers hebben meegedaan voor een beloning. Minimaal %s nodig!",
		["cantSelect"] = "Je kunt ~r~geen ~b~team~w~ selecteren in FFA!",
		["playerShot"] = "Je hebt ~r~geschoten~w~! ~b~Spawnprotectie~w~ staat ~r~uit~w~!",
		["spawnProtection"] = "Je hebt ~g~5 ~w~seconde ~b~spawnprotectie~w~!",
		["noProtection"] = "Je ~b~spawnprotectie~w~ is ~r~verlopen~w~!",
		["kitSelect"] = "Succesvol kit ~y~%s~w~ gekozen!",
		["kitRespawn"] = "Je zult respawnen met de ~y~%s~w~ kit!",
		["wrongKit"] = "Onjuiste kit!",
		["teamChosen"] = "~g~Succesvol~w~ team ~b~%s~w~ gekozen!",
		["notInParty"] = "Je zit niet in een airsoft party!",

		["minuteCount"] = "Aantal minuten (%s - %s)",
		["menuTitle"] = "Map selectie",
		["menuGamemodeTitle"] = "Gamemode selectie",
		["isInReadyCircle"] = "~g~Je bent in de cirkel, gebruik ~y~/mahelp ~g~om de commando's te zien",
		["playerWon"] = "%s wint!",
		["tdm"] = "Team Death Match",
		["ffa"] = "Free For All",
		["teamRed"] = "red",
		["teamBlue"] = "blue",
		["teamRandom"] = "random",
		["WinMessage"] = "Team %s heeft gewonnen!",
		["DrawMessage"] = "Het is een gelijkspel!",
		["PlayerWin"] = "Speler %s heeft gewonnen!",

		-- Command help
		["makickDesc"] = "Kick iemand van de party",
		["makickArgDesc"] = "Speler ID van de speler die moet worden gekicked",
		["mainviteDesc"] = "Invite iemand voor de party",
		["mainviteArgDesc"] = "Speler ID van de speler die moet worden uitgenodigd",
		["maacceptDesc"] = "Accepteer de uitnodiging",
		["mastartDesc"] = "Start de game",
		["macloseDesc"] = "Hef de party op",
		["maleaveDesc"] = "Verlaat de party",
		["mahelpDesc"] = "Help command voor het airsoften",
		["makitDesc"] = "Kies een kit",
		["makitArgDesc"] = "Naam van de kit, gebruik /makitlist",
		["makitlistDesc"] = "Geef de verschillende kits weer",
		["mateamDesc"] = "Join een team",
		["mateamArgDesc"] = "Kies team blue, red of random",
		["malbDesc"] = "Show leaderboard",

		-- Leaderboard
		["totalStarts"] = "Aantal keer gestart",
		["totalPlayers"] = "Totaal aantal spelers",
		["totalFFA"] = "Totale FFA kills",
		["totalTDM"] = "Totale TDM kills",
		["totalKills"] = "Totale kills",

		["logReceivedAccount"] = "ontving $%s %s",
		["logReward"] = "ontving %s %s",
	}
}
```

{% endcode %}

{% code title="functions.lua" lineNumbers="true" %}

```lua
Functions = {}

--- [[ Markhor Bridge ]] ---
--- [[ Markhor Bridge ]] ---


--- This resource depends on Markhor Bridge.
--- With Markhor Bridge, all necessary settings (such as framework, inventory, interact, etc.) are automatically set.
--- You don't have to do anything except install Markhor Bridge.


--- [[ Markhor Bridge ]] ---
--- [[ Markhor Bridge ]] ---

-- With the following client called function, the text messages can be fully customized
Functions.ShowMissiontext = function(text,time)
    ClearPrints()
    SetTextEntry_2("STRING")
    AddTextComponentString(text)
    DrawSubtitleTimed(time, 1)
end

-- This server called function makes it possible to link and customize your own chat resource
Functions.ShowChatMessage = function(src, title, color, message)
    TriggerClientEvent('chatMessage', src, title, color, message)
end

-- This client called function makes it possible to link and customize your own chat resource
Functions.ShowChatMessageClient = function(title, color, message)
    TriggerEvent('chatMessage', title, color, message)
end

-- The two client called functions below are used to change players' outfits.
Functions.loadTeamSkin = function(currentTeam)
    TriggerEvent('skinchanger:getSkin', function(skin)
        TriggerEvent('mh_airsoft:syncSkin', skin)
        local newSkin = nil
        if skin.sex == 0 then
            if currentTeam == Language[Config.language].teamBlue then
                newSkin = Config.Outfits.blue.male
            elseif currentTeam == Language[Config.language].teamRed then
                newSkin = Config.Outfits.red.male
            else
                newSkin = Config.Outfits.ffa.male
            end
        else
            if currentTeam == Language[Config.language].teamBlue then
                newSkin = Config.Outfits.blue.female
            elseif currentTeam == Language[Config.language].teamRed then
                newSkin = Config.Outfits.red.female
            else
                newSkin = Config.Outfits.ffa.female
            end
        end
        TriggerEvent('skinchanger:loadClothes', skin, newSkin)
    end)
end

Functions.restoreSkin = function(oldSkin)
    TriggerEvent('skinchanger:getSkin', function(skin)
        TriggerEvent('skinchanger:loadClothes', skin, oldSkin)
    end)
end

-- To ensure that the ambulance job does not take over the death, it is important that this function is called. This instantly revives the player.
Functions.overruleRevive = function()
    TriggerEvent('mh_ambulancejob:revive')
end

-- This function can be used to check if a player has been killed. The function is called client sided in a loop, when active 0 ticks.
Functions.checkDeath = function(player)
    if NetworkIsPlayerActive(player) then
        local ped = PlayerPedId()

        if IsPedFatallyInjured(ped) and not isDead then
            isDead = true

            local killer_2, killerweapon = NetworkGetEntityKillerOfPlayer(player)
            local killer = GetPedSourceOfDeath(PlayerPedId())

            if killer_2 ~= 0 and killer_2 ~= -1 then
                killer = killer_2
            end

            -- The event below triggers Functions.overruleRevive()
            TriggerEvent('mh_airsoft:onPlayerKilled', NetworkGetNetworkIdFromEntity(killer))

        elseif not IsPedFatallyInjured(ped) then
            isDead = false
        end
    end
end

-- The four client called functions below control the weapons, which can be adjusted as soon as you work with, for example, an unknown inventory.
Functions.GiveWeapon = function(ped, weapon)
    GiveWeaponToPed(ped, weapon, 1000, false, true)
end

Functions.RemoveWeapon = function(ped, weapon)
    RemoveWeaponFromPed(ped, weapon)
end

Functions.ForceWeaponInHand = function(ped, weapon)
    SetCurrentPedWeapon(ped, weapon, true)
end
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.markhorscripts.com/home/scripts/markhor-airsoft/configuration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
