Files
Docs/ru/scripting/server/latest-server-reference/index.html

6107 lines
282 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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="alternate" href="../../../../scripting/server/latest-server-reference/" hreflang="en">
<link rel="alternate" href="../../../../es/scripting/server/latest-server-reference/" hreflang="es">
<link rel="alternate" href="../../../../de/scripting/server/latest-server-reference/" hreflang="de">
<link rel="alternate" href="../../../../fr/scripting/server/latest-server-reference/" hreflang="fr">
<link rel="alternate" href="../../../../it/scripting/server/latest-server-reference/" hreflang="it">
<link rel="alternate" href="./" hreflang="ru">
<link rel="icon" href="../../../../assets/core/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Version 3.X (Latest) - BeamMP Docs</title>
<link rel="stylesheet" href="../../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../../assets/stylesheets/palette.ab4e12ef.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/ru/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 property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Version 3.X (Latest) - BeamMP Docs" />
<meta property="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 property="twitter:image" content="https://docs.beammp.com/assets/images/social/ru/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="#_1" 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.1.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 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.1.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 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="#3x" class="md-nav__link">
<span class="md-ellipsis">
Версия сервера 3.X
</span>
</a>
<nav class="md-nav" aria-label="Версия сервера 3.X">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Введение
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Структура каталога
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lua" class="md-nav__link">
<span class="md-ellipsis">
Файлы Lua
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
События
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Пользовательские события
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Таймеры событий («Потоки»)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
Отладка
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Пользовательские команды
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api" class="md-nav__link">
<span class="md-ellipsis">
Ссылка на API
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
Встроенные функции
</span>
</a>
<nav class="md-nav" aria-label="Встроенные функции">
<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="#_10" class="md-nav__link">
<span class="md-ellipsis">
Функции МП
</span>
</a>
<nav class="md-nav" aria-label="Функции МП">
<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="#_11" class="md-nav__link">
<span class="md-ellipsis">
Утилитарные функции
</span>
</a>
<nav class="md-nav" aria-label="Утилитарные функции">
<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-330" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(params: ...) и др. (начиная с версии 3.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="#_12" class="md-nav__link">
<span class="md-ellipsis">
Функции ФС
</span>
</a>
<nav class="md-nav" aria-label="Функции ФС">
<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="#_13" class="md-nav__link">
<span class="md-ellipsis">
События
</span>
</a>
<nav class="md-nav" aria-label="События">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_14" class="md-nav__link">
<span class="md-ellipsis">
Объяснение
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_15" class="md-nav__link">
<span class="md-ellipsis">
Краткое изложение событий
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_16" class="md-nav__link">
<span class="md-ellipsis">
Системные события
</span>
</a>
<nav class="md-nav" aria-label="Системные события">
<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="#_17" class="md-nav__link">
<span class="md-ellipsis">
События, связанные с игрой
</span>
</a>
<nav class="md-nav" aria-label="События, связанные с игрой">
<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="#lua_1" class="md-nav__link">
<span class="md-ellipsis">
Миграция со старого Lua
</span>
</a>
<nav class="md-nav" aria-label="Миграция со старого Lua">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#lua_2" class="md-nav__link">
<span class="md-ellipsis">
Понять, как работает новый lua
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_18" class="md-nav__link">
<span class="md-ellipsis">
Найти и заменить
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_19" class="md-nav__link">
<span class="md-ellipsis">
Прощайте, темы, привет, таймеры событий!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_20" class="md-nav__link">
<span class="md-ellipsis">
Больше никаких неявных вызовов событий
</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="#3x" class="md-nav__link">
<span class="md-ellipsis">
Версия сервера 3.X
</span>
</a>
<nav class="md-nav" aria-label="Версия сервера 3.X">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Введение
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Структура каталога
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lua" class="md-nav__link">
<span class="md-ellipsis">
Файлы Lua
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
События
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Пользовательские события
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Таймеры событий («Потоки»)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
Отладка
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Пользовательские команды
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api" class="md-nav__link">
<span class="md-ellipsis">
Ссылка на API
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
Встроенные функции
</span>
</a>
<nav class="md-nav" aria-label="Встроенные функции">
<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="#_10" class="md-nav__link">
<span class="md-ellipsis">
Функции МП
</span>
</a>
<nav class="md-nav" aria-label="Функции МП">
<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="#_11" class="md-nav__link">
<span class="md-ellipsis">
Утилитарные функции
</span>
</a>
<nav class="md-nav" aria-label="Утилитарные функции">
<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-330" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(params: ...) и др. (начиная с версии 3.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="#_12" class="md-nav__link">
<span class="md-ellipsis">
Функции ФС
</span>
</a>
<nav class="md-nav" aria-label="Функции ФС">
<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="#_13" class="md-nav__link">
<span class="md-ellipsis">
События
</span>
</a>
<nav class="md-nav" aria-label="События">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_14" class="md-nav__link">
<span class="md-ellipsis">
Объяснение
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_15" class="md-nav__link">
<span class="md-ellipsis">
Краткое изложение событий
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_16" class="md-nav__link">
<span class="md-ellipsis">
Системные события
</span>
</a>
<nav class="md-nav" aria-label="Системные события">
<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="#_17" class="md-nav__link">
<span class="md-ellipsis">
События, связанные с игрой
</span>
</a>
<nav class="md-nav" aria-label="События, связанные с игрой">
<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="#lua_1" class="md-nav__link">
<span class="md-ellipsis">
Миграция со старого Lua
</span>
</a>
<nav class="md-nav" aria-label="Миграция со старого Lua">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#lua_2" class="md-nav__link">
<span class="md-ellipsis">
Понять, как работает новый lua
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_18" class="md-nav__link">
<span class="md-ellipsis">
Найти и заменить
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_19" class="md-nav__link">
<span class="md-ellipsis">
Прощайте, темы, привет, таймеры событий!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_20" class="md-nav__link">
<span class="md-ellipsis">
Больше никаких неявных вызовов событий
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Навигация" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../../../" class="md-path__link">
<span class="md-ellipsis">
Главная
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../mod-reference/" class="md-path__link">
<span class="md-ellipsis">
Справочник по скриптингу
</span>
</a>
</li>
<li class="md-path__item">
<a href="./" class="md-path__link">
<span class="md-ellipsis">
Сервер
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<a href="https://github.com/beammp/docs/edit/main/docs/ru/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/ru/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 предупреждение">
<p class="admonition-title">Этот сайт находится в стадии разработки!</p>
</div>
<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>Над этим сайтом ведется активная работа.
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>Чувствуете, что можете помочь? Пожалуйста, сделайте это, нажав на страницу с карандашом справа!
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>Это можно сделать на любой странице.
</span></code></pre></div>
<h1 id="_1">Справочник по серверным скриптам</h1>
<h2 id="3x">Версия сервера 3.X</h2>
<h3 id="_2">Введение</h3>
<p>Выпуск BeamMP-Server v3.0.0 вносит радикальные изменения в работу системы плагинов Lua. Нет возможности использовать старый lua с новым сервером, поэтому вам придется мигрировать.</p>
<p>Система плагинов сервера использует <a href="https://www.lua.org/manual/5.3/">Lua 5.3</a> . В этом разделе подробно описывается, как начать писать плагины, изучаются некоторые базовые концепции и начинается работа с вашим первым плагином. <strong>Рекомендуется прочитать этот раздел, даже если вы знакомы с системой до версии 3.0.0, так как некоторые вещи кардинально изменились</strong> .</p>
<p>Руководство по миграции с lua до версии 3.0.0 см. в разделе <a href="#migrating-from-old-lua">«Миграция со старой версии Lua»</a> .</p>
<h3 id="_3">Структура каталога</h3>
<p>Серверные плагины, в отличие от модов, располагаются (по умолчанию) в <code>Resources/Server</code> , тогда как моды, которые пишутся для BeamNG.drive и отправляются клиентам, находятся в <code>Resources/Client</code> . Каждый плагин должен иметь свою собственную подпапку в <code>Resources/Server</code> , например, для плагина с именем "MyPlugin" структура будет следующей:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Resources
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>└── Server
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> ├── MyPlugin
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> │ └── main.lua
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> └── SomeOtherPlugin
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> └── ...
</span></code></pre></div>
<p>Здесь мы также отображаем другой плагин под названием "SomeOtherPlugin", чтобы проиллюстрировать, как ваша папка <code>Resources/Server</code> может иметь несколько различных папок плагинов. Мы продолжим использовать эту структуру каталогов в качестве примера на протяжении всего этого руководства.</p>
<p>Вы также заметите <code>main.lua</code> . У вас может быть столько файлов Lua <code>.lua</code> , сколько вам нужно. Все файлы Lua в главном каталоге вашего плагина загружаются в <em>алфавитном порядке</em> (поэтому <code>aaa.lua</code> запускается перед <code>bbb.lua</code> ).</p>
<h3 id="lua">Файлы Lua</h3>
<p>Каждый файл Lua <code>.lua</code> в папке плагина загружается при запуске сервера. Это означает, что операторы вне функций оцениваются («запускаются») немедленно.</p>
<p>Файлы Lua в подпапках игнорируются, но могут быть <code>require()</code> .</p>
<p>Например, наш <code>main.lua</code> выглядит так:</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">PrintMyName</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="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-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="kr">end</span>
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-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>Когда сервер запустится и загрузится <code>main.lua</code> , он <em>немедленно</em> запустит <code>print("What's up!")</code> , но пока <strong>НЕ</strong> <em>вызовет</em> функцию <code>PrintMyName</code> (потому что она не была вызвана)!</p>
<h3 id="_4">События</h3>
<p>Событие — это что-то вроде «игрок присоединяется», «игрок отправил сообщение в чате», «игрок создал транспортное средство».</p>
<p>Вы можете отменить события (если они отменяемы), вернув <code>1</code> из обработчика.</p>
<p>В Lua вы обычно хотите реагировать на некоторые из них. Для этого вы можете зарегистрировать "Handler". Это функция, которая вызывается, когда происходит событие, и получает некоторые аргументы.</p>
<p>Пример:</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="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-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="c1">-- censoring only the exact message &#39;darn&#39;</span>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-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-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="c1">-- cancel the event by returning 1</span>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-3-8"><a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-3-9"><a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="kr">end</span>
</span><span id="__span-3-10"><a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a>
</span><span id="__span-3-11"><a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-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>Это фактически гарантирует, что любое сообщение, которое в точности равно "darn", не будет отправлено и не будет показано в чате (обратите внимание, что для настоящего фильтра ненормативной лексики вам нужно будет проверить, <em>содержит</em> ли сообщение "darn", а не <em>является</em> ли оно "darn"). Отмена события приводит к тому, что оно не происходит, например, сообщение чата не будет показано никому другому, транспортное средство не будет создано и т. д.</p>
<h3 id="_5">Пользовательские события</h3>
<p>Вы можете зарегистрироваться на любое понравившееся вам мероприятие, например:</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="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>Затем вы можете инициировать эти пользовательские события:</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="c1">-- call all event handlers to this in ALL plugins</span>
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-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-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="c1">-- call all event handlers to this in THIS plugin</span>
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-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>С событиями можно делать гораздо больше, но эти возможности будут подробно рассмотрены ниже в справочнике по API.</p>
<h3 id="_6">Таймеры событий («Потоки»)</h3>
<p>До версии 3.0.0 Lua имела концепцию "потоков", которые запускались X раз в секунду. Такое наименование было немного обманчивым, поскольку они были синхронными.</p>
<p>v3.0.0 Lua вместо этого имеет "Таймеры событий". Это таймеры, которые работают внутри сервера, и как только они заканчиваются, они запускают событие (глобально). Это также синхронно. Пожалуйста, имейте в виду, что второй аргумент - это интервал в миллисекундах.</p>
<p>Пример:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-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-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="kr">function</span><span class="w"> </span><span class="nf">CountSeconds</span><span class="p">()</span>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-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-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="kr">end</span>
</span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>
</span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="c1">-- create a custom event called &#39;EverySecond&#39;</span>
</span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="c1">-- and register the handler function &#39;CountSeconds&#39; to it</span>
</span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-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-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>
</span><span id="__span-6-11"><a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="c1">-- create a timer for this event, which will fire every 1000ms (1s)</span>
</span><span id="__span-6-12"><a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-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>Это приведет к тому, что "CountSeconds" будет вызываться каждую секунду. Вы также можете отменить таймеры событий с помощью <code>MP.CancelEventTimer</code> (см. справочник API).</p>
<p>С консоли сервера вы можете запустить <code>status</code> , чтобы увидеть, сколько таймеров событий запущено в данный момент, а также информацию об ожидающих обработчиках событий. Эта команда покажет больше информации в будущем.</p>
<h3 id="_7">Отладка</h3>
<p>Lua трудно отлаживать. К сожалению, для встроенного Lua не существует отладчика промышленного уровня, такого как <code>gdb</code> .</p>
<p>В общем случае вы, конечно, можете в любое время просто <code>print()</code> значения, которые хотите проверить.</p>
<p>В версии 3.0.0 сервер предоставляет вам возможность внедрить интерпретатор в плагин и впоследствии запустить Lua внутри него в реальном времени. Это самое близкое, что у нас есть к отладчику.</p>
<p>Предположим, у вас есть плагин, который мы назвали <code>MyPlugin</code> , вы можете войти в его состояние Lua следующим образом:</p>
<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>&gt; lua MyPlugin
</span></code></pre></div>
<p>Здесь важны заглавные буквы, поэтому будьте внимательны, чтобы они были введены правильно. Вывод будет примерно таким:</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;
</span></code></pre></div>
<p>Как видите, мы перешли в состояние Lua для <code>MyPlugin</code> . С этого момента и до тех пор, пока мы не войдем в <code>exit()</code> (с версии 3.1.0 <code>:exit</code> ), мы будем в <code>MyPlugin</code> и сможем выполнить Lua там.</p>
<p>Например, если у нас есть глобальный объект с именем <code>MyValue</code> , мы можем вывести это значение следующим образом:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>lua @MyPlugin&gt; print(MyValue)
</span></code></pre></div>
<p>Здесь вы можете вызывать функции и делать все, что вам нужно.</p>
<p>Начиная с версии 3.1.0: Вы можете нажать клавишу TAB для автодополнения функций и переменных.</p>
<p>ВНИМАНИЕ: К сожалению, если состояние Lua в данный момент занято выполнением другого кода (например, цикла <code>while</code> ), это может полностью повесить консоль до тех пор, пока она не завершит эту работу, поэтому будьте очень осторожны, переключаясь на состояния, которые могут ожидать чего-то.</p>
<p>Кроме того, вы можете запустить <code>status</code> в обычной консоли ( <code>&gt;</code> ), которая покажет вам, среди прочего, некоторую статистику о Lua.</p>
<h3 id="_8">Пользовательские команды</h3>
<p>Для реализации пользовательских команд для консоли сервера можно использовать событие <code>onConsoleInput</code> . Это может быть полезно, когда вы хотите добавить способ для владельца сервера подать сигнал на ваш плагин или отобразить внутреннее состояние пользовательским способом.</p>
<p>Вот пример:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-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-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-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-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-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-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-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-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-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-10-6"><a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">message</span>
</span><span id="__span-10-7"><a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-10-8"><a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-10-9"><a id="__codelineno-10-9" name="__codelineno-10-9" href="#__codelineno-10-9"></a><span class="kr">end</span>
</span><span id="__span-10-10"><a id="__codelineno-10-10" name="__codelineno-10-10" href="#__codelineno-10-10"></a>
</span><span id="__span-10-11"><a id="__codelineno-10-11" name="__codelineno-10-11" href="#__codelineno-10-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>Это позволит вам выполнять следующие действия в консоли сервера:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>&gt; print hello, world
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a>hello, world
</span></code></pre></div>
<p>Мы реализовали собственную <code>print</code> . В качестве упражнения попробуйте создать функцию, подобную <code>say</code> , которая отправляет сообщение чата всем игрокам или даже конкретному игроку (с помощью <code>MP.SendChatMessage</code> ).</p>
<p><strong>Внимание:</strong> для ваших собственных плагинов обычно рекомендуется "пространство имен". Наш пример <code>print</code> в плагине с именем <code>mystuff</code> может называться <code>mystuff.print</code> или <code>ms.print</code> или что-то подобное.</p>
<h3 id="api">Ссылка на API</h3>
<p>Формат документации: <code>function_name(arg_name: arg_type, arg_name: arg_type) -&gt; return_types</code></p>
<h3 id="_9">Встроенные функции</h3>
<h4 id="print-printraw"><code>print(...)</code> , <code>printRaw(...)</code></h4>
<p>Выводит сообщение на консоль сервера с префиксом <code>[DATE TIME] [LUA]</code> . Если вам не нужен этот префикс, вы можете использовать <code>printRaw(...)</code> .</p>
<p>Пример:</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">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-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-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>Он может принимать столько аргументов произвольных типов, сколько вам нужно. Он также с радостью выгрузит таблицы!</p>
<p>Это похоже на <code>print</code> интерпретатора lua, поэтому она будет вставлять символы табуляции между аргументами.</p>
<h4 id="exit"><code>exit()</code></h4>
<p>Корректно завершает работу сервера. Вызывает срабатывание события <code>onShutdown</code> .</p>
<h3 id="_10">Функции МП</h3>
<h4 id="mpcreatetimer-timer"><code>MP.CreateTimer() -&gt; Timer</code></h4>
<p>Создает объект таймера, который можно использовать для отслеживания того, сколько времени заняло что-то / сколько времени прошло. Он запускается после создания и может быть сброшен/перезапущен с помощью <code>mytimer:Start()</code> .</p>
<p>Текущее прошедшее время в секундах можно получить с помощью <code>mytimer:GetCurrent()</code> .</p>
<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">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-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="c1">-- do stuff here that needs to be timed</span>
</span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-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>Таймеры не нужно останавливать (и их невозможно остановить), они не создают накладных расходов.</p>
<h4 id="mpgetosname-string"><code>MP.GetOSName() -&gt; string</code></h4>
<p>Возвращает имя текущей ОС: <code>Windows</code> , <code>Linux</code> или <code>Other</code> .</p>
<h4 id="mpgetserverversion-numbernumbernumber"><code>MP.GetServerVersion() -&gt; number,number,number</code></h4>
<p>Возвращает текущую версию сервера в формате major, minor, patch. Например, версия v3.0.0 вернет <code>3, 0, 0</code> .</p>
<p>Пример:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-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-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-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>
<p>Выход:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>2 4 0
</span></code></pre></div>
<h4 id="mpregistereventevent_name-string-function_name-string"><code>MP.RegisterEvent(event_name: string, function_name: string)</code></h4>
<p>Запоминает функцию с именем Имя <code>Function Name</code> как обработчик события с именем <code>Event Name</code> .</p>
<p>Вы можете зарегистрировать столько обработчиков события, сколько захотите.</p>
<p>Список событий, предоставляемых сервером, можно посмотреть <a href="#events-1">здесь</a> .</p>
<p>Если событие с таким именем не существует, оно создается, и, таким образом, RegisterEvent не может завершиться неудачей. Это можно использовать для создания пользовательских событий. Подробнее см. в разделах <a href="#custom-events">Пользовательские события</a> и <a href="#events">События</a> .</p>
<p>Пример:</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="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-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-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-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-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-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-16-6"><a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a><span class="kr">end</span>
</span><span id="__span-16-7"><a id="__codelineno-16-7" name="__codelineno-16-7" href="#__codelineno-16-7"></a>
</span><span id="__span-16-8"><a id="__codelineno-16-8" name="__codelineno-16-8" href="#__codelineno-16-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>Запускает таймер внутри сервера, который запускает событие <code>event_name</code> каждые <code>interval_ms</code> миллисекунд.</p>
<p>Таймеры событий можно отменить с помощью <code>MP.CancelEventTimer</code> .</p>
<p>Интервалы &lt;25 мс не рекомендуются, так как несколько таких интервалов, скорее всего, не будут обслуживаться вовремя надежно. Хотя несколько таймеров могут быть запущены для одного и того же события, рекомендуется создавать как можно меньше таймеров событий. Например, если вам нужно одно событие, которое запускается каждые полсекунды, и одно, которое запускается каждую секунду, рассмотрите возможность создания просто события каждые полсекунды и запуска триггера every-second-functiosecond.</p>
<p>Вы также можете использовать <code>MP.CreateTimer</code> для создания таймера и измерения времени, прошедшего с момента последнего вызова события, чтобы минимизировать таймеры событий, хотя это не обязательно рекомендуется, поскольку это значительно увеличивает сложность кода.</p>
<p><strong>Начиная с версии 3.0.2:</strong></p>
<p>Необязательный <code>CallStrategy</code> может быть указан в качестве третьего аргумента. Это может быть:</p>
<ul>
<li><code>MP.CallStrategy.BestEffort</code> (по умолчанию): попытается запустить событие с указанным интервалом, но откажется ставить обработчики в очередь, если выполнение обработчика займет слишком много времени.</li>
<li><code>MP.CallStrategy.Precise</code> : будет ставить обработчики событий в очередь с точным указанным интервалом. Может привести к заполнению очереди, если обработчику требуется больше времени, чем интервал. Используйте только если вам НУЖЕН точный интервал.</li>
</ul>
<h4 id="mpcanceleventtimerevent_name-string"><code>MP.CancelEventTimer(event_name: string)</code></h4>
<p>Отменяет все таймеры для события с именем <code>event_name</code> В некоторых случаях таймер может сработать еще один раз, прежде чем будет отменен, из-за особенностей асинхронного программирования.</p>
<h4 id="mptriggerlocaleventevent_name-string-table"><code>MP.TriggerLocalEvent(event_name: string, ...) -&gt; table</code></h4>
<p>Синхронный триггер событий локального плагина.</p>
<p>Запускает локальное событие, которое приводит к вызову всех обработчиков этого события <em>в текущем состоянии lua</em> (обычно в текущем плагине, если состояние не было передано через PluginConfig.toml).</p>
<p>Вы можете передать этой функции аргументы ( <code>...</code> ), которые копируются и отправляются всем обработчикам как аргументы функции.</p>
<p>Этот вызов является синхронным и вернет управление после завершения всех обработчиков событий.</p>
<p>Возвращаемое значение — это таблица всех результатов. Если обработчик вернул значение, оно будет в этой таблице, неаннотированное и неименованное. Это можно использовать для «сбора» вещей или регистрации подобработчиков для событий, которые можно отменить. Это практически массив.</p>
<p>Пример:</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">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-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-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>Глобальный асинхронный триггер событий.</p>
<p>Запускает глобальное событие, которое приводит к вызову всех обработчиков этого события <em>во всех плагинах</em> (включая <em>этот</em> плагин).</p>
<p>Вы можете передать этой функции аргументы ( <code>...</code> ), которые копируются и отправляются всем обработчикам как аргументы функции.</p>
<p>Этот вызов асинхронный и возвращает объект, подобный будущему. Локальные обработчики (обработчики в том же плагине, что и вызывающий) запускаются синхронно и немедленно.</p>
<p>Возвращаемая таблица имеет две функции:</p>
<ul>
<li><code>IsDone() -&gt; boolean</code> сообщает, все ли обработчики завершились. Вы можете подождать, пока это не станет правдой, проверив это и <code>MP.Sleep</code> -ing на некоторое время в цикле.</li>
<li><code>GetResults() -&gt; table</code> возвращает неаннотированную неименованную таблицу со всеми возвращаемыми значениями всех обработчиков. Это практически массив.</li>
</ul>
<p>Обязательно вызывайте их с помощью синтаксиса <code>Obj:Function()</code> ( <code>:</code> , NOT <code>.</code> ).</p>
<p>Пример:</p>
<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="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-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="c1">-- wait until handlers finished</span>
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-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-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-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-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="kr">end</span>
</span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-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-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-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>Имейте в виду, что обработчик, регистрирующийся здесь в "MyEvent" и никогда не возвращающийся, может заблокировать ваш плагин. Вероятно, вы захотите отслеживать, как долго вы ждали, и прекратить ожидание через несколько секунд.</p>
<h4 id="mpsleeptime_ms-number"><code>MP.Sleep(time_ms: number)</code></h4>
<p>Ожидает в течение указанного в миллисекундах времени.</p>
<p>Это не приведет к выполнению состояния lua, и в состоянии сна ничего не будет выполнено.</p>
<p>ВНИМАНИЕ: НЕ засыпайте более чем на 500 мс, если у вас зарегистрированы обработчики событий, если вы <em>точно</em> не знаете, что делаете. Это предназначено для использования в режиме сна на 1-100 мс, чтобы дождаться результатов или чего-то подобного. Заблокированное (спящее) состояние lua может существенно замедлить работу всего сервера, если не соблюдать осторожность.</p>
<h4 id="mpsendchatmessageplayer_id-number-message-string"><code>MP.SendChatMessage(player_id: number, message: string)</code></h4>
<p>Отправляет сообщение чата, которое может видеть только указанный игрок (или все, если идентификатор <code>-1</code> ). В игре это не будет отображаться как направленное сообщение.</p>
<p>Вы можете использовать это, например, чтобы сообщить игроку <em>, почему</em> вы отменили появление его транспортного средства, отправить сообщение в чате или что-то подобное, или чтобы отобразить некоторую информацию о вашем сервере.</p>
<p>Пример:</p>
<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="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-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="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-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">1</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">else</span>
</span><span id="__span-19-6"><a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-19-7"><a id="__codelineno-19-7" name="__codelineno-19-7" href="#__codelineno-19-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-19-8"><a id="__codelineno-19-8" name="__codelineno-19-8" href="#__codelineno-19-8"></a><span class="kr">end</span>
</span><span id="__span-19-9"><a id="__codelineno-19-9" name="__codelineno-19-9" href="#__codelineno-19-9"></a>
</span><span id="__span-19-10"><a id="__codelineno-19-10" name="__codelineno-19-10" href="#__codelineno-19-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>
<p>Пример 2:</p>
<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="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-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-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-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-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-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a><span class="kr">end</span>
</span></code></pre></div>
<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>до версии 3.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>начиная с версии 3.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>начиная с версии 3.1.0</em></p>
<p>Вызовет указанное событие с указанными данными на указанном клиенте (-1 для трансляции). Это событие затем может быть обработано в клиентском lua mod, см. документацию "Client Scripting" для этого.</p>
<p>Вернет <code>true</code> если сообщение удалось отправить (для <code>id = -1</code> , поэтому для трансляций это всегда <code>true</code> ), и <code>false</code> если игрок с таким идентификатором не существует или отключен, но у него все еще есть идентификатор (это известная проблема).</p>
<p>Если возвращается <code>false</code> , нет смысла повторять это событие, и не следует ожидать ответа (если таковой ожидался).</p>
<p>Начиная с версии 3.1.0, второе возвращаемое значение содержит сообщение об ошибке, если функция не удалась. Также, начиная с этой версии, версия функции <code>*Json</code> принимает таблицу в качестве аргумента данных и преобразует ее в json. Это просто сокращение для <code>MP.TriggerClientEvent(..., Util.JsonEncode(mytable))</code> .</p>
<h4 id="mpgetplayercount-number"><code>MP.GetPlayerCount() -&gt; number</code></h4>
<p>Возвращает количество игроков, находящихся в данный момент на сервере.</p>
<h4 id="mpgetpositionrawpid-number-vid-number-tablestring"><code>MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string</code></h4>
<p>Возвращает текущую позицию транспортного средства <code>vid</code> (идентификатор транспортного средства) игрока <code>pid</code> (идентификатор игрока) и строку ошибки, если произошла ошибка.</p>
<p>Таблица декодируется из пакета позиции, поэтому она содержит разнообразные данные, включая позицию и поворот (именно поэтому эта функция имеет постфикс «Raw»).</p>
<p>Пример:</p>
<div class="language-lua 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="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-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-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-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a>
</span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-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-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a>
</span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-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-21-7"><a id="__codelineno-21-7" name="__codelineno-21-7" href="#__codelineno-21-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-21-8"><a id="__codelineno-21-8" name="__codelineno-21-8" href="#__codelineno-21-8"></a><span class="kr">else</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="nb">print</span><span class="p">(</span><span class="nb">error</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="kr">end</span>
</span></code></pre></div>
<p>Выход:</p>
<div class="language-json 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="w"> </span><span class="p">{</span>
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-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-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-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-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-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-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-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-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-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-22-7"><a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a><span class="w"> </span><span class="p">},</span>
</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="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-22-9"><a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-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-22-10"><a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-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-22-11"><a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-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-22-12"><a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a><span class="w"> </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="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-22-14"><a id="__codelineno-22-14" name="__codelineno-22-14" href="#__codelineno-22-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-22-15"><a id="__codelineno-22-15" name="__codelineno-22-15" href="#__codelineno-22-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-22-16"><a id="__codelineno-22-16" name="__codelineno-22-16" href="#__codelineno-22-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-22-17"><a id="__codelineno-22-17" name="__codelineno-22-17" href="#__codelineno-22-17"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-22-18"><a id="__codelineno-22-18" name="__codelineno-22-18" href="#__codelineno-22-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-22-19"><a id="__codelineno-22-19" name="__codelineno-22-19" href="#__codelineno-22-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-22-20"><a id="__codelineno-22-20" name="__codelineno-22-20" href="#__codelineno-22-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-22-21"><a id="__codelineno-22-21" name="__codelineno-22-21" href="#__codelineno-22-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-22-22"><a id="__codelineno-22-22" name="__codelineno-22-22" href="#__codelineno-22-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-22-23"><a id="__codelineno-22-23" name="__codelineno-22-23" href="#__codelineno-22-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-22-24"><a id="__codelineno-22-24" name="__codelineno-22-24" href="#__codelineno-22-24"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-22-25"><a id="__codelineno-22-25" name="__codelineno-22-25" href="#__codelineno-22-25"></a><span class="p">}</span>
</span></code></pre></div>
<p>Пример 2:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-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-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-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-23-3"><a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a>
</span><span id="__span-23-4"><a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-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-23-5"><a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-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-23-6"><a id="__codelineno-23-6" name="__codelineno-23-6" href="#__codelineno-23-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-23-7"><a id="__codelineno-23-7" name="__codelineno-23-7" href="#__codelineno-23-7"></a>
</span><span id="__span-23-8"><a id="__codelineno-23-8" name="__codelineno-23-8" href="#__codelineno-23-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-23-9"><a id="__codelineno-23-9" name="__codelineno-23-9" href="#__codelineno-23-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-23-10"><a id="__codelineno-23-10" name="__codelineno-23-10" href="#__codelineno-23-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-23-11"><a id="__codelineno-23-11" name="__codelineno-23-11" href="#__codelineno-23-11"></a><span class="kr">else</span>
</span><span id="__span-23-12"><a id="__codelineno-23-12" name="__codelineno-23-12" href="#__codelineno-23-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-23-13"><a id="__codelineno-23-13" name="__codelineno-23-13" href="#__codelineno-23-13"></a><span class="kr">end</span>
</span></code></pre></div>
<p>Выход:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a>X: -603.459
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>Y: -175.078
</span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a>Z: 26.9505
</span></code></pre></div>
<h4 id="mpisplayerconnectedplayer_id-number-boolean"><code>MP.IsPlayerConnected(player_id: number) -&gt; boolean</code></h4>
<p>Подключен ли игрок и получил ли сервер от него UDP-пакет.</p>
<p>Пример:</p>
<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="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-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-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>
<p>Выход:</p>
<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="kc">true</span>
</span></code></pre></div>
<h4 id="mpgetplayernameplayer_id-number-string"><code>MP.GetPlayerName(player_id: number) -&gt; string</code></h4>
<p>Получает отображаемое имя игрока.</p>
<p>Пример:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-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-27-2"><a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-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>
<p>Выход:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a>ilovebeammp2004
</span></code></pre></div>
<h4 id="mpremovevehicleplayer_id-number-vehicle_id-number"><code>MP.RemoveVehicle(player_id: number, vehicle_id: number)</code></h4>
<p>Удаляет указанное транспортное средство для указанного игрока.</p>
<p>Пример:</p>
<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="c1">-- Loop over all of player 3&#39;s vehicles and delete them</span>
</span><span id="__span-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-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-29-6"><a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-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-29-7"><a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="mpgetplayervehiclesplayer_id-number-table"><code>MP.GetPlayerVehicles(player_id: number) -&gt; table</code></h4>
<p>Возвращает таблицу всех транспортных средств, которые в данный момент есть у игрока. Каждая запись в таблице представляет собой сопоставление идентификатора транспортного средства с данными о транспортном средстве (которые в настоящее время являются необработанной строкой json).</p>
<p>Пример:</p>
<div class="language-lua 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="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-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-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-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a>
</span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-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-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-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-30-6"><a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-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-30-7"><a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-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-30-8"><a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a><span class="kr">end</span>
</span></code></pre></div>
<p>Выход:</p>
<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="err">pid</span><span class="p">:</span><span class="w"> </span><span class="mi">0</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="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-31-4"><a id="__codelineno-31-4" name="__codelineno-31-4" href="#__codelineno-31-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-31-5"><a id="__codelineno-31-5" name="__codelineno-31-5" href="#__codelineno-31-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-31-6"><a id="__codelineno-31-6" name="__codelineno-31-6" href="#__codelineno-31-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-31-7"><a id="__codelineno-31-7" name="__codelineno-31-7" href="#__codelineno-31-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-31-8"><a id="__codelineno-31-8" name="__codelineno-31-8" href="#__codelineno-31-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-31-9"><a id="__codelineno-31-9" name="__codelineno-31-9" href="#__codelineno-31-9"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-10"><a id="__codelineno-31-10" name="__codelineno-31-10" href="#__codelineno-31-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-31-11"><a id="__codelineno-31-11" name="__codelineno-31-11" href="#__codelineno-31-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-31-12"><a id="__codelineno-31-12" name="__codelineno-31-12" href="#__codelineno-31-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-31-13"><a id="__codelineno-31-13" name="__codelineno-31-13" href="#__codelineno-31-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-31-14"><a id="__codelineno-31-14" name="__codelineno-31-14" href="#__codelineno-31-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-31-15"><a id="__codelineno-31-15" name="__codelineno-31-15" href="#__codelineno-31-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-31-16"><a id="__codelineno-31-16" name="__codelineno-31-16" href="#__codelineno-31-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-31-17"><a id="__codelineno-31-17" name="__codelineno-31-17" href="#__codelineno-31-17"></a><span class="w"> </span><span class="c1">// ... continue</span>
</span><span id="__span-31-18"><a id="__codelineno-31-18" name="__codelineno-31-18" href="#__codelineno-31-18"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-19"><a id="__codelineno-31-19" name="__codelineno-31-19" href="#__codelineno-31-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-31-20"><a id="__codelineno-31-20" name="__codelineno-31-20" href="#__codelineno-31-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-31-21"><a id="__codelineno-31-21" name="__codelineno-31-21" href="#__codelineno-31-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-31-22"><a id="__codelineno-31-22" name="__codelineno-31-22" href="#__codelineno-31-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-31-23"><a id="__codelineno-31-23" name="__codelineno-31-23" href="#__codelineno-31-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-31-24"><a id="__codelineno-31-24" name="__codelineno-31-24" href="#__codelineno-31-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-31-25"><a id="__codelineno-31-25" name="__codelineno-31-25" href="#__codelineno-31-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-31-26"><a id="__codelineno-31-26" name="__codelineno-31-26" href="#__codelineno-31-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-31-27"><a id="__codelineno-31-27" name="__codelineno-31-27" href="#__codelineno-31-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-31-28"><a id="__codelineno-31-28" name="__codelineno-31-28" href="#__codelineno-31-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-31-29"><a id="__codelineno-31-29" name="__codelineno-31-29" href="#__codelineno-31-29"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-30"><a id="__codelineno-31-30" name="__codelineno-31-30" href="#__codelineno-31-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-31-31"><a id="__codelineno-31-31" name="__codelineno-31-31" href="#__codelineno-31-31"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// ... continue</span>
</span><span id="__span-31-32"><a id="__codelineno-31-32" name="__codelineno-31-32" href="#__codelineno-31-32"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-33"><a id="__codelineno-31-33" name="__codelineno-31-33" href="#__codelineno-31-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-31-34"><a id="__codelineno-31-34" name="__codelineno-31-34" href="#__codelineno-31-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-31-35"><a id="__codelineno-31-35" name="__codelineno-31-35" href="#__codelineno-31-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-31-36"><a id="__codelineno-31-36" name="__codelineno-31-36" href="#__codelineno-31-36"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-37"><a id="__codelineno-31-37" name="__codelineno-31-37" href="#__codelineno-31-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-31-38"><a id="__codelineno-31-38" name="__codelineno-31-38" href="#__codelineno-31-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-31-39"><a id="__codelineno-31-39" name="__codelineno-31-39" href="#__codelineno-31-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-31-40"><a id="__codelineno-31-40" name="__codelineno-31-40" href="#__codelineno-31-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-31-41"><a id="__codelineno-31-41" name="__codelineno-31-41" href="#__codelineno-31-41"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-42"><a id="__codelineno-31-42" name="__codelineno-31-42" href="#__codelineno-31-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-31-43"><a id="__codelineno-31-43" name="__codelineno-31-43" href="#__codelineno-31-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-31-44"><a id="__codelineno-31-44" name="__codelineno-31-44" href="#__codelineno-31-44"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="mpgetplayers-table"><code>MP.GetPlayers() -&gt; table</code></h4>
<p>Возвращает таблицу всех подключенных игроков. Эта таблица сопоставляет идентификаторы с именами, например:</p>
<div class="language-json 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="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="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-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-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-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="mpisplayerguestplayer_id-number-boolean"><code>MP.IsPlayerGuest(player_id: number) -&gt; boolean</code></h4>
<p>Является ли игрок гостем. Гость — это тот, кто не вошел в систему, а вместо этого решил играть как гость. Обычно его имя — <code>guest</code> за которым следует длинный номер.</p>
<p>Поскольку гости анонимны, вы можете запретить им присоединяться. В этом случае рекомендуется использовать аргумент <a href="#onplayerauth"><code>onPlayerAuth</code></a> <code>is_guest</code> .</p>
<h4 id="mpdropplayerplayer_id-number-reason-string"><code>MP.DropPlayer(player_id: number, [reason: string])</code></h4>
<p>Выгоняет игрока с указанным ID. Параметр причины необязателен.</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="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-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-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-33-3"><a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-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-33-4"><a id="__codelineno-33-4" name="__codelineno-33-4" href="#__codelineno-33-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-33-5"><a id="__codelineno-33-5" name="__codelineno-33-5" href="#__codelineno-33-5"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-33-6"><a id="__codelineno-33-6" name="__codelineno-33-6" href="#__codelineno-33-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-33-7"><a id="__codelineno-33-7" name="__codelineno-33-7" href="#__codelineno-33-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-33-8"><a id="__codelineno-33-8" name="__codelineno-33-8" href="#__codelineno-33-8"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="mpgetstatememoryusage-number"><code>MP.GetStateMemoryUsage() -&gt; number</code></h4>
<p>Возвращает использование памяти текущим состоянием Lua в байтах.</p>
<h4 id="mpgetluamemoryusage-number"><code>MP.GetLuaMemoryUsage() -&gt; number</code></h4>
<p>Возвращает использование памяти всеми состояниями lua в байтах.</p>
<h4 id="mpgetplayeridentifiersplayer_id-number-table"><code>MP.GetPlayerIdentifiers(player_id: number) -&gt; table</code></h4>
<p>Возвращает таблицу с информацией об игроке, такой как идентификатор форума BeamMP, IP-адрес и идентификатор учетной записи Discord. Discord ID будет возвращен только в том случае, если пользователь связал его со своей учетной записью форума.</p>
<p>Вы можете найти идентификатор форума пользователя, перейдя по адресу <code>https://forum.beammp.com/u/USERNAME.json</code> и выполнив поиск по запросу <code>"user": {"id": 123456}</code> . Идентификатор BeamMP уникален для проигрывателя и не может быть изменен в отличие от имени пользователя.</p>
<p>Пример:</p>
<div class="language-lua 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="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-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-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>
<p>Выход:</p>
<div class="language-json 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="p">{</span>
</span><span id="__span-35-2"><a id="__codelineno-35-2" name="__codelineno-35-2" href="#__codelineno-35-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-35-3"><a id="__codelineno-35-3" name="__codelineno-35-3" href="#__codelineno-35-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-35-4"><a id="__codelineno-35-4" name="__codelineno-35-4" href="#__codelineno-35-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-35-5"><a id="__codelineno-35-5" name="__codelineno-35-5" href="#__codelineno-35-5"></a><span class="p">}</span>
</span></code></pre></div>
<p><em>До версии 3.1.0 поле <code>ip</code> было неверным и не работало как задумано. Исправлено в версии 3.1.0.</em></p>
<h4 id="mpsetsetting-number"><code>MP.Set(setting: number, ...)</code></h4>
<p>Временно устанавливает параметр ServerConfig. Для этого полезна таблица <code>MP.Settings</code> .</p>
<p>Пример:</p>
<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="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>
<h4 id="mpsettings-table"><code>MP.Settings -&gt; table</code></h4>
<p>Таблица карты настройки идентификаторов для имени. Используется с <code>MP.Set</code> для изменения настроек ServerConfig.</p>
<p>Пример:</p>
<div class="language-lua 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="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>
<p>Выход:</p>
<div class="language-json 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="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="err">MaxPlayers</span><span class="p">:</span><span class="w"> </span><span class="mi">3</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="err">Debug</span><span class="p">:</span><span class="w"> </span><span class="mi">0</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="err">Name</span><span class="p">:</span><span class="w"> </span><span class="mi">5</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="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-38-6"><a id="__codelineno-38-6" name="__codelineno-38-6" href="#__codelineno-38-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-38-7"><a id="__codelineno-38-7" name="__codelineno-38-7" href="#__codelineno-38-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-38-8"><a id="__codelineno-38-8" name="__codelineno-38-8" href="#__codelineno-38-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-38-9"><a id="__codelineno-38-9" name="__codelineno-38-9" href="#__codelineno-38-9"></a><span class="p">}</span>
</span></code></pre></div>
<h3 id="_11">Утилитарные функции</h3>
<h4 id="utiljson"><code>Util.Json*</code></h4>
<p>Начиная с BeamMP-Server <code>v3.1.0</code> .</p>
<p>Это встроенная библиотека JSON, которая обычно намного быстрее любой библиотеки Lua JSON. За кулисами используется библиотека C++ <code>nlohmann::json</code> , которая совместима с JSON, полностью протестирована и постоянно подвергается фаззингу.</p>
<h4 id="utiljsonencodetable-table-string"><code>Util.JsonEncode(table: table) -&gt; string</code></h4>
<p>Кодирует таблицу Lua в строку JSON, рекурсивно (таблицы внутри таблиц внутри таблиц ... работают как и ожидалось). Все примитивные типы учитываются, функции, пользовательские данные и т. п. игнорируются.</p>
<p>Полученный JSON минимизируется и может быть красиво выведен с помощью <code>Util.JsonPrettify</code> для его наглядности.</p>
<p>Пример:</p>
<div class="language-lua 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="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-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-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-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-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-39-4"><a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-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-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="p">}</span>
</span><span id="__span-39-6"><a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-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>
<div class="language-json 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="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>
<h4 id="utiljsondecodejson-string-table"><code>Util.JsonDecode(json: string) -&gt; table</code></h4>
<p>Декодирует JSON в таблицу Lua. Возвращает <code>nil</code> если это не удалось, и выводит ошибку.</p>
<p>Пример:</p>
<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="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-41-2"><a id="__codelineno-41-2" name="__codelineno-41-2" href="#__codelineno-41-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>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-42-1"><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a><span class="p">{</span>
</span><span id="__span-42-2"><a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-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-42-3"><a id="__codelineno-42-3" name="__codelineno-42-3" href="#__codelineno-42-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-42-4"><a id="__codelineno-42-4" name="__codelineno-42-4" href="#__codelineno-42-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="utiljsonprettifyjson-string-string"><code>Util.JsonPrettify(json: string) -&gt; string</code></h4>
<p>Добавьте отступы и новые строки в JSON, чтобы сделать его более читабельным для людей.</p>
<p>Пример:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-43-1"><a id="__codelineno-43-1" name="__codelineno-43-1" href="#__codelineno-43-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-43-2"><a id="__codelineno-43-2" name="__codelineno-43-2" href="#__codelineno-43-2"></a>
</span><span id="__span-43-3"><a id="__codelineno-43-3" name="__codelineno-43-3" href="#__codelineno-43-3"></a>print(Util.JsonPrettify(myjson))
</span></code></pre></div>
<p>Результаты в:</p>
<div class="language-json 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="p">{</span>
</span><span id="__span-44-2"><a id="__codelineno-44-2" name="__codelineno-44-2" href="#__codelineno-44-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-44-3"><a id="__codelineno-44-3" name="__codelineno-44-3" href="#__codelineno-44-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-44-4"><a id="__codelineno-44-4" name="__codelineno-44-4" href="#__codelineno-44-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-44-5"><a id="__codelineno-44-5" name="__codelineno-44-5" href="#__codelineno-44-5"></a><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span>
</span><span id="__span-44-6"><a id="__codelineno-44-6" name="__codelineno-44-6" href="#__codelineno-44-6"></a><span class="w"> </span><span class="s2">&quot;skill B&quot;</span>
</span><span id="__span-44-7"><a id="__codelineno-44-7" name="__codelineno-44-7" href="#__codelineno-44-7"></a><span class="w"> </span><span class="p">]</span>
</span><span id="__span-44-8"><a id="__codelineno-44-8" name="__codelineno-44-8" href="#__codelineno-44-8"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="utiljsonminifyjson-string-string"><code>Util.JsonMinify(json: string) -&gt; string</code></h4>
<p>Удаляет отступы, переносы строк и любые другие пробелы. Не обязательно, если вы не вызвали <code>Util.JsonPrettify</code> , так как весь вывод из <code>Util.Json*</code> уже минифицирован.</p>
<p>Пример:</p>
<div class="language-lua 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="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-45-2"><a id="__codelineno-45-2" name="__codelineno-45-2" href="#__codelineno-45-2"></a>
</span><span id="__span-45-3"><a id="__codelineno-45-3" name="__codelineno-45-3" href="#__codelineno-45-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>
<div class="language-json 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="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>
<h4 id="utiljsonflattenjson-string-string"><code>Util.JsonFlatten(json: string) -&gt; string</code></h4>
<p>Создает объект JSON, ключи которого сводятся к указателям JSON в соответствии с RFC 6901. Вы можете восстановить оригинал с помощью <code>Util.JsonUnflatten()</code> . Чтобы это работало, все значения должны быть примитивами.</p>
<p>Пример:</p>
<div class="language-lua 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="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-47-2"><a id="__codelineno-47-2" name="__codelineno-47-2" href="#__codelineno-47-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-47-3"><a id="__codelineno-47-3" name="__codelineno-47-3" href="#__codelineno-47-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-47-4"><a id="__codelineno-47-4" name="__codelineno-47-4" href="#__codelineno-47-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>
<div class="language-json 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="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-48-2"><a id="__codelineno-48-2" name="__codelineno-48-2" href="#__codelineno-48-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-48-3"><a id="__codelineno-48-3" name="__codelineno-48-3" href="#__codelineno-48-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-48-4"><a id="__codelineno-48-4" name="__codelineno-48-4" href="#__codelineno-48-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-48-5"><a id="__codelineno-48-5" name="__codelineno-48-5" href="#__codelineno-48-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-48-6"><a id="__codelineno-48-6" name="__codelineno-48-6" href="#__codelineno-48-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-48-7"><a id="__codelineno-48-7" name="__codelineno-48-7" href="#__codelineno-48-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-48-8"><a id="__codelineno-48-8" name="__codelineno-48-8" href="#__codelineno-48-8"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="utiljsonunflattenjson-string-string"><code>Util.JsonUnflatten(json: string) -&gt; string</code></h4>
<p>Восстанавливает произвольную вложенность значения JSON, которое было сглажено перед использованием функции <code>Util.JsonFlatten()</code> .</p>
<h4 id="utiljsondiffa-string-b-string-string"><code>Util.JsonDiff(a: string, b: string) -&gt; string</code></h4>
<p>Создает разницу JSON в соответствии с RFC 6902 (http://jsonpatch.com/). Затем эту разницу можно применить как патч через <code>Util.JsonDiffApply()</code> . Возвращает разницу.</p>
<h4 id="utiljsondiffapplybase-string-diff-string-string"><code>Util.JsonDiffApply(base: string, diff: string) -&gt; string</code></h4>
<p>Применяет JSON <code>diff</code> к <code>base</code> как JSON patch (RFC 6902, http://jsonpatch.com/). Возвращает результат.</p>
<h3 id="utilrandom"><code>Util.Random*</code></h3>
<p>Начиная с BeamMP-Server <code>v3.1.0</code> .</p>
<h4 id="utilrandom-float"><code>Util.Random() -&gt; float</code></h4>
<p>Возвращает число с плавающей точкой от 0 до 1.</p>
<p>Пример:</p>
<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="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-49-2"><a id="__codelineno-49-2" name="__codelineno-49-2" href="#__codelineno-49-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>
<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="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>
<h4 id="utilrandomintrangemin-int-max-int-int"><code>Util.RandomIntRange(min: int, max: int) -&gt; int</code></h4>
<p>Возвращает целое число от минимума до максимума.</p>
<p>Пример:</p>
<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="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-51-2"><a id="__codelineno-51-2" name="__codelineno-51-2" href="#__codelineno-51-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>
<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="nv">randInt</span><span class="p">:</span><span class="w"> </span><span class="err">69</span>
</span></code></pre></div>
<h4 id="utilrandomrangemin-number-max-number-float"><code>Util.RandomRange(min: number, max: number) -&gt; float</code></h4>
<p>Возвращает число с плавающей точкой между минимумом и максимумом.</p>
<p>Пример:</p>
<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="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-53-2"><a id="__codelineno-53-2" name="__codelineno-53-2" href="#__codelineno-53-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>
<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">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>
<h4 id="utilloginfoparams-330"><code>Util.LogInfo(params: ...)</code> и др. (начиная с версии 3.3.0)</h4>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-55-1"><a id="__codelineno-55-1" name="__codelineno-55-1" href="#__codelineno-55-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-55-2"><a id="__codelineno-55-2" name="__codelineno-55-2" href="#__codelineno-55-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-55-3"><a id="__codelineno-55-3" name="__codelineno-55-3" href="#__codelineno-55-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-55-4"><a id="__codelineno-55-4" name="__codelineno-55-4" href="#__codelineno-55-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>
<p>производит</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-56-1"><a id="__codelineno-56-1" name="__codelineno-56-1" href="#__codelineno-56-1"></a>[19/04/24 11:06:50.142] [Test] [INFO] Hello, World!
</span><span id="__span-56-2"><a id="__codelineno-56-2" name="__codelineno-56-2" href="#__codelineno-56-2"></a>[19/04/24 11:06:50.142] [Test] [WARN] Cool warning
</span><span id="__span-56-3"><a id="__codelineno-56-3" name="__codelineno-56-3" href="#__codelineno-56-3"></a>[19/04/24 11:06:50.142] [Test] [ERROR] Oh no!
</span><span id="__span-56-4"><a id="__codelineno-56-4" name="__codelineno-56-4" href="#__codelineno-56-4"></a>[19/04/24 11:06:50.142] [Test] [DEBUG] hi
</span></code></pre></div>
<p>Поддерживает ту же самую печать/сброс данных, что и <code>print()</code> .</p>
<h4 id="utildebugexecutiontime-table"><code>Util.DebugExecutionTime() -&gt; table</code></h4>
<p>Когда код Lua выполняется на сервере, выполнение каждого обработчика событий хронометрируется. Минимальное, максимальное, среднее (среднее) и стандартное отклонение этих времен выполнения вычисляются и возвращаются в таблице этой функцией. Расчет происходит пошагово, поэтому каждый раз, когда запускается обработчик событий, минимальное, максимальное, среднее и стандартное отклонение обновляются. Таким образом, <code>Util.DebugExecutionTime()</code> обычно не занимает значительного времени для выполнения (менее 0,25 мс).</p>
<p>Возвращает таблицу следующего вида:</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="s">[[table: 0x7af6d400aca0]]</span><span class="p">:</span><span class="w"> </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="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-57-3"><a id="__codelineno-57-3" name="__codelineno-57-3" href="#__codelineno-57-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-57-4"><a id="__codelineno-57-4" name="__codelineno-57-4" href="#__codelineno-57-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-57-5"><a id="__codelineno-57-5" name="__codelineno-57-5" href="#__codelineno-57-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-57-6"><a id="__codelineno-57-6" name="__codelineno-57-6" href="#__codelineno-57-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-57-7"><a id="__codelineno-57-7" name="__codelineno-57-7" href="#__codelineno-57-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-57-8"><a id="__codelineno-57-8" name="__codelineno-57-8" href="#__codelineno-57-8"></a><span class="w"> </span><span class="err">},</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="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-57-10"><a id="__codelineno-57-10" name="__codelineno-57-10" href="#__codelineno-57-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-57-11"><a id="__codelineno-57-11" name="__codelineno-57-11" href="#__codelineno-57-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-57-12"><a id="__codelineno-57-12" name="__codelineno-57-12" href="#__codelineno-57-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-57-13"><a id="__codelineno-57-13" name="__codelineno-57-13" href="#__codelineno-57-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-57-14"><a id="__codelineno-57-14" name="__codelineno-57-14" href="#__codelineno-57-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-57-15"><a id="__codelineno-57-15" name="__codelineno-57-15" href="#__codelineno-57-15"></a><span class="w"> </span><span class="err">},</span>
</span><span id="__span-57-16"><a id="__codelineno-57-16" name="__codelineno-57-16" href="#__codelineno-57-16"></a><span class="err">}</span>
</span></code></pre></div>
<p>Для каждого <em>обработчика</em> событий возвращаются следующие данные:</p>
<ul>
<li><code>n</code> : Количество раз, когда событие срабатывало и был вызван обработчик</li>
<li><code>mean</code> : среднее значение всех времен выполнения, в мс</li>
<li><code>max</code> .: Максимальное время выполнения, в мс.</li>
<li><code>min</code> .: Наименьшее время выполнения, в мс.</li>
<li><code>stdev</code> : стандартное отклонение всех средних значений времени выполнения в мс</li>
</ul>
<p>Вот функция, которую можно использовать для наглядной распечатки этих данных:</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="kr">function</span><span class="w"> </span><span class="nf">printDebugExecutionTime</span><span class="p">()</span>
</span><span id="__span-58-2"><a id="__codelineno-58-2" name="__codelineno-58-2" href="#__codelineno-58-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-58-3"><a id="__codelineno-58-3" name="__codelineno-58-3" href="#__codelineno-58-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-58-4"><a id="__codelineno-58-4" name="__codelineno-58-4" href="#__codelineno-58-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-58-5"><a id="__codelineno-58-5" name="__codelineno-58-5" href="#__codelineno-58-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-58-6"><a id="__codelineno-58-6" name="__codelineno-58-6" href="#__codelineno-58-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-58-7"><a id="__codelineno-58-7" name="__codelineno-58-7" href="#__codelineno-58-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-58-8"><a id="__codelineno-58-8" name="__codelineno-58-8" href="#__codelineno-58-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-58-9"><a id="__codelineno-58-9" name="__codelineno-58-9" href="#__codelineno-58-9"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-58-10"><a id="__codelineno-58-10" name="__codelineno-58-10" href="#__codelineno-58-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-58-11"><a id="__codelineno-58-11" name="__codelineno-58-11" href="#__codelineno-58-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-58-12"><a id="__codelineno-58-12" name="__codelineno-58-12" href="#__codelineno-58-12"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-58-13"><a id="__codelineno-58-13" name="__codelineno-58-13" href="#__codelineno-58-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-58-14"><a id="__codelineno-58-14" name="__codelineno-58-14" href="#__codelineno-58-14"></a><span class="kr">end</span>
</span></code></pre></div>
<p>Вы можете вызвать его следующим образом для отладки кода, если он работает медленно:</p>
<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="c1">-- event to print the debug times</span>
</span><span id="__span-59-2"><a id="__codelineno-59-2" name="__codelineno-59-2" href="#__codelineno-59-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-59-3"><a id="__codelineno-59-3" name="__codelineno-59-3" href="#__codelineno-59-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-59-4"><a id="__codelineno-59-4" name="__codelineno-59-4" href="#__codelineno-59-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="_12">Функции ФС</h3>
<p>Функции <code>FS</code> — это функции <strong>файловой</strong> <strong>системы</strong> , которые стремятся превзойти возможности Lua по умолчанию.</p>
<p>Пожалуйста, всегда используйте <code>/</code> в качестве разделителя при указании путей, так как это кроссплатформенно (windows, linux, macos, ...).</p>
<h4 id="fscreatedirectorypath-string-boolstring"><code>FS.CreateDirectory(path: string) -&gt; bool,string</code></h4>
<p>Создает указанный каталог и любые родительские каталоги, если они не существуют. Поведение примерно эквивалентно обычной команде linux <code>mkdir -p</code> .</p>
<p>В случае успеха возвращает <code>true</code> и <code>""</code> . Если создание каталога не удалось, возвращается <code>false</code> и сообщение об ошибке ( <code>string</code> ).</p>
<p>Пример:</p>
<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="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-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="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-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 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-60-5"><a id="__codelineno-60-5" name="__codelineno-60-5" href="#__codelineno-60-5"></a><span class="kr">else</span>
</span><span id="__span-60-6"><a id="__codelineno-60-6" name="__codelineno-60-6" href="#__codelineno-60-6"></a><span class="w"> </span><span class="c1">-- do something with the directory</span>
</span><span id="__span-60-7"><a id="__codelineno-60-7" name="__codelineno-60-7" href="#__codelineno-60-7"></a><span class="kr">end</span>
</span><span id="__span-60-8"><a id="__codelineno-60-8" name="__codelineno-60-8" href="#__codelineno-60-8"></a>
</span><span id="__span-60-9"><a id="__codelineno-60-9" name="__codelineno-60-9" href="#__codelineno-60-9"></a><span class="c1">-- Be careful not to do this! This will ALWAYS be true!</span>
</span><span id="__span-60-10"><a id="__codelineno-60-10" name="__codelineno-60-10" href="#__codelineno-60-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-60-11"><a id="__codelineno-60-11" name="__codelineno-60-11" href="#__codelineno-60-11"></a><span class="w"> </span><span class="c1">-- ...</span>
</span><span id="__span-60-12"><a id="__codelineno-60-12" name="__codelineno-60-12" href="#__codelineno-60-12"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="fsremovepath-string-boolstring"><code>FS.Remove(path: string) -&gt; bool,string</code></h4>
<p>Удаляет указанный файл или папку.</p>
<p>Возвращает <code>true</code> , если произошла ошибка, с сообщением об ошибке во втором возвращаемом значении.</p>
<p>Пример:</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="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-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="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-61-4"><a id="__codelineno-61-4" name="__codelineno-61-4" href="#__codelineno-61-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-61-5"><a id="__codelineno-61-5" name="__codelineno-61-5" href="#__codelineno-61-5"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="fsrenamepatha-string-pathb-string-boolstring"><code>FS.Rename(pathA: string, pathB: string) -&gt; bool,string</code></h4>
<p>Переименовывает (или перемещает) <code>pathA</code> в <code>pathB</code> .</p>
<p>Возвращает <code>true</code> , если произошла ошибка, с сообщением об ошибке во втором возвращаемом значении.</p>
<h4 id="fscopypatha-string-pathb-string-boolstring"><code>FS.Copy(pathA: string, pathB: string) -&gt; bool,string</code></h4>
<p>Копирует <code>pathA</code> в <code>pathB</code> .</p>
<p>Возвращает <code>true</code> , если произошла ошибка, с сообщением об ошибке во втором возвращаемом значении.</p>
<h4 id="fsgetfilenamepath-string-string"><code>FS.GetFilename(path: string) -&gt; string</code></h4>
<p>Возвращает последнюю часть пути, которая обычно является именем файла. Вот несколько примеров входов + выходов:</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;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-62-4"><a id="__codelineno-62-4" name="__codelineno-62-4" href="#__codelineno-62-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-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;path&quot;</span>
</span></code></pre></div>
<h4 id="fsgetextensionpath-string-string"><code>FS.GetExtension(path: string) -&gt; string</code></h4>
<p>Возвращает расширение файла или пустую строку, если расширения нет. Вот несколько примеров входов + выходов</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;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-63-4"><a id="__codelineno-63-4" name="__codelineno-63-4" href="#__codelineno-63-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-63-5"><a id="__codelineno-63-5" name="__codelineno-63-5" href="#__codelineno-63-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-63-6"><a id="__codelineno-63-6" name="__codelineno-63-6" href="#__codelineno-63-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-63-7"><a id="__codelineno-63-7" name="__codelineno-63-7" href="#__codelineno-63-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>Возвращает путь к родительскому каталогу, т. е. папке, в которой содержится файл или папка. Вот несколько примеров входных и выходных данных:</p>
<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="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-64-2"><a id="__codelineno-64-2" name="__codelineno-64-2" href="#__codelineno-64-2"></a>
</span><span id="__span-64-3"><a id="__codelineno-64-3" name="__codelineno-64-3" href="#__codelineno-64-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-64-4"><a id="__codelineno-64-4" name="__codelineno-64-4" href="#__codelineno-64-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-64-5"><a id="__codelineno-64-5" name="__codelineno-64-5" href="#__codelineno-64-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>Возвращает <code>true</code> если путь существует, <code>false</code> если нет.</p>
<h4 id="fsisdirectorypath-string-bool"><code>FS.IsDirectory(path: string) -&gt; bool</code></h4>
<p>Возвращает <code>true</code> , если указанный путь является каталогом, <code>false</code> если нет. Обратите внимание, что <code>false</code> НЕ подразумевает, что путь является файлом (см. <code>FS.IsFile()</code> ).</p>
<h4 id="fsisfilepath-string-bool"><code>FS.IsFile(path: string) -&gt; bool</code></h4>
<p>Возвращает <code>true</code> , если указанный путь является обычным файлом (не символической ссылкой, жесткой ссылкой, блочным устройством и т. д.), <code>false</code> если нет. Обратите внимание, что <code>false</code> НЕ подразумевает, что путь является каталогом (см. <code>FS.IsDirectory()</code> ).</p>
<h4 id="fslistdirectoriespath-string-table"><code>FS.ListDirectories(path: string) -&gt; table</code></h4>
<p>Возвращает таблицу всех каталогов по указанному пути.</p>
<p>Пример:</p>
<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="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>
<p>Результаты в:</p>
<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="p">{</span>
</span><span id="__span-66-2"><a id="__codelineno-66-2" name="__codelineno-66-2" href="#__codelineno-66-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-66-3"><a id="__codelineno-66-3" name="__codelineno-66-3" href="#__codelineno-66-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-66-4"><a id="__codelineno-66-4" name="__codelineno-66-4" href="#__codelineno-66-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="fslistfilespath-string-table"><code>FS.ListFiles(path: string) -&gt; table</code></h4>
<p>Возвращает таблицу всех файлов по указанному пути.</p>
<p>Пример:</p>
<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="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>
<p>Результаты в:</p>
<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="p">{</span>
</span><span id="__span-68-2"><a id="__codelineno-68-2" name="__codelineno-68-2" href="#__codelineno-68-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-68-3"><a id="__codelineno-68-3" name="__codelineno-68-3" href="#__codelineno-68-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-68-4"><a id="__codelineno-68-4" name="__codelineno-68-4" href="#__codelineno-68-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="fsconcatpaths-string"><code>FS.ConcatPaths(...) -&gt; string</code></h4>
<p>Складывает (объединяет) все аргументы с предпочитаемым разделителем пути системы.</p>
<p>Пример:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-69-1"><a id="__codelineno-69-1" name="__codelineno-69-1" href="#__codelineno-69-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>
<p>результаты в</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-70-1"><a id="__codelineno-70-1" name="__codelineno-70-1" href="#__codelineno-70-1"></a>a/b/c/d/e/f/g/h.txt
</span></code></pre></div>
<p>Также разрешает <code>..</code> , если он существует в пути в любой точке. Эта функция безопаснее, чем конкатенация строк в lua, и учитывает разделители платформы.</p>
<p>Пожалуйста, всегда используйте <code>/</code> в качестве разделителя при указании путей, так как это кроссплатформенно (windows, linux, macos, ...).</p>
<h3 id="_13">События</h3>
<h4 id="_14">Объяснение</h4>
<ul>
<li>Аргументы: Список аргументов, переданных обработчикам этого события.</li>
<li>Отменяемое: Можно ли отменить событие. Если его можно отменить, обработчик может сделать это, вернув <code>1</code> , например <code>return 1</code> .</li>
</ul>
<h4 id="_15">Краткое изложение событий</h4>
<p>Присоединение игрока вызывает следующие события в указанном порядке:</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="_16">Системные события</h4>
<h5 id="oninit"><code>onInit</code></h5>
<p>Аргументы: НЕТ Отменяемо: НЕТ</p>
<p>Срабатывает сразу после инициализации всех файлов в плагине.</p>
<h5 id="onconsoleinput"><code>onConsoleInput</code></h5>
<p>Аргументы: <code>input: string</code> Отменяемость: НЕТ</p>
<p>Срабатывает, когда консоль BeamMP получает входной сигнал.</p>
<h5 id="onshutdown"><code>onShutdown</code></h5>
<p>Аргументы: НЕТ Отменяемо: НЕТ</p>
<p>Срабатывает при отключении сервера. В настоящее время происходит после того, как все игроки были выгнаны.</p>
<h4 id="_17">События, связанные с игрой</h4>
<h5 id="onplayerauth"><code>onPlayerAuth</code></h5>
<p>Аргументы: <code>player_name: string</code> , <code>player_role: string</code> , <code>is_guest: bool</code> , <code>identifiers: table -&gt; beammp, ip</code> Возможность отмены: ДА</p>
<p>Первое событие, которое срабатывает, когда игрок хочет присоединиться. Игроку может быть отказано в присоединении, если вернуть <code>1</code> или причину ( <code>string</code> ) из функции-обработчика.</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="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-71-2"><a id="__codelineno-71-2" name="__codelineno-71-2" href="#__codelineno-71-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-71-3"><a id="__codelineno-71-3" name="__codelineno-71-3" href="#__codelineno-71-3"></a><span class="kr">end</span>
</span><span id="__span-71-4"><a id="__codelineno-71-4" name="__codelineno-71-4" href="#__codelineno-71-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>Аргументы: <code>player_id: number</code> Возможность отмены: НЕТ</p>
<p>Срабатывает, когда игрок впервые начинает подключение, после <code>onPlayerAuth</code> .</p>
<h5 id="onplayerjoining"><code>onPlayerJoining</code></h5>
<p>Аргументы: <code>player_id: number</code> Возможность отмены: НЕТ</p>
<p>Срабатывает, когда игрок завершил загрузку всех модов, после <code>onPlayerConnecting</code> .</p>
<h5 id="onplayerdisconnect"><code>onPlayerDisconnect</code></h5>
<p>Аргументы: <code>player_id: number</code> Возможность отмены: НЕТ</p>
<p>Срабатывает при отключении игрока.</p>
<h5 id="onchatmessage"><code>onChatMessage</code></h5>
<p>Аргументы: <code>player_id: number</code> , <code>player_name: string</code> , <code>message: string</code> Возможность отмены: ДА</p>
<p>Срабатывает, когда игрок отправляет сообщение в чате. При отмене сообщение в чате не будет показано никому, даже игроку, который его отправил.</p>
<h5 id="onvehiclespawn"><code>onVehicleSpawn</code></h5>
<p>Аргументы: <code>player_id: number</code> , <code>vehicle_id: number</code> , <code>data: string</code> Возможность отмены: ДА</p>
<p>Срабатывает, когда игрок создает новое транспортное средство. Аргумент <code>data</code> содержит конфигурацию автомобиля и данные о положении/вращении для транспортного средства в виде строки json.</p>
<h5 id="onvehicleedited"><code>onVehicleEdited</code></h5>
<p>Аргументы: <code>player_id: number</code> , <code>vehicle_id: number</code> , <code>data: string</code> Возможность отмены: ДА</p>
<p>Срабатывает, когда игрок редактирует свое транспортное средство и применяет редактирование. Аргумент <code>data</code> содержит обновленную конфигурацию автомобиля в виде строки json, но <strong>не</strong> включает данные о положении или вращении. Вы можете использовать <a href="#mpgetpositionrawpid-number-vid-number-tablestring">MP.GetPositionRaw</a> для получения данных о положении и вращении.</p>
<h5 id="onvehicledeleted"><code>onVehicleDeleted</code></h5>
<p>Аргументы: <code>player_id: number</code> , <code>vehicle_id: number</code> Возможность отмены: НЕТ</p>
<p>Срабатывает, когда игрок удаляет свое транспортное средство.</p>
<h5 id="onvehiclereset"><code>onVehicleReset</code></h5>
<p>Аргументы: <code>player_id: number</code> , <code>vehicle_id: number</code> , <code>data: string</code> Возможность отмены: НЕТ</p>
<p>Срабатывает, когда игрок сбрасывает свое транспортное средство. <code>data</code> — это обновленное положение и вращение автомобиля, однако <strong>не</strong> включают конфигурацию транспортных средств. Вы можете использовать <a href="#mpgetplayervehiclesplayer_id-number-table">MP.GetPlayerVehicles</a> , чтобы получить конфигурацию транспортных средств.</p>
<h5 id="onfilechanged"><code>onFileChanged</code></h5>
<p><em>начиная с версии 3.1.0</em></p>
<p>Аргументы: <code>path: string</code> Возможность отмены: НЕТ</p>
<p>Срабатывает при изменении файла в каталоге <code>Resources/Server</code> <em>или любом его подкаталоге</em> .</p>
<p>Любое изменение файла в каталоге <code>Resources/Server/&lt;plugin&gt;</code> (не в его подпапке) вызовет перезагрузку состояния Lua и событие <code>onFileChanged</code> .</p>
<p>Любой файл в подпапках <code>Resources/Server/&lt;plugin&gt;</code> , например <code>Resources/Server/&lt;plugin&gt;/lua/stuff.lua</code> , не вызовет перезагрузку состояния, а только вызовет событие <code>onFileChanged</code> . Таким образом, вы можете перезагрузить его самостоятельно правильным образом (или не перезагружать).</p>
<p>Это относится ко всем файлам, а не только к файлам <code>.lua</code> .</p>
<p><code>path</code> указывается относительно корня сервера, например <code>Resources/Server/myplugin/myfile.txt</code> . Вы можете выполнить дальнейшую обработку этой строки с помощью семейства функций <code>FS.*</code> , например, извлечь имя или расширение ( <code>FS.GetExtension(...)</code> , <code>FS.GetFilename(...)</code> , ...).</p>
<p>Примечание: файлы, добавленные после запуска сервера, <em>не</em> отслеживаются, начиная с версии 3.1.0.</p>
<h3 id="lua_1">Миграция со старого Lua</h3>
<p>Это краткий обзор основных шагов, которые необходимо предпринять для перехода со старого на новый lua.</p>
<h4 id="lua_2">Понять, как работает новый lua</h4>
<p>Для этого внимательно прочтите раздел <a href="#how-to-start-writing-a-plugin">«Введение»</a> и все его подразделы. Необходимо правильно выполнить следующие шаги.</p>
<h4 id="_18">Найти и заменить</h4>
<p>Сначала вам следует выполнить поиск и замену всех функций MP. Подстановка должна добавить <code>MP.</code> перед всеми функциями MP, за исключением <code>print()</code> .</p>
<p>Пример:</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="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></code></pre></div>
<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="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-73-2"><a id="__codelineno-73-2" name="__codelineno-73-2" href="#__codelineno-73-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="_19">Прощайте, темы, привет, таймеры событий!</h4>
<p>Как обсуждалось во введении, потоки — это таймеры событий. Для любых вызовов <code>CreateThread</code> замените его вызовом <code>CreateEventTimer</code> . Внимательно проверьте время, которое имел ваш старый CreateThread (число было X в секунду), и подумайте о том, какое значение тайм-аута таймера событий для этого (которое указывается в миллисекундах). Также имейте в виду, что вместо имени функции он принимает имя события, поэтому вам придется также зарегистрировать событие.</p>
<p>Пример:</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="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>
<p>становится</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;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-75-2"><a id="__codelineno-75-2" name="__codelineno-75-2" href="#__codelineno-75-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>Если у вас много таймеров событий, имеет смысл попробовать объединить их, например, создав событие "ежеминутное" и зарегистрировав в нем несколько функций, которые нужно вызывать каждую минуту, вместо того, чтобы иметь несколько таймеров событий. Каждый таймер событий требует от сервера немного времени для срабатывания.</p>
<h4 id="_20">Больше никаких неявных вызовов событий</h4>
<p>Вам нужно регистрировать все ваши события. Вы не можете полагаться на имена функций. В старом lua это было неясно, но в новом lua это обычно соблюдается. Хороший шаблон:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-76-1"><a id="__codelineno-76-1" name="__codelineno-76-1" href="#__codelineno-76-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-76-2"><a id="__codelineno-76-2" name="__codelineno-76-2" href="#__codelineno-76-2"></a><span class="c1">-- or</span>
</span><span id="__span-76-3"><a id="__codelineno-76-3" name="__codelineno-76-3" href="#__codelineno-76-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>Это лучше, чем называть обработчик тем же, что и событие, что вводит в заблуждение и сбивает с толку.</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="31 марта 2026г. 04:22:47 UTC">31 марта 2026г.</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="31 марта 2026г. 04:22:47 UTC">31 марта 2026г.</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.1.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 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.1.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 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.1.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 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">{"annotate": null, "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.2c215733.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.79ae519e.min.js"></script>
<script src="../../../../javascript/custom.js"></script>
</body>
</html>