Files

5455 lines
183 KiB
HTML
Raw Permalink 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="zh" 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/zh/API%20documentation/Server-Side/">
<link rel="alternate" href="../../../API%20documentation/Server-Side/" hreflang="en">
<link rel="alternate" href="../../../es/API%20documentation/Server-Side/" hreflang="es">
<link rel="alternate" href="../../../de/API%20documentation/Server-Side/" hreflang="de">
<link rel="alternate" href="../../../fr/API%20documentation/Server-Side/" hreflang="fr">
<link rel="alternate" href="../../../it/API%20documentation/Server-Side/" hreflang="it">
<link rel="alternate" href="../../../ru/API%20documentation/Server-Side/" hreflang="ru">
<link rel="alternate" href="./" hreflang="zh">
<link rel="icon" href="../../../assets/core/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Server Side - 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="Server Side - 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/zh/API%20documentation/Server-Side.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/zh/API%20documentation/Server-Side/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Server Side - 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/zh/API%20documentation/Server-Side.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">
Server Side
</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="../../../API%20documentation/Server-Side/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../es/API%20documentation/Server-Side/" hreflang="es" class="md-select__link">
Español
</a>
</li>
<li class="md-select__item">
<a href="../../../de/API%20documentation/Server-Side/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
<li class="md-select__item">
<a href="../../../fr/API%20documentation/Server-Side/" hreflang="fr" class="md-select__link">
Français
</a>
</li>
<li class="md-select__item">
<a href="../../../it/API%20documentation/Server-Side/" hreflang="it" class="md-select__link">
Italiano
</a>
</li>
<li class="md-select__item">
<a href="../../../ru/API%20documentation/Server-Side/" hreflang="ru" class="md-select__link">
Pусский
</a>
</li>
<li class="md-select__item">
<a href="./" hreflang="zh" class="md-select__link">
中文
</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">
常见问题解答
</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.drive 文档
</a>
</li>
<li class="md-tabs__item">
<a href="../../scripting/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/setup-vps/" class="md-nav__link">
<span class="md-ellipsis">
服务器设置(VPS
</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">
常见问题解答
</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>
常见问题解答
</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/Clearing-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--新的"></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="../../scripting/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.drive 文档
</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.drive 文档
</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-window-tutorial/" class="md-nav__link">
<span class="md-ellipsis">
ImGui Window Tutorial
</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/lua-snippets/" class="md-nav__link">
<span class="md-ellipsis">
Lua Code Snippets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../beamng/css-snippets/" class="md-nav__link">
<span class="md-ellipsis">
CSS Code Snippets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../beamng/imgui-snippets/" class="md-nav__link">
<span class="md-ellipsis">
ImGui Code Snippets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../beamng/cef-snippets/" class="md-nav__link">
<span class="md-ellipsis">
CEF Code Snippets
</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_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_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_6_label" aria-expanded="false">
<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="../../scripting/mod-reference/" class="md-nav__link">
<span class="md-ellipsis">
Client Scripting Reference
</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_6_2" >
<label class="md-nav__link" for="__nav_6_2" id="__nav_6_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="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
<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">
<a href="../../scripting/server/latest-server-reference/" class="md-nav__link">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../scripting/server/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="#_1" 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="#_2" class="md-nav__link">
<span class="md-ellipsis">
全局
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mp" class="md-nav__link">
<span class="md-ellipsis">
MP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#util" class="md-nav__link">
<span class="md-ellipsis">
Util
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#http" class="md-nav__link">
<span class="md-ellipsis">
Http
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fs" class="md-nav__link">
<span class="md-ellipsis">
FS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
事件
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_4" 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" class="md-nav__link">
<span class="md-ellipsis">
print(...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#printraw" class="md-nav__link">
<span class="md-ellipsis">
printRaw(...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit" class="md-nav__link">
<span class="md-ellipsis">
exit()
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp_1" class="md-nav__link">
<span class="md-ellipsis">
MP — 玩家
</span>
</a>
<nav class="md-nav" aria-label="MP — 玩家">
<ul class="md-nav__list">
<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="#mpgetplayers-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayers() -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayernameplayerid-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerName(playerID) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayeridbynamename-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerIDByName(name) -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayeridentifiersplayerid-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerIdentifiers(playerID) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayerroleplayerid-stringnil" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerRole(playerID) -&gt; string|nil
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerconnectedplayerid-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerConnected(playerID) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerguestplayerid-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerGuest(playerID) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpdropplayerplayerid-reason" class="md-nav__link">
<span class="md-ellipsis">
MP.DropPlayer(playerID, reason?)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp_2" class="md-nav__link">
<span class="md-ellipsis">
MP — 车辆
</span>
</a>
<nav class="md-nav" aria-label="MP — 车辆">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mpgetplayervehiclesplayerid-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerVehicles(playerID) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetpositionrawplayerid-vehicleid-table-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPositionRaw(playerID, vehicleID) -&gt; table, string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpremovevehicleplayerid-vehicleid" class="md-nav__link">
<span class="md-ellipsis">
MP.RemoveVehicle(playerID, vehicleID)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp_3" class="md-nav__link">
<span class="md-ellipsis">
MP — 通讯
</span>
</a>
<nav class="md-nav" aria-label="MP — 通讯">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mpsendchatmessageplayerid-message-logchat" class="md-nav__link">
<span class="md-ellipsis">
MP.SendChatMessage(playerID, message, logChat?)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsendnotificationplayerid-message-icon-category" class="md-nav__link">
<span class="md-ellipsis">
MP.SendNotification(playerID, message, icon?, category?)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpconfirmationdialogplayerid-title-body-buttons-interactionid-warning-reporttoserver-reporttoextensions" class="md-nav__link">
<span class="md-ellipsis">
MP.ConfirmationDialog(playerID, title, body, buttons, interactionID, warning?, reportToServer?, reportToExtensions?)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayerid-eventname-data-boolean-string" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(playerID, eventName, data) -&gt; boolean, string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventjsonplayerid-eventname-data-boolean-string" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEventJson(playerID, eventName, data) -&gt; boolean, string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp_4" class="md-nav__link">
<span class="md-ellipsis">
MP — 事件
</span>
</a>
<nav class="md-nav" aria-label="MP — 事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mpregistereventeventname-functionname" class="md-nav__link">
<span class="md-ellipsis">
MP.RegisterEvent(eventName, functionName)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerlocaleventeventname-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerLocalEvent(eventName, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerglobaleventeventname-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerGlobalEvent(eventName, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcreateeventtimereventname-intervalms-strategy" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateEventTimer(eventName, intervalMS, strategy?)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcanceleventtimereventname" class="md-nav__link">
<span class="md-ellipsis">
MP.CancelEventTimer(eventName)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp_5" class="md-nav__link">
<span class="md-ellipsis">
MP — 工具
</span>
</a>
<nav class="md-nav" aria-label="MP — 工具">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mpcreatetimer-table" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateTimer() -&gt; table
</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-number-number-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetServerVersion() -&gt; number, number, number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetconfigid-value" class="md-nav__link">
<span class="md-ellipsis">
MP.Get(configID) -&gt; value
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsetconfigid-value" class="md-nav__link">
<span class="md-ellipsis">
MP.Set(configID, value)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsettings" class="md-nav__link">
<span class="md-ellipsis">
MP.Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcallstrategy" class="md-nav__link">
<span class="md-ellipsis">
MP.CallStrategy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsleepms" class="md-nav__link">
<span class="md-ellipsis">
MP.Sleep(ms)
</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>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util_1" class="md-nav__link">
<span class="md-ellipsis">
Util — 日志记录
</span>
</a>
<nav class="md-nav" aria-label="Util — 日志记录">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utilloginfo-utillogwarn-utillogerror-utillogdebug" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(...) 、 Util.LogWarn(...) 、 Util.LogError(...) 、 Util.LogDebug(...)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util-json" class="md-nav__link">
<span class="md-ellipsis">
Util — JSON
</span>
</a>
<nav class="md-nav" aria-label="Util — JSON">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utiljsonencodetable-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonEncode(table) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondecodejson-table" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDecode(json) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonprettifyjson-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonPrettify(json) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonminifyjson-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonMinify(json) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonflattenjson-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonFlatten(json) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonunflattenjson-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonUnflatten(json) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffa-b-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiff(a, b) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util_2" class="md-nav__link">
<span class="md-ellipsis">
Util — 随机
</span>
</a>
<nav class="md-nav" aria-label="Util — 随机">
<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="#utilrandomrangemin-max-float" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomRange(min, max) -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomintrangemin-max-number" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomIntRange(min, max) -&gt; number
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util_3" class="md-nav__link">
<span class="md-ellipsis">
Util — 分析
</span>
</a>
<nav class="md-nav" aria-label="Util — 分析">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utildebugstartprofilename" class="md-nav__link">
<span class="md-ellipsis">
Util.DebugStartProfile(name)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utildebugstopprofilename" class="md-nav__link">
<span class="md-ellipsis">
Util.DebugStopProfile(name)
</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="#http_1" class="md-nav__link">
<span class="md-ellipsis">
Http
</span>
</a>
<nav class="md-nav" aria-label="Http">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#httpcreateconnectionhost-port-table" class="md-nav__link">
<span class="md-ellipsis">
Http.CreateConnection(host, port) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#connectiongetpath-headers" class="md-nav__link">
<span class="md-ellipsis">
connection:Get(path, headers)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs_1" class="md-nav__link">
<span class="md-ellipsis">
FS — 检查
</span>
</a>
<nav class="md-nav" aria-label="FS — 检查">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fsexistspath-boolean" class="md-nav__link">
<span class="md-ellipsis">
FS.Exists(path) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisdirectorypath-boolean" class="md-nav__link">
<span class="md-ellipsis">
FS.IsDirectory(path) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisfilepath-boolean" class="md-nav__link">
<span class="md-ellipsis">
FS.IsFile(path) -&gt; boolean
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs_2" class="md-nav__link">
<span class="md-ellipsis">
FS — 操作
</span>
</a>
<nav class="md-nav" aria-label="FS — 操作">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fscreatedirectorypath-boolean-string" class="md-nav__link">
<span class="md-ellipsis">
FS.CreateDirectory(path) -&gt; boolean, string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsremovepath-boolean-string" class="md-nav__link">
<span class="md-ellipsis">
FS.Remove(path) -&gt; boolean, string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsrenamepath-newpath-boolean-string" class="md-nav__link">
<span class="md-ellipsis">
FS.Rename(path, newPath) -&gt; boolean, string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fscopypath-newpath-boolean-string" class="md-nav__link">
<span class="md-ellipsis">
FS.Copy(path, newPath) -&gt; boolean, string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistfilespath-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListFiles(path) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistdirectoriespath-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListDirectories(path) -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs_3" class="md-nav__link">
<span class="md-ellipsis">
FS — 路径
</span>
</a>
<nav class="md-nav" aria-label="FS — 路径">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fsgetfilenamepath-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetFilename(path) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetextensionpath-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetExtension(path) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetparentfolderpath-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetParentFolder(path) -&gt; string
</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="#_5" 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="#_6" class="md-nav__link">
<span class="md-ellipsis">
玩家连接顺序
</span>
</a>
</li>
<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>
<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="#postplayerauth" class="md-nav__link">
<span class="md-ellipsis">
postPlayerAuth
</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="#onplayerjoin" class="md-nav__link">
<span class="md-ellipsis">
onPlayerJoin
</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="#postchatmessage" class="md-nav__link">
<span class="md-ellipsis">
postChatMessage
</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="#postvehiclespawn" class="md-nav__link">
<span class="md-ellipsis">
postVehicleSpawn
</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="#postvehicleedited" class="md-nav__link">
<span class="md-ellipsis">
postVehicleEdited
</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="#onvehiclepaintchanged" class="md-nav__link">
<span class="md-ellipsis">
onVehiclePaintChanged
</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>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/beammp/docs/edit/main/docs/zh/API documentation/Server-Side.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/zh/API documentation/Server-Side.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>
<h1>Server Side</h1>
<h2 id="_1">目录</h2>
<h3 id="_2">全局</h3>
<ul>
<li><a href="#global-functions">全局函数</a></li>
</ul>
<h3 id="mp">MP</h3>
<ul>
<li><a href="#mp--players">玩家</a></li>
<li><a href="#mp--vehicles">车辆</a></li>
<li><a href="#mp--communication">通信</a></li>
<li><a href="#mp--events">事件</a></li>
<li><a href="#mp--utilities">工具</a></li>
</ul>
<h3 id="util">Util</h3>
<ul>
<li><a href="#util--logging">日志记录</a></li>
<li><a href="#util--json">JSON</a></li>
<li><a href="#util--random">随机数</a></li>
<li><a href="#util--profiling">性能分析</a></li>
</ul>
<h3 id="http">Http</h3>
<ul>
<li><a href="#http">HTTP 函数</a></li>
</ul>
<h3 id="fs">FS</h3>
<ul>
<li><a href="#fs--checks">检查</a></li>
<li><a href="#fs--operations">操作</a></li>
<li><a href="#fs--paths">路径</a></li>
</ul>
<h3 id="_3">事件</h3>
<ul>
<li><a href="#events">事件参考</a></li>
</ul>
<hr />
<h2 id="_4">全局函数</h2>
<h3 id="print"><code>print(...)</code></h3>
<p>打印到服务器控制台,以日期、时间和<code>[LUA]</code>为前缀。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>...</code> (任意)——任何类型的值。表会连同其内容一起打印出来。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua 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 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-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-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>
<hr />
<h3 id="printraw"><code>printRaw(...)</code></h3>
<p>不带任何前缀直接打印到服务器控制台。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>...</code> (任意)——任何类型的值。</li>
</ul>
<hr />
<h3 id="exit"><code>exit()</code></h3>
<p>正常关闭服务器。触发<code>onShutdown</code>事件。</p>
<hr />
<h2 id="mp_1">MP — 玩家</h2>
<h3 id="mpgetplayercount-number"><code>MP.GetPlayerCount() -&gt; number</code></h3>
<p>返回当前在线玩家的数量。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(数字)- 玩家人数。</li>
</ul>
<hr />
<h3 id="mpgetplayers-table"><code>MP.GetPlayers() -&gt; table</code></h3>
<p>返回所有已连接玩家的表。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- <code>{[playerID] = playerName}</code>的映射。</li>
</ul>
<hr />
<h3 id="mpgetplayernameplayerid-string"><code>MP.GetPlayerName(playerID) -&gt; string</code></h3>
<p>根据ID返回玩家名称。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 玩家名称,如果找不到则为<code>""</code></li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="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-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-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></code></pre></div>
<hr />
<h3 id="mpgetplayeridbynamename-number"><code>MP.GetPlayerIDByName(name) -&gt; number</code></h3>
<p>根据名称返回玩家的 ID。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>name</code> (字符串)- 玩家的名称。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(数字)- 玩家 ID,如果找不到则为<code>-1</code></li>
</ul>
<hr />
<h3 id="mpgetplayeridentifiersplayerid-table"><code>MP.GetPlayerIdentifiers(playerID) -&gt; table</code></h3>
<p>返回玩家的标识符,例如 IP 地址、BeamMP 论坛 ID 和 Discord ID。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 包含键<code>ip</code><code>beammp</code><code>discord</code> (仅当已链接时)的表。</li>
<li>nil- 如果未找到玩家。</li>
</ul>
<p><strong>用法:</strong></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="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-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-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><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="c1">-- { ip: &quot;127.0.0.1&quot;, discord: &quot;12345678987654321&quot;, beammp: &quot;1234567&quot; }</span>
</span></code></pre></div>
<hr />
<h3 id="mpgetplayerroleplayerid-stringnil"><code>MP.GetPlayerRole(playerID) -&gt; string|nil</code></h3>
<p>返回玩家在 BeamMP 后端设置的角色。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 玩家的角色。</li>
<li>nil- 如果未找到玩家。</li>
</ul>
<hr />
<h3 id="mpisplayerconnectedplayerid-boolean"><code>MP.IsPlayerConnected(playerID) -&gt; boolean</code></h3>
<p>返回是否已收到来自玩家的 UDP 数据包,即连接是否已完全建立。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 如果完全连接, <code>true</code></li>
</ul>
<p><strong>用法:</strong></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="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-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-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></code></pre></div>
<hr />
<h3 id="mpisplayerguestplayerid-boolean"><code>MP.IsPlayerGuest(playerID) -&gt; boolean</code></h3>
<p>返回玩家是否为访客(未在 BeamMP 论坛注册)。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 如果是访客<code>true</code></li>
</ul>
<hr />
<h3 id="mpdropplayerplayerid-reason"><code>MP.DropPlayer(playerID, reason?)</code></h3>
<p>将玩家踢出服务器。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
<li><code>reason</code> (字符串,可选)- 被踢的原因。</li>
</ul>
<p><strong>用法:</strong></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="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-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-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-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-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-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h2 id="mp_2">MP — 车辆</h2>
<h3 id="mpgetplayervehiclesplayerid-table"><code>MP.GetPlayerVehicles(playerID) -&gt; table</code></h3>
<p>返回玩家的所有车辆。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- <code>{[vehicleID] = dataString}</code>的映射,其中 dataString 是原始 JSON 字符串。</li>
<li>(nil)- 如果玩家没有车辆或未被找到。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span>
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-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-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-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-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-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-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-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-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-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-5-8"><a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h3 id="mpgetpositionrawplayerid-vehicleid-table-string"><code>MP.GetPositionRaw(playerID, vehicleID) -&gt; table, string</code></h3>
<p>返回车辆的当前原始位置。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
<li><code>vehicleID</code> number- 车辆的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 包含以下键的表: <code>pos</code><code>rot</code><code>vel</code><code>rvel</code><code>tim</code><code>ping</code></li>
<li>(字符串)- 如果发生错误,则显示错误信息;成功时显示空字符串。</li>
</ul>
<p><strong>注意:</strong> <code>pos</code><code>rot</code><code>vel</code><code>rvel</code>中的每个值都是一个表,索引为<code>1, 2, 3</code> <code>rot</code>的索引为<code>4</code> )。</p>
<p><strong>用法:</strong></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">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-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-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-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-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-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-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-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-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></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 class="w"> </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 class="w"> </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-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="kr">else</span>
</span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-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-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h3 id="mpremovevehicleplayerid-vehicleid"><code>MP.RemoveVehicle(playerID, vehicleID)</code></h3>
<p>移除玩家拥有的车辆。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID。</li>
<li><code>vehicleID</code> number- 车辆的 ID。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-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-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-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-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>
</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-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-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></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-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h2 id="mp_3">MP — 通讯</h2>
<h3 id="mpsendchatmessageplayerid-message-logchat"><code>MP.SendChatMessage(playerID, message, logChat?)</code></h3>
<p>向特定玩家或所有人发送聊天消息。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID <code>-1</code>表示所有人。</li>
<li><code>message</code> (字符串)- 消息内容。</li>
<li><code>logChat</code> (布尔值,可选)- 是否记录到服务器日志(默认值: <code>true</code> )。</li>
</ul>
<p><strong>注意:</strong>此函数不返回值。</p>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="c1">-- To a specific player</span>
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></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-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></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-8-4"><a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></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><span id="__span-8-5"><a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-8-6"><a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-8-7"><a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a><span class="kr">end</span>
</span><span id="__span-8-8"><a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a>
</span><span id="__span-8-9"><a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a><span class="c1">-- To everyone</span>
</span><span id="__span-8-10"><a id="__codelineno-8-10" name="__codelineno-8-10" href="#__codelineno-8-10"></a><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></code></pre></div>
<hr />
<h3 id="mpsendnotificationplayerid-message-icon-category"><code>MP.SendNotification(playerID, message, icon?, category?)</code></h3>
<p>向特定玩家或所有玩家发送通知(弹出窗口)。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID <code>-1</code>表示所有人。</li>
<li><code>message</code> (字符串)- 通知内容。</li>
<li><code>icon</code> (字符串,可选)- 通知图标。</li>
<li><code>category</code> (字符串,可选)- 通知类别。</li>
</ul>
<p><strong>注意:</strong>此函数不返回值。当仅使用 3 个参数(不指定类别)调用时,类别会自动设置为消息的值。</p>
<hr />
<h3 id="mpconfirmationdialogplayerid-title-body-buttons-interactionid-warning-reporttoserver-reporttoextensions"><code>MP.ConfirmationDialog(playerID, title, body, buttons, interactionID, warning?, reportToServer?, reportToExtensions?)</code></h3>
<p>向玩家发送带有按钮的确认对话框。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID <code>-1</code>表示所有人。</li>
<li><code>title</code> (字符串)- 对话框标题。</li>
<li><code>body</code> (字符串)- 对话框正文。</li>
<li><code>buttons</code> (表)- 按钮数组。</li>
<li><code>interactionID</code> (字符串)- 此交互的唯一标识符。</li>
<li><code>warning</code> (布尔值,可选)- 显示警告样式(默认值: <code>false</code> )。</li>
<li><code>reportToServer</code> (布尔值,可选)- 向服务器发送响应(默认值: <code>true</code> )。</li>
<li><code>reportToExtensions</code> (布尔值,可选)- 触发本地事件(默认值: <code>true</code> )。</li>
</ul>
<p><strong>注意:</strong>当只使用 5 个参数调用该函数时,该函数不返回值。当使用 6-8 个参数调用该函数时,它会返回<code>boolean, string</code></p>
<hr />
<h3 id="mptriggerclienteventplayerid-eventname-data-boolean-string"><code>MP.TriggerClientEvent(playerID, eventName, data) -&gt; boolean, string</code></h3>
<p>将事件发送给特定客户端或所有人。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID <code>-1</code>表示所有人。</li>
<li><code>eventName</code> (字符串)- 事件名称。</li>
<li><code>data</code> (字符串)- 要发送的数据。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 如果发送成功则为<code>true</code> <code>-1</code>始终为<code>true</code></li>
<li>(字符串)- 如果失败,则显示错误消息。</li>
</ul>
<hr />
<h3 id="mptriggerclienteventjsonplayerid-eventname-data-boolean-string"><code>MP.TriggerClientEventJson(playerID, eventName, data) -&gt; boolean, string</code></h3>
<p><code>TriggerClientEvent</code>相同,但接受 Lua 表并自动将其编码为 JSON。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)- 玩家的 ID <code>-1</code>表示所有人。</li>
<li><code>eventName</code> (字符串)- 事件名称。</li>
<li><code>data</code> (表) - 要进行 JSON 编码并发送的 Lua 表。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 成功时为<code>true</code></li>
<li>(字符串)- 如果失败,则显示错误消息。</li>
</ul>
<hr />
<h2 id="mp_4">MP — 事件</h2>
<h3 id="mpregistereventeventname-functionname"><code>MP.RegisterEvent(eventName, functionName)</code></h3>
<p>将函数注册为事件的处理程序。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>eventName</code> (字符串)- 事件名称。</li>
<li><code>functionName</code> (字符串)- 要注册的 Lua 函数的名称。</li>
</ul>
<p><strong>注意:</strong>如果事件不存在,则会创建该事件。可以为同一个事件注册多个处理程序。</p>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">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-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-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-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-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-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="kr">end</span>
</span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a>
</span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-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>
<hr />
<h3 id="mptriggerlocaleventeventname-table"><code>MP.TriggerLocalEvent(eventName, ...) -&gt; table</code></h3>
<p>仅在当前状态下触发事件。同步。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>eventName</code> (字符串)- 事件名称。</li>
<li><code>...</code> (任意,可选)——传递给处理程序的参数。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 所有处理程序的返回值表。</li>
</ul>
<p><strong>用法:</strong></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="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-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Results</span><span class="p">)</span>
</span></code></pre></div>
<hr />
<h3 id="mptriggerglobaleventeventname-table"><code>MP.TriggerGlobalEvent(eventName, ...) -&gt; table</code></h3>
<p>在所有状态下触发事件。异步执行。本地处理程序同步且立即运行。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>eventName</code> (字符串)- 事件名称。</li>
<li><code>...</code> (任意,可选)- 参数。支持的类型:字符串、数字、布尔值、表。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 类似 Future 的对象,包含:<ul>
<li><code>:IsDone() -&gt; boolean</code> — 所有处理程序是否已完成。</li>
<li><code>:GetResults() -&gt; table</code> — 返回所有处理程序的值。</li>
</ul>
</li>
</ul>
<p><strong>注意:</strong>调用这些方法时要用冒号<code>:</code>不要用句点<code>.</code></p>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">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-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></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-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></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><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="kr">end</span>
</span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></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-11-6"><a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Results</span><span class="p">)</span>
</span></code></pre></div>
<hr />
<h3 id="mpcreateeventtimereventname-intervalms-strategy"><code>MP.CreateEventTimer(eventName, intervalMS, strategy?)</code></h3>
<p>创建一个定时器,重复触发一个事件。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>eventName</code> (字符串)- 要触发的事件。</li>
<li><code>intervalMS</code> (数值)- 触发之间的间隔,以毫秒为单位。</li>
<li><code>strategy</code> (数字,可选)- <code>MP.CallStrategy.BestEffort</code> (默认值)或<code>MP.CallStrategy.Precise</code></li>
</ul>
<p><strong>注意:</strong>不建议使用低于 25 毫秒的间隔,且服务可能无法稳定运行。</p>
<p><strong>用法:</strong></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">seconds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a><span class="kr">function</span><span class="w"> </span><span class="nf">CountSeconds</span><span class="p">()</span>
</span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-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-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a><span class="kr">end</span>
</span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a>
</span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></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-12-8"><a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></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>
<hr />
<h3 id="mpcanceleventtimereventname"><code>MP.CancelEventTimer(eventName)</code></h3>
<p>取消已存在的事件计时器。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>eventName</code> (字符串)- 事件名称。</li>
</ul>
<p><strong>注意:</strong>由于异步行为,该事件在被取消之前可能会再次触发一次。</p>
<hr />
<h2 id="mp_5">MP — 工具</h2>
<h3 id="mpcreatetimer-table"><code>MP.CreateTimer() -&gt; table</code></h3>
<p>创建一个计时器对象,用于测量经过的时间。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 对象包含:<ul>
<li><code>:GetCurrent() -&gt; float</code> — 自上次开始以来经过的秒数。</li>
<li><code>:Start()</code> — 重置计时器。</li>
</ul>
</li>
</ul>
<p><strong>用法:</strong></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></code></pre></div>
<hr />
<h3 id="mpgetosname-string"><code>MP.GetOSName() -&gt; string</code></h3>
<p>返回服务器操作系统的名称。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- <code>"Windows"</code><code>"Linux"</code><code>"Other"</code></li>
</ul>
<hr />
<h3 id="mpgetserverversion-number-number-number"><code>MP.GetServerVersion() -&gt; number, number, number</code></h3>
<p>返回服务器版本。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(数字)- 主要</li>
<li>(数字)- 次要</li>
<li>number- 补丁</li>
</ul>
<p><strong>用法:</strong></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>
<hr />
<h3 id="mpgetconfigid-value"><code>MP.Get(configID) -&gt; value</code></h3>
<p>通过 ID 读取服务器配置设置。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>configID</code> (数字)- 来自<code>MP.Settings</code>的 ID。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(值)- 设置的当前值。</li>
</ul>
<hr />
<h3 id="mpsetconfigid-value"><code>MP.Set(configID, value)</code></h3>
<p>临时更改服务器配置设置。更改不会保存到配置文件中。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>configID</code> (数字)- 来自<code>MP.Settings</code>的 ID。</li>
<li><code>value</code> (任意)- 新值。类型必须与设置匹配。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="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></code></pre></div>
<hr />
<h3 id="mpsettings"><code>MP.Settings</code></h3>
<p>用于<code>MP.Get</code><code>MP.Set</code>设置 ID 枚举。</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="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Debug</span><span class="w"> </span><span class="c1">-- 0 (boolean)</span>
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Private</span><span class="w"> </span><span class="c1">-- 1 (boolean)</span>
</span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">MaxCars</span><span class="w"> </span><span class="c1">-- 2 (number)</span>
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">MaxPlayers</span><span class="w"> </span><span class="c1">-- 3 (number)</span>
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Map</span><span class="w"> </span><span class="c1">-- 4 (string)</span>
</span><span id="__span-16-6"><a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Name</span><span class="w"> </span><span class="c1">-- 5 (string)</span>
</span><span id="__span-16-7"><a id="__codelineno-16-7" name="__codelineno-16-7" href="#__codelineno-16-7"></a><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Description</span><span class="w"> </span><span class="c1">-- 6 (string)</span>
</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="py">Settings</span><span class="p">.</span><span class="py">InformationPacket</span><span class="w"> </span><span class="c1">-- 7 (boolean)</span>
</span></code></pre></div>
<hr />
<h3 id="mpcallstrategy"><code>MP.CallStrategy</code></h3>
<p>用于<code>MP.CreateEventTimer</code>枚举。</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="nv">MP</span><span class="p">.</span><span class="py">CallStrategy</span><span class="p">.</span><span class="py">BestEffort</span><span class="w"> </span><span class="c1">-- Skip trigger if previous handler hasn&#39;t finished (default)</span>
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a><span class="nv">MP</span><span class="p">.</span><span class="py">CallStrategy</span><span class="p">.</span><span class="py">Precise</span><span class="w"> </span><span class="c1">-- Always trigger, even if it causes the queue to build up</span>
</span></code></pre></div>
<hr />
<h3 id="mpsleepms"><code>MP.Sleep(ms)</code></h3>
<p>暂停当前​ Lua 状态若干毫秒。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>ms</code> (数字)- 睡眠时间(以毫秒为单位)。</li>
</ul>
<p><strong>注意:</strong>睡眠状态下不会执行任何操作。如果注册了事件处理程序,<strong>请勿让服务器睡眠超过 500 毫秒</strong>——睡眠状态会显著降低整个服务器的运行速度。</p>
<p><strong>用法:</strong></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="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-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
</span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h3 id="mpgetstatememoryusage-number"><code>MP.GetStateMemoryUsage() -&gt; number</code></h3>
<p>返回当前 Lua 状态的内存使用情况。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(数字)- 内存大小(以字节为单位)。</li>
</ul>
<hr />
<h3 id="mpgetluamemoryusage-number"><code>MP.GetLuaMemoryUsage() -&gt; number</code></h3>
<p>返回所有 Lua 状态的总内存使用量。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(数字)- 内存大小(以字节为单位)。</li>
</ul>
<hr />
<h2 id="util_1">Util — 日志记录</h2>
<h3 id="utilloginfo-utillogwarn-utillogerror-utillogdebug"><code>Util.LogInfo(...)</code><code>Util.LogWarn(...)</code><code>Util.LogError(...)</code><code>Util.LogDebug(...)</code></h3>
<p>在相应级别的服务器日志中打印信息。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>...</code> (任意)——任何类型的值。</li>
</ul>
<p><strong>注意:</strong>仅当启用<code>MP.Settings.Debug</code>时才会显示<code>Util.LogDebug</code></p>
<p><strong>用法:</strong></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="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-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-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-19-3"><a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-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-19-4"><a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-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>
<hr />
<h2 id="util-json">Util — JSON</h2>
<h3 id="utiljsonencodetable-string"><code>Util.JsonEncode(table) -&gt; string</code></h3>
<p>将 Lua 表编码为 JSON 字符串。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>table</code> table - 要编码的表。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 压缩后的 JSON 字符串。</li>
</ul>
<p><strong>注意:</strong>根据键类型自动检测数组还是对象。函数、用户数据和不支持的类型将被忽略。</p>
<p><strong>用法:</strong></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="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-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-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-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-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-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-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-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a><span class="p">}</span>
</span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-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><span id="__span-20-7"><a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a><span class="c1">-- &#39;{&quot;name&quot;:&quot;Lion&quot;,&quot;age&quot;:69,&quot;skills&quot;:[&quot;skill A&quot;,&quot;skill B&quot;]}&#39;</span>
</span></code></pre></div>
<hr />
<h3 id="utiljsondecodejson-table"><code>Util.JsonDecode(json) -&gt; table</code></h3>
<p>将 JSON 字符串解码为 Lua 表。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>json</code> (字符串)- 有效的 JSON 字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)——解码后的表。</li>
<li>nil- 如果 JSON 无效。</li>
</ul>
<p><strong>用法:</strong></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">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-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">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><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="c1">-- { message = &quot;OK&quot;, code = 200 }</span>
</span></code></pre></div>
<hr />
<h3 id="utiljsonprettifyjson-string"><code>Util.JsonPrettify(json) -&gt; string</code></h3>
<p>为 JSON 字符串添加缩进和换行符,以提高可读性(缩进为 4)。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>json</code> (字符串)- 有效的 JSON 字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 美化打印的 JSON。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">myjson</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-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonPrettify</span><span class="p">(</span><span class="nv">myjson</span><span class="p">))</span>
</span></code></pre></div>
<hr />
<h3 id="utiljsonminifyjson-string"><code>Util.JsonMinify(json) -&gt; string</code></h3>
<p>从 JSON 字符串中删除不必要的空格和换行符。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>json</code> (字符串)- 有效的 JSON 字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 压缩后的 JSON。</li>
</ul>
<p><strong>用法:</strong></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">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="w"> </span><span class="p">}))</span>
</span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></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>
<hr />
<h3 id="utiljsonflattenjson-string"><code>Util.JsonFlatten(json) -&gt; string</code></h3>
<p>根据 RFC 6901 将嵌套的 JSON 扁平化为<code>/a/b/c</code>样式的键。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>json</code> (字符串)- 有效的 JSON 字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 扁平化的 JSON。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">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">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-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">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-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="c1">-- &#39;{&quot;/name&quot;:&quot;Lion&quot;,&quot;/skills/0&quot;:&quot;skill A&quot;,&quot;/skills/1&quot;:&quot;skill B&quot;}&#39;</span>
</span></code></pre></div>
<hr />
<h3 id="utiljsonunflattenjson-string"><code>Util.JsonUnflatten(json) -&gt; string</code></h3>
<p>将扁平化的 JSON 恢复到其嵌套结构。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>json</code> (字符串)- 扁平化的 JSON 字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 嵌套 JSON。</li>
</ul>
<hr />
<h3 id="utiljsondiffa-b-string"><code>Util.JsonDiff(a, b) -&gt; string</code></h3>
<p>根据 RFC 6902 计算两个 JSON 字符串之间的差异。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>a</code> (字符串)- 第一个 JSON 字符串。</li>
<li><code>b</code> (字符串)- 第二个 JSON 字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 表示差异的 JSON 补丁。</li>
</ul>
<hr />
<h2 id="util_2">Util — 随机</h2>
<h3 id="utilrandom-float"><code>Util.Random() -&gt; float</code></h3>
<p>返回一个介于 0 和 1 之间的随机浮点数。</p>
<p><strong>返回:</strong></p>
<ul>
<li>float</li>
</ul>
<p><strong>用法:</strong></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">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-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="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><span id="__span-25-3"><a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a><span class="c1">-- rand: 0.135477</span>
</span></code></pre></div>
<hr />
<h3 id="utilrandomrangemin-max-float"><code>Util.RandomRange(min, max) -&gt; float</code></h3>
<p>返回给定范围内的随机浮点数。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>min</code> (数字)- 下限。</li>
<li><code>max</code> (数字)- 上限。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>float</li>
</ul>
<p><strong>用法:</strong></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="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-26-2"><a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a><span class="nb">print</span><span class="p">(</span><span class="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><span id="__span-26-3"><a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a><span class="c1">-- randFloat: 420.6969</span>
</span></code></pre></div>
<hr />
<h3 id="utilrandomintrangemin-max-number"><code>Util.RandomIntRange(min, max) -&gt; number</code></h3>
<p>返回给定范围内的随机整数。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>min</code> (数字)- 下限。</li>
<li><code>max</code> (数字)- 上限。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(数字)- 整数。</li>
</ul>
<p><strong>用法:</strong></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">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-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="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><span id="__span-27-3"><a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a><span class="c1">-- randInt: 69</span>
</span></code></pre></div>
<hr />
<h2 id="util_3">Util — 分析</h2>
<h3 id="utildebugstartprofilename"><code>Util.DebugStartProfile(name)</code></h3>
<p>启动一个命名执行时间测量。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>name</code> (字符串)- 此测量的标识符。</li>
</ul>
<hr />
<h3 id="utildebugstopprofilename"><code>Util.DebugStopProfile(name)</code></h3>
<p>停止指定名称的测量。必须在调用<code>DebugStartProfile</code>之后,并使用相同的名称调用此函数。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>name</code> (字符串)- 此测量的标识符。</li>
</ul>
<hr />
<h3 id="utildebugexecutiontime-table"><code>Util.DebugExecutionTime() -&gt; table</code></h3>
<p>返回每个已运行处理程序的执行时间统计信息。</p>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 每个处理程序: <code>mean</code><code>stdev</code><code>min</code><code>max</code><code>n</code> (全部以毫秒为单位)。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">printDebugExecutionTime</span><span class="p">()</span>
</span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-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-28-3"><a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-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-28-4"><a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-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-28-5"><a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-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-28-6"><a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-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-28-7"><a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-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-28-8"><a id="__codelineno-28-8" name="__codelineno-28-8" href="#__codelineno-28-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-28-9"><a id="__codelineno-28-9" name="__codelineno-28-9" href="#__codelineno-28-9"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-28-10"><a id="__codelineno-28-10" name="__codelineno-28-10" href="#__codelineno-28-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-28-11"><a id="__codelineno-28-11" name="__codelineno-28-11" href="#__codelineno-28-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-28-12"><a id="__codelineno-28-12" name="__codelineno-28-12" href="#__codelineno-28-12"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-28-13"><a id="__codelineno-28-13" name="__codelineno-28-13" href="#__codelineno-28-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-28-14"><a id="__codelineno-28-14" name="__codelineno-28-14" href="#__codelineno-28-14"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h2 id="http_1">Http</h2>
<h3 id="httpcreateconnectionhost-port-table"><code>Http.CreateConnection(host, port) -&gt; table</code></h3>
<p>创建与外部服务器的HTTP连接。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>host</code> (字符串)- 服务器地址。</li>
<li><code>port</code> number- 端口号。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 具有方法的连接对象<code>:Get(path, headers)</code></li>
</ul>
<hr />
<h3 id="connectiongetpath-headers"><code>connection:Get(path, headers)</code></h3>
<p>发送HTTP GET请求。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 请求路径。</li>
<li><code>headers</code> (表)- 表头作为<code>{[string] = string}</code></li>
</ul>
<hr />
<h2 id="fs_1">FS — 检查</h2>
<h3 id="fsexistspath-boolean"><code>FS.Exists(path) -&gt; boolean</code></h3>
<p>返回路径是否存在。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 要检查的路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 如果存在<code>true</code></li>
</ul>
<hr />
<h3 id="fsisdirectorypath-boolean"><code>FS.IsDirectory(path) -&gt; boolean</code></h3>
<p>返回指定路径是否为目录。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 要检查的路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 如果目录为<code>true</code></li>
</ul>
<p><strong>注意:</strong> <code>false</code>并不意味着该路径就是一个文件。请使用<code>FS.IsFile</code>单独进行检查。</p>
<hr />
<h3 id="fsisfilepath-boolean"><code>FS.IsFile(path) -&gt; boolean</code></h3>
<p>返回指定路径是否为普通文件。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 要检查的路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 如果是普通文件<code>true</code></li>
</ul>
<p><strong>注意:</strong> <code>false</code>并不意味着该路径是一个目录。</p>
<hr />
<h2 id="fs_2">FS — 操作</h2>
<h3 id="fscreatedirectorypath-boolean-string"><code>FS.CreateDirectory(path) -&gt; boolean, string</code></h3>
<p>创建目录,包括任何缺失的父目录(类似于<code>mkdir -p</code> )。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 要创建的目录的路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 成功时为<code>true</code></li>
<li>(字符串)- 失败时显示错误消息,成功时显示<code>""</code></li>
</ul>
<p><strong>用法:</strong></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">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-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a>
</span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-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-29-4"><a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-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-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a><span class="kr">end</span>
</span></code></pre></div>
<hr />
<h3 id="fsremovepath-boolean-string"><code>FS.Remove(path) -&gt; boolean, string</code></h3>
<p>删除文件或空目录。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 要删除的路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 成功时为<code>true</code></li>
<li>(字符串)- 失败时的错误信息。</li>
</ul>
<hr />
<h3 id="fsrenamepath-newpath-boolean-string"><code>FS.Rename(path, newPath) -&gt; boolean, string</code></h3>
<p>重命名或移动文件或目录。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 当前路径。</li>
<li><code>newPath</code> (字符串)- 新路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 成功时为<code>true</code></li>
<li>(字符串)- 失败时的错误信息。</li>
</ul>
<hr />
<h3 id="fscopypath-newpath-boolean-string"><code>FS.Copy(path, newPath) -&gt; boolean, string</code></h3>
<p>复制文件或目录(递归)。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 源路径。</li>
<li><code>newPath</code> (字符串)- 目标路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(布尔值)- 成功时为<code>true</code></li>
<li>(字符串)- 失败时的错误信息。</li>
</ul>
<hr />
<h3 id="fslistfilespath-table"><code>FS.ListFiles(path) -&gt; table</code></h3>
<p>返回目录中的文件名列表(非递归)。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 目录路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表)- 文件名数组。</li>
<li>nil- 如果路径不存在。</li>
</ul>
<p><strong>用法:</strong></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="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><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="c1">-- { 1: &quot;example.json&quot;, 2: &quot;example.lua&quot; }</span>
</span></code></pre></div>
<hr />
<h3 id="fslistdirectoriespath-table"><code>FS.ListDirectories(path) -&gt; table</code></h3>
<p>返回目录内所有目录名称的列表(非递归)。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 目录路径。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(表格)- 目录名称数组。</li>
<li>nil- 如果路径不存在。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua 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="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><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a><span class="c1">-- { 1: &quot;Client&quot;, 2: &quot;Server&quot; }</span>
</span></code></pre></div>
<hr />
<h2 id="fs_3">FS — 路径</h2>
<h3 id="fsgetfilenamepath-string"><code>FS.GetFilename(path) -&gt; string</code></h3>
<p>从指定路径返回带扩展名的文件名。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 路径字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 文件名。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a><span class="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-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></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-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></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>
<hr />
<h3 id="fsgetextensionpath-string"><code>FS.GetExtension(path) -&gt; string</code></h3>
<p>返回包含点号的文件扩展名。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 路径字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 扩展名(例如<code>".json"</code> ),如果没有扩展名,则为<code>""</code></li>
</ul>
<p><strong>用法:</strong></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="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-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></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-33-3"><a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-3"></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-33-4"><a id="__codelineno-33-4" name="__codelineno-33-4" href="#__codelineno-33-4"></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></code></pre></div>
<hr />
<h3 id="fsgetparentfolderpath-string"><code>FS.GetParentFolder(path) -&gt; string</code></h3>
<p>返回包含目录的路径。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 路径字符串。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 父文件夹路径。</li>
</ul>
<p><strong>用法:</strong></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="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-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></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-34-3"><a id="__codelineno-34-3" name="__codelineno-34-3" href="#__codelineno-34-3"></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>
<hr />
<h3 id="fsconcatpaths-string"><code>FS.ConcatPaths(...) -&gt; string</code></h3>
<p>使用系统首选分隔符将路径段连接起来,并解析存在的<code>..</code>分隔符。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>...</code> (字符串)- 路径段。</li>
</ul>
<p><strong>返回:</strong></p>
<ul>
<li>(字符串)- 连接路径。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-35-1"><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a><span class="nv">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><span id="__span-35-2"><a id="__codelineno-35-2" name="__codelineno-35-2" href="#__codelineno-35-2"></a><span class="c1">-- &quot;a/b/c/d/e/f/g/h.txt&quot;</span>
</span></code></pre></div>
<hr />
<h2 id="_5">事件</h2>
<h3 id="_6">玩家连接顺序</h3>
<div class="language-text highlight"><pre><span></span><code><span id="__span-36-1"><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a>onPlayerAuth → onPlayerConnecting → onPlayerJoining → onPlayerJoin
</span></code></pre></div>
<hr />
<h3 id="oninit"><code>onInit</code></h3>
<p>插件文件全部加载完毕后立即触发。</p>
<p><strong>参数:</strong><strong>可取消:</strong></p>
<hr />
<h3 id="onconsoleinput"><code>onConsoleInput</code></h3>
<p>当服务器控制台收到输入时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>input</code> (字符串)- 输入的文本。</li>
</ul>
<p><strong>可取消:</strong></p>
<p><strong>用法:</strong></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="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-37-2"><a id="__codelineno-37-2" name="__codelineno-37-2" href="#__codelineno-37-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-37-3"><a id="__codelineno-37-3" name="__codelineno-37-3" href="#__codelineno-37-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-37-4"><a id="__codelineno-37-4" name="__codelineno-37-4" href="#__codelineno-37-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-37-5"><a id="__codelineno-37-5" name="__codelineno-37-5" href="#__codelineno-37-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-37-6"><a id="__codelineno-37-6" name="__codelineno-37-6" href="#__codelineno-37-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">message</span>
</span><span id="__span-37-7"><a id="__codelineno-37-7" name="__codelineno-37-7" href="#__codelineno-37-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-37-8"><a id="__codelineno-37-8" name="__codelineno-37-8" href="#__codelineno-37-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-37-9"><a id="__codelineno-37-9" name="__codelineno-37-9" href="#__codelineno-37-9"></a><span class="kr">end</span>
</span><span id="__span-37-10"><a id="__codelineno-37-10" name="__codelineno-37-10" href="#__codelineno-37-10"></a>
</span><span id="__span-37-11"><a id="__codelineno-37-11" name="__codelineno-37-11" href="#__codelineno-37-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>
<hr />
<h3 id="onshutdown"><code>onShutdown</code></h3>
<p>服务器关闭且所有玩家都被踢出后触发。</p>
<p><strong>参数:</strong><strong>可取消:</strong></p>
<hr />
<h3 id="onplayerauth"><code>onPlayerAuth</code></h3>
<p>当玩家尝试连接时触发,在任何其他连接事件之前触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>name</code> (字符串)- 玩家名称。</li>
<li><code>role</code> (字符串)- 后端玩家角色。</li>
<li><code>isGuest</code> (布尔值)- 玩家是否为访客。</li>
<li><code>identifiers</code> (表) - 标识符: <code>ip</code><code>beammp</code><code>discord</code></li>
</ul>
<p><strong>可取消:</strong></p>
<ul>
<li>返回<code>1</code> — 以通用消息拒绝。</li>
<li>返回<code>string</code> ——拒绝,拒绝理由为该字符串。</li>
<li>返回<code>2</code> — 即使服务器已满也允许进入。</li>
</ul>
<p><strong>用法:</strong></p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-38-1"><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a><span class="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-38-2"><a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-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-38-3"><a id="__codelineno-38-3" name="__codelineno-38-3" href="#__codelineno-38-3"></a><span class="kr">end</span>
</span><span id="__span-38-4"><a id="__codelineno-38-4" name="__codelineno-38-4" href="#__codelineno-38-4"></a>
</span><span id="__span-38-5"><a id="__codelineno-38-5" name="__codelineno-38-5" href="#__codelineno-38-5"></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>
<hr />
<h3 id="postplayerauth"><code>postPlayerAuth</code></h3>
<p>无论玩家是否被接受或拒绝,都会在<code>onPlayerAuth</code>之后触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>wasRejected</code> (布尔值)- 玩家是否被拒绝。</li>
<li><code>reason</code> (字符串)- 如果被拒绝,则显示拒绝原因。</li>
<li><code>name</code> (字符串)- 玩家名称。</li>
<li><code>role</code> (字符串)- 玩家角色。</li>
<li><code>isGuest</code> (布尔值)- 是否为访客。</li>
<li><code>identifiers</code> (表)- 标识符。</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onplayerconnecting"><code>onPlayerConnecting</code></h3>
<p>当玩家开始连接时触发,在<code>onPlayerAuth</code>之后。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onplayerjoining"><code>onPlayerJoining</code></h3>
<p>玩家完成所有模组下载后触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onplayerjoin"><code>onPlayerJoin</code></h3>
<p>玩家完成同步并进入游戏后触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onplayerdisconnect"><code>onPlayerDisconnect</code></h3>
<p>当玩家断开连接时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onchatmessage"><code>onChatMessage</code></h3>
<p>当玩家发送聊天消息时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
<li><code>playerName</code> (字符串)</li>
<li><code>message</code> (字符串)</li>
</ul>
<p><strong>可取消:</strong>是——返回<code>1</code>可防止消息显示给任何人。</p>
<p><strong>用法:</strong></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="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-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></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-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</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="kr">else</span>
</span><span id="__span-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-39-6"><a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-39-7"><a id="__codelineno-39-7" name="__codelineno-39-7" href="#__codelineno-39-7"></a><span class="kr">end</span>
</span><span id="__span-39-8"><a id="__codelineno-39-8" name="__codelineno-39-8" href="#__codelineno-39-8"></a>
</span><span id="__span-39-9"><a id="__codelineno-39-9" name="__codelineno-39-9" href="#__codelineno-39-9"></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>
<hr />
<h3 id="postchatmessage"><code>postChatMessage</code></h3>
<p><code>onChatMessage</code>之后触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>wasSent</code> (布尔值)- 消息是否已发送。</li>
<li><code>playerID</code> (数字)</li>
<li><code>playerName</code> (字符串)</li>
<li><code>message</code> (字符串)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onvehiclespawn"><code>onVehicleSpawn</code></h3>
<p>当玩家生成新车辆时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
<li><code>data</code> (字符串)- 包含车辆配置和位置数据的 JSON 字符串。</li>
</ul>
<p><strong>可取消:</strong>是——返回非<code>0</code>值可阻止生成。</p>
<hr />
<h3 id="postvehiclespawn"><code>postVehicleSpawn</code></h3>
<p><code>onVehicleSpawn</code>之后触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>wasSpawned</code> (布尔值)- 车辆是否实际生成。</li>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
<li><code>data</code> (字符串)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onvehicleedited"><code>onVehicleEdited</code></h3>
<p>当玩家编辑现有车辆时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
<li><code>data</code> (字符串)- 新配置的 JSON 字符串(不包含位置数据)。</li>
</ul>
<p><strong>可取消:</strong>是——返回非<code>0</code>值将取消编辑。</p>
<hr />
<h3 id="postvehicleedited"><code>postVehicleEdited</code></h3>
<p><code>onVehicleEdited</code>之后触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>wasAllowed</code> (布尔值)- 是否允许编辑。</li>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
<li><code>data</code> (字符串)</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onvehicledeleted"><code>onVehicleDeleted</code></h3>
<p>当车辆被删除时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onvehiclereset"><code>onVehicleReset</code></h3>
<p>当玩家重置车辆时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
<li><code>data</code> (字符串)- 新位置和旋转的 JSON 字符串(不包含配置)。</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onvehiclepaintchanged"><code>onVehiclePaintChanged</code></h3>
<p>当车辆油漆发生变化时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>playerID</code> (数字)</li>
<li><code>vehicleID</code> number</li>
<li><code>data</code> (字符串)- 包含新绘制数据的 JSON 字符串。</li>
</ul>
<p><strong>可取消:</strong></p>
<hr />
<h3 id="onfilechanged"><code>onFileChanged</code></h3>
<p>当插件目录中的文件发生更改时触发。</p>
<p><strong>参数:</strong></p>
<ul>
<li><code>path</code> (字符串)- 相对于服务器根目录的已更改文件的路径。</li>
</ul>
<p><strong>可取消:</strong></p>
<p><strong>注意:</strong>服务器启动后添加的文件不会被跟踪。</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="2026年7月5日 11:07:26 UTC">2026年7月5日</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="2026年7月5日 11:07:26 UTC">2026年7月5日</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">
<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": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
<script src="../../../javascript/custom.js"></script>
</body>
</html>