5359 lines
255 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="ru" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="This website serves as the new BeamMP Documentation site for general self serve support, guides and documentation. Best of all it is source available so you the community can help us to A. keep it up-to-date and B. providing the content you require.">
<link rel="canonical" href="https://docs.beammp.com/ru/scripting/server/latest-server-reference/">
<link rel="prev" href="../../mod-reference/">
<link rel="next" href="../v2-server-reference/">
<link rel="icon" href="../../../../assets/core/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16">
<title>Version 3.X (Latest) - BeamMP Docs</title>
<link rel="stylesheet" href="../../../../assets/stylesheets/main.7e37652d.min.css">
<link rel="stylesheet" href="../../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../../stylesheets/custom.css">
<script>__md_scope=new URL("../../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<script id="__analytics">function __md_analytics(){function e(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],e("js",new Date),e("config","G-8T6ETLZCMC"),document.addEventListener("DOMContentLoaded",(function(){document.forms.search&&document.forms.search.query.addEventListener("blur",(function(){this.value&&e("event","search",{search_term:this.value})}));document$.subscribe((function(){var t=document.forms.feedback;if(void 0!==t)for(var a of t.querySelectorAll("[type=submit]"))a.addEventListener("click",(function(a){a.preventDefault();var n=document.location.pathname,d=this.getAttribute("data-md-value");e("event","feedback",{page:n,data:d}),t.firstElementChild.disabled=!0;var r=t.querySelector(".md-feedback__note [data-md-value='"+d+"']");r&&(r.hidden=!1)})),t.hidden=!1})),location$.subscribe((function(t){e("config","G-8T6ETLZCMC",{page_path:t.pathname})}))}));var t=document.createElement("script");t.async=!0,t.src="https://www.googletagmanager.com/gtag/js?id=G-8T6ETLZCMC",document.getElementById("__analytics").insertAdjacentElement("afterEnd",t)}</script>
<script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="Version 3.X (Latest) - BeamMP Docs" >
<meta property="og:description" content="This website serves as the new BeamMP Documentation site for general self serve support, guides and documentation. Best of all it is source available so you the community can help us to A. keep it up-to-date and B. providing the content you require." >
<meta property="og:image" content="https://docs.beammp.com/assets/images/social/en/scripting/server/latest-server-reference.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.beammp.com/ru/scripting/server/latest-server-reference/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Version 3.X (Latest) - BeamMP Docs" >
<meta name="twitter:description" content="This website serves as the new BeamMP Documentation site for general self serve support, guides and documentation. Best of all it is source available so you the community can help us to A. keep it up-to-date and B. providing the content you require." >
<meta name="twitter:image" content="https://docs.beammp.com/assets/images/social/en/scripting/server/latest-server-reference.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#server-scripting-reference" class="md-skip">
Перейти к содержанию
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Верхний колонтитул">
<a href="/" title="BeamMP Docs" class="md-header__button md-logo" aria-label="BeamMP Docs" data-md-component="logo">
<img src="../../../../assets/core/beammp_dark.png" alt="logo" class="logo-light" />
<img src="../../../../assets/core/beammp_light.png" alt="logo" class="logo-dark" />
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
BeamMP Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Выберите язык">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.5 17.5 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../../scripting/server/latest-server-reference/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../../es/scripting/server/latest-server-reference/" hreflang="es" class="md-select__link">
Español
</a>
</li>
<li class="md-select__item">
<a href="../../../../de/scripting/server/latest-server-reference/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
<li class="md-select__item">
<a href="../../../../fr/scripting/server/latest-server-reference/" hreflang="fr" class="md-select__link">
Français
</a>
</li>
<li class="md-select__item">
<a href="../../../../it/scripting/server/latest-server-reference/" hreflang="it" class="md-select__link">
Italiano
</a>
</li>
<li class="md-select__item">
<a href="./" hreflang="ru" class="md-select__link">
Pусский
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Поиск" placeholder="Поиск" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Поиск">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Поделиться" aria-label="Поделиться" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Очистить" aria-label="Очистить" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Инициализация поиска
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/beammp/docs" title="Перейти к репозиторию" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
beammp/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Вкладки" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../../" class="md-tabs__link">
Главная
</a>
</li>
<li class="md-tabs__item">
<a href="../../../game/getting-started/" class="md-tabs__link">
Поддержка
</a>
</li>
<li class="md-tabs__item">
<a href="../../../FAQ/How-to-check-for-CGNAT/" class="md-tabs__link">
FAQ
</a>
</li>
<li class="md-tabs__item">
<a href="../../../guides/" class="md-tabs__link">
Руководства по разработке
</a>
</li>
<li class="md-tabs__item">
<a href="../../../beamng/" class="md-tabs__link">
Документация BeamNG
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../mod-reference/" class="md-tabs__link">
Справочник по скриптингу
</a>
</li>
<li class="md-tabs__item">
<a href="../../../contributing/" class="md-tabs__link">
Участие
</a>
</li>
<li class="md-tabs__item">
<a href="../../../community/" class="md-tabs__link">
Сообщество
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Навигация" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="/" title="BeamMP Docs" class="md-nav__button md-logo" aria-label="BeamMP Docs" data-md-component="logo">
<img src="../../../../assets/core/beammp_dark.png" alt="logo" class="logo-light" />
<img src="../../../../assets/core/beammp_light.png" alt="logo" class="logo-dark" />
</a>
BeamMP Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/beammp/docs" title="Перейти к репозиторию" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
beammp/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../" class="md-nav__link">
<span class="md-ellipsis">
Главная
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Поддержка
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Поддержка
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1" id="__nav_2_1_label" tabindex="0">
<span class="md-ellipsis">
Игра в BeamMP
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
Игра в BeamMP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../game/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Установка BeamMP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../game/error-codes/" class="md-nav__link">
<span class="md-ellipsis">
коды ошибок
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../game/multiplayer-settings/" class="md-nav__link">
<span class="md-ellipsis">
Настройки мультиплеера
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2" id="__nav_2_2_label" tabindex="0">
<span class="md-ellipsis">
Running a BeamMP-Server
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Running a BeamMP-Server
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../server/create-a-server/" class="md-nav__link">
<span class="md-ellipsis">
Установка сервера
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../server/port-forwarding/" class="md-nav__link">
<span class="md-ellipsis">
Port Forwarding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../server/server-maintenance/" class="md-nav__link">
<span class="md-ellipsis">
Обслуживание сервера
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../server/error-codes/" class="md-nav__link">
<span class="md-ellipsis">
коды ошибок
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../server/manual/" class="md-nav__link">
<span class="md-ellipsis">
Руководство по серверу
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_3" >
<label class="md-nav__link" for="__nav_2_3" id="__nav_2_3_label" tabindex="0">
<span class="md-ellipsis">
Создание модов и ресурсов
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Создание модов и ресурсов
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../guides/mod-creation/server/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Сторона сервера
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
FAQ
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
FAQ
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../FAQ/How-to-check-for-CGNAT/" class="md-nav__link">
<span class="md-ellipsis">
Как проверить наличие CGNAT?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/where-to-find-my-IP/" class="md-nav__link">
<span class="md-ellipsis">
Где я могу найти свой IP-адрес?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/How-to-deactivate-mods/" class="md-nav__link">
<span class="md-ellipsis">
Как деактивировать мод?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/Update-launcher/" class="md-nav__link">
<span class="md-ellipsis">
Обновление лаунчера вручную
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/Change-launcher-port/" class="md-nav__link">
<span class="md-ellipsis">
Изменение порта лаунчера
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/Defender-exclusions/" class="md-nav__link">
<span class="md-ellipsis">
Создание исключений (Defender)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/player-faq/" class="md-nav__link">
<span class="md-ellipsis">
Игроки ЧаВо
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/game-faq/" class="md-nav__link">
<span class="md-ellipsis">
Часто задаваемые вопросы об игре
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../FAQ/server-faq/" class="md-nav__link">
<span class="md-ellipsis">
Часто задаваемые вопросы о сервере
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<div class="md-nav__link md-nav__container">
<a href="../../../guides/" class="md-nav__link ">
<span class="md-ellipsis">
Руководства по разработке
</span>
<span class="md-status md-status--new" title="Recently added">
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Руководства по разработке
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../guides/beammp-dev/beammp-dev/" class="md-nav__link">
<span class="md-ellipsis">
Development Environment Setup
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0">
<span class="md-ellipsis">
Создание модов
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Создание модов
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mod-reference/" class="md-nav__link">
<span class="md-ellipsis">
Client Scripting Reference
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0">
<span class="md-ellipsis">
Создание ресурсов
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
Создание ресурсов
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../guides/mod-creation/server/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Сторона сервера
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<div class="md-nav__link md-nav__container">
<a href="../../../beamng/" class="md-nav__link ">
<span class="md-ellipsis">
Документация BeamNG
</span>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Документация BeamNG
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_2" >
<div class="md-nav__link md-nav__container">
<a href="../../../beamng/dev/" class="md-nav__link ">
<span class="md-ellipsis">
Content Development
</span>
</a>
<label class="md-nav__link " for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Content Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_2_2" >
<label class="md-nav__link" for="__nav_5_2_2" id="__nav_5_2_2_label" tabindex="0">
<span class="md-ellipsis">
Programming
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_5_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2_2">
<span class="md-nav__icon md-icon"></span>
Programming
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../beamng/dev/modding/ui-apps/" class="md-nav__link">
<span class="md-ellipsis">
UI Apps (HTML)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../beamng/dev/modding/imgui-windows/" class="md-nav__link">
<span class="md-ellipsis">
IMGUI Windows (Lua)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../beamng/dev/modding/lua-mods/" class="md-nav__link">
<span class="md-ellipsis">
Lua Mods (Scripts)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_2_3" >
<label class="md-nav__link" for="__nav_5_2_3" id="__nav_5_2_3_label" tabindex="0">
<span class="md-ellipsis">
Content
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_5_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2_3">
<span class="md-nav__icon md-icon"></span>
Content
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../beamng/dev/content/maps/" class="md-nav__link">
<span class="md-ellipsis">
Maps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../beamng/dev/content/props/" class="md-nav__link">
<span class="md-ellipsis">
Props
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../beamng/dev/content/vehicles/" class="md-nav__link">
<span class="md-ellipsis">
Vehicles
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../../beamng/snippets/" class="md-nav__link">
<span class="md-ellipsis">
Helpful Code Snippets
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
Справочник по скриптингу
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Справочник по скриптингу
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mod-reference/" class="md-nav__link">
<span class="md-ellipsis">
Client Scripting Reference
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" checked>
<label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="">
<span class="md-ellipsis">
Сервер
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6_2">
<span class="md-nav__icon md-icon"></span>
Сервер
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Содержание">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Содержание
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#server-version-3x" class="md-nav__link">
<span class="md-ellipsis">
Server Version 3.X
</span>
</a>
<nav class="md-nav" aria-label="Server Version 3.X">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#directory-structure" class="md-nav__link">
<span class="md-ellipsis">
Directory Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lua-files" class="md-nav__link">
<span class="md-ellipsis">
Lua Files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-events" class="md-nav__link">
<span class="md-ellipsis">
Custom Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#event-timers-threads" class="md-nav__link">
<span class="md-ellipsis">
Event Timers ("Threads")
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#debugging" class="md-nav__link">
<span class="md-ellipsis">
Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-commands" class="md-nav__link">
<span class="md-ellipsis">
Custom Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-reference" class="md-nav__link">
<span class="md-ellipsis">
API Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#builtin-functions" class="md-nav__link">
<span class="md-ellipsis">
Builtin Functions
</span>
</a>
<nav class="md-nav" aria-label="Builtin Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#print-printraw" class="md-nav__link">
<span class="md-ellipsis">
print(...), printRaw(...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit" class="md-nav__link">
<span class="md-ellipsis">
exit()
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp-functions" class="md-nav__link">
<span class="md-ellipsis">
MP Functions
</span>
</a>
<nav class="md-nav" aria-label="MP Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mpcreatetimer-timer" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateTimer() -&gt; Timer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetosname-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetOSName() -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetserverversion-numbernumbernumber" class="md-nav__link">
<span class="md-ellipsis">
MP.GetServerVersion() -&gt; number,number,number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpregistereventevent_name-string-function_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.RegisterEvent(event_name: string, function_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcreateeventtimerevent_name-string-interval_ms-number-strategy-number-since-v302" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateEventTimer(event_name: string, interval_ms: number, [strategy: number (since v3.0.2)])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcanceleventtimerevent_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.CancelEventTimer(event_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerlocaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerLocalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerglobaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerGlobalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsleeptime_ms-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Sleep(time_ms: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsendchatmessageplayer_id-number-message-string" class="md-nav__link">
<span class="md-ellipsis">
MP.SendChatMessage(player_id: number, message: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventjsonplayer_id-number-event_name-string-data-table-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEventJson(player_id: number, event_name: string, data: table) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayercount-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerCount() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetpositionrawpid-number-vid-number-tablestring" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerconnectedplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerConnected(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayernameplayer_id-number-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerName(player_id: number) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpremovevehicleplayer_id-number-vehicle_id-number" class="md-nav__link">
<span class="md-ellipsis">
MP.RemoveVehicle(player_id: number, vehicle_id: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayervehiclesplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerVehicles(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayers-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayers() -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerguestplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerGuest(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpdropplayerplayer_id-number-reason-string" class="md-nav__link">
<span class="md-ellipsis">
MP.DropPlayer(player_id: number, [reason: string])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetstatememoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetStateMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetluamemoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetLuaMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayeridentifiersplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerIdentifiers(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsetsetting-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Set(setting: number, ...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsettings-table" class="md-nav__link">
<span class="md-ellipsis">
MP.Settings -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util-functions" class="md-nav__link">
<span class="md-ellipsis">
Util Functions
</span>
</a>
<nav class="md-nav" aria-label="Util Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utiljson" class="md-nav__link">
<span class="md-ellipsis">
Util.Json*
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonencodetable-table-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonEncode(table: table) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondecodejson-string-table" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDecode(json: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonprettifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonPrettify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonminifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonMinify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonFlatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonunflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonUnflatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffa-string-b-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiff(a: string, b: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffapplybase-string-diff-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiffApply(base: string, diff: string) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utilrandom" class="md-nav__link">
<span class="md-ellipsis">
Util.Random*
</span>
</a>
<nav class="md-nav" aria-label="Util.Random*">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utilrandom-float" class="md-nav__link">
<span class="md-ellipsis">
Util.Random() -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomintrangemin-int-max-int-int" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomIntRange(min: int, max: int) -&gt; int
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomrangemin-number-max-number-float" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomRange(min: number, max: number) -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilloginfoparams-et-al-since-v330" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(params: ...) et al (since v3.3.0)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utildebugexecutiontime-table" class="md-nav__link">
<span class="md-ellipsis">
Util.DebugExecutionTime() -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs-functions" class="md-nav__link">
<span class="md-ellipsis">
FS Functions
</span>
</a>
<nav class="md-nav" aria-label="FS Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fscreatedirectorypath-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.CreateDirectory(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsremovepath-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Remove(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsrenamepatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Rename(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fscopypatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Copy(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetfilenamepath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetFilename(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetextensionpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetExtension(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetparentfolderpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetParentFolder(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsexistspath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.Exists(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisdirectorypath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsDirectory(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisfilepath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsFile(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistdirectoriespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListDirectories(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistfilespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListFiles(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsconcatpaths-string" class="md-nav__link">
<span class="md-ellipsis">
FS.ConcatPaths(...) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#events_1" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
<nav class="md-nav" aria-label="Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#explanation" class="md-nav__link">
<span class="md-ellipsis">
Explanation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#summary-of-events" class="md-nav__link">
<span class="md-ellipsis">
Summary of events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#system-events" class="md-nav__link">
<span class="md-ellipsis">
System Events
</span>
</a>
<nav class="md-nav" aria-label="System Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#oninit" class="md-nav__link">
<span class="md-ellipsis">
onInit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onconsoleinput" class="md-nav__link">
<span class="md-ellipsis">
onConsoleInput
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onshutdown" class="md-nav__link">
<span class="md-ellipsis">
onShutdown
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#game-related-events" class="md-nav__link">
<span class="md-ellipsis">
Game-Related Events
</span>
</a>
<nav class="md-nav" aria-label="Game-Related Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#onplayerauth" class="md-nav__link">
<span class="md-ellipsis">
onPlayerAuth
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerconnecting" class="md-nav__link">
<span class="md-ellipsis">
onPlayerConnecting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerjoining" class="md-nav__link">
<span class="md-ellipsis">
onPlayerJoining
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerdisconnect" class="md-nav__link">
<span class="md-ellipsis">
onPlayerDisconnect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onchatmessage" class="md-nav__link">
<span class="md-ellipsis">
onChatMessage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclespawn" class="md-nav__link">
<span class="md-ellipsis">
onVehicleSpawn
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicleedited" class="md-nav__link">
<span class="md-ellipsis">
onVehicleEdited
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicledeleted" class="md-nav__link">
<span class="md-ellipsis">
onVehicleDeleted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclereset" class="md-nav__link">
<span class="md-ellipsis">
onVehicleReset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onfilechanged" class="md-nav__link">
<span class="md-ellipsis">
onFileChanged
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#migrating-from-old-lua" class="md-nav__link">
<span class="md-ellipsis">
Migrating from old Lua
</span>
</a>
<nav class="md-nav" aria-label="Migrating from old Lua">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#understand-how-the-new-lua-works" class="md-nav__link">
<span class="md-ellipsis">
Understand how the new lua works
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#search-replace" class="md-nav__link">
<span class="md-ellipsis">
Search &amp; Replace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#goodbye-threads-hello-event-timers" class="md-nav__link">
<span class="md-ellipsis">
Goodbye Threads, Hello Event Timers!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#no-more-implicit-event-calling" class="md-nav__link">
<span class="md-ellipsis">
No more implicit event calling
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../v2-server-reference/" class="md-nav__link">
<span class="md-ellipsis">
Version 2.X (Deprecated)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Участие
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Участие
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../contributing/" class="md-nav__link">
<span class="md-ellipsis">
Начало работы
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<div class="md-nav__link md-nav__container">
<a href="../../../community/" class="md-nav__link ">
<span class="md-ellipsis">
Сообщество
</span>
</a>
<label class="md-nav__link " for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Сообщество
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../community/rules/" class="md-nav__link">
<span class="md-ellipsis">
Rules
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Содержание">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Содержание
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#server-version-3x" class="md-nav__link">
<span class="md-ellipsis">
Server Version 3.X
</span>
</a>
<nav class="md-nav" aria-label="Server Version 3.X">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#directory-structure" class="md-nav__link">
<span class="md-ellipsis">
Directory Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lua-files" class="md-nav__link">
<span class="md-ellipsis">
Lua Files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-events" class="md-nav__link">
<span class="md-ellipsis">
Custom Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#event-timers-threads" class="md-nav__link">
<span class="md-ellipsis">
Event Timers ("Threads")
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#debugging" class="md-nav__link">
<span class="md-ellipsis">
Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-commands" class="md-nav__link">
<span class="md-ellipsis">
Custom Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-reference" class="md-nav__link">
<span class="md-ellipsis">
API Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#builtin-functions" class="md-nav__link">
<span class="md-ellipsis">
Builtin Functions
</span>
</a>
<nav class="md-nav" aria-label="Builtin Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#print-printraw" class="md-nav__link">
<span class="md-ellipsis">
print(...), printRaw(...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit" class="md-nav__link">
<span class="md-ellipsis">
exit()
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp-functions" class="md-nav__link">
<span class="md-ellipsis">
MP Functions
</span>
</a>
<nav class="md-nav" aria-label="MP Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mpcreatetimer-timer" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateTimer() -&gt; Timer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetosname-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetOSName() -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetserverversion-numbernumbernumber" class="md-nav__link">
<span class="md-ellipsis">
MP.GetServerVersion() -&gt; number,number,number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpregistereventevent_name-string-function_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.RegisterEvent(event_name: string, function_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcreateeventtimerevent_name-string-interval_ms-number-strategy-number-since-v302" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateEventTimer(event_name: string, interval_ms: number, [strategy: number (since v3.0.2)])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcanceleventtimerevent_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.CancelEventTimer(event_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerlocaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerLocalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerglobaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerGlobalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsleeptime_ms-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Sleep(time_ms: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsendchatmessageplayer_id-number-message-string" class="md-nav__link">
<span class="md-ellipsis">
MP.SendChatMessage(player_id: number, message: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventjsonplayer_id-number-event_name-string-data-table-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEventJson(player_id: number, event_name: string, data: table) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayercount-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerCount() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetpositionrawpid-number-vid-number-tablestring" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerconnectedplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerConnected(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayernameplayer_id-number-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerName(player_id: number) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpremovevehicleplayer_id-number-vehicle_id-number" class="md-nav__link">
<span class="md-ellipsis">
MP.RemoveVehicle(player_id: number, vehicle_id: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayervehiclesplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerVehicles(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayers-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayers() -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerguestplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerGuest(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpdropplayerplayer_id-number-reason-string" class="md-nav__link">
<span class="md-ellipsis">
MP.DropPlayer(player_id: number, [reason: string])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetstatememoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetStateMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetluamemoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetLuaMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayeridentifiersplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerIdentifiers(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsetsetting-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Set(setting: number, ...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsettings-table" class="md-nav__link">
<span class="md-ellipsis">
MP.Settings -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util-functions" class="md-nav__link">
<span class="md-ellipsis">
Util Functions
</span>
</a>
<nav class="md-nav" aria-label="Util Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utiljson" class="md-nav__link">
<span class="md-ellipsis">
Util.Json*
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonencodetable-table-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonEncode(table: table) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondecodejson-string-table" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDecode(json: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonprettifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonPrettify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonminifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonMinify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonFlatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonunflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonUnflatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffa-string-b-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiff(a: string, b: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffapplybase-string-diff-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiffApply(base: string, diff: string) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utilrandom" class="md-nav__link">
<span class="md-ellipsis">
Util.Random*
</span>
</a>
<nav class="md-nav" aria-label="Util.Random*">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utilrandom-float" class="md-nav__link">
<span class="md-ellipsis">
Util.Random() -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomintrangemin-int-max-int-int" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomIntRange(min: int, max: int) -&gt; int
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomrangemin-number-max-number-float" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomRange(min: number, max: number) -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilloginfoparams-et-al-since-v330" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(params: ...) et al (since v3.3.0)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utildebugexecutiontime-table" class="md-nav__link">
<span class="md-ellipsis">
Util.DebugExecutionTime() -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs-functions" class="md-nav__link">
<span class="md-ellipsis">
FS Functions
</span>
</a>
<nav class="md-nav" aria-label="FS Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fscreatedirectorypath-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.CreateDirectory(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsremovepath-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Remove(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsrenamepatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Rename(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fscopypatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Copy(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetfilenamepath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetFilename(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetextensionpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetExtension(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetparentfolderpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetParentFolder(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsexistspath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.Exists(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisdirectorypath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsDirectory(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisfilepath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsFile(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistdirectoriespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListDirectories(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistfilespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListFiles(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsconcatpaths-string" class="md-nav__link">
<span class="md-ellipsis">
FS.ConcatPaths(...) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#events_1" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
<nav class="md-nav" aria-label="Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#explanation" class="md-nav__link">
<span class="md-ellipsis">
Explanation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#summary-of-events" class="md-nav__link">
<span class="md-ellipsis">
Summary of events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#system-events" class="md-nav__link">
<span class="md-ellipsis">
System Events
</span>
</a>
<nav class="md-nav" aria-label="System Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#oninit" class="md-nav__link">
<span class="md-ellipsis">
onInit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onconsoleinput" class="md-nav__link">
<span class="md-ellipsis">
onConsoleInput
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onshutdown" class="md-nav__link">
<span class="md-ellipsis">
onShutdown
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#game-related-events" class="md-nav__link">
<span class="md-ellipsis">
Game-Related Events
</span>
</a>
<nav class="md-nav" aria-label="Game-Related Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#onplayerauth" class="md-nav__link">
<span class="md-ellipsis">
onPlayerAuth
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerconnecting" class="md-nav__link">
<span class="md-ellipsis">
onPlayerConnecting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerjoining" class="md-nav__link">
<span class="md-ellipsis">
onPlayerJoining
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerdisconnect" class="md-nav__link">
<span class="md-ellipsis">
onPlayerDisconnect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onchatmessage" class="md-nav__link">
<span class="md-ellipsis">
onChatMessage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclespawn" class="md-nav__link">
<span class="md-ellipsis">
onVehicleSpawn
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicleedited" class="md-nav__link">
<span class="md-ellipsis">
onVehicleEdited
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicledeleted" class="md-nav__link">
<span class="md-ellipsis">
onVehicleDeleted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclereset" class="md-nav__link">
<span class="md-ellipsis">
onVehicleReset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onfilechanged" class="md-nav__link">
<span class="md-ellipsis">
onFileChanged
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#migrating-from-old-lua" class="md-nav__link">
<span class="md-ellipsis">
Migrating from old Lua
</span>
</a>
<nav class="md-nav" aria-label="Migrating from old Lua">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#understand-how-the-new-lua-works" class="md-nav__link">
<span class="md-ellipsis">
Understand how the new lua works
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#search-replace" class="md-nav__link">
<span class="md-ellipsis">
Search &amp; Replace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#goodbye-threads-hello-event-timers" class="md-nav__link">
<span class="md-ellipsis">
Goodbye Threads, Hello Event Timers!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#no-more-implicit-event-calling" class="md-nav__link">
<span class="md-ellipsis">
No more implicit event calling
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/beammp/docs/edit/main/docs/en/scripting/server/latest-server-reference.md" title="Редактировать страницу" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="https://github.com/beammp/docs/raw/main/docs/en/scripting/server/latest-server-reference.md" title="Посмотреть исходный код страницы" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<div class="admonition warning">
<p class="admonition-title">This site is under construction!</p>
<p>This site is being actively worked on. </p>
<p>Feel you could help? Please do by clicking on the page with a pencil on the right!</p>
<p>This can be done on any page too.</p>
</div>
<h1 id="server-scripting-reference">Server Scripting Reference</h1>
<h2 id="server-version-3x">Server Version 3.X</h2>
<h3 id="introduction">Introduction</h3>
<p>BeamMP-Server release v3.0.0 does some drastic changes to the way the Lua plugin system works. There is no way to use the old lua with a new server, so you'll have to migrate.</p>
<p>The Server's Plugin system uses <a href="https://www.lua.org/manual/5.3/">Lua 5.3</a>. This section details how to get started writing plugins, teaches some basic concepts and gets you started with your first plugin. <strong>It is recommended you read this section even if you know the pre-v3.0.0 system, as a few things changed drastically</strong>.</p>
<p>For a migration guide from pre-v3.0.0 lua, go to the section <a href="#migrating-from-old-lua">"Migrating from old Lua"</a>.</p>
<h3 id="directory-structure">Directory Structure</h3>
<p>Server plugins, unlike mods, are situated (by default) in <code>Resources/Server</code>, while mods, which are written for BeamNG.drive and are sent to the clients are in <code>Resources/Client</code>. Each plugin must have it's own subfolder in <code>Resources/Server</code>, for example for a plugin called "MyPlugin", the structure would be:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>Resources
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>└── Server
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> ├── MyPlugin
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> │ └── main.lua
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> └── SomeOtherPlugin
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> └── ...
</span></code></pre></div>
<p>Here we also display another plugin called "SomeOtherPlugin", to illustrate how your <code>Resources/Server</code> folder can have multiple different plugin folders. We will keep using this directory structure as an example throughout this guide.</p>
<p>You also notice the <code>main.lua</code>. You can have as many Lua <code>.lua</code> files as you like. All Lua files in your plugin's main directory are loaded in <em>alphabetical order</em> (so <code>aaa.lua</code> is run before <code>bbb.lua</code>).</p>
<h3 id="lua-files">Lua Files</h3>
<p>Each Lua <code>.lua</code> file in the plugin's folder is loaded on server startup. This means that statements outside of functions are evaluated ("run") immediately.</p>
<p>Lua files in subfolders are ignored, but can be <code>require()</code>-ed.</p>
<p>For example, our <code>main.lua</code> looks like this:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">PrintMyName</span><span class="p">()</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;I&#39;m &#39;My Plugin&#39;!&quot;</span><span class="p">)</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="kr">end</span>
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;What&#39;s up!&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>When the server starts and the <code>main.lua</code> is loaded, it will run <code>print("What's up!")</code> <em>immediately</em>, but will <strong>NOT</strong> <em>call</em> the <code>PrintMyName</code> function yet (because it wasn't called)!</p>
<h3 id="events">Events</h3>
<p>An event is something like "a player is joining", "a player sent a chat message", "a player spawned a vehicle".</p>
<p>You can cancel events (if they are cancellable) by returning <code>1</code> from the handler.</p>
<p>In Lua, you usually want to react to some of these. For this, you can register a "Handler". This is a function which is called when an event happens, and gets passed some arguments.</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">MyChatMessageHandler</span><span class="p">(</span><span class="nv">sender_id</span><span class="p">,</span><span class="w"> </span><span class="nv">sender_name</span><span class="p">,</span><span class="w"> </span><span class="nv">message</span><span class="p">)</span>
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="c1">-- censoring only the exact message &#39;darn&#39;</span>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;darn&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="c1">-- cancel the event by returning 1</span>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-2-9"><a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="kr">end</span>
</span><span id="__span-2-10"><a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>
</span><span id="__span-2-11"><a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;MyChatMessageHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>This will effectively make sure that any message that is exactly equal to "darn" will not be sent and won't show in chat (note that for a real profanity filter you'd want to see if the message <em>contains</em> "darn", not <em>is</em> "darn"). Cancelling an event causes it to not happen, for example a chat message not to be shown to anyone else, a vehicle not to be spawned, etc.</p>
<h3 id="custom-events">Custom Events</h3>
<p>You can register to any event you like, for example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;MyCoolCustomEvent&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;MyHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>You can then trigger those custom events:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1">-- call all event handlers to this in ALL plugins</span>
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerGlobalEvent</span><span class="p">(</span><span class="s2">&quot;MyCoolCustomEvent&quot;</span><span class="p">)</span>
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="c1">-- call all event handlers to this in THIS plugin</span>
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerLocalEvent</span><span class="p">(</span><span class="s2">&quot;MyCoolCustomEvent&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>You can do a lot more with events, but those possibilities will be covered in detail below in the API reference.</p>
<h3 id="event-timers-threads">Event Timers ("Threads")</h3>
<p>Pre-v3.0.0 Lua had a concept of "threads" which run X times per second. This naming was slightly misleading, as they were synchronous.</p>
<p>v3.0.0 Lua instead has "Event Timers". These are timers which run inside the server, and once they run out, they trigger an event (globally). This is also synchronous. Please be aware that the second argument is an interval in milliseconds.</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">seconds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="kr">function</span><span class="w"> </span><span class="nf">CountSeconds</span><span class="p">()</span>
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="w"> </span><span class="nv">seconds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">seconds</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="kr">end</span>
</span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>
</span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1">-- create a custom event called &#39;EverySecond&#39;</span>
</span><span id="__span-5-8"><a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="c1">-- and register the handler function &#39;CountSeconds&#39; to it</span>
</span><span id="__span-5-9"><a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;EverySecond&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;CountSeconds&quot;</span><span class="p">)</span>
</span><span id="__span-5-10"><a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a>
</span><span id="__span-5-11"><a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="c1">-- create a timer for this event, which will fire every 1000ms (1s)</span>
</span><span id="__span-5-12"><a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateEventTimer</span><span class="p">(</span><span class="s2">&quot;EverySecond&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">1000</span><span class="p">)</span>
</span></code></pre></div>
<p>This will cause "CountSeconds" to be called every second. You can also cancel event timers with <code>MP.CancelEventTimer</code> (see API reference).</p>
<p>From the server's console, you can run <code>status</code> to see how many event timers are currently running, as well as info about event handlers that are waiting. This command will show more information in the future.</p>
<h3 id="debugging">Debugging</h3>
<p>Lua is difficult to debug. An industry-grade debugger like <code>gdb</code> sadly doesn't exist for embedded Lua.</p>
<p>Generally, you can of course simple <code>print()</code> the values you want to inspect at any time. </p>
<p>In v3.0.0, the server provides a way for you to inject an interpreter into a plugin and subsequently run Lua inside it in realtime. This is the closest we have to a debugger.</p>
<p>Assuming you have the plugin from above which we called <code>MyPlugin</code>, you can enter into its Lua state like so:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>&gt; lua MyPlugin
</span></code></pre></div>
<p>Capitalisation matters here, so be careful its entered correctly.
The output is something like
<div class="language-text highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>lua @MyPlugin&gt;
</span></code></pre></div>
As you can see, we switched into the Lua state for <code>MyPlugin</code>. From now on until we enter <code>exit()</code> (as of v3.1.0 <code>:exit</code>), we will be in <code>MyPlugin</code> and can execute Lua there. </p>
<p>For example, if we have a global called <code>MyValue</code>, we can print that value like so:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>lua @MyPlugin&gt; print(MyValue)
</span></code></pre></div>
<p>You can call functions here and do anything you expect to be able to do.</p>
<p>Since v3.1.0: You can press TAB to autocomplete functions and variables.</p>
<p>WARNING: Sadly, if the Lua state is currently busy executing other code (like a <code>while</code> loop), this can fully hang the console until it finishes that work, so be very careful switching to states which may be waiting for something to happen.</p>
<p>Additionally, you can run <code>status</code> in the regular console (<code>&gt;</code>), which will show you some statistics about Lua, among other things.</p>
<h3 id="custom-commands">Custom Commands</h3>
<p>In order to implement custom commands for the server console, the event <code>onConsoleInput</code> can be used.
This can be useful when you want to add a way for the server owner to signal something to your plugin, or to display internal state in a custom way.</p>
<p>Here's an example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">handleConsoleInput</span><span class="p">(</span><span class="nv">cmd</span><span class="p">)</span>
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">delim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">cmd</span><span class="p">:</span><span class="nf">find</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">delim</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">cmd</span><span class="p">:</span><span class="nf">sub</span><span class="p">(</span><span class="nv">delim</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">cmd</span><span class="p">:</span><span class="nf">sub</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nv">delim</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;print&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">message</span>
</span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-9-9"><a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a><span class="kr">end</span>
</span><span id="__span-9-10"><a id="__codelineno-9-10" name="__codelineno-9-10" href="#__codelineno-9-10"></a>
</span><span id="__span-9-11"><a id="__codelineno-9-11" name="__codelineno-9-11" href="#__codelineno-9-11"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onConsoleInput&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;handleConsoleInput&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>This will enable you to do the following in the server's console:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>&gt; print hello, world
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a>hello, world
</span></code></pre></div>
<p>We implemented our own <code>print</code>. As an exercise, try to build a function like <code>say</code>, which sends a chat message to all players, or even a specific player (with <code>MP.SendChatMessage</code>).</p>
<p><strong>Caution:</strong> For your own plugins, it's generally recommended to "namespace" them. Our <code>print</code> example, in a plugin called <code>mystuff</code>, could be called <code>mystuff.print</code> or <code>ms.print</code> or similar.</p>
<h3 id="api-reference">API Reference</h3>
<p>Documentation format: <code>function_name(arg_name: arg_type, arg_name: arg_type) -&gt; return_types</code></p>
<h3 id="builtin-functions">Builtin Functions</h3>
<h4 id="print-printraw"><code>print(...)</code>, <code>printRaw(...)</code></h4>
<p>Prints the message to the server console, prefixed with <code>[DATE TIME] [LUA]</code>. If you don't want this prefix, you can use <code>printRaw(...)</code>.</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;John Doe&quot;</span>
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Hello, I&#39;m&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;and I&#39;m&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">32</span><span class="p">)</span>
</span></code></pre></div>
<p>It can take as many arguments of arbitrary types as you like. It will also happily dump tables!</p>
<p>This behaves like the lua interpreter's <code>print</code>, so it will put tabs between arguments.</p>
<h4 id="exit"><code>exit()</code></h4>
<p>Shuts down the server gracefully. Causes the <code>onShutdown</code> event to be triggered.</p>
<h3 id="mp-functions">MP Functions</h3>
<h4 id="mpcreatetimer-timer"><code>MP.CreateTimer() -&gt; Timer</code></h4>
<p>Creates a timer object, which can be used to keep track of how long something took / how much time elapsed. It starts once created, and can be reset/restarted with <code>mytimer:Start()</code>.</p>
<p>You can get the current elapsed time in seconds with <code>mytimer:GetCurrent()</code>.</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">mytimer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateTimer</span><span class="p">()</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="c1">-- do stuff here that needs to be timed</span>
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a><span class="nb">print</span><span class="p">(</span><span class="nv">mytimer</span><span class="p">:</span><span class="nf">GetCurrent</span><span class="p">())</span><span class="w"> </span><span class="c1">-- print how much time elapsed</span>
</span></code></pre></div>
<p>Timers do not need to be stopped (and can't be stopped), they have no overhead.</p>
<h4 id="mpgetosname-string"><code>MP.GetOSName() -&gt; string</code></h4>
<p>Returns the name of the current OS, either <code>Windows</code>, <code>Linux</code> or <code>Other</code>.</p>
<h4 id="mpgetserverversion-numbernumbernumber"><code>MP.GetServerVersion() -&gt; number,number,number</code></h4>
<p>Returns the current server version in major, minor, patch format. For example, the v3.0.0 version would return <code>3, 0, 0</code>.</p>
<p>Example:</p>
<p><div class="language-lua highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">major</span><span class="p">,</span><span class="w"> </span><span class="nv">minor</span><span class="p">,</span><span class="w"> </span><span class="nv">patch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetServerVersion</span><span class="p">()</span>
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">major</span><span class="p">,</span><span class="w"> </span><span class="nv">minor</span><span class="p">,</span><span class="w"> </span><span class="nv">patch</span><span class="p">)</span>
</span></code></pre></div>
Output:
<div class="language-text highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a>2 4 0
</span></code></pre></div></p>
<h4 id="mpregistereventevent_name-string-function_name-string"><code>MP.RegisterEvent(event_name: string, function_name: string)</code></h4>
<p>Remembers the function with name <code>Function Name</code> as an event handler to event with name <code>Event Name</code>.</p>
<p>You can register as many handlers to an event as you like.</p>
<p>For a list of events the server provides, see <a href="#events-1">here</a>.</p>
<p>If the event with that name doesn't exist, it's created, and thus RegisterEvent cannot fail. This can be used to create custom events. See <a href="#custom-events">Custom Events</a> and <a href="#events">Events</a> for more.</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">msg</span><span class="p">)</span>
</span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">msg</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;hello&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Hello World!&quot;</span><span class="p">)</span>
</span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-15-5"><a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-15-6"><a id="__codelineno-15-6" name="__codelineno-15-6" href="#__codelineno-15-6"></a><span class="kr">end</span>
</span><span id="__span-15-7"><a id="__codelineno-15-7" name="__codelineno-15-7" href="#__codelineno-15-7"></a>
</span><span id="__span-15-8"><a id="__codelineno-15-8" name="__codelineno-15-8" href="#__codelineno-15-8"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;ChatHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<h4 id="mpcreateeventtimerevent_name-string-interval_ms-number-strategy-number-since-v302"><code>MP.CreateEventTimer(event_name: string, interval_ms: number, [strategy: number (since v3.0.2)])</code></h4>
<p>Starts a timer inside the server which triggers the event <code>event_name</code> every <code>interval_ms</code> milliseconds.</p>
<p>Event timers can be cancelled with <code>MP.CancelEventTimer</code>.</p>
<p>Intervals &lt;25 ms are not encouraged, as multiple such intervals will likely not be served in time reliably. While multiple timers can be started on the same event, it's encouraged to create as few event timers as possible. For example, if you need one event that runs every half second, and one which runs every second, consider just making the half-second one and running the every-second-functiosecond trigger.</p>
<p>You may also use <code>MP.CreateTimer</code> to make a timer and measure time passed since the last event call, in order to minimize event timers, though this is not necessarily recommended as it increases the code complexity significantly.</p>
<p><strong>Since 3.0.2:</strong></p>
<p>An optional <code>CallStrategy</code> may be supplied as the third argument. This can be either:</p>
<ul>
<li><code>MP.CallStrategy.BestEffort</code> (default): Will try to get your event to trigger at the specified interval, but will refuse to queue handlers if a handler takes too long.</li>
<li><code>MP.CallStrategy.Precise</code>: Will enqueue event handlers at the exact interval specified. Can lead to the queue filling up if the handler takes longer than the interval. Only use if you NEED the exact interval.</li>
</ul>
<h4 id="mpcanceleventtimerevent_name-string"><code>MP.CancelEventTimer(event_name: string)</code></h4>
<p>Cancels all timers on the event with the name <code>event_name</code> On some occasions, the timer might go off one more time before being cancelled, due to the nature of asynchronous programming.</p>
<h4 id="mptriggerlocaleventevent_name-string-table"><code>MP.TriggerLocalEvent(event_name: string, ...) -&gt; table</code></h4>
<p>Plugin-local synchronous event trigger.</p>
<p>Triggers an event locally, which causes all handlers to that event <em>in the current lua state</em> (usually the current plugin, unless state was shared via PluginConfig.toml) to be called.</p>
<p>You can pass arguments to this function (<code>...</code>) which are copied and sent to all handlers as function arguments.</p>
<p>This call is synchronous and will return once all event handlers finished.</p>
<p>The returned value is a table of all results. If a handler returned a value, it will be in this table, unannotated and unnamed. This can be used to "collect" things, or register sub-handlers for events that can be cancelled. This is practically an array.</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">Results</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerLocalEvent</span><span class="p">(</span><span class="s2">&quot;MyEvent&quot;</span><span class="p">)</span>
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Results</span><span class="p">)</span>
</span></code></pre></div>
<h4 id="mptriggerglobaleventevent_name-string-table"><code>MP.TriggerGlobalEvent(event_name: string, ...) -&gt; table</code></h4>
<p>Global asynchronous event trigger.</p>
<p>Triggers an event globally, which causes all handlers to that event <em>in all plugins</em> (including <em>this</em> plugin) to be called.</p>
<p>You can pass arguments to this function (<code>...</code>) which are copied and sent to all handlers as function arguments.</p>
<p>This call is asynchronous and returns a future-like object. Local handlers (handlers in the same plugin as the caller) run synchronously and immediately. </p>
<p>The table returned has two functions:</p>
<ul>
<li><code>IsDone() -&gt; boolean</code> tells you whether all handlers have finished. You can wait until this is true by checking it and <code>MP.Sleep</code>-ing for a little bit in a loop.</li>
<li><code>GetResults() -&gt; table</code> returns an unannotated unnamed table with all return values of all handlers. This is practically an array.</li>
</ul>
<p>Make sure to call these with <code>Obj:Function()</code> syntax (<code>:</code>, NOT <code>.</code>).</p>
<p>Example:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">Future</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerGlobalEvent</span><span class="p">(</span><span class="s2">&quot;MyEvent&quot;</span><span class="p">)</span>
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a><span class="c1">-- wait until handlers finished</span>
</span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a><span class="kr">while</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="nv">Future</span><span class="p">:</span><span class="nf">IsDone</span><span class="p">()</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span><span class="w"> </span><span class="c1">-- sleep 100 ms</span>
</span><span id="__span-17-5"><a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a><span class="kr">end</span>
</span><span id="__span-17-6"><a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a><span class="kd">local</span><span class="w"> </span><span class="nv">Results</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Future</span><span class="p">:</span><span class="nf">GetResults</span><span class="p">()</span>
</span><span id="__span-17-7"><a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Results</span><span class="p">)</span>
</span></code></pre></div>
<p>Be aware that a handler registering to "MyEvent" here and never returning could lock up your plugin. You likely want to keep track of how long you have waited and stop waiting after a few seconds.</p>
<h4 id="mpsleeptime_ms-number"><code>MP.Sleep(time_ms: number)</code></h4>
<p>Waits for an amount of time, specified in milliseconds.</p>
<p>This does not yield the execution of the lua state and nothing will execute in the state while asleep. </p>
<p>WARNING: Do NOT sleep for &gt;500 ms if you have event handlers registered, unless you know <em>exactly</em> what you are doing. This is intended to be used to sleep for 1-100 ms, in order to wait for results or similar. A locked up (sleeping) lua state can slow the entire server down drastically if not careful.</p>
<h4 id="mpsendchatmessageplayer_id-number-message-string"><code>MP.SendChatMessage(player_id: number, message: string)</code></h4>
<p>Sends a chat message that only the specified player can see (or everyone if the ID is <code>-1</code>).
In the game, this will not appear as a directed message.</p>
<p>You can use this, for example, to tell a player <em>why</em> you cancelled their vehicle spawn, chat message, or similar, or to display some information about your server.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">msg</span><span class="p">)</span>
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nb">string.match</span><span class="p">(</span><span class="nv">msg</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;darn&quot;</span><span class="p">)</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">SendChatMessage</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;Please do not use profanity.&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1">-- If the player sends a message containing &quot;darn&quot;, notify the player and cancel the message</span>
</span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-18-8"><a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a><span class="kr">end</span>
</span><span id="__span-18-9"><a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a>
</span><span id="__span-18-10"><a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;ChatHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
Example 2:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">msg</span><span class="p">)</span>
</span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">msg</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;hello&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-19-3"><a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">SendChatMessage</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;Hello World!&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1">-- If the player sends the exact message &quot;hello&quot;, announce to the entire server &quot;Hello World!&quot;</span>
</span><span id="__span-19-4"><a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-19-5"><a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-19-6"><a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a><span class="kr">end</span>
</span></code></pre></div></p>
<h4 id="mptriggerclienteventplayer_id-number-event_name-string-data-string-boolean"><code>MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean</code></h4>
<p><em>until v3.1.0</em></p>
<h4 id="mptriggerclienteventplayer_id-number-event_name-string-data-string-booleanstring"><code>MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean,string</code></h4>
<p><em>since v3.1.0</em></p>
<h4 id="mptriggerclienteventjsonplayer_id-number-event_name-string-data-table-booleanstring"><code>MP.TriggerClientEventJson(player_id: number, event_name: string, data: table) -&gt; boolean,string</code></h4>
<p><em>since v3.1.0</em></p>
<p>Will call the given event with the given data on the specified client (-1 for broadcast). This event can then be handled in a clientside lua mod, see the "Client Scripting" documentation for this.</p>
<p>Will return <code>true</code> if it was able to send the message (for <code>id = -1</code>, so broadcasts, its always <code>true</code>), and <code>false</code> if the player with that ID doesn't exist or is disconnected but still has an ID (this is a known issue).</p>
<p>If <code>false</code> is returned, it makes no sense to retry this event, and a response (if any was expected) shouldn't be expected.</p>
<p>Since v3.1.0, the second return value contains an error message if the function failed. Also since this version, the <code>*Json</code> version of the function takes a table as the data argument, and converts it to json. This is simply a shorthand for <code>MP.TriggerClientEvent(..., Util.JsonEncode(mytable))</code>.</p>
<h4 id="mpgetplayercount-number"><code>MP.GetPlayerCount() -&gt; number</code></h4>
<p>Returns the amount of players currently in the server.</p>
<h4 id="mpgetpositionrawpid-number-vid-number-tablestring"><code>MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string</code></h4>
<p>Returns the current position of the vehicle <code>vid</code> (vehicle id) of player <code>pid</code> (player id), and an error string if an error occurred.</p>
<p>The table is decoded from a position packet, so it has a variety of data including position and rotation (that's why this function is postfixed "Raw").</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a>
</span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a><span class="kd">local</span><span class="w"> </span><span class="nv">raw_pos</span><span class="p">,</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPositionRaw</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">)</span>
</span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a>
</span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a><span class="kr">if</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-20-7"><a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">raw_pos</span><span class="p">)</span>
</span><span id="__span-20-8"><a id="__codelineno-20-8" name="__codelineno-20-8" href="#__codelineno-20-8"></a><span class="kr">else</span>
</span><span id="__span-20-9"><a id="__codelineno-20-9" name="__codelineno-20-9" href="#__codelineno-20-9"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nb">error</span><span class="p">)</span>
</span><span id="__span-20-10"><a id="__codelineno-20-10" name="__codelineno-20-10" href="#__codelineno-20-10"></a><span class="kr">end</span>
</span></code></pre></div>
Output:
<div class="language-json highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="w"> </span><span class="p">{</span>
</span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a><span class="w"> </span><span class="kc">t</span><span class="err">im</span><span class="p">:</span><span class="w"> </span><span class="mf">49.824</span><span class="p">,</span><span class="w"> </span><span class="c1">// Time since spawn</span>
</span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="w"> </span><span class="err">rvel</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Rotational velocity</span>
</span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">-1.33564e-05</span><span class="p">,</span>
</span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-9.16553e-06</span><span class="p">,</span>
</span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">8.33364e-07</span><span class="p">,</span>
</span><span id="__span-21-7"><a id="__codelineno-21-7" name="__codelineno-21-7" href="#__codelineno-21-7"></a><span class="w"> </span><span class="p">},</span><span class="w"> </span>
</span><span id="__span-21-8"><a id="__codelineno-21-8" name="__codelineno-21-8" href="#__codelineno-21-8"></a><span class="w"> </span><span class="err">vel</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Velocity</span>
</span><span id="__span-21-9"><a id="__codelineno-21-9" name="__codelineno-21-9" href="#__codelineno-21-9"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">-4.29755e-06</span><span class="p">,</span>
</span><span id="__span-21-10"><a id="__codelineno-21-10" name="__codelineno-21-10" href="#__codelineno-21-10"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-5.79335e-06</span><span class="p">,</span>
</span><span id="__span-21-11"><a id="__codelineno-21-11" name="__codelineno-21-11" href="#__codelineno-21-11"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">4.95236e-06</span><span class="p">,</span>
</span><span id="__span-21-12"><a id="__codelineno-21-12" name="__codelineno-21-12" href="#__codelineno-21-12"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-21-13"><a id="__codelineno-21-13" name="__codelineno-21-13" href="#__codelineno-21-13"></a><span class="w"> </span><span class="err">pos</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Position</span>
</span><span id="__span-21-14"><a id="__codelineno-21-14" name="__codelineno-21-14" href="#__codelineno-21-14"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">269.979</span><span class="p">,</span>
</span><span id="__span-21-15"><a id="__codelineno-21-15" name="__codelineno-21-15" href="#__codelineno-21-15"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-759.068</span><span class="p">,</span>
</span><span id="__span-21-16"><a id="__codelineno-21-16" name="__codelineno-21-16" href="#__codelineno-21-16"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">46.554</span><span class="p">,</span>
</span><span id="__span-21-17"><a id="__codelineno-21-17" name="__codelineno-21-17" href="#__codelineno-21-17"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-21-18"><a id="__codelineno-21-18" name="__codelineno-21-18" href="#__codelineno-21-18"></a><span class="w"> </span><span class="err">pi</span><span class="kc">n</span><span class="err">g</span><span class="p">:</span><span class="w"> </span><span class="mf">0.0125</span><span class="p">,</span><span class="w"> </span><span class="c1">// Vehicle latency</span>
</span><span id="__span-21-19"><a id="__codelineno-21-19" name="__codelineno-21-19" href="#__codelineno-21-19"></a><span class="w"> </span><span class="err">ro</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Rotation</span>
</span><span id="__span-21-20"><a id="__codelineno-21-20" name="__codelineno-21-20" href="#__codelineno-21-20"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">-0.00559953</span><span class="p">,</span>
</span><span id="__span-21-21"><a id="__codelineno-21-21" name="__codelineno-21-21" href="#__codelineno-21-21"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">0.00894832</span><span class="p">,</span>
</span><span id="__span-21-22"><a id="__codelineno-21-22" name="__codelineno-21-22" href="#__codelineno-21-22"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">0.772266</span><span class="p">,</span>
</span><span id="__span-21-23"><a id="__codelineno-21-23" name="__codelineno-21-23" href="#__codelineno-21-23"></a><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w"> </span><span class="mf">0.635212</span><span class="p">,</span>
</span><span id="__span-21-24"><a id="__codelineno-21-24" name="__codelineno-21-24" href="#__codelineno-21-24"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-21-25"><a id="__codelineno-21-25" name="__codelineno-21-25" href="#__codelineno-21-25"></a><span class="p">}</span>
</span></code></pre></div>
Example 2:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a>
</span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a><span class="kd">local</span><span class="w"> </span><span class="nv">raw_pos</span><span class="p">,</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPositionRaw</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">)</span>
</span><span id="__span-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a><span class="kr">if</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">x</span><span class="p">,</span><span class="w"> </span><span class="nv">y</span><span class="p">,</span><span class="w"> </span><span class="nv">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">table.unpack</span><span class="p">(</span><span class="nv">raw_pos</span><span class="p">[</span><span class="s2">&quot;pos&quot;</span><span class="p">])</span>
</span><span id="__span-22-7"><a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a>
</span><span id="__span-22-8"><a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;X:&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">x</span><span class="p">)</span>
</span><span id="__span-22-9"><a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Y:&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">y</span><span class="p">)</span>
</span><span id="__span-22-10"><a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Z:&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">z</span><span class="p">)</span>
</span><span id="__span-22-11"><a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a><span class="kr">else</span>
</span><span id="__span-22-12"><a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nb">error</span><span class="p">)</span>
</span><span id="__span-22-13"><a id="__codelineno-22-13" name="__codelineno-22-13" href="#__codelineno-22-13"></a><span class="kr">end</span>
</span></code></pre></div>
Output:
<div class="language-text highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a>X: -603.459
</span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a>Y: -175.078
</span><span id="__span-23-3"><a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a>Z: 26.9505
</span></code></pre></div></p>
<h4 id="mpisplayerconnectedplayer_id-number-boolean"><code>MP.IsPlayerConnected(player_id: number) -&gt; boolean</code></h4>
<p>Whether the player is connected and if the server has received a UDP packet from them.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">8</span>
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="nf">IsPlayerConnected</span><span class="p">(</span><span class="nv">player_id</span><span class="p">))</span><span class="w"> </span><span class="c1">-- Check if player with ID 8 is properly connected.</span>
</span></code></pre></div>
Output:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="kc">true</span>
</span></code></pre></div></p>
<h4 id="mpgetplayernameplayer_id-number-string"><code>MP.GetPlayerName(player_id: number) -&gt; string</code></h4>
<p>Gets the display-name of the player.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-26-2"><a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerName</span><span class="p">(</span><span class="nv">player_id</span><span class="p">))</span><span class="w"> </span><span class="c1">-- Get the name of the player with ID 4</span>
</span></code></pre></div>
Output:
<div class="language-text highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a>ilovebeammp2004
</span></code></pre></div></p>
<h4 id="mpremovevehicleplayer_id-number-vehicle_id-number"><code>MP.RemoveVehicle(player_id: number, vehicle_id: number)</code></h4>
<p>Removes the specified vehicle for the specified player.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span>
</span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_vehicles</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerVehicles</span><span class="p">(</span><span class="nv">player_id</span><span class="p">)</span>
</span><span id="__span-28-3"><a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a>
</span><span id="__span-28-4"><a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a><span class="c1">-- Loop over all of player 3&#39;s vehicles and delete them</span>
</span><span id="__span-28-5"><a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a><span class="kr">for</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_data</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">player_vehicles</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-28-6"><a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">RemoveVehicle</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">)</span>
</span><span id="__span-28-7"><a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-7"></a><span class="kr">end</span>
</span></code></pre></div></p>
<h4 id="mpgetplayervehiclesplayer_id-number-table"><code>MP.GetPlayerVehicles(player_id: number) -&gt; table</code></h4>
<p>Returns a table of all vehicles the player currently has. Each entry in the table is a mapping from vehicle ID to vehicle data (which is currently a raw json string).</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-29-1"><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span>
</span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_vehicles</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerVehicles</span><span class="p">(</span><span class="nv">player_id</span><span class="p">)</span>
</span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a>
</span><span id="__span-29-4"><a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a><span class="kr">for</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_data</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">player_vehicles</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string.find</span><span class="p">(</span><span class="nv">vehicle_data</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;{&quot;</span><span class="p">)</span>
</span><span id="__span-29-6"><a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">formattedVehicleData</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string.sub</span><span class="p">(</span><span class="nv">vehicle_data</span><span class="p">,</span><span class="w"> </span><span class="nv">start</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span id="__span-29-7"><a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonDecode</span><span class="p">(</span><span class="nv">formattedVehicleData</span><span class="p">))</span>
</span><span id="__span-29-8"><a id="__codelineno-29-8" name="__codelineno-29-8" href="#__codelineno-29-8"></a><span class="kr">end</span>
</span></code></pre></div>
Output:
<div class="language-json highlight"><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="p">{</span>
</span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="w"> </span><span class="err">pid</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a><span class="w"> </span><span class="err">pro</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;0&quot;</span><span class="p">,</span>
</span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a><span class="w"> </span><span class="err">ro</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-30-6"><a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-30-7"><a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">0.776866</span><span class="p">,</span>
</span><span id="__span-30-8"><a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w"> </span><span class="mf">0.629665</span><span class="p">,</span>
</span><span id="__span-30-9"><a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-30-10"><a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a><span class="w"> </span><span class="err">jbm</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar&quot;</span><span class="p">,</span>
</span><span id="__span-30-11"><a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a><span class="w"> </span><span class="err">vc</span><span class="kc">f</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-12"><a id="__codelineno-30-12" name="__codelineno-30-12" href="#__codelineno-30-12"></a><span class="w"> </span><span class="err">par</span><span class="kc">ts</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-13"><a id="__codelineno-30-13" name="__codelineno-30-13" href="#__codelineno-30-13"></a><span class="w"> </span><span class="err">miramar_exhaus</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_exhaust&quot;</span><span class="p">,</span>
</span><span id="__span-30-14"><a id="__codelineno-30-14" name="__codelineno-30-14" href="#__codelineno-30-14"></a><span class="w"> </span><span class="err">miramar_shock_R</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_shock_R&quot;</span><span class="p">,</span>
</span><span id="__span-30-15"><a id="__codelineno-30-15" name="__codelineno-30-15" href="#__codelineno-30-15"></a><span class="w"> </span><span class="err">miramar_</span><span class="kc">ta</span><span class="err">illigh</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_taillight&quot;</span><span class="p">,</span>
</span><span id="__span-30-16"><a id="__codelineno-30-16" name="__codelineno-30-16" href="#__codelineno-30-16"></a><span class="w"> </span><span class="err">miramar_door_RL</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_door_RL&quot;</span>
</span><span id="__span-30-17"><a id="__codelineno-30-17" name="__codelineno-30-17" href="#__codelineno-30-17"></a><span class="w"> </span><span class="c1">// ... continue</span>
</span><span id="__span-30-18"><a id="__codelineno-30-18" name="__codelineno-30-18" href="#__codelineno-30-18"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-30-19"><a id="__codelineno-30-19" name="__codelineno-30-19" href="#__codelineno-30-19"></a><span class="w"> </span><span class="err">pai</span><span class="kc">nts</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-20"><a id="__codelineno-30-20" name="__codelineno-30-20" href="#__codelineno-30-20"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-21"><a id="__codelineno-30-21" name="__codelineno-30-21" href="#__codelineno-30-21"></a><span class="w"> </span><span class="err">rough</span><span class="kc">ness</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-30-22"><a id="__codelineno-30-22" name="__codelineno-30-22" href="#__codelineno-30-22"></a><span class="w"> </span><span class="err">me</span><span class="kc">tall</span><span class="err">ic</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-30-23"><a id="__codelineno-30-23" name="__codelineno-30-23" href="#__codelineno-30-23"></a><span class="w"> </span><span class="err">clearcoa</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-30-24"><a id="__codelineno-30-24" name="__codelineno-30-24" href="#__codelineno-30-24"></a><span class="w"> </span><span class="err">baseColor</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-25"><a id="__codelineno-30-25" name="__codelineno-30-25" href="#__codelineno-30-25"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">0.85</span><span class="p">,</span>
</span><span id="__span-30-26"><a id="__codelineno-30-26" name="__codelineno-30-26" href="#__codelineno-30-26"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">0.84</span><span class="p">,</span>
</span><span id="__span-30-27"><a id="__codelineno-30-27" name="__codelineno-30-27" href="#__codelineno-30-27"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">0.8</span><span class="p">,</span>
</span><span id="__span-30-28"><a id="__codelineno-30-28" name="__codelineno-30-28" href="#__codelineno-30-28"></a><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w"> </span><span class="mf">1.2</span><span class="p">,</span>
</span><span id="__span-30-29"><a id="__codelineno-30-29" name="__codelineno-30-29" href="#__codelineno-30-29"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-30-30"><a id="__codelineno-30-30" name="__codelineno-30-30" href="#__codelineno-30-30"></a><span class="w"> </span><span class="err">clearcoa</span><span class="kc">t</span><span class="err">Rough</span><span class="kc">ness</span><span class="p">:</span><span class="w"> </span><span class="mf">0.09</span><span class="p">,</span>
</span><span id="__span-30-31"><a id="__codelineno-30-31" name="__codelineno-30-31" href="#__codelineno-30-31"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// ... continue</span>
</span><span id="__span-30-32"><a id="__codelineno-30-32" name="__codelineno-30-32" href="#__codelineno-30-32"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-30-33"><a id="__codelineno-30-33" name="__codelineno-30-33" href="#__codelineno-30-33"></a><span class="w"> </span><span class="err">par</span><span class="kc">t</span><span class="err">Co</span><span class="kc">nf</span><span class="err">igFile</span><span class="kc">na</span><span class="err">me</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;vehicles/miramar/base_M.pc&quot;</span><span class="p">,</span>
</span><span id="__span-30-34"><a id="__codelineno-30-34" name="__codelineno-30-34" href="#__codelineno-30-34"></a><span class="w"> </span><span class="err">vars</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
</span><span id="__span-30-35"><a id="__codelineno-30-35" name="__codelineno-30-35" href="#__codelineno-30-35"></a><span class="w"> </span><span class="err">mai</span><span class="kc">n</span><span class="err">Par</span><span class="kc">t</span><span class="err">Name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar&quot;</span><span class="p">,</span>
</span><span id="__span-30-36"><a id="__codelineno-30-36" name="__codelineno-30-36" href="#__codelineno-30-36"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-30-37"><a id="__codelineno-30-37" name="__codelineno-30-37" href="#__codelineno-30-37"></a><span class="w"> </span><span class="err">pos</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-38"><a id="__codelineno-30-38" name="__codelineno-30-38" href="#__codelineno-30-38"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">283.669</span><span class="p">,</span>
</span><span id="__span-30-39"><a id="__codelineno-30-39" name="__codelineno-30-39" href="#__codelineno-30-39"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-754.332</span><span class="p">,</span>
</span><span id="__span-30-40"><a id="__codelineno-30-40" name="__codelineno-30-40" href="#__codelineno-30-40"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">48.2151</span><span class="p">,</span>
</span><span id="__span-30-41"><a id="__codelineno-30-41" name="__codelineno-30-41" href="#__codelineno-30-41"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-30-42"><a id="__codelineno-30-42" name="__codelineno-30-42" href="#__codelineno-30-42"></a><span class="w"> </span><span class="err">vid</span><span class="p">:</span><span class="w"> </span><span class="mi">64822</span><span class="p">,</span>
</span><span id="__span-30-43"><a id="__codelineno-30-43" name="__codelineno-30-43" href="#__codelineno-30-43"></a><span class="w"> </span><span class="err">ig</span><span class="kc">n</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-30-44"><a id="__codelineno-30-44" name="__codelineno-30-44" href="#__codelineno-30-44"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="mpgetplayers-table"><code>MP.GetPlayers() -&gt; table</code></h4>
<p>Returns a table of all connected players. This table maps IDs to Names, like so:<br />
<div class="language-json highlight"><pre><span></span><code><span id="__span-31-1"><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a><span class="p">{</span>
</span><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a><span class="w"> </span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;LionKor&quot;</span><span class="p">,</span>
</span><span id="__span-31-3"><a id="__codelineno-31-3" name="__codelineno-31-3" href="#__codelineno-31-3"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;JohnDoe&quot;</span>
</span><span id="__span-31-4"><a id="__codelineno-31-4" name="__codelineno-31-4" href="#__codelineno-31-4"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="mpisplayerguestplayer_id-number-boolean"><code>MP.IsPlayerGuest(player_id: number) -&gt; boolean</code></h4>
<p>Whether the player is a guest. A guest is someone who didn't log in, and instead chose to play as a guest. Their name is usually <code>guest</code> followed by a long number.</p>
<p>Because guests are anonymous, you may want to disallow them to join, if so it is recommended to use the <a href="#onplayerauth"><code>onPlayerAuth</code></a> <code>is_guest</code> argument instead.</p>
<h4 id="mpdropplayerplayer_id-number-reason-string"><code>MP.DropPlayer(player_id: number, [reason: string])</code></h4>
<p>Kicks the player with the specified ID. The reason parameter is optional.</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">message</span><span class="p">)</span>
</span><span id="__span-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nb">string.match</span><span class="p">(</span><span class="nv">message</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;darn&quot;</span><span class="p">)</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">DropPlayer</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;Profanity is not allowed&quot;</span><span class="p">)</span>
</span><span id="__span-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-32-5"><a id="__codelineno-32-5" name="__codelineno-32-5" href="#__codelineno-32-5"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-32-6"><a id="__codelineno-32-6" name="__codelineno-32-6" href="#__codelineno-32-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-32-7"><a id="__codelineno-32-7" name="__codelineno-32-7" href="#__codelineno-32-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-32-8"><a id="__codelineno-32-8" name="__codelineno-32-8" href="#__codelineno-32-8"></a><span class="kr">end</span><span class="w"> </span>
</span></code></pre></div>
<h4 id="mpgetstatememoryusage-number"><code>MP.GetStateMemoryUsage() -&gt; number</code></h4>
<p>Returns the memory usage of the current Lua state in bytes.</p>
<h4 id="mpgetluamemoryusage-number"><code>MP.GetLuaMemoryUsage() -&gt; number</code></h4>
<p>Returns the memory usage of all lua states combined, in bytes.</p>
<h4 id="mpgetplayeridentifiersplayer_id-number-table"><code>MP.GetPlayerIdentifiers(player_id: number) -&gt; table</code></h4>
<p>Returns a table with information about the player, such as BeamMP forum ID, IP address and Discord account ID. Discord ID will only be returned if the user has it linked to their forum account.</p>
<p>You can find a users forum ID by navigating to <code>https://forum.beammp.com/u/USERNAME.json</code> and looking for <code>"user": {"id": 123456}</code>. A BeamMP ID is unique to the player and cannot be changed unlike the username.</p>
<p>Example:</p>
<p><div class="language-lua highlight"><pre><span></span><code><span id="__span-33-1"><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span>
</span><span id="__span-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerIdentifiers</span><span class="p">(</span><span class="nv">player_id</span><span class="p">))</span>
</span></code></pre></div>
Output:
<div class="language-json highlight"><pre><span></span><code><span id="__span-34-1"><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a><span class="p">{</span>
</span><span id="__span-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></a><span class="w"> </span><span class="err">ip</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;127.0.0.1&quot;</span><span class="p">,</span>
</span><span id="__span-34-3"><a id="__codelineno-34-3" name="__codelineno-34-3" href="#__codelineno-34-3"></a><span class="w"> </span><span class="err">discord</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;12345678987654321&quot;</span><span class="p">,</span>
</span><span id="__span-34-4"><a id="__codelineno-34-4" name="__codelineno-34-4" href="#__codelineno-34-4"></a><span class="w"> </span><span class="err">beammp</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;1234567&quot;</span><span class="p">,</span>
</span><span id="__span-34-5"><a id="__codelineno-34-5" name="__codelineno-34-5" href="#__codelineno-34-5"></a><span class="p">}</span>
</span></code></pre></div></p>
<p><em>Until v3.1.0 the <code>ip</code> field is incorrect and will not work as intended. Fixed in v3.1.0.</em></p>
<h4 id="mpsetsetting-number"><code>MP.Set(setting: number, ...)</code></h4>
<p>Sets a ServerConfig setting temporarily. For this, the <code>MP.Settings</code> table is useful.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-35-1"><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">Set</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Debug</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">)</span><span class="w"> </span><span class="c1">-- Turns on debug mode</span>
</span></code></pre></div></p>
<h4 id="mpsettings-table"><code>MP.Settings -&gt; table</code></h4>
<p>Table map of setting ID's to name. Used with <code>MP.Set</code> to change ServerConfig settings. </p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-36-1"><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">)</span>
</span></code></pre></div>
Output:
<div class="language-json highlight"><pre><span></span><code><span id="__span-37-1"><a id="__codelineno-37-1" name="__codelineno-37-1" href="#__codelineno-37-1"></a><span class="p">{</span>
</span><span id="__span-37-2"><a id="__codelineno-37-2" name="__codelineno-37-2" href="#__codelineno-37-2"></a><span class="w"> </span><span class="err">MaxPlayers</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
</span><span id="__span-37-3"><a id="__codelineno-37-3" name="__codelineno-37-3" href="#__codelineno-37-3"></a><span class="w"> </span><span class="err">Debug</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-37-4"><a id="__codelineno-37-4" name="__codelineno-37-4" href="#__codelineno-37-4"></a><span class="w"> </span><span class="err">Name</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span>
</span><span id="__span-37-5"><a id="__codelineno-37-5" name="__codelineno-37-5" href="#__codelineno-37-5"></a><span class="w"> </span><span class="err">Descrip</span><span class="kc">t</span><span class="err">io</span><span class="kc">n</span><span class="p">:</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span>
</span><span id="__span-37-6"><a id="__codelineno-37-6" name="__codelineno-37-6" href="#__codelineno-37-6"></a><span class="w"> </span><span class="err">MaxCars</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
</span><span id="__span-37-7"><a id="__codelineno-37-7" name="__codelineno-37-7" href="#__codelineno-37-7"></a><span class="w"> </span><span class="err">Priva</span><span class="kc">te</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-37-8"><a id="__codelineno-37-8" name="__codelineno-37-8" href="#__codelineno-37-8"></a><span class="w"> </span><span class="err">Map</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
</span><span id="__span-37-9"><a id="__codelineno-37-9" name="__codelineno-37-9" href="#__codelineno-37-9"></a><span class="p">}</span>
</span></code></pre></div></p>
<h3 id="util-functions">Util Functions</h3>
<h4 id="utiljson"><code>Util.Json*</code></h4>
<p>Since BeamMP-Server <code>v3.1.0</code>.</p>
<p>This is a builtin JSON library, which is usually much faster than any Lua JSON library. Behind the scenes, C++'s <code>nlohmann::json</code> library is used, which is JSON compliant, full-coverage unit tested and continuously being fuzzed.</p>
<h4 id="utiljsonencodetable-table-string"><code>Util.JsonEncode(table: table) -&gt; string</code></h4>
<p>Encodes a Lua table into a JSON string, recursively (tables inside tables inside tables ... work as expected). All primitive types are respected, functions, userdata and similar are ignored.</p>
<p>The resulting JSON is minified and can be pretty-printed by using <code>Util.JsonPrettify</code> to prettify it.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-38-1"><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-38-2"><a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-2"></a><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span>
</span><span id="__span-38-3"><a id="__codelineno-38-3" name="__codelineno-38-3" href="#__codelineno-38-3"></a><span class="w"> </span><span class="nv">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span>
</span><span id="__span-38-4"><a id="__codelineno-38-4" name="__codelineno-38-4" href="#__codelineno-38-4"></a><span class="w"> </span><span class="nv">skills</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span><span class="w"> </span><span class="p">}</span>
</span><span id="__span-38-5"><a id="__codelineno-38-5" name="__codelineno-38-5" href="#__codelineno-38-5"></a><span class="p">}</span>
</span><span id="__span-38-6"><a id="__codelineno-38-6" name="__codelineno-38-6" href="#__codelineno-38-6"></a><span class="kd">local</span><span class="w"> </span><span class="nv">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonEncode</span><span class="p">(</span><span class="nv">player</span><span class="p">)</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-json highlight"><pre><span></span><code><span id="__span-39-1"><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="mi">69</span><span class="p">,</span><span class="nt">&quot;skills&quot;</span><span class="p">:[</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="s2">&quot;skill B&quot;</span><span class="p">]}</span>
</span></code></pre></div></p>
<h4 id="utiljsondecodejson-string-table"><code>Util.JsonDecode(json: string) -&gt; table</code></h4>
<p>Decodes JSON into a Lua table. Will return <code>nil</code> if this failed, and print an error.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-40-1"><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;{</span><span class="se">\&quot;</span><span class="s2">message</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">OK</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">code</span><span class="se">\&quot;</span><span class="s2">:200}&quot;</span>
</span><span id="__span-40-2"><a id="__codelineno-40-2" name="__codelineno-40-2" href="#__codelineno-40-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">tbl</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonDecode</span><span class="p">(</span><span class="nv">json</span><span class="p">)</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-41-1"><a id="__codelineno-41-1" name="__codelineno-41-1" href="#__codelineno-41-1"></a><span class="p">{</span>
</span><span id="__span-41-2"><a id="__codelineno-41-2" name="__codelineno-41-2" href="#__codelineno-41-2"></a><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;OK&quot;</span><span class="p">,</span>
</span><span id="__span-41-3"><a id="__codelineno-41-3" name="__codelineno-41-3" href="#__codelineno-41-3"></a><span class="w"> </span><span class="nv">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span>
</span><span id="__span-41-4"><a id="__codelineno-41-4" name="__codelineno-41-4" href="#__codelineno-41-4"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="utiljsonprettifyjson-string-string"><code>Util.JsonPrettify(json: string) -&gt; string</code></h4>
<p>Add indentation and newlines to the json to make it more readable for humans.</p>
<p>Example:
<div class="language-text highlight"><pre><span></span><code><span id="__span-42-1"><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a>local myjson = Util.JsonEncode({ name=&quot;Lion&quot;, age = 69, skills = { &quot;skill A&quot;, &quot;skill B&quot; } })
</span><span id="__span-42-2"><a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-2"></a>
</span><span id="__span-42-3"><a id="__codelineno-42-3" name="__codelineno-42-3" href="#__codelineno-42-3"></a>print(Util.JsonPrettify(myjson))
</span></code></pre></div></p>
<p>Results in:
<div class="language-json highlight"><pre><span></span><code><span id="__span-43-1"><a id="__codelineno-43-1" name="__codelineno-43-1" href="#__codelineno-43-1"></a><span class="p">{</span>
</span><span id="__span-43-2"><a id="__codelineno-43-2" name="__codelineno-43-2" href="#__codelineno-43-2"></a><span class="w"> </span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">69.0</span><span class="p">,</span>
</span><span id="__span-43-3"><a id="__codelineno-43-3" name="__codelineno-43-3" href="#__codelineno-43-3"></a><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span>
</span><span id="__span-43-4"><a id="__codelineno-43-4" name="__codelineno-43-4" href="#__codelineno-43-4"></a><span class="w"> </span><span class="nt">&quot;skills&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
</span><span id="__span-43-5"><a id="__codelineno-43-5" name="__codelineno-43-5" href="#__codelineno-43-5"></a><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span>
</span><span id="__span-43-6"><a id="__codelineno-43-6" name="__codelineno-43-6" href="#__codelineno-43-6"></a><span class="w"> </span><span class="s2">&quot;skill B&quot;</span>
</span><span id="__span-43-7"><a id="__codelineno-43-7" name="__codelineno-43-7" href="#__codelineno-43-7"></a><span class="w"> </span><span class="p">]</span>
</span><span id="__span-43-8"><a id="__codelineno-43-8" name="__codelineno-43-8" href="#__codelineno-43-8"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="utiljsonminifyjson-string-string"><code>Util.JsonMinify(json: string) -&gt; string</code></h4>
<p>Removes indentation, newlines and any other whitespace. Not necessary unless you called <code>Util.JsonPrettify</code>, as all output from <code>Util.Json*</code> is already minified.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-44-1"><a id="__codelineno-44-1" name="__codelineno-44-1" href="#__codelineno-44-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonPrettify</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonEncode</span><span class="p">({</span><span class="w"> </span><span class="nv">name</span><span class="o">=</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span><span class="w"> </span><span class="nv">skills</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}))</span>
</span><span id="__span-44-2"><a id="__codelineno-44-2" name="__codelineno-44-2" href="#__codelineno-44-2"></a>
</span><span id="__span-44-3"><a id="__codelineno-44-3" name="__codelineno-44-3" href="#__codelineno-44-3"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonMinify</span><span class="p">(</span><span class="nv">pretty</span><span class="p">))</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-json highlight"><pre><span></span><code><span id="__span-45-1"><a id="__codelineno-45-1" name="__codelineno-45-1" href="#__codelineno-45-1"></a><span class="p">{</span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="mf">69.0</span><span class="p">,</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;skills&quot;</span><span class="p">:[</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="s2">&quot;skill B&quot;</span><span class="p">]}</span>
</span></code></pre></div></p>
<h4 id="utiljsonflattenjson-string-string"><code>Util.JsonFlatten(json: string) -&gt; string</code></h4>
<p>Creates a JSON object whose key are flattened to JSON pointers, according to RFC 6901. You can restore the original with <code>Util.JsonUnflatten()</code>. For this to work, all values need to be primitives.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-46-1"><a id="__codelineno-46-1" name="__codelineno-46-1" href="#__codelineno-46-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonEncode</span><span class="p">({</span><span class="w"> </span><span class="nv">name</span><span class="o">=</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span><span class="w"> </span><span class="nv">skills</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">})</span>
</span><span id="__span-46-2"><a id="__codelineno-46-2" name="__codelineno-46-2" href="#__codelineno-46-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;normal: &quot;</span><span class="w"> </span><span class="o">..</span><span class="nv">json</span><span class="p">)</span>
</span><span id="__span-46-3"><a id="__codelineno-46-3" name="__codelineno-46-3" href="#__codelineno-46-3"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;flattened: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonFlatten</span><span class="p">(</span><span class="nv">json</span><span class="p">))</span>
</span><span id="__span-46-4"><a id="__codelineno-46-4" name="__codelineno-46-4" href="#__codelineno-46-4"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;flattened pretty: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonPrettify</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonFlatten</span><span class="p">(</span><span class="nv">json</span><span class="p">)))</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-json highlight"><pre><span></span><code><span id="__span-47-1"><a id="__codelineno-47-1" name="__codelineno-47-1" href="#__codelineno-47-1"></a><span class="kc">n</span><span class="err">ormal</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="mf">69.0</span><span class="p">,</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;skills&quot;</span><span class="p">:[</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="s2">&quot;skill B&quot;</span><span class="p">]}</span>
</span><span id="__span-47-2"><a id="__codelineno-47-2" name="__codelineno-47-2" href="#__codelineno-47-2"></a><span class="kc">flattene</span><span class="err">d</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;/age&quot;</span><span class="p">:</span><span class="mf">69.0</span><span class="p">,</span><span class="nt">&quot;/name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;/skills/0&quot;</span><span class="p">:</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="nt">&quot;/skills/1&quot;</span><span class="p">:</span><span class="s2">&quot;skill B&quot;</span><span class="p">}</span>
</span><span id="__span-47-3"><a id="__codelineno-47-3" name="__codelineno-47-3" href="#__codelineno-47-3"></a><span class="kc">flattene</span><span class="err">d</span><span class="w"> </span><span class="err">pre</span><span class="kc">tt</span><span class="err">y</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-47-4"><a id="__codelineno-47-4" name="__codelineno-47-4" href="#__codelineno-47-4"></a><span class="w"> </span><span class="nt">&quot;/age&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">69.0</span><span class="p">,</span>
</span><span id="__span-47-5"><a id="__codelineno-47-5" name="__codelineno-47-5" href="#__codelineno-47-5"></a><span class="w"> </span><span class="nt">&quot;/name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span>
</span><span id="__span-47-6"><a id="__codelineno-47-6" name="__codelineno-47-6" href="#__codelineno-47-6"></a><span class="w"> </span><span class="nt">&quot;/skills/0&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span>
</span><span id="__span-47-7"><a id="__codelineno-47-7" name="__codelineno-47-7" href="#__codelineno-47-7"></a><span class="w"> </span><span class="nt">&quot;/skills/1&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span>
</span><span id="__span-47-8"><a id="__codelineno-47-8" name="__codelineno-47-8" href="#__codelineno-47-8"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="utiljsonunflattenjson-string-string"><code>Util.JsonUnflatten(json: string) -&gt; string</code></h4>
<p>Restores the arbitrary nesting of a JSON value that has been flattened before using the <code>Util.JsonFlatten()</code> function. </p>
<h4 id="utiljsondiffa-string-b-string-string"><code>Util.JsonDiff(a: string, b: string) -&gt; string</code></h4>
<p>Creates a JSON diff according to RFC 6902 (http://jsonpatch.com/). This diff can then be applied as a patch via <code>Util.JsonDiffApply()</code>. Returns the diff.</p>
<h4 id="utiljsondiffapplybase-string-diff-string-string"><code>Util.JsonDiffApply(base: string, diff: string) -&gt; string</code></h4>
<p>Applies the JSON <code>diff</code> to <code>base</code> as a JSON patch (RFC 6902, http://jsonpatch.com/). Returns the result.</p>
<h3 id="utilrandom"><code>Util.Random*</code></h3>
<p>Since BeamMP-Server <code>v3.1.0</code>.</p>
<h4 id="utilrandom-float"><code>Util.Random() -&gt; float</code></h4>
<p>Returns a float between 0 and 1.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-48-1"><a id="__codelineno-48-1" name="__codelineno-48-1" href="#__codelineno-48-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">rand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">Random</span><span class="p">()</span>
</span><span id="__span-48-2"><a id="__codelineno-48-2" name="__codelineno-48-2" href="#__codelineno-48-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;rand: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">rand</span><span class="p">)</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-49-1"><a id="__codelineno-49-1" name="__codelineno-49-1" href="#__codelineno-49-1"></a><span class="nv">rand</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">135477</span>
</span></code></pre></div></p>
<h4 id="utilrandomintrangemin-int-max-int-int"><code>Util.RandomIntRange(min: int, max: int) -&gt; int</code></h4>
<p>Returns an integer between min and max.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-50-1"><a id="__codelineno-50-1" name="__codelineno-50-1" href="#__codelineno-50-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">randInt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">RandomIntRange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">)</span>
</span><span id="__span-50-2"><a id="__codelineno-50-2" name="__codelineno-50-2" href="#__codelineno-50-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;randInt: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">randInt</span><span class="p">)</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-51-1"><a id="__codelineno-51-1" name="__codelineno-51-1" href="#__codelineno-51-1"></a><span class="nv">randInt</span><span class="p">:</span><span class="w"> </span><span class="err">69</span>
</span></code></pre></div></p>
<h4 id="utilrandomrangemin-number-max-number-float"><code>Util.RandomRange(min: number, max: number) -&gt; float</code></h4>
<p>Returns a float between min and max.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-52-1"><a id="__codelineno-52-1" name="__codelineno-52-1" href="#__codelineno-52-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">randFloat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">RandomRange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1000</span><span class="p">)</span>
</span><span id="__span-52-2"><a id="__codelineno-52-2" name="__codelineno-52-2" href="#__codelineno-52-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;randFloat: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">randFloat</span><span class="p">)</span>
</span></code></pre></div></p>
<p>Results in:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-53-1"><a id="__codelineno-53-1" name="__codelineno-53-1" href="#__codelineno-53-1"></a><span class="nv">randFloat</span><span class="p">:</span><span class="w"> </span><span class="err">420</span><span class="p">.</span><span class="err">6969</span>
</span></code></pre></div></p>
<h4 id="utilloginfoparams-et-al-since-v330"><code>Util.LogInfo(params: ...)</code> et al (since v3.3.0)</h4>
<p><div class="language-lua highlight"><pre><span></span><code><span id="__span-54-1"><a id="__codelineno-54-1" name="__codelineno-54-1" href="#__codelineno-54-1"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogInfo</span><span class="p">(</span><span class="s2">&quot;Hello, World!&quot;</span><span class="p">)</span>
</span><span id="__span-54-2"><a id="__codelineno-54-2" name="__codelineno-54-2" href="#__codelineno-54-2"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogWarn</span><span class="p">(</span><span class="s2">&quot;Cool warning&quot;</span><span class="p">)</span>
</span><span id="__span-54-3"><a id="__codelineno-54-3" name="__codelineno-54-3" href="#__codelineno-54-3"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogError</span><span class="p">(</span><span class="s2">&quot;Oh no!&quot;</span><span class="p">)</span>
</span><span id="__span-54-4"><a id="__codelineno-54-4" name="__codelineno-54-4" href="#__codelineno-54-4"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogDebug</span><span class="p">(</span><span class="s2">&quot;hi&quot;</span><span class="p">)</span>
</span></code></pre></div>
produces</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-55-1"><a id="__codelineno-55-1" name="__codelineno-55-1" href="#__codelineno-55-1"></a>[19/04/24 11:06:50.142] [Test] [INFO] Hello, World!
</span><span id="__span-55-2"><a id="__codelineno-55-2" name="__codelineno-55-2" href="#__codelineno-55-2"></a>[19/04/24 11:06:50.142] [Test] [WARN] Cool warning
</span><span id="__span-55-3"><a id="__codelineno-55-3" name="__codelineno-55-3" href="#__codelineno-55-3"></a>[19/04/24 11:06:50.142] [Test] [ERROR] Oh no!
</span><span id="__span-55-4"><a id="__codelineno-55-4" name="__codelineno-55-4" href="#__codelineno-55-4"></a>[19/04/24 11:06:50.142] [Test] [DEBUG] hi
</span></code></pre></div>
<p>Supports the exact same printing / dumping of data as <code>print()</code> does.</p>
<h4 id="utildebugexecutiontime-table"><code>Util.DebugExecutionTime() -&gt; table</code></h4>
<p>When Lua code runs in the server, each event handler's execution is timed. The min, max, average (mean) and standard deviation of these execution times are calculated, and are returned in a table by this function. The calculation takes place incrementally, so every time an event handler runs the min, max, average and standard deviation are updated. This way, <code>Util.DebugExecutionTime()</code> does not usually take any significant amount of time to execute (sub 0.25ms).</p>
<p>It returns a table like this:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-56-1"><a id="__codelineno-56-1" name="__codelineno-56-1" href="#__codelineno-56-1"></a><span class="s">[[table: 0x7af6d400aca0]]</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-56-2"><a id="__codelineno-56-2" name="__codelineno-56-2" href="#__codelineno-56-2"></a><span class="w"> </span><span class="nv">printStuff</span><span class="p">:</span><span class="w"> </span><span class="err">[[</span><span class="py">table</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="py">x7af6d400be60</span><span class="p">]]:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-56-3"><a id="__codelineno-56-3" name="__codelineno-56-3" href="#__codelineno-56-3"></a><span class="w"> </span><span class="nv">mean</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">250433,</span>
</span><span id="__span-56-4"><a id="__codelineno-56-4" name="__codelineno-56-4" href="#__codelineno-56-4"></a><span class="w"> </span><span class="py">n</span><span class="p">:</span><span class="w"> </span><span class="err">76,</span>
</span><span id="__span-56-5"><a id="__codelineno-56-5" name="__codelineno-56-5" href="#__codelineno-56-5"></a><span class="w"> </span><span class="py">max</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">074475,</span>
</span><span id="__span-56-6"><a id="__codelineno-56-6" name="__codelineno-56-6" href="#__codelineno-56-6"></a><span class="w"> </span><span class="py">stdev</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">109405,</span>
</span><span id="__span-56-7"><a id="__codelineno-56-7" name="__codelineno-56-7" href="#__codelineno-56-7"></a><span class="w"> </span><span class="py">min</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">449274,</span>
</span><span id="__span-56-8"><a id="__codelineno-56-8" name="__codelineno-56-8" href="#__codelineno-56-8"></a><span class="w"> </span><span class="err">},</span>
</span><span id="__span-56-9"><a id="__codelineno-56-9" name="__codelineno-56-9" href="#__codelineno-56-9"></a><span class="w"> </span><span class="py">onInit</span><span class="p">:</span><span class="w"> </span><span class="err">[[</span><span class="py">table</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="py">x7af6d400b130</span><span class="p">]]:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-56-10"><a id="__codelineno-56-10" name="__codelineno-56-10" href="#__codelineno-56-10"></a><span class="w"> </span><span class="nv">mean</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">033095,</span>
</span><span id="__span-56-11"><a id="__codelineno-56-11" name="__codelineno-56-11" href="#__codelineno-56-11"></a><span class="w"> </span><span class="py">n</span><span class="p">:</span><span class="w"> </span><span class="err">1,</span>
</span><span id="__span-56-12"><a id="__codelineno-56-12" name="__codelineno-56-12" href="#__codelineno-56-12"></a><span class="w"> </span><span class="py">max</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">033095,</span>
</span><span id="__span-56-13"><a id="__codelineno-56-13" name="__codelineno-56-13" href="#__codelineno-56-13"></a><span class="w"> </span><span class="py">stdev</span><span class="p">:</span><span class="w"> </span><span class="err">0,</span>
</span><span id="__span-56-14"><a id="__codelineno-56-14" name="__codelineno-56-14" href="#__codelineno-56-14"></a><span class="w"> </span><span class="py">min</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">033095,</span>
</span><span id="__span-56-15"><a id="__codelineno-56-15" name="__codelineno-56-15" href="#__codelineno-56-15"></a><span class="w"> </span><span class="err">},</span>
</span><span id="__span-56-16"><a id="__codelineno-56-16" name="__codelineno-56-16" href="#__codelineno-56-16"></a><span class="err">}</span><span class="w"> </span>
</span></code></pre></div>
Per event <em>handler</em>, returns the following data:</p>
<ul>
<li><code>n</code>: Amount of times the event triggered and a handler was called</li>
<li><code>mean</code>: Average/mean of all execution times, in ms</li>
<li><code>max</code>: The longest execution time, in ms</li>
<li><code>min</code>: The shortest execution time, in ms</li>
<li><code>stdev</code>: The standard deviation of all execution time averages, in ms</li>
</ul>
<p>Here's a function you can use to pretty-print this data:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-57-1"><a id="__codelineno-57-1" name="__codelineno-57-1" href="#__codelineno-57-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">printDebugExecutionTime</span><span class="p">()</span>
</span><span id="__span-57-2"><a id="__codelineno-57-2" name="__codelineno-57-2" href="#__codelineno-57-2"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">stats</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">DebugExecutionTime</span><span class="p">()</span>
</span><span id="__span-57-3"><a id="__codelineno-57-3" name="__codelineno-57-3" href="#__codelineno-57-3"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;DebugExecutionTime:</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="__span-57-4"><a id="__codelineno-57-4" name="__codelineno-57-4" href="#__codelineno-57-4"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-57-5"><a id="__codelineno-57-5" name="__codelineno-57-5" href="#__codelineno-57-5"></a><span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">stats</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-57-6"><a id="__codelineno-57-6" name="__codelineno-57-6" href="#__codelineno-57-6"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="o">#</span><span class="nv">name</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-57-7"><a id="__codelineno-57-7" name="__codelineno-57-7" href="#__codelineno-57-7"></a><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">#</span><span class="nv">name</span>
</span><span id="__span-57-8"><a id="__codelineno-57-8" name="__codelineno-57-8" href="#__codelineno-57-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-57-9"><a id="__codelineno-57-9" name="__codelineno-57-9" href="#__codelineno-57-9"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-57-10"><a id="__codelineno-57-10" name="__codelineno-57-10" href="#__codelineno-57-10"></a><span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">stats</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-57-11"><a id="__codelineno-57-11" name="__codelineno-57-11" href="#__codelineno-57-11"></a><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nb">string.format</span><span class="p">(</span><span class="s2">&quot;%&quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="s2">&quot;s: %12f +/- %12f (min: %12f, max: %12f) (called %d time(s))</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">mean</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">stdev</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">min</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">max</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">n</span><span class="p">)</span>
</span><span id="__span-57-12"><a id="__codelineno-57-12" name="__codelineno-57-12" href="#__codelineno-57-12"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-57-13"><a id="__codelineno-57-13" name="__codelineno-57-13" href="#__codelineno-57-13"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">pretty</span><span class="p">)</span>
</span><span id="__span-57-14"><a id="__codelineno-57-14" name="__codelineno-57-14" href="#__codelineno-57-14"></a><span class="kr">end</span>
</span></code></pre></div>
<p>You may call it like this to debug your code if it's slow:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-58-1"><a id="__codelineno-58-1" name="__codelineno-58-1" href="#__codelineno-58-1"></a><span class="c1">-- event to print the debug times</span>
</span><span id="__span-58-2"><a id="__codelineno-58-2" name="__codelineno-58-2" href="#__codelineno-58-2"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;printStuff&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;printDebugExecutionTime&quot;</span><span class="p">)</span>
</span><span id="__span-58-3"><a id="__codelineno-58-3" name="__codelineno-58-3" href="#__codelineno-58-3"></a><span class="c1">-- run every 5000 ms = 5 seconds (or 10, or 60, whatever makes sense for you</span>
</span><span id="__span-58-4"><a id="__codelineno-58-4" name="__codelineno-58-4" href="#__codelineno-58-4"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateEventTimer</span><span class="p">(</span><span class="s2">&quot;printStuff&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">5000</span><span class="p">)</span>
</span></code></pre></div>
<h3 id="fs-functions">FS Functions</h3>
<p><code>FS</code> functions are <strong>f</strong>ile<strong>s</strong>ystem functions, which aim to be better than the default Lua capabilities.</p>
<p>Please always use <code>/</code> as a separator when specifying paths, as this is cross-platform (windows, linux, macos, ...).</p>
<h4 id="fscreatedirectorypath-string-boolstring"><code>FS.CreateDirectory(path: string) -&gt; bool,string</code></h4>
<p>Creates the specified directory, and any parent directories if they don't exist. Behavior is roughly equivalent to the common linux command <code>mkdir -p</code>.</p>
<p>If successful, returns <code>true</code> and <code>""</code>. If creating the directory failed, <code>false</code> and an error message (<code>string</code>) is returned.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-59-1"><a id="__codelineno-59-1" name="__codelineno-59-1" href="#__codelineno-59-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">success</span><span class="p">,</span><span class="w"> </span><span class="nv">error_message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">FS</span><span class="p">.</span><span class="nf">CreateDirectory</span><span class="p">(</span><span class="s2">&quot;data/mystuff/somefolder&quot;</span><span class="p">)</span>
</span><span id="__span-59-2"><a id="__codelineno-59-2" name="__codelineno-59-2" href="#__codelineno-59-2"></a>
</span><span id="__span-59-3"><a id="__codelineno-59-3" name="__codelineno-59-3" href="#__codelineno-59-3"></a><span class="kr">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="nv">success</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-59-4"><a id="__codelineno-59-4" name="__codelineno-59-4" href="#__codelineno-59-4"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;failed to create directory: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">error_message</span><span class="p">)</span>
</span><span id="__span-59-5"><a id="__codelineno-59-5" name="__codelineno-59-5" href="#__codelineno-59-5"></a><span class="kr">else</span>
</span><span id="__span-59-6"><a id="__codelineno-59-6" name="__codelineno-59-6" href="#__codelineno-59-6"></a><span class="w"> </span><span class="c1">-- do something with the directory</span>
</span><span id="__span-59-7"><a id="__codelineno-59-7" name="__codelineno-59-7" href="#__codelineno-59-7"></a><span class="kr">end</span>
</span><span id="__span-59-8"><a id="__codelineno-59-8" name="__codelineno-59-8" href="#__codelineno-59-8"></a>
</span><span id="__span-59-9"><a id="__codelineno-59-9" name="__codelineno-59-9" href="#__codelineno-59-9"></a><span class="c1">-- Be careful not to do this! This will ALWAYS be true!</span>
</span><span id="__span-59-10"><a id="__codelineno-59-10" name="__codelineno-59-10" href="#__codelineno-59-10"></a><span class="kr">if</span><span class="w"> </span><span class="nv">error_message</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-59-11"><a id="__codelineno-59-11" name="__codelineno-59-11" href="#__codelineno-59-11"></a><span class="w"> </span><span class="c1">-- ...</span>
</span><span id="__span-59-12"><a id="__codelineno-59-12" name="__codelineno-59-12" href="#__codelineno-59-12"></a><span class="kr">end</span>
</span></code></pre></div></p>
<h4 id="fsremovepath-string-boolstring"><code>FS.Remove(path: string) -&gt; bool,string</code></h4>
<p>Removes the specified file or folder.</p>
<p>Returns <code>true</code> if an error occured, with an error message in the second return value.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-60-1"><a id="__codelineno-60-1" name="__codelineno-60-1" href="#__codelineno-60-1"></a><span class="kd">local</span><span class="w"> </span><span class="nb">error</span><span class="p">,</span><span class="w"> </span><span class="nv">error_message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">FS</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s2">&quot;myfile.txt&quot;</span><span class="p">)</span>
</span><span id="__span-60-2"><a id="__codelineno-60-2" name="__codelineno-60-2" href="#__codelineno-60-2"></a>
</span><span id="__span-60-3"><a id="__codelineno-60-3" name="__codelineno-60-3" href="#__codelineno-60-3"></a><span class="kr">if</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-60-4"><a id="__codelineno-60-4" name="__codelineno-60-4" href="#__codelineno-60-4"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;failed to delete myfile: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">error_message</span><span class="p">)</span>
</span><span id="__span-60-5"><a id="__codelineno-60-5" name="__codelineno-60-5" href="#__codelineno-60-5"></a><span class="kr">end</span>
</span></code></pre></div></p>
<h4 id="fsrenamepatha-string-pathb-string-boolstring"><code>FS.Rename(pathA: string, pathB: string) -&gt; bool,string</code></h4>
<p>Renames (or moves) <code>pathA</code> to <code>pathB</code>.</p>
<p>Returns <code>true</code> if an error occured, with an error message in the second return value.</p>
<h4 id="fscopypatha-string-pathb-string-boolstring"><code>FS.Copy(pathA: string, pathB: string) -&gt; bool,string</code></h4>
<p>Copies <code>pathA</code> to <code>pathB</code>.</p>
<p>Returns <code>true</code> if an error occured, with an error message in the second return value.</p>
<h4 id="fsgetfilenamepath-string-string"><code>FS.GetFilename(path: string) -&gt; string</code></h4>
<p>Returns the last part of a path, which is usually the filename.
Here are some example inputs + outputs:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-61-1"><a id="__codelineno-61-1" name="__codelineno-61-1" href="#__codelineno-61-1"></a><span class="nv">input</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nv">output</span>
</span><span id="__span-61-2"><a id="__codelineno-61-2" name="__codelineno-61-2" href="#__codelineno-61-2"></a>
</span><span id="__span-61-3"><a id="__codelineno-61-3" name="__codelineno-61-3" href="#__codelineno-61-3"></a><span class="s2">&quot;my/path/a.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;a.txt&quot;</span>
</span><span id="__span-61-4"><a id="__codelineno-61-4" name="__codelineno-61-4" href="#__codelineno-61-4"></a><span class="s2">&quot;somefile.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;somefile.txt&quot;</span>
</span><span id="__span-61-5"><a id="__codelineno-61-5" name="__codelineno-61-5" href="#__codelineno-61-5"></a><span class="s2">&quot;/awesome/path&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;path&quot;</span>
</span></code></pre></div>
<h4 id="fsgetextensionpath-string-string"><code>FS.GetExtension(path: string) -&gt; string</code></h4>
<p>Returns the extension of the file, or an empty string if no extension exists.
Here are some example inputs + outputs</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-62-1"><a id="__codelineno-62-1" name="__codelineno-62-1" href="#__codelineno-62-1"></a><span class="nv">input</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nv">output</span>
</span><span id="__span-62-2"><a id="__codelineno-62-2" name="__codelineno-62-2" href="#__codelineno-62-2"></a>
</span><span id="__span-62-3"><a id="__codelineno-62-3" name="__codelineno-62-3" href="#__codelineno-62-3"></a><span class="s2">&quot;myfile.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.txt&quot;</span>
</span><span id="__span-62-4"><a id="__codelineno-62-4" name="__codelineno-62-4" href="#__codelineno-62-4"></a><span class="s2">&quot;somefile.&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.&quot;</span>
</span><span id="__span-62-5"><a id="__codelineno-62-5" name="__codelineno-62-5" href="#__codelineno-62-5"></a><span class="s2">&quot;/awesome/path&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;&quot;</span>
</span><span id="__span-62-6"><a id="__codelineno-62-6" name="__codelineno-62-6" href="#__codelineno-62-6"></a><span class="s2">&quot;/awesome/path/file.zip.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.txt&quot;</span>
</span><span id="__span-62-7"><a id="__codelineno-62-7" name="__codelineno-62-7" href="#__codelineno-62-7"></a><span class="s2">&quot;myexe.exe&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.exe&quot;</span>
</span></code></pre></div>
<h4 id="fsgetparentfolderpath-string-string"><code>FS.GetParentFolder(path: string) -&gt; string</code></h4>
<p>Returns the path to the parent directory, i.e. the folder a file or folder is contained in.
Here are some example inputs + outputs:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-63-1"><a id="__codelineno-63-1" name="__codelineno-63-1" href="#__codelineno-63-1"></a><span class="nv">input</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nv">output</span>
</span><span id="__span-63-2"><a id="__codelineno-63-2" name="__codelineno-63-2" href="#__codelineno-63-2"></a>
</span><span id="__span-63-3"><a id="__codelineno-63-3" name="__codelineno-63-3" href="#__codelineno-63-3"></a><span class="s2">&quot;/var/tmp/example.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;/var/tmp&quot;</span>
</span><span id="__span-63-4"><a id="__codelineno-63-4" name="__codelineno-63-4" href="#__codelineno-63-4"></a><span class="s2">&quot;/&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;/&quot;</span>
</span><span id="__span-63-5"><a id="__codelineno-63-5" name="__codelineno-63-5" href="#__codelineno-63-5"></a><span class="s2">&quot;mydir/a/b/c.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;mydir/a/b&quot;</span>
</span></code></pre></div>
<h4 id="fsexistspath-string-bool"><code>FS.Exists(path: string) -&gt; bool</code></h4>
<p>Returns <code>true</code> if the path exists, <code>false</code> if it doesn't.</p>
<h4 id="fsisdirectorypath-string-bool"><code>FS.IsDirectory(path: string) -&gt; bool</code></h4>
<p>Returns <code>true</code> if the specified path is a directory, <code>false</code> if it's not. Note that <code>false</code> does NOT imply that the path is a file (see <code>FS.IsFile()</code>).</p>
<h4 id="fsisfilepath-string-bool"><code>FS.IsFile(path: string) -&gt; bool</code></h4>
<p>Returns <code>true</code> if the specified path is a regular file (not a symlink, hardlink, block device, etc.), <code>false</code> if it's not. Note taht <code>false</code> does NOT imply that the path is a directory (see <code>FS.IsDirectory()</code>).</p>
<h4 id="fslistdirectoriespath-string-table"><code>FS.ListDirectories(path: string) -&gt; table</code></h4>
<p>Returns a table of all the directories in the given path.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-64-1"><a id="__codelineno-64-1" name="__codelineno-64-1" href="#__codelineno-64-1"></a><span class="nb">print</span><span class="p">(</span><span class="nv">FS</span><span class="p">.</span><span class="nf">ListDirectories</span><span class="p">(</span><span class="s2">&quot;Resources&quot;</span><span class="p">))</span>
</span></code></pre></div>
Results in:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-65-1"><a id="__codelineno-65-1" name="__codelineno-65-1" href="#__codelineno-65-1"></a><span class="p">{</span>
</span><span id="__span-65-2"><a id="__codelineno-65-2" name="__codelineno-65-2" href="#__codelineno-65-2"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Client&quot;</span><span class="p">,</span>
</span><span id="__span-65-3"><a id="__codelineno-65-3" name="__codelineno-65-3" href="#__codelineno-65-3"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Server&quot;</span>
</span><span id="__span-65-4"><a id="__codelineno-65-4" name="__codelineno-65-4" href="#__codelineno-65-4"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="fslistfilespath-string-table"><code>FS.ListFiles(path: string) -&gt; table</code></h4>
<p>Returns a table of all the files in the given path.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-66-1"><a id="__codelineno-66-1" name="__codelineno-66-1" href="#__codelineno-66-1"></a><span class="nb">print</span><span class="p">(</span><span class="nv">FS</span><span class="p">.</span><span class="nf">ListFiles</span><span class="p">(</span><span class="s2">&quot;Resources/Server/examplePlugin&quot;</span><span class="p">))</span>
</span></code></pre></div>
Results in:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-67-1"><a id="__codelineno-67-1" name="__codelineno-67-1" href="#__codelineno-67-1"></a><span class="p">{</span>
</span><span id="__span-67-2"><a id="__codelineno-67-2" name="__codelineno-67-2" href="#__codelineno-67-2"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;example.json&quot;</span><span class="p">,</span>
</span><span id="__span-67-3"><a id="__codelineno-67-3" name="__codelineno-67-3" href="#__codelineno-67-3"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;example.lua&quot;</span>
</span><span id="__span-67-4"><a id="__codelineno-67-4" name="__codelineno-67-4" href="#__codelineno-67-4"></a><span class="p">}</span>
</span></code></pre></div></p>
<h4 id="fsconcatpaths-string"><code>FS.ConcatPaths(...) -&gt; string</code></h4>
<p>Adds together (concatenates) all arguments with the system's preferred path separator.</p>
<p>Example:
<div class="language-lua highlight"><pre><span></span><code><span id="__span-68-1"><a id="__codelineno-68-1" name="__codelineno-68-1" href="#__codelineno-68-1"></a><span class="nv">FS</span><span class="p">.</span><span class="nf">ConcatPaths</span><span class="p">(</span><span class="s2">&quot;a&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;b&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/c/d/e/&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/f/&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;g&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;h.txt&quot;</span><span class="p">)</span>
</span></code></pre></div>
results in
<div class="language-text highlight"><pre><span></span><code><span id="__span-69-1"><a id="__codelineno-69-1" name="__codelineno-69-1" href="#__codelineno-69-1"></a>a/b/c/d/e/f/g/h.txt
</span></code></pre></div></p>
<p>Also resolves <code>..</code>, if that exists in the path at any point. This function is safer than concatenating strings in lua, and respects the platform's separators.</p>
<p>Please always use <code>/</code> as a separator when specifying paths, as this is cross-platform (windows, linux, macos, ...).</p>
<h3 id="events_1">Events</h3>
<h4 id="explanation">Explanation</h4>
<ul>
<li>Arguments: List of arguments given to handlers of this event</li>
<li>Cancellable: Whether the event can be cancelled. If it can be cancelled, a handler can do so by returning <code>1</code>, like <code>return 1</code>.</li>
</ul>
<h4 id="summary-of-events">Summary of events</h4>
<p>A player join triggers the following events in the given order:</p>
<ol>
<li><code>onPlayerAuth</code></li>
<li><code>onPlayerConnecting</code></li>
<li><code>onPlayerJoining</code></li>
<li><code>onPlayerJoin</code></li>
</ol>
<h4 id="system-events">System Events</h4>
<h5 id="oninit"><code>onInit</code></h5>
<p>Arguments: NONE
Cancellable: NO</p>
<p>Triggered right after all files in the plugin were initialized.</p>
<h5 id="onconsoleinput"><code>onConsoleInput</code></h5>
<p>Arguments: <code>input: string</code>
Cancellable: NO</p>
<p>Triggered when the BeamMP console receives an input.</p>
<h5 id="onshutdown"><code>onShutdown</code></h5>
<p>Arguments: NONE
Cancellable: NO</p>
<p>Triggered when the server shuts down. Currently happens after all players were kicked.</p>
<h4 id="game-related-events">Game-Related Events</h4>
<h5 id="onplayerauth"><code>onPlayerAuth</code></h5>
<p>Arguments: <code>player_name: string</code>, <code>player_role: string</code>, <code>is_guest: bool</code>, <code>identifiers: table -&gt; beammp, ip</code>
Cancellable: YES</p>
<p>First event that gets triggered when a player wants to join. A player can be denied from joining by returning <code>1</code> or a reason (<code>string</code>) from the handler function.</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-70-1"><a id="__codelineno-70-1" name="__codelineno-70-1" href="#__codelineno-70-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">myPlayerAuthorizer</span><span class="p">(</span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">role</span><span class="p">,</span><span class="w"> </span><span class="nv">is_guest</span><span class="p">,</span><span class="w"> </span><span class="nv">identifiers</span><span class="p">)</span>
</span><span id="__span-70-2"><a id="__codelineno-70-2" name="__codelineno-70-2" href="#__codelineno-70-2"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="s2">&quot;Sorry, you cannot join at this time.&quot;</span>
</span><span id="__span-70-3"><a id="__codelineno-70-3" name="__codelineno-70-3" href="#__codelineno-70-3"></a><span class="kr">end</span>
</span><span id="__span-70-4"><a id="__codelineno-70-4" name="__codelineno-70-4" href="#__codelineno-70-4"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onPlayerAuth&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;myPlayerAuthorizer&quot;</span><span class="p">)</span>
</span></code></pre></div>
<h5 id="onplayerconnecting"><code>onPlayerConnecting</code></h5>
<p>Arguments: <code>player_id: number</code>
Cancellable: NO</p>
<p>Triggered when a player first starts connecting, after <code>onPlayerAuth</code>.</p>
<h5 id="onplayerjoining"><code>onPlayerJoining</code></h5>
<p>Arguments: <code>player_id: number</code>
Cancellable: NO</p>
<p>Triggered when a player has finished loading all mods, after <code>onPlayerConnecting</code>.</p>
<h5 id="onplayerdisconnect"><code>onPlayerDisconnect</code></h5>
<p>Arguments: <code>player_id: number</code>
Cancellable: NO</p>
<p>Triggered when a player disconnects.</p>
<h5 id="onchatmessage"><code>onChatMessage</code></h5>
<p>Arguments: <code>player_id: number</code>, <code>player_name: string</code>, <code>message: string</code>
Cancellable: YES</p>
<p>Triggered when a player sends a chat message. When cancelled, it will not show the chat message to anyone, not even the player who sent it.</p>
<h5 id="onvehiclespawn"><code>onVehicleSpawn</code></h5>
<p>Arguments: <code>player_id: number</code>, <code>vehicle_id: number</code>, <code>data: string</code>
Cancellable: YES</p>
<p>Triggered when a player spawns a new vehicle. The <code>data</code> argument contains the car's configuration and positional/rotational data for the vehicle as a json string.</p>
<h5 id="onvehicleedited"><code>onVehicleEdited</code></h5>
<p>Arguments: <code>player_id: number</code>, <code>vehicle_id: number</code>, <code>data: string</code>
Cancellable: YES</p>
<p>Triggered when a player edits their vehicle and applies the edit. The <code>data</code> argument contains the car's updated configuration as a json string but does <strong>not</strong> include positional or rotational data. You can use <a href="#mpgetpositionrawpid-number-vid-number-tablestring">MP.GetPositionRaw</a> to get positional and rotational data.</p>
<h5 id="onvehicledeleted"><code>onVehicleDeleted</code></h5>
<p>Arguments: <code>player_id: number</code>, <code>vehicle_id: number</code>
Cancellable: NO</p>
<p>Triggered when a player deletes their vehicle.</p>
<h5 id="onvehiclereset"><code>onVehicleReset</code></h5>
<p>Arguments: <code>player_id: number</code>, <code>vehicle_id: number</code>, <code>data: string</code>
Cancellable: NO</p>
<p>Triggered when a player resets their vehicle. <code>data</code> is the car's updated position and rotation however does <strong>not</strong> include the vehicles configuration. You can use <a href="#mpgetplayervehiclesplayer_id-number-table">MP.GetPlayerVehicles</a> to get the vehicles configuration.</p>
<h5 id="onfilechanged"><code>onFileChanged</code></h5>
<p><em>since v3.1.0</em></p>
<p>Arguments: <code>path: string</code>
Cancellable: NO</p>
<p>Triggered if a file changes in the <code>Resources/Server</code> directory <em>or any subdirectory of it</em>. </p>
<p>Any file change in the <code>Resources/Server/&lt;plugin&gt;</code> directory (not in a subfolder of it) will trigger a Lua state reload, and an <code>onFileChanged</code> event.</p>
<p>Any file in subfolders of <code>Resources/Server/&lt;plugin&gt;</code>, such as <code>Resources/Server/&lt;plugin&gt;/lua/stuff.lua</code>, will not trigger a state reload and will only trigger an <code>onFileChanged</code> event. This way, you can reload it yourself in the correct way (or not reload it).</p>
<p>This applies to all files, not just <code>.lua</code> files.</p>
<p>The <code>path</code> is relative to the root of the server, for example <code>Resources/Server/myplugin/myfile.txt</code>. You can do further processing on this string with the <code>FS.*</code> family of functions, such as extracting the name or extension (<code>FS.GetExtension(...)</code>, <code>FS.GetFilename(...)</code>, ...).</p>
<p>Note: Files added after the server is started are <em>not</em> tracked as of v3.1.0.</p>
<h3 id="migrating-from-old-lua">Migrating from old Lua</h3>
<p>This is a short run-down of the basic steps to take to migrate from old to new lua.</p>
<h4 id="understand-how-the-new-lua-works">Understand how the new lua works</h4>
<p>For this, please read through the section <a href="#how-to-start-writing-a-plugin">"Introduction"</a> and all its subsections carefully.
It's necessary to do the next steps properly.</p>
<h4 id="search-replace">Search &amp; Replace</h4>
<p>First, you should search and replace all MP functions. The substitution should add an <code>MP.</code> infront of all MP functions, except <code>print()</code>.</p>
<p>Example:</p>
<p><div class="language-lua highlight"><pre><span></span><code><span id="__span-71-1"><a id="__codelineno-71-1" name="__codelineno-71-1" href="#__codelineno-71-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">players</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">GetPlayers</span><span class="p">()</span>
</span><span id="__span-71-2"><a id="__codelineno-71-2" name="__codelineno-71-2" href="#__codelineno-71-2"></a><span class="nb">print</span><span class="p">(</span><span class="o">#</span><span class="nv">players</span><span class="p">)</span>
</span></code></pre></div>
becomes</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-72-1"><a id="__codelineno-72-1" name="__codelineno-72-1" href="#__codelineno-72-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">players</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayers</span><span class="p">()</span>
</span><span id="__span-72-2"><a id="__codelineno-72-2" name="__codelineno-72-2" href="#__codelineno-72-2"></a><span class="nb">print</span><span class="p">(</span><span class="o">#</span><span class="nv">players</span><span class="p">)</span><span class="w"> </span><span class="c1">-- note how print() doesn&#39;t change</span>
</span></code></pre></div>
<h4 id="goodbye-threads-hello-event-timers">Goodbye Threads, Hello Event Timers!</h4>
<p>As discussed in the introduction, threads are event timers. For any calls to <code>CreateThread</code>, replace it with a call to <code>CreateEventTimer</code>. Carefully inspect the timing your old CreateThread had (the number was X per second), and think about what the event timer timeout value is for this (which is in milliseconds). Also keep in mind that instead of a function name, it takes an event name, so you will have to register an event as well.</p>
<p>Example:</p>
<p><div class="language-lua highlight"><pre><span></span><code><span id="__span-73-1"><a id="__codelineno-73-1" name="__codelineno-73-1" href="#__codelineno-73-1"></a><span class="nf">CreateThread</span><span class="p">(</span><span class="s2">&quot;myFunction&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1">-- calls &quot;myFunction&quot; twice per second</span>
</span></code></pre></div>
becomes</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-74-1"><a id="__codelineno-74-1" name="__codelineno-74-1" href="#__codelineno-74-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;myEvent&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;myFunction&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1">-- registering our event for the timer</span>
</span><span id="__span-74-2"><a id="__codelineno-74-2" name="__codelineno-74-2" href="#__codelineno-74-2"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateEventTimer</span><span class="p">(</span><span class="s2">&quot;myEvent&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">500</span><span class="p">)</span><span class="w"> </span><span class="c1">-- 500 milliseconds = 2 times per second</span>
</span></code></pre></div>
<p>If you have many event timers, it makes sense to see if you can combine them, e.g. by creating a "every minute" event and registering multiple functions to it which need to be called every minute, instead of having multiple event timers. Each event timer costs the server a little bit of time to trigger.</p>
<h4 id="no-more-implicit-event-calling">No more implicit event calling</h4>
<p>You need to register all your events. You cannot rely on function names. In the old lua, this was unclear, but in the new lua this is usually enforced. A good pattern is: </p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-75-1"><a id="__codelineno-75-1" name="__codelineno-75-1" href="#__codelineno-75-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;chatMessageHandler&quot;</span><span class="p">)</span>
</span><span id="__span-75-2"><a id="__codelineno-75-2" name="__codelineno-75-2" href="#__codelineno-75-2"></a><span class="c1">-- or </span>
</span><span id="__span-75-3"><a id="__codelineno-75-3" name="__codelineno-75-3" href="#__codelineno-75-3"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;handleChatMessage&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>This is a better pattern than calling the handler the same as the event, which is misleading and confusing.</p>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Последнее обновление">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="August 12, 2025 17:33:45 UTC">August 12, 2025</span>
</span>
<span class="md-source-file__fact">
<span class="md-icon" title="Дата создания">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.47 15.08 11 13V7h1.5v5.25l3.08 1.83c-.41.28-.79.62-1.11 1m-1.39 4.84c-.36.05-.71.08-1.08.08-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8c0 .37-.03.72-.08 1.08.69.1 1.33.32 1.92.64.1-.56.16-1.13.16-1.72 0-5.5-4.5-10-10-10S2 6.5 2 12s4.47 10 10 10c.59 0 1.16-.06 1.72-.16-.32-.59-.54-1.23-.64-1.92M18 15v3h-3v2h3v3h2v-3h3v-2h-3v-3z"/></svg>
</span>
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="August 12, 2025 17:33:45 UTC">August 12, 2025</span>
</span>
</aside>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Нижний колонтитул" >
<a href="../../mod-reference/" class="md-footer__link md-footer__link--prev" aria-label="Назад: Client Scripting Reference">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Назад
</span>
<div class="md-ellipsis">
Client Scripting Reference
</div>
</div>
</a>
<a href="../v2-server-reference/" class="md-footer__link md-footer__link--next" aria-label="Вперед: Version 2.X (Deprecated)">
<div class="md-footer__title">
<span class="md-footer__direction">
Вперед
</span>
<div class="md-ellipsis">
Version 2.X (Deprecated)
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2019 - 2024 BeamMP Mod Team
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/beammp" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://twitter.com/beamng_mp" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M459.4 151.7c.3 4.5.3 9.1.3 13.6 0 138.7-105.6 298.6-298.6 298.6-59.5 0-114.7-17.2-161.1-47.1 8.4 1 16.6 1.3 25.3 1.3 49.1 0 94.2-16.6 130.3-44.8-46.1-1-84.8-31.2-98.1-72.8 6.5 1 13 1.6 19.8 1.6 9.4 0 18.8-1.3 27.6-3.6-48.1-9.7-84.1-52-84.1-103v-1.3c14 7.8 30.2 12.7 47.4 13.3-28.3-18.8-46.8-51-46.8-87.4 0-19.5 5.2-37.4 14.3-53C87.4 130.8 165 172.4 252.1 176.9c-1.6-7.8-2.6-15.9-2.6-24C249.5 95.1 296.3 48 354.4 48c30.2 0 57.5 12.7 76.7 33.1 23.7-4.5 46.5-13.3 66.6-25.3-7.8 24.4-24.4 44.8-46.1 57.8 21.1-2.3 41.6-8.1 60.4-16.2-14.3 20.8-32.2 39.3-52.6 54.3"/></svg>
</a>
<a href="https://discord.gg/beammp" target="_blank" rel="noopener" title="discord.gg" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M492.5 69.8c-.2-.3-.4-.6-.8-.7-38.1-17.5-78.4-30-119.7-37.1-.4-.1-.8 0-1.1.1s-.6.4-.8.8c-5.5 9.9-10.5 20.2-14.9 30.6-44.6-6.8-89.9-6.8-134.4 0-4.5-10.5-9.5-20.7-15.1-30.6-.2-.3-.5-.6-.8-.8s-.7-.2-1.1-.2C162.5 39 122.2 51.5 84.1 69c-.3.1-.6.4-.8.7C7.1 183.5-13.8 294.6-3.6 404.2c0 .3.1.5.2.8s.3.4.5.6c44.4 32.9 94 58 146.8 74.2.4.1.8.1 1.1 0s.7-.4.9-.7c11.3-15.4 21.4-31.8 30-48.8.1-.2.2-.5.2-.8s0-.5-.1-.8-.2-.5-.4-.6-.4-.3-.7-.4c-15.8-6.1-31.2-13.4-45.9-21.9-.3-.2-.5-.4-.7-.6s-.3-.6-.3-.9 0-.6.2-.9.3-.5.6-.7c3.1-2.3 6.2-4.7 9.1-7.1.3-.2.6-.4.9-.4s.7 0 1 .1c96.2 43.9 200.4 43.9 295.5 0 .3-.1.7-.2 1-.2s.7.2.9.4c2.9 2.4 6 4.9 9.1 7.2.2.2.4.4.6.7s.2.6.2.9-.1.6-.3.9-.4.5-.6.6c-14.7 8.6-30 15.9-45.9 21.8-.2.1-.5.2-.7.4s-.3.4-.4.7-.1.5-.1.8.1.5.2.8c8.8 17 18.8 33.3 30 48.8.2.3.6.6.9.7s.8.1 1.1 0c52.9-16.2 102.6-41.3 147.1-74.2.2-.2.4-.4.5-.6s.2-.5.2-.8c12.3-126.8-20.5-236.9-86.9-334.5zm-302 267.7c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.4 59.2-52.8 59.2m195.4 0c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.2 59.2-52.8 59.2"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
<div class="md-consent__overlay"></div>
<aside class="md-consent__inner">
<form class="md-consent__form md-grid md-typeset" name="consent">
<h4>Cookie consent</h4>
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation and whether users find what they're searching for. With your consent, you're helping us to make our documentation better.</p>
<input class="md-toggle" type="checkbox" id="__settings" >
<div class="md-consent__settings">
<ul class="task-list">
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="analytics" checked>
<span class="task-list-indicator"></span>
Google Analytics
</label>
</li>
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="github" checked>
<span class="task-list-indicator"></span>
GitHub
</label>
</li>
</ul>
</div>
<div class="md-consent__controls">
<button class="md-button md-button--primary">Принять</button>
<label class="md-button" for="__settings">Управлять настройками</label>
</div>
</form>
</aside>
</div>
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
<script id="__config" type="application/json">{"base": "../../../..", "features": ["search.suggest", "search.highlight", "search.share", "content.code.annotate", "content.code.copy", "content.action.edit", "content.action.view", "content.tooltips", "navigation.footer", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.path", "navigation.tracking", "navigation.indexes", "toc.follow"], "search": "../../../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u0443\u0444\u0435\u0440", "clipboard.copy": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440", "search.result.more.one": "\u0415\u0449\u0451 1 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435", "search.result.more.other": "\u0415\u0449\u0451 # \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435", "search.result.none": "\u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e", "search.result.one": "\u041d\u0430\u0439\u0434\u0435\u043d\u043e 1 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435", "search.result.other": "\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439: #", "search.result.placeholder": "\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430", "search.result.term.missing": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442", "select.version": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044e"}, "version": null}</script>
<script src="../../../../assets/javascripts/bundle.50899def.min.js"></script>
<script src="../../../../javascript/custom.js"></script>
</body>
</html>