Files
Docs/zh/scripting/server/latest-server-reference/index.html
T

6631 lines
323 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="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/scripting/server/latest-server-reference/">
<link rel="prev" href="../../mod-reference/">
<link rel="next" href="../v2-server-reference/">
<link rel="alternate" href="../../../../scripting/server/latest-server-reference/" hreflang="en">
<link rel="alternate" href="../../../../es/scripting/server/latest-server-reference/" hreflang="es">
<link rel="alternate" href="../../../../de/scripting/server/latest-server-reference/" hreflang="de">
<link rel="alternate" href="../../../../fr/scripting/server/latest-server-reference/" hreflang="fr">
<link rel="alternate" href="../../../../it/scripting/server/latest-server-reference/" hreflang="it">
<link rel="alternate" href="../../../../ru/scripting/server/latest-server-reference/" 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>Version 3.X (Latest) - BeamMP Docs</title>
<link rel="stylesheet" href="../../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../../stylesheets/custom.css">
<script>__md_scope=new URL("../../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<script id="__analytics">function __md_analytics(){function e(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],e("js",new Date),e("config","G-8T6ETLZCMC"),document.addEventListener("DOMContentLoaded",(function(){document.forms.search&&document.forms.search.query.addEventListener("blur",(function(){this.value&&e("event","search",{search_term:this.value})}));document$.subscribe((function(){var t=document.forms.feedback;if(void 0!==t)for(var a of t.querySelectorAll("[type=submit]"))a.addEventListener("click",(function(a){a.preventDefault();var n=document.location.pathname,d=this.getAttribute("data-md-value");e("event","feedback",{page:n,data:d}),t.firstElementChild.disabled=!0;var r=t.querySelector(".md-feedback__note [data-md-value='"+d+"']");r&&(r.hidden=!1)})),t.hidden=!1})),location$.subscribe((function(t){e("config","G-8T6ETLZCMC",{page_path:t.pathname})}))}));var t=document.createElement("script");t.async=!0,t.src="https://www.googletagmanager.com/gtag/js?id=G-8T6ETLZCMC",document.getElementById("__analytics").insertAdjacentElement("afterEnd",t)}</script>
<script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
<meta property="og:type" content="website" />
<meta property="og:title" content="Version 3.X (Latest) - BeamMP Docs" />
<meta property="og:description" content="This website serves as the new BeamMP Documentation site for general self serve support, guides and documentation. Best of all it is source available so you the community can help us to A. keep it up-to-date and B. providing the content you require." />
<meta property="og:image" content="https://docs.beammp.com/assets/images/social/zh/scripting/server/latest-server-reference.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://docs.beammp.com/zh/scripting/server/latest-server-reference/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Version 3.X (Latest) - BeamMP Docs" />
<meta property="twitter:description" content="This website serves as the new BeamMP Documentation site for general self serve support, guides and documentation. Best of all it is source available so you the community can help us to A. keep it up-to-date and B. providing the content you require." />
<meta property="twitter:image" content="https://docs.beammp.com/assets/images/social/zh/scripting/server/latest-server-reference.png" />
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
跳转至
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="页眉">
<a href="/" title="BeamMP Docs" class="md-header__button md-logo" aria-label="BeamMP Docs" data-md-component="logo">
<img src="../../../../assets/core/beammp_dark.png" alt="logo" class="logo-light" />
<img src="../../../../assets/core/beammp_light.png" alt="logo" class="logo-dark" />
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
BeamMP Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="选择当前语言">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.5 17.5 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="../../../../scripting/server/latest-server-reference/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="../../../../es/scripting/server/latest-server-reference/" hreflang="es" class="md-select__link">
Español
</a>
</li>
<li class="md-select__item">
<a href="../../../../de/scripting/server/latest-server-reference/" hreflang="de" class="md-select__link">
Deutsch
</a>
</li>
<li class="md-select__item">
<a href="../../../../fr/scripting/server/latest-server-reference/" hreflang="fr" class="md-select__link">
Français
</a>
</li>
<li class="md-select__item">
<a href="../../../../it/scripting/server/latest-server-reference/" hreflang="it" class="md-select__link">
Italiano
</a>
</li>
<li class="md-select__item">
<a href="../../../../ru/scripting/server/latest-server-reference/" 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 md-tabs__item--active">
<a href="../../mod-reference/" class="md-tabs__link">
脚本参考
</a>
</li>
<li class="md-tabs__item">
<a href="../../../contributing/" class="md-tabs__link">
参与贡献
</a>
</li>
<li class="md-tabs__item">
<a href="../../../community/" class="md-tabs__link">
社区
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="导航栏" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="/" title="BeamMP Docs" class="md-nav__button md-logo" aria-label="BeamMP Docs" data-md-component="logo">
<img src="../../../../assets/core/beammp_dark.png" alt="logo" class="logo-light" />
<img src="../../../../assets/core/beammp_light.png" alt="logo" class="logo-dark" />
</a>
BeamMP Docs
</label>
<div class="md-nav__source">
<a href="https://github.com/beammp/docs" title="前往仓库" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
beammp/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../" class="md-nav__link">
<span class="md-ellipsis">
首页
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
支持
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
支持
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_1" >
<label class="md-nav__link" for="__nav_2_1" id="__nav_2_1_label" tabindex="0">
<span class="md-ellipsis">
游玩 BeamMP
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
游玩 BeamMP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../game/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
安装 BeamMP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../game/error-codes/" class="md-nav__link">
<span class="md-ellipsis">
错误代码
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../game/multiplayer-settings/" class="md-nav__link">
<span class="md-ellipsis">
多人模式设置
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_2" >
<label class="md-nav__link" for="__nav_2_2" id="__nav_2_2_label" tabindex="0">
<span class="md-ellipsis">
Running a BeamMP-Server
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Running a BeamMP-Server
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../server/create-a-server/" class="md-nav__link">
<span class="md-ellipsis">
服务器设置(首页)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../server/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="../../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--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
脚本参考
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
脚本参考
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mod-reference/" class="md-nav__link">
<span class="md-ellipsis">
Client Scripting Reference
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" checked>
<label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="">
<span class="md-ellipsis">
服务器
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6_2">
<span class="md-nav__icon md-icon"></span>
服务器
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Version 3.X (Latest)
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#3x" class="md-nav__link">
<span class="md-ellipsis">
服务器版本 3.X
</span>
</a>
<nav class="md-nav" aria-label="服务器版本 3.X">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
目录结构
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lua" class="md-nav__link">
<span class="md-ellipsis">
Lua 文件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
事件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
自定义事件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
事件计时器 ("线程")
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
调试
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
自定义命令
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api" class="md-nav__link">
<span class="md-ellipsis">
API 参考
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
内键指令功能
</span>
</a>
<nav class="md-nav" aria-label="内键指令功能">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#print-printraw" class="md-nav__link">
<span class="md-ellipsis">
print(...), printRaw(...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit" class="md-nav__link">
<span class="md-ellipsis">
exit()
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp" 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-timer" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateTimer() -&gt; Timer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetosname-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetOSName() -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetserverversion-numbernumbernumber" class="md-nav__link">
<span class="md-ellipsis">
MP.GetServerVersion() -&gt; number,number,number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpregistereventevent_name-string-function_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.RegisterEvent(event_name: string, function_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcreateeventtimerevent_name-string-interval_ms-number-strategy-number-since-v302" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateEventTimer(event_name: string, interval_ms: number, [strategy: number (since v3.0.2)])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcanceleventtimerevent_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.CancelEventTimer(event_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerlocaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerLocalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerglobaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerGlobalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsleeptime_ms-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Sleep(time_ms: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsendchatmessageplayer_id-number-message-string" class="md-nav__link">
<span class="md-ellipsis">
MP.SendChatMessage(player_id: number, message: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventjsonplayer_id-number-event_name-string-data-table-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEventJson(player_id: number, event_name: string, data: table) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayercount-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerCount() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetpositionrawpid-number-vid-number-tablestring" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerconnectedplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerConnected(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayernameplayer_id-number-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerName(player_id: number) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpremovevehicleplayer_id-number-vehicle_id-number" class="md-nav__link">
<span class="md-ellipsis">
MP.RemoveVehicle(player_id: number, vehicle_id: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayervehiclesplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerVehicles(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayers-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayers() -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerguestplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerGuest(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpdropplayerplayer_id-number-reason-string" class="md-nav__link">
<span class="md-ellipsis">
MP.DropPlayer(player_id: number, [reason: string])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetstatememoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetStateMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetluamemoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetLuaMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayeridentifiersplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerIdentifiers(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsetsetting-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Set(setting: number, ...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsettings-table" class="md-nav__link">
<span class="md-ellipsis">
MP.Settings -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util" 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="#utiljson" class="md-nav__link">
<span class="md-ellipsis">
Util.Json*
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonencodetable-table-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonEncode(table: table) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondecodejson-string-table" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDecode(json: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonprettifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonPrettify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonminifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonMinify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonFlatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonunflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonUnflatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffa-string-b-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiff(a: string, b: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffapplybase-string-diff-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiffApply(base: string, diff: string) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utilrandom" class="md-nav__link">
<span class="md-ellipsis">
Util.Random*
</span>
</a>
<nav class="md-nav" aria-label="Util.Random*">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utilrandom-float" class="md-nav__link">
<span class="md-ellipsis">
Util.Random() -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomintrangemin-int-max-int-int" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomIntRange(min: int, max: int) -&gt; int
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomrangemin-number-max-number-float" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomRange(min: number, max: number) -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilloginfoparams-v330" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(params: ...) 及其关联方法集(自 v3.3.0 版本起)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utildebugexecutiontime-table" class="md-nav__link">
<span class="md-ellipsis">
Util.DebugExecutionTime() -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs" 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-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.CreateDirectory(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsremovepath-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Remove(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsrenamepatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Rename(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fscopypatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Copy(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetfilenamepath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetFilename(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetextensionpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetExtension(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetparentfolderpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetParentFolder(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsexistspath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.Exists(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisdirectorypath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsDirectory(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisfilepath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsFile(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistdirectoriespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListDirectories(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistfilespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListFiles(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsconcatpaths-string" class="md-nav__link">
<span class="md-ellipsis">
FS.ConcatPaths(...) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_10" class="md-nav__link">
<span class="md-ellipsis">
事件
</span>
</a>
<nav class="md-nav" aria-label="事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_11" class="md-nav__link">
<span class="md-ellipsis">
说明
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_12" class="md-nav__link">
<span class="md-ellipsis">
事件摘要
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_13" class="md-nav__link">
<span class="md-ellipsis">
系统事件
</span>
</a>
<nav class="md-nav" aria-label="系统事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#oninit" class="md-nav__link">
<span class="md-ellipsis">
onInit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onconsoleinput" class="md-nav__link">
<span class="md-ellipsis">
onConsoleInput
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onshutdown" class="md-nav__link">
<span class="md-ellipsis">
onShutdown
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_14" class="md-nav__link">
<span class="md-ellipsis">
游戏相关事件
</span>
</a>
<nav class="md-nav" aria-label="游戏相关事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#onplayerauth" class="md-nav__link">
<span class="md-ellipsis">
onPlayerAuth
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerconnecting" class="md-nav__link">
<span class="md-ellipsis">
onPlayerConnecting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerjoining" class="md-nav__link">
<span class="md-ellipsis">
onPlayerJoining
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerdisconnect" class="md-nav__link">
<span class="md-ellipsis">
onPlayerDisconnect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onchatmessage" class="md-nav__link">
<span class="md-ellipsis">
onChatMessage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclespawn" class="md-nav__link">
<span class="md-ellipsis">
onVehicleSpawn
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicleedited" class="md-nav__link">
<span class="md-ellipsis">
onVehicleEdited
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicledeleted" class="md-nav__link">
<span class="md-ellipsis">
onVehicleDeleted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclereset" class="md-nav__link">
<span class="md-ellipsis">
onVehicleReset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onfilechanged" class="md-nav__link">
<span class="md-ellipsis">
onFileChanged
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#lua_1" class="md-nav__link">
<span class="md-ellipsis">
从旧Lua迁移
</span>
</a>
<nav class="md-nav" aria-label="从旧Lua迁移">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#lua_2" class="md-nav__link">
<span class="md-ellipsis">
理解新的lua如何工作
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_15" class="md-nav__link">
<span class="md-ellipsis">
搜索和替换
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_16" class="md-nav__link">
<span class="md-ellipsis">
再见线程,你好事件计时器!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_17" class="md-nav__link">
<span class="md-ellipsis">
不再支持隐式事件调用
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../v2-server-reference/" class="md-nav__link">
<span class="md-ellipsis">
Version 2.X (Deprecated)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
参与贡献
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
参与贡献
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../contributing/" class="md-nav__link">
<span class="md-ellipsis">
快速开始
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<div class="md-nav__link md-nav__container">
<a href="../../../community/" class="md-nav__link ">
<span class="md-ellipsis">
社区
</span>
</a>
<label class="md-nav__link " for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
社区
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../community/rules/" class="md-nav__link">
<span class="md-ellipsis">
Rules
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#3x" class="md-nav__link">
<span class="md-ellipsis">
服务器版本 3.X
</span>
</a>
<nav class="md-nav" aria-label="服务器版本 3.X">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
介绍
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
目录结构
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#lua" class="md-nav__link">
<span class="md-ellipsis">
Lua 文件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
事件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
自定义事件
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
事件计时器 ("线程")
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
调试
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
自定义命令
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api" class="md-nav__link">
<span class="md-ellipsis">
API 参考
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
内键指令功能
</span>
</a>
<nav class="md-nav" aria-label="内键指令功能">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#print-printraw" class="md-nav__link">
<span class="md-ellipsis">
print(...), printRaw(...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exit" class="md-nav__link">
<span class="md-ellipsis">
exit()
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mp" 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-timer" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateTimer() -&gt; Timer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetosname-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetOSName() -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetserverversion-numbernumbernumber" class="md-nav__link">
<span class="md-ellipsis">
MP.GetServerVersion() -&gt; number,number,number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpregistereventevent_name-string-function_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.RegisterEvent(event_name: string, function_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcreateeventtimerevent_name-string-interval_ms-number-strategy-number-since-v302" class="md-nav__link">
<span class="md-ellipsis">
MP.CreateEventTimer(event_name: string, interval_ms: number, [strategy: number (since v3.0.2)])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpcanceleventtimerevent_name-string" class="md-nav__link">
<span class="md-ellipsis">
MP.CancelEventTimer(event_name: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerlocaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerLocalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerglobaleventevent_name-string-table" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerGlobalEvent(event_name: string, ...) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsleeptime_ms-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Sleep(time_ms: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsendchatmessageplayer_id-number-message-string" class="md-nav__link">
<span class="md-ellipsis">
MP.SendChatMessage(player_id: number, message: string)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventplayer_id-number-event_name-string-data-string-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mptriggerclienteventjsonplayer_id-number-event_name-string-data-table-booleanstring" class="md-nav__link">
<span class="md-ellipsis">
MP.TriggerClientEventJson(player_id: number, event_name: string, data: table) -&gt; boolean,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayercount-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerCount() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetpositionrawpid-number-vid-number-tablestring" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerconnectedplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerConnected(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayernameplayer_id-number-string" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerName(player_id: number) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpremovevehicleplayer_id-number-vehicle_id-number" class="md-nav__link">
<span class="md-ellipsis">
MP.RemoveVehicle(player_id: number, vehicle_id: number)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayervehiclesplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerVehicles(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayers-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayers() -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpisplayerguestplayer_id-number-boolean" class="md-nav__link">
<span class="md-ellipsis">
MP.IsPlayerGuest(player_id: number) -&gt; boolean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpdropplayerplayer_id-number-reason-string" class="md-nav__link">
<span class="md-ellipsis">
MP.DropPlayer(player_id: number, [reason: string])
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetstatememoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetStateMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetluamemoryusage-number" class="md-nav__link">
<span class="md-ellipsis">
MP.GetLuaMemoryUsage() -&gt; number
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpgetplayeridentifiersplayer_id-number-table" class="md-nav__link">
<span class="md-ellipsis">
MP.GetPlayerIdentifiers(player_id: number) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsetsetting-number" class="md-nav__link">
<span class="md-ellipsis">
MP.Set(setting: number, ...)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mpsettings-table" class="md-nav__link">
<span class="md-ellipsis">
MP.Settings -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#util" 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="#utiljson" class="md-nav__link">
<span class="md-ellipsis">
Util.Json*
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonencodetable-table-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonEncode(table: table) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondecodejson-string-table" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDecode(json: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonprettifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonPrettify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonminifyjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonMinify(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonFlatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsonunflattenjson-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonUnflatten(json: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffa-string-b-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiff(a: string, b: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utiljsondiffapplybase-string-diff-string-string" class="md-nav__link">
<span class="md-ellipsis">
Util.JsonDiffApply(base: string, diff: string) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utilrandom" class="md-nav__link">
<span class="md-ellipsis">
Util.Random*
</span>
</a>
<nav class="md-nav" aria-label="Util.Random*">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#utilrandom-float" class="md-nav__link">
<span class="md-ellipsis">
Util.Random() -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomintrangemin-int-max-int-int" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomIntRange(min: int, max: int) -&gt; int
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilrandomrangemin-number-max-number-float" class="md-nav__link">
<span class="md-ellipsis">
Util.RandomRange(min: number, max: number) -&gt; float
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utilloginfoparams-v330" class="md-nav__link">
<span class="md-ellipsis">
Util.LogInfo(params: ...) 及其关联方法集(自 v3.3.0 版本起)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#utildebugexecutiontime-table" class="md-nav__link">
<span class="md-ellipsis">
Util.DebugExecutionTime() -&gt; table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#fs" 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-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.CreateDirectory(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsremovepath-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Remove(path: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsrenamepatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Rename(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fscopypatha-string-pathb-string-boolstring" class="md-nav__link">
<span class="md-ellipsis">
FS.Copy(pathA: string, pathB: string) -&gt; bool,string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetfilenamepath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetFilename(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetextensionpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetExtension(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsgetparentfolderpath-string-string" class="md-nav__link">
<span class="md-ellipsis">
FS.GetParentFolder(path: string) -&gt; string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsexistspath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.Exists(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisdirectorypath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsDirectory(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsisfilepath-string-bool" class="md-nav__link">
<span class="md-ellipsis">
FS.IsFile(path: string) -&gt; bool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistdirectoriespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListDirectories(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fslistfilespath-string-table" class="md-nav__link">
<span class="md-ellipsis">
FS.ListFiles(path: string) -&gt; table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fsconcatpaths-string" class="md-nav__link">
<span class="md-ellipsis">
FS.ConcatPaths(...) -&gt; string
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_10" class="md-nav__link">
<span class="md-ellipsis">
事件
</span>
</a>
<nav class="md-nav" aria-label="事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_11" class="md-nav__link">
<span class="md-ellipsis">
说明
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_12" class="md-nav__link">
<span class="md-ellipsis">
事件摘要
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_13" class="md-nav__link">
<span class="md-ellipsis">
系统事件
</span>
</a>
<nav class="md-nav" aria-label="系统事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#oninit" class="md-nav__link">
<span class="md-ellipsis">
onInit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onconsoleinput" class="md-nav__link">
<span class="md-ellipsis">
onConsoleInput
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onshutdown" class="md-nav__link">
<span class="md-ellipsis">
onShutdown
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_14" class="md-nav__link">
<span class="md-ellipsis">
游戏相关事件
</span>
</a>
<nav class="md-nav" aria-label="游戏相关事件">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#onplayerauth" class="md-nav__link">
<span class="md-ellipsis">
onPlayerAuth
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerconnecting" class="md-nav__link">
<span class="md-ellipsis">
onPlayerConnecting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerjoining" class="md-nav__link">
<span class="md-ellipsis">
onPlayerJoining
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onplayerdisconnect" class="md-nav__link">
<span class="md-ellipsis">
onPlayerDisconnect
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onchatmessage" class="md-nav__link">
<span class="md-ellipsis">
onChatMessage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclespawn" class="md-nav__link">
<span class="md-ellipsis">
onVehicleSpawn
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicleedited" class="md-nav__link">
<span class="md-ellipsis">
onVehicleEdited
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehicledeleted" class="md-nav__link">
<span class="md-ellipsis">
onVehicleDeleted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onvehiclereset" class="md-nav__link">
<span class="md-ellipsis">
onVehicleReset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#onfilechanged" class="md-nav__link">
<span class="md-ellipsis">
onFileChanged
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#lua_1" class="md-nav__link">
<span class="md-ellipsis">
从旧Lua迁移
</span>
</a>
<nav class="md-nav" aria-label="从旧Lua迁移">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#lua_2" class="md-nav__link">
<span class="md-ellipsis">
理解新的lua如何工作
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_15" class="md-nav__link">
<span class="md-ellipsis">
搜索和替换
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_16" class="md-nav__link">
<span class="md-ellipsis">
再见线程,你好事件计时器!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_17" class="md-nav__link">
<span class="md-ellipsis">
不再支持隐式事件调用
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="导航栏" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../../../" class="md-path__link">
<span class="md-ellipsis">
首页
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../mod-reference/" class="md-path__link">
<span class="md-ellipsis">
脚本参考
</span>
</a>
</li>
<li class="md-path__item">
<a href="./" class="md-path__link">
<span class="md-ellipsis">
服务器
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<a href="https://github.com/beammp/docs/edit/main/docs/zh/scripting/server/latest-server-reference.md" title="编辑此页" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="https://github.com/beammp/docs/raw/main/docs/zh/scripting/server/latest-server-reference.md" title="查看本页的源代码" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<div class="admonition 警告">
<p class="admonition-title">这个网站正在建设中!</p>
</div>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>这个网站正在积极建设中。
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>觉得你能帮上忙吗?请用铅笔在右侧点击页面!
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>这也可以在任何页面上完成。
</span></code></pre></div>
<h1 id="_1">服务器脚本参考</h1>
<h2 id="3x">服务器版本 3.X</h2>
<h3 id="_2">介绍</h3>
<p>BeamMP-Server v3.0.0版本对Lua插件系统的工作方式做了一些重大的改变。没有办法在新服务器上使用旧的lua,因此您必须进行迁移。</p>
<p>服务器的插件系统使用<a href="https://www.lua.org/manual/5.3/">Lua 5.3</a>。本节详细介绍了如何开始编写插件,教一些基本概念,并让您开始使用第一个插件。即使您了解v3.0.0之前的系统,也建议您阅读本节,因为现在发生了一些巨大的变化。</p>
<p>有关从v3.0.0之前版本的lua迁移指南,请转到<a href="#migrating-from-old-lua">“从旧lua迁移”</a>一节。</p>
<h3 id="_3">目录结构</h3>
<p>服务器插件(Server plugins)与模组(mods)的默认安装路径存在差异:前者默认位于&lt;code&gt;Resources/Server&lt;/code&gt;目录下,而专为BeamNG.drive编写且需同步至客户端的模组则存放于&lt;code&gt;Resources/Client&lt;/code&gt;路径。每个插件必须在&lt;code&gt;Resources/Server&lt;/code&gt;目录下拥有独立子文件夹,例如名为"MyPlugin"的插件应具备如下结构:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Resources
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>└── Server
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> ├── MyPlugin
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> │ └── main.lua
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> └── SomeOtherPlugin
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> └── ...
</span></code></pre></div>
<p>为演示&lt;code&gt;Resources/Server&lt;/code&gt;目录如何管理多插件共存的情况,此处同时展示名为"SomeOtherPlugin"的另一插件配置。本指南将持续以该目录结构作为操作基准示例,所有代码片段及配置文件均基于此层级关系展开说明。</p>
<p>您会注意到核心配置文件&lt;code&gt;main.lua&lt;/code&gt;的存在。开发者可自由创建多个&lt;code&gt;.lua&lt;/code&gt;扩展名的脚本文件(建议遵循&lt;a href="https://github.com/BeamMP/BeamMP-Server/wiki/Scripting-Guide"&gt;BeamMP脚本规范&lt;/a&gt;),所有位于插件主目录层级的Lua文件将按&lt;strong&gt;字母表顺序&lt;/strong&gt;初始化(如&lt;code&gt;aaa.lua&lt;/code&gt;优先于&lt;code&gt;bbb.lua&lt;/code&gt;执行)。</p>
<h3 id="lua">Lua 文件</h3>
<p>插件目录中的每个&lt;code&gt;.lua&lt;/code&gt;文件都会在服务器启动时加载。这意味着所有函数外部的语句会被立即解析执行(即"运行"),该行为由BeamMP服务端核心的Lua虚拟机在初始化阶段强制触发。</p>
<p>子目录中的Lua文件不会被自动加载,但可通过<code>require()</code>函数手动调用。</p>
<p>例如,<code>main.Lua</code>是这样的:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">PrintMyName</span><span class="p">()</span>
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;I&#39;m &#39;My Plugin&#39;!&quot;</span><span class="p">)</span>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="kr">end</span>
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;What&#39;s up!&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>当服务器启动时,<code>main.lua</code>会启动,它会把<code>print("What's up!")</code><em>运行</em>,但是<strong>不会</strong> <em>调用</em> <code>PrintMyName</code>函数(因为它没有被调用)!</p>
<h3 id="_4">事件</h3>
<p>事件类似于“玩家加入”,“玩家发送聊天信息”,“玩家生成车辆”。</p>
<p>您可以通过从处理程序返回<code>1</code>来取消事件(如果它们是可取消的)。</p>
<p>在Lua中,您通常希望对其中的一些做出反应。为此,您可以注册一个“处理程序”。这是一个在事件发生时调用的函数,并传递一些参数。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">MyChatMessageHandler</span><span class="p">(</span><span class="nv">sender_id</span><span class="p">,</span><span class="w"> </span><span class="nv">sender_name</span><span class="p">,</span><span class="w"> </span><span class="nv">message</span><span class="p">)</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="c1">-- censoring only the exact message &#39;darn&#39;</span>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;darn&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="c1">-- cancel the event by returning 1</span>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-3-8"><a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-3-9"><a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="kr">end</span>
</span><span id="__span-3-10"><a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a>
</span><span id="__span-3-11"><a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;MyChatMessageHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>这将有效确保任何与<em>"darn"</em><strong>完全匹配</strong>的信息既不会被发送也不会出现在聊天中(注意:实际脏话过滤器应检测消息<em>是否包含</em>"darn"而非<em>完全等于</em>)。<code>取消事件</code>会阻止其发生,例如使聊天信息<code>不向其他玩家显示</code>,载具<code>无法生成</code>等情形。</p>
<h3 id="_5">自定义事件</h3>
<p>您可以注册任何您喜欢的事件,例如:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;MyCoolCustomEvent&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;MyHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>您可以触发这些自定义事件:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1">-- call all event handlers to this in ALL plugins</span>
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerGlobalEvent</span><span class="p">(</span><span class="s2">&quot;MyCoolCustomEvent&quot;</span><span class="p">)</span>
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="c1">-- call all event handlers to this in THIS plugin</span>
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerLocalEvent</span><span class="p">(</span><span class="s2">&quot;MyCoolCustomEvent&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>您可以使用事件做更多的事情,但是这些可能性将在下面的API参考中详细介绍。</p>
<h3 id="_6">事件计时器 ("线程")</h3>
<p>在v3.0.0之前,Lua有一个每秒运行X次的“线程”概念。这个命名有点误导人,因为它们是同步的。</p>
<p>v3.0.0 Lua改为“事件计时器”。这些是在服务器内部运行的计时器,一旦它们用完,它们就会触发一个事件(全局)。这也是同步的。请注意,第二个参数是以毫秒为单位的间隔。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">seconds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="kr">function</span><span class="w"> </span><span class="nf">CountSeconds</span><span class="p">()</span>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="w"> </span><span class="nv">seconds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">seconds</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="kr">end</span>
</span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>
</span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="c1">-- create a custom event called &#39;EverySecond&#39;</span>
</span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="c1">-- and register the handler function &#39;CountSeconds&#39; to it</span>
</span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;EverySecond&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;CountSeconds&quot;</span><span class="p">)</span>
</span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>
</span><span id="__span-6-11"><a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="c1">-- create a timer for this event, which will fire every 1000ms (1s)</span>
</span><span id="__span-6-12"><a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateEventTimer</span><span class="p">(</span><span class="s2">&quot;EverySecond&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">1000</span><span class="p">)</span>
</span></code></pre></div>
<p>这将导致“CountSeconds”每秒被调用一次。您还可以取消使用事件计时器<code>MP.CancelEventTimer</code>(参见API参考)。</p>
<p>从服务器的控制台中,您可以运行<code>status</code>来查看当前正在运行的事件计时器的数量,以及正在等待的事件处理程序的信息。该命令将在将来显示更多信息。</p>
<h3 id="_7">调试</h3>
<p>Lua很难调试。遗憾的是,像<code>gdb</code>这样的工业级调试器并不存在于嵌入式Lua中。</p>
<p>通常,您当然可以在任何时候简单地<code>print()</code>您想要检查的值。</p>
<p>在v3.0.0中,服务器为您提供了一种将解释器注入插件并随后在其中实时运行Lua的最接近调试器的方法。</p>
<p>假设你有上面我们称为<code>MyPlugin</code>的插件,你可以像这样进入它的Lua状态:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>&gt; lua MyPlugin
</span></code></pre></div>
<p>字母大小写在此处至关重要,请确保输入准确无误。最终输出结果需严格遵循既定格式要求。</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>lua @MyPlugin&gt;
</span></code></pre></div>
<p>如你所见,我们已切入<code>MyPlugin</code>的Lua运行环境。自当前操作时点起,至执行<code>exit()</code>指令前(v3.1.0版本后变更为<code>:exit</code>),系统将全程驻留于<code>MyPlugin</code>模块,在此状态下可执行Lua脚本操作。</p>
<p>例如,如果我们有一个名为<code>MyValue</code>的全局变量,我们可以像这样输出该值:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>lua @MyPlugin&gt; print(MyValue)
</span></code></pre></div>
<p>你可以在这里调用函数,做任何你想做的事情。</p>
<p>从v3.1.0开始:你可以按TAB键来自动完成函数和变量。</p>
<p>警告:不幸的是,如果Lua状态当前正忙于执行其他代码(如<code>while</code>循环),这可能会使控制台完全挂起,直到它完成这项工作,所以切换到可能正在等待某些事情发生的状态时要非常小心。</p>
<p>此外,您可以在常规控制台(<code>&gt;</code>)中运行<code>status</code>,这将向您显示有关Lua的一些统计信息。</p>
<h3 id="_8">自定义命令</h3>
<p>为了实现服务器控制台的自定义命令,可以使用事件<code>onConsoleInput</code>。当你想为服务器所有者添加一种向插件发送信号的方式,或者以自定义方式显示内部状态时,这可能很有用。</p>
<p>这里有一个范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">handleConsoleInput</span><span class="p">(</span><span class="nv">cmd</span><span class="p">)</span>
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">delim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">cmd</span><span class="p">:</span><span class="nf">find</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">delim</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-10-4"><a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">cmd</span><span class="p">:</span><span class="nf">sub</span><span class="p">(</span><span class="nv">delim</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span><span id="__span-10-5"><a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">cmd</span><span class="p">:</span><span class="nf">sub</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nv">delim</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;print&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-10-6"><a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">message</span>
</span><span id="__span-10-7"><a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-10-8"><a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-10-9"><a id="__codelineno-10-9" name="__codelineno-10-9" href="#__codelineno-10-9"></a><span class="kr">end</span>
</span><span id="__span-10-10"><a id="__codelineno-10-10" name="__codelineno-10-10" href="#__codelineno-10-10"></a>
</span><span id="__span-10-11"><a id="__codelineno-10-11" name="__codelineno-10-11" href="#__codelineno-10-11"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onConsoleInput&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;handleConsoleInput&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>这将使您能够在服务器的控制台中执行以下操作:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>&gt; print hello, world
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a>hello, world
</span></code></pre></div>
<p>我们实现了自己的<code>print</code>。作为练习,尝试构建一个像<code>say</code>这样的函数,它将聊天消息发送给所有玩家,甚至是特定的玩家(使用<code>MP.SendChatMessage</code>)。</p>
<p><strong>注意:</strong>对于你自己的插件,通常建议给它们“namespace”。我们的<code>print</code>示例,在一个名为<code>mystuff</code>的插件中,可以称为<code>mystuff.print</code><code>ms.print</code>或类似内容。</p>
<h3 id="api">API 参考</h3>
<p>文档格式: <code>function_name(arg_name: arg_type, arg_name: arg_type) -&gt; return_types</code></p>
<h3 id="_9">内键指令功能</h3>
<h4 id="print-printraw"><code>print(...)</code>, <code>printRaw(...)</code></h4>
<p>将消息输出到服务器控制台,前缀<code>[DATE TIME] [LUA]</code>. 如果你不想要这个前缀, 你可以使用<code>printRaw(…)</code></p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;John Doe&quot;</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Hello, I&#39;m&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;and I&#39;m&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">32</span><span class="p">)</span>
</span></code></pre></div>
<p>它可以接受任意类型的任意多参数。它也会开心的转储表!</p>
<p>它的行为类似于lua解释器的<code>print</code>,所以它会在参数之间放置制表符。</p>
<h4 id="exit"><code>exit()</code></h4>
<p>正常关闭服务器。触发<code>onShutdown</code>事件。</p>
<h3 id="mp">MP 功能</h3>
<h4 id="mpcreatetimer-timer"><code>MP.CreateTimer() -&gt; Timer</code></h4>
<p>创建一个计时器对象,该对象可用于跟踪某事花费了多长时间/经过了多少时间。它一旦创建就会启动,并且可以使用<code>mytimer:Start()</code>来重置/重新启动。</p>
<p>您可以使用<code>mytimer:GetCurrent()</code>获取当前经过的时间(以秒为单位)。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">mytimer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateTimer</span><span class="p">()</span>
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="c1">-- do stuff here that needs to be timed</span>
</span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="nb">print</span><span class="p">(</span><span class="nv">mytimer</span><span class="p">:</span><span class="nf">GetCurrent</span><span class="p">())</span><span class="w"> </span><span class="c1">-- print how much time elapsed</span>
</span></code></pre></div>
<p>计时器不需要停止(也不能停止),它们没有性能开销。</p>
<h4 id="mpgetosname-string"><code>MP.GetOSName() -&gt; string</code></h4>
<p>返回当前操作系统的名称,<code>Windows</code> <code>Linux</code><code>Other</code></p>
<h4 id="mpgetserverversion-numbernumbernumber"><code>MP.GetServerVersion() -&gt; number,number,number</code></h4>
<p>以主要、次要、补丁格式返回当前服务器版本。例如,v3.0.0版本将返回<code>3,0,0</code></p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">major</span><span class="p">,</span><span class="w"> </span><span class="nv">minor</span><span class="p">,</span><span class="w"> </span><span class="nv">patch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetServerVersion</span><span class="p">()</span>
</span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">major</span><span class="p">,</span><span class="w"> </span><span class="nv">minor</span><span class="p">,</span><span class="w"> </span><span class="nv">patch</span><span class="p">)</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>2 4 0
</span></code></pre></div>
<h4 id="mpregistereventevent_name-string-function_name-string"><code>MP.RegisterEvent(event_name: string, function_name: string)</code></h4>
<p>将名称为<code>Function Name</code>的函数注册为<code>Event Name</code>事件对应处理器,完成事件与回调逻辑的映射关联操作。</p>
<p>您可以根据需要为一个事件注册任意多个处理程序。</p>
<p>有关服务器提供的事件列表,请参阅<a href="#events-1">这里</a></p>
<p>如果具有该名称的事件不存在,则创建它,因此RegisterEvent不会失败。这可用于创建自定义事件。更多信息请参见<a href="#custom-events">自定义事件</a><a href="#events">事件</a></p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">msg</span><span class="p">)</span>
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">msg</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;hello&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-16-3"><a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Hello World!&quot;</span><span class="p">)</span>
</span><span id="__span-16-4"><a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-16-5"><a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-16-6"><a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a><span class="kr">end</span>
</span><span id="__span-16-7"><a id="__codelineno-16-7" name="__codelineno-16-7" href="#__codelineno-16-7"></a>
</span><span id="__span-16-8"><a id="__codelineno-16-8" name="__codelineno-16-8" href="#__codelineno-16-8"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;ChatHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<h4 id="mpcreateeventtimerevent_name-string-interval_ms-number-strategy-number-since-v302"><code>MP.CreateEventTimer(event_name: string, interval_ms: number, [strategy: number (since v3.0.2)])</code></h4>
<p>在服务器内部启动定时器,触发事件<code>event_name</code><code>interval_ms</code>毫秒。</p>
<p>事件计时器可以取消 <code>MP.CancelEventTimer</code>.</p>
<p>不建议间隔小于25毫秒,因为多个这样的间隔可能无法及时可靠地提供服务。虽然可以在同一事件上启动多个计时器,但建议创建尽可能少的事件计时器。例如,如果您需要一个每半秒运行一次的事件和一个每秒钟运行一次的事件,可以考虑只创建一个每半秒运行一次的事件,并运行每秒钟运行一次的functionosecond触发器。</p>
<p>您也可以使用<code>MP.CreateTimer</code>来创建一个计时器并测量自上次事件调用以来经过的时间,以尽量减少事件计时器,尽管不一定建议这样做,因为它会显着增加代码复杂性。</p>
<p><strong>自 3.0.2 起:</strong></p>
<p>可选的<code>CallStrategy</code>可以作为第三个参数提供。可以是以下任一值:</p>
<ul>
<li><code>MP.CallStrategy.BestEffort</code> (默认):将尝试以指定的时间间隔触发事件,但如果处理程序花费的时间太长,将拒绝排队处理程序。</li>
<li><code>MP.CallStrategy.Precise</code> :将按照指定的精确间隔将事件处理程序入队。如果处理程序执行时间超过该间隔,则可能导致队列填满。仅在需要精确间隔时使用。</li>
</ul>
<h4 id="mpcanceleventtimerevent_name-string"><code>MP.CancelEventTimer(event_name: string)</code></h4>
<p>取消名称为<code>event_name</code>的事件上的所有计时器在某些情况下,由于异步编程的性质,计时器可能在被取消之前再次关闭。</p>
<h4 id="mptriggerlocaleventevent_name-string-table"><code>MP.TriggerLocalEvent(event_name: string, ...) -&gt; table</code></h4>
<p>本地插件同步事件触发器。</p>
<p>在本地触发一个事件,这将导致<em>当前Lua状态</em>(通常是当前插件,除非通过PluginConfig.toml共享了状态)中注册该事件的所有处理函数被调用。</p>
<p>你可以传递参数给这个函数(<code></code>),这些参数被复制并作为函数参数发送给所有的处理程序。</p>
<p>此调用是同步的,并将在所有事件处理程序完成后返回。</p>
<p>返回的值是一个包含所有结果的表。如果某个处理程序返回了值,它就会出现在这个表中,未加注释且未命名。这可用于“收集”东西,或者为可取消的事件注册子处理程序。实际上,这就像一个数组。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">Results</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerLocalEvent</span><span class="p">(</span><span class="s2">&quot;MyEvent&quot;</span><span class="p">)</span>
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Results</span><span class="p">)</span>
</span></code></pre></div>
<h4 id="mptriggerglobaleventevent_name-string-table"><code>MP.TriggerGlobalEvent(event_name: string, ...) -&gt; table</code></h4>
<p>全局异步事件触发器。</p>
<p>全局触发一个事件,导致所有插件(包括<em>this</em>插件)中该事件<em>的所有处理程序被调用。</em></p>
<p>您可以向此函数(<code>...</code>)传递参数,这些参数会被复制并作为函数参数发送给所有处理程序。</p>
<p>此调用是异步的,并返回一个类似未来对象的值。本地处理程序(与调用者处于同一插件中的处理程序)会同步且立即运行。</p>
<p>返回的表有两个函数:</p>
<ul>
<li><code>IsDone() -&gt; boolean</code> 会告知您所有处理程序是否已完成。还可以通过检查它的<code>MP.Sleep</code>-来等待变为True</li>
<li><code>GetResults() -&gt; table</code> 返回一个未注释且未命名的表,其中包含所有处理程序的所有返回值,这是一个数组</li>
</ul>
<p>一定要用<code>Obj:Function()</code> 语法 (<code>:</code>, 不要 <code>.</code>).</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">Future</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">TriggerGlobalEvent</span><span class="p">(</span><span class="s2">&quot;MyEvent&quot;</span><span class="p">)</span>
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="c1">-- wait until handlers finished</span>
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="kr">while</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="nv">Future</span><span class="p">:</span><span class="nf">IsDone</span><span class="p">()</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span><span class="w"> </span><span class="c1">-- sleep 100 ms</span>
</span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="kr">end</span>
</span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a><span class="kd">local</span><span class="w"> </span><span class="nv">Results</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Future</span><span class="p">:</span><span class="nf">GetResults</span><span class="p">()</span>
</span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Results</span><span class="p">)</span>
</span></code></pre></div>
<p>请注意,在这里注册到“MyEvent”的处理程序如果一直不返回,可能导致您的插件卡死,您可能需要跟踪等待的时间,并在等待几秒后停止等待。</p>
<h4 id="mpsleeptime_ms-number"><code>MP.Sleep(time_ms: number)</code></h4>
<p>等待的时间以毫秒为单位指定</p>
<p>这不会让lua状态的执行,并且在休眠状态下不会执行任何操作。</p>
<p>警告:如果您注册了事件处理程序,请不要在&gt;500毫秒内休眠,除非您确切地知道<em>您正在做什么。这是用来睡眠1-100毫秒,以便等待结果或类似的。如果不小心,锁定(睡眠)的lua状态可能会大大降低整个服务器的速度。</em></p>
<h4 id="mpsendchatmessageplayer_id-number-message-string"><code>MP.SendChatMessage(player_id: number, message: string)</code></h4>
<p>发送一个聊天消息,只有指定的玩家可以看到(或所有人,如果ID是<code>-1</code>)。在游戏中,这不会显示为直接消息。</p>
<p>例如,你可以用它来告诉玩家为什么你取消了他们的车辆刷出,聊天信息,或者类似的,或者显示一些关于你的服务器的信息。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">msg</span><span class="p">)</span>
</span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nb">string.match</span><span class="p">(</span><span class="nv">msg</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;darn&quot;</span><span class="p">)</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-19-3"><a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">SendChatMessage</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;Please do not use profanity.&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1">-- If the player sends a message containing &quot;darn&quot;, notify the player and cancel the message</span>
</span><span id="__span-19-4"><a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-19-5"><a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-19-6"><a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-19-7"><a id="__codelineno-19-7" name="__codelineno-19-7" href="#__codelineno-19-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-19-8"><a id="__codelineno-19-8" name="__codelineno-19-8" href="#__codelineno-19-8"></a><span class="kr">end</span>
</span><span id="__span-19-9"><a id="__codelineno-19-9" name="__codelineno-19-9" href="#__codelineno-19-9"></a>
</span><span id="__span-19-10"><a id="__codelineno-19-10" name="__codelineno-19-10" href="#__codelineno-19-10"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;ChatHandler&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>范例 2:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">msg</span><span class="p">)</span>
</span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nv">msg</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;hello&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">SendChatMessage</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;Hello World!&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1">-- If the player sends the exact message &quot;hello&quot;, announce to the entire server &quot;Hello World!&quot;</span>
</span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="mptriggerclienteventplayer_id-number-event_name-string-data-string-boolean"><code>MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean</code></h4>
<p><em>在 v3.1.0 中</em></p>
<h4 id="mptriggerclienteventplayer_id-number-event_name-string-data-string-booleanstring"><code>MP.TriggerClientEvent(player_id: number, event_name: string, data: string) -&gt; boolean,string</code></h4>
<p><em>在 v3.1.0 中</em></p>
<h4 id="mptriggerclienteventjsonplayer_id-number-event_name-string-data-table-booleanstring"><code>MP.TriggerClientEventJson(player_id: number, event_name: string, data: table) -&gt; boolean,string</code></h4>
<p><em>从 v3.1.0 以来</em></p>
<p>将使用指定客户机上的给定数据调用给定事件(-1表示广播)。这个事件可以在客户端lua mod中处理,请参阅“客户端脚本”文档。</p>
<p>如果能够发送消息,将返回<code>true</code>(对于<code>id = -1</code>,因为广播,它总是<code>true</code>),如果具有该id的播放器不存在或断开连接但仍有id(这是一个已知问题),则返回<code>false</code></p>
<p>如果返回<code>false</code>,则重试此事件没有意义,并且不应该期望响应(如果期望有响应)。</p>
<p>从v3.1.0开始,如果函数失败,第二个返回值包含一条错误消息。同样从这个版本开始,函数的<code>*Json</code>版本接受一个表作为数据参数,并将其转换为Json。这是<code>mp . triggerclienttevent(…)的简写。Util.JsonEncode (mytable)) {/ code1}。</code></p>
<h4 id="mpgetplayercount-number"><code>MP.GetPlayerCount() -&gt; number</code></h4>
<p>返回服务器中当前玩家的数量。</p>
<h4 id="mpgetpositionrawpid-number-vid-number-tablestring"><code>MP.GetPositionRaw(pid: number, vid: number) -&gt; table,string</code></h4>
<p>返回玩家<code>pid</code>(玩家id)的车辆<code>vid</code>(车辆id)的当前位置,如果发生错误则返回错误字符串。</p>
<p>这个表是从位置数据包解码的,所以它有各种各样的数据,包括位置和旋转(这就是为什么这个函数后面加了“Raw”)。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a>
</span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a><span class="kd">local</span><span class="w"> </span><span class="nv">raw_pos</span><span class="p">,</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPositionRaw</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">)</span>
</span><span id="__span-21-5"><a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a>
</span><span id="__span-21-6"><a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a><span class="kr">if</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-21-7"><a id="__codelineno-21-7" name="__codelineno-21-7" href="#__codelineno-21-7"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">raw_pos</span><span class="p">)</span>
</span><span id="__span-21-8"><a id="__codelineno-21-8" name="__codelineno-21-8" href="#__codelineno-21-8"></a><span class="kr">else</span>
</span><span id="__span-21-9"><a id="__codelineno-21-9" name="__codelineno-21-9" href="#__codelineno-21-9"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nb">error</span><span class="p">)</span>
</span><span id="__span-21-10"><a id="__codelineno-21-10" name="__codelineno-21-10" href="#__codelineno-21-10"></a><span class="kr">end</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="w"> </span><span class="p">{</span>
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="w"> </span><span class="kc">t</span><span class="err">im</span><span class="p">:</span><span class="w"> </span><span class="mf">49.824</span><span class="p">,</span><span class="w"> </span><span class="c1">// Time since spawn</span>
</span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a><span class="w"> </span><span class="err">rvel</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Rotational velocity</span>
</span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">-1.33564e-05</span><span class="p">,</span>
</span><span id="__span-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-9.16553e-06</span><span class="p">,</span>
</span><span id="__span-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">8.33364e-07</span><span class="p">,</span>
</span><span id="__span-22-7"><a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-22-8"><a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a><span class="w"> </span><span class="err">vel</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Velocity</span>
</span><span id="__span-22-9"><a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">-4.29755e-06</span><span class="p">,</span>
</span><span id="__span-22-10"><a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-5.79335e-06</span><span class="p">,</span>
</span><span id="__span-22-11"><a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">4.95236e-06</span><span class="p">,</span>
</span><span id="__span-22-12"><a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-22-13"><a id="__codelineno-22-13" name="__codelineno-22-13" href="#__codelineno-22-13"></a><span class="w"> </span><span class="err">pos</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Position</span>
</span><span id="__span-22-14"><a id="__codelineno-22-14" name="__codelineno-22-14" href="#__codelineno-22-14"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">269.979</span><span class="p">,</span>
</span><span id="__span-22-15"><a id="__codelineno-22-15" name="__codelineno-22-15" href="#__codelineno-22-15"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-759.068</span><span class="p">,</span>
</span><span id="__span-22-16"><a id="__codelineno-22-16" name="__codelineno-22-16" href="#__codelineno-22-16"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">46.554</span><span class="p">,</span>
</span><span id="__span-22-17"><a id="__codelineno-22-17" name="__codelineno-22-17" href="#__codelineno-22-17"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-22-18"><a id="__codelineno-22-18" name="__codelineno-22-18" href="#__codelineno-22-18"></a><span class="w"> </span><span class="err">pi</span><span class="kc">n</span><span class="err">g</span><span class="p">:</span><span class="w"> </span><span class="mf">0.0125</span><span class="p">,</span><span class="w"> </span><span class="c1">// Vehicle latency</span>
</span><span id="__span-22-19"><a id="__codelineno-22-19" name="__codelineno-22-19" href="#__codelineno-22-19"></a><span class="w"> </span><span class="err">ro</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Rotation</span>
</span><span id="__span-22-20"><a id="__codelineno-22-20" name="__codelineno-22-20" href="#__codelineno-22-20"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">-0.00559953</span><span class="p">,</span>
</span><span id="__span-22-21"><a id="__codelineno-22-21" name="__codelineno-22-21" href="#__codelineno-22-21"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">0.00894832</span><span class="p">,</span>
</span><span id="__span-22-22"><a id="__codelineno-22-22" name="__codelineno-22-22" href="#__codelineno-22-22"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">0.772266</span><span class="p">,</span>
</span><span id="__span-22-23"><a id="__codelineno-22-23" name="__codelineno-22-23" href="#__codelineno-22-23"></a><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w"> </span><span class="mf">0.635212</span><span class="p">,</span>
</span><span id="__span-22-24"><a id="__codelineno-22-24" name="__codelineno-22-24" href="#__codelineno-22-24"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-22-25"><a id="__codelineno-22-25" name="__codelineno-22-25" href="#__codelineno-22-25"></a><span class="p">}</span>
</span></code></pre></div>
<p>范例 2:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-23-3"><a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a>
</span><span id="__span-23-4"><a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-4"></a><span class="kd">local</span><span class="w"> </span><span class="nv">raw_pos</span><span class="p">,</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPositionRaw</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">)</span>
</span><span id="__span-23-5"><a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-5"></a><span class="kr">if</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-23-6"><a id="__codelineno-23-6" name="__codelineno-23-6" href="#__codelineno-23-6"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">x</span><span class="p">,</span><span class="w"> </span><span class="nv">y</span><span class="p">,</span><span class="w"> </span><span class="nv">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">table.unpack</span><span class="p">(</span><span class="nv">raw_pos</span><span class="p">[</span><span class="s2">&quot;pos&quot;</span><span class="p">])</span>
</span><span id="__span-23-7"><a id="__codelineno-23-7" name="__codelineno-23-7" href="#__codelineno-23-7"></a>
</span><span id="__span-23-8"><a id="__codelineno-23-8" name="__codelineno-23-8" href="#__codelineno-23-8"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;X:&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">x</span><span class="p">)</span>
</span><span id="__span-23-9"><a id="__codelineno-23-9" name="__codelineno-23-9" href="#__codelineno-23-9"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Y:&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">y</span><span class="p">)</span>
</span><span id="__span-23-10"><a id="__codelineno-23-10" name="__codelineno-23-10" href="#__codelineno-23-10"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Z:&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">z</span><span class="p">)</span>
</span><span id="__span-23-11"><a id="__codelineno-23-11" name="__codelineno-23-11" href="#__codelineno-23-11"></a><span class="kr">else</span>
</span><span id="__span-23-12"><a id="__codelineno-23-12" name="__codelineno-23-12" href="#__codelineno-23-12"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nb">error</span><span class="p">)</span>
</span><span id="__span-23-13"><a id="__codelineno-23-13" name="__codelineno-23-13" href="#__codelineno-23-13"></a><span class="kr">end</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a>X: -603.459
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>Y: -175.078
</span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a>Z: 26.9505
</span></code></pre></div>
<h4 id="mpisplayerconnectedplayer_id-number-boolean"><code>MP.IsPlayerConnected(player_id: number) -&gt; boolean</code></h4>
<p>玩家是否已连接以及服务器是否已收到来自其的UDP数据包。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">8</span>
</span><span id="__span-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="nf">IsPlayerConnected</span><span class="p">(</span><span class="nv">player_id</span><span class="p">))</span><span class="w"> </span><span class="c1">-- Check if player with ID 8 is properly connected.</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="kc">true</span>
</span></code></pre></div>
<h4 id="mpgetplayernameplayer_id-number-string"><code>MP.GetPlayerName(player_id: number) -&gt; string</code></h4>
<p>获取玩家的显示名称。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span>
</span><span id="__span-27-2"><a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerName</span><span class="p">(</span><span class="nv">player_id</span><span class="p">))</span><span class="w"> </span><span class="c1">-- Get the name of the player with ID 4</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a>ilovebeammp2004
</span></code></pre></div>
<h4 id="mpremovevehicleplayer_id-number-vehicle_id-number"><code>MP.RemoveVehicle(player_id: number, vehicle_id: number)</code></h4>
<p>移除指定玩家的指定车辆。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-29-1"><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span>
</span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_vehicles</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerVehicles</span><span class="p">(</span><span class="nv">player_id</span><span class="p">)</span>
</span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a>
</span><span id="__span-29-4"><a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a><span class="c1">-- Loop over all of player 3&#39;s vehicles and delete them</span>
</span><span id="__span-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a><span class="kr">for</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_data</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">player_vehicles</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-29-6"><a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">RemoveVehicle</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">)</span>
</span><span id="__span-29-7"><a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="mpgetplayervehiclesplayer_id-number-table"><code>MP.GetPlayerVehicles(player_id: number) -&gt; table</code></h4>
<p>返回玩家当前拥有的所有车辆的表。表中的每个条目都是从车辆ID到车辆数据(目前是一个原始json字符串)的映射。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span>
</span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_vehicles</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerVehicles</span><span class="p">(</span><span class="nv">player_id</span><span class="p">)</span>
</span><span id="__span-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a>
</span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a><span class="kr">for</span><span class="w"> </span><span class="nv">vehicle_id</span><span class="p">,</span><span class="w"> </span><span class="nv">vehicle_data</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">player_vehicles</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string.find</span><span class="p">(</span><span class="nv">vehicle_data</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;{&quot;</span><span class="p">)</span>
</span><span id="__span-30-6"><a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">formattedVehicleData</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string.sub</span><span class="p">(</span><span class="nv">vehicle_data</span><span class="p">,</span><span class="w"> </span><span class="nv">start</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span id="__span-30-7"><a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonDecode</span><span class="p">(</span><span class="nv">formattedVehicleData</span><span class="p">))</span>
</span><span id="__span-30-8"><a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a><span class="kr">end</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-31-1"><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a><span class="p">{</span>
</span><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a><span class="w"> </span><span class="err">pid</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-31-3"><a id="__codelineno-31-3" name="__codelineno-31-3" href="#__codelineno-31-3"></a><span class="w"> </span><span class="err">pro</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;0&quot;</span><span class="p">,</span>
</span><span id="__span-31-4"><a id="__codelineno-31-4" name="__codelineno-31-4" href="#__codelineno-31-4"></a><span class="w"> </span><span class="err">ro</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-5"><a id="__codelineno-31-5" name="__codelineno-31-5" href="#__codelineno-31-5"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-31-6"><a id="__codelineno-31-6" name="__codelineno-31-6" href="#__codelineno-31-6"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-31-7"><a id="__codelineno-31-7" name="__codelineno-31-7" href="#__codelineno-31-7"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">0.776866</span><span class="p">,</span>
</span><span id="__span-31-8"><a id="__codelineno-31-8" name="__codelineno-31-8" href="#__codelineno-31-8"></a><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w"> </span><span class="mf">0.629665</span><span class="p">,</span>
</span><span id="__span-31-9"><a id="__codelineno-31-9" name="__codelineno-31-9" href="#__codelineno-31-9"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-10"><a id="__codelineno-31-10" name="__codelineno-31-10" href="#__codelineno-31-10"></a><span class="w"> </span><span class="err">jbm</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar&quot;</span><span class="p">,</span>
</span><span id="__span-31-11"><a id="__codelineno-31-11" name="__codelineno-31-11" href="#__codelineno-31-11"></a><span class="w"> </span><span class="err">vc</span><span class="kc">f</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-12"><a id="__codelineno-31-12" name="__codelineno-31-12" href="#__codelineno-31-12"></a><span class="w"> </span><span class="err">par</span><span class="kc">ts</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-13"><a id="__codelineno-31-13" name="__codelineno-31-13" href="#__codelineno-31-13"></a><span class="w"> </span><span class="err">miramar_exhaus</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_exhaust&quot;</span><span class="p">,</span>
</span><span id="__span-31-14"><a id="__codelineno-31-14" name="__codelineno-31-14" href="#__codelineno-31-14"></a><span class="w"> </span><span class="err">miramar_shock_R</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_shock_R&quot;</span><span class="p">,</span>
</span><span id="__span-31-15"><a id="__codelineno-31-15" name="__codelineno-31-15" href="#__codelineno-31-15"></a><span class="w"> </span><span class="err">miramar_</span><span class="kc">ta</span><span class="err">illigh</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_taillight&quot;</span><span class="p">,</span>
</span><span id="__span-31-16"><a id="__codelineno-31-16" name="__codelineno-31-16" href="#__codelineno-31-16"></a><span class="w"> </span><span class="err">miramar_door_RL</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar_door_RL&quot;</span>
</span><span id="__span-31-17"><a id="__codelineno-31-17" name="__codelineno-31-17" href="#__codelineno-31-17"></a><span class="w"> </span><span class="c1">// ... continue</span>
</span><span id="__span-31-18"><a id="__codelineno-31-18" name="__codelineno-31-18" href="#__codelineno-31-18"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-19"><a id="__codelineno-31-19" name="__codelineno-31-19" href="#__codelineno-31-19"></a><span class="w"> </span><span class="err">pai</span><span class="kc">nts</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-20"><a id="__codelineno-31-20" name="__codelineno-31-20" href="#__codelineno-31-20"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-21"><a id="__codelineno-31-21" name="__codelineno-31-21" href="#__codelineno-31-21"></a><span class="w"> </span><span class="err">rough</span><span class="kc">ness</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-31-22"><a id="__codelineno-31-22" name="__codelineno-31-22" href="#__codelineno-31-22"></a><span class="w"> </span><span class="err">me</span><span class="kc">tall</span><span class="err">ic</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-31-23"><a id="__codelineno-31-23" name="__codelineno-31-23" href="#__codelineno-31-23"></a><span class="w"> </span><span class="err">clearcoa</span><span class="kc">t</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-31-24"><a id="__codelineno-31-24" name="__codelineno-31-24" href="#__codelineno-31-24"></a><span class="w"> </span><span class="err">baseColor</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-25"><a id="__codelineno-31-25" name="__codelineno-31-25" href="#__codelineno-31-25"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">0.85</span><span class="p">,</span>
</span><span id="__span-31-26"><a id="__codelineno-31-26" name="__codelineno-31-26" href="#__codelineno-31-26"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">0.84</span><span class="p">,</span>
</span><span id="__span-31-27"><a id="__codelineno-31-27" name="__codelineno-31-27" href="#__codelineno-31-27"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">0.8</span><span class="p">,</span>
</span><span id="__span-31-28"><a id="__codelineno-31-28" name="__codelineno-31-28" href="#__codelineno-31-28"></a><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w"> </span><span class="mf">1.2</span><span class="p">,</span>
</span><span id="__span-31-29"><a id="__codelineno-31-29" name="__codelineno-31-29" href="#__codelineno-31-29"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-30"><a id="__codelineno-31-30" name="__codelineno-31-30" href="#__codelineno-31-30"></a><span class="w"> </span><span class="err">clearcoa</span><span class="kc">t</span><span class="err">Rough</span><span class="kc">ness</span><span class="p">:</span><span class="w"> </span><span class="mf">0.09</span><span class="p">,</span>
</span><span id="__span-31-31"><a id="__codelineno-31-31" name="__codelineno-31-31" href="#__codelineno-31-31"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// ... continue</span>
</span><span id="__span-31-32"><a id="__codelineno-31-32" name="__codelineno-31-32" href="#__codelineno-31-32"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-33"><a id="__codelineno-31-33" name="__codelineno-31-33" href="#__codelineno-31-33"></a><span class="w"> </span><span class="err">par</span><span class="kc">t</span><span class="err">Co</span><span class="kc">nf</span><span class="err">igFile</span><span class="kc">na</span><span class="err">me</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;vehicles/miramar/base_M.pc&quot;</span><span class="p">,</span>
</span><span id="__span-31-34"><a id="__codelineno-31-34" name="__codelineno-31-34" href="#__codelineno-31-34"></a><span class="w"> </span><span class="err">vars</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span>
</span><span id="__span-31-35"><a id="__codelineno-31-35" name="__codelineno-31-35" href="#__codelineno-31-35"></a><span class="w"> </span><span class="err">mai</span><span class="kc">n</span><span class="err">Par</span><span class="kc">t</span><span class="err">Name</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;miramar&quot;</span><span class="p">,</span>
</span><span id="__span-31-36"><a id="__codelineno-31-36" name="__codelineno-31-36" href="#__codelineno-31-36"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-37"><a id="__codelineno-31-37" name="__codelineno-31-37" href="#__codelineno-31-37"></a><span class="w"> </span><span class="err">pos</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-31-38"><a id="__codelineno-31-38" name="__codelineno-31-38" href="#__codelineno-31-38"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="mf">283.669</span><span class="p">,</span>
</span><span id="__span-31-39"><a id="__codelineno-31-39" name="__codelineno-31-39" href="#__codelineno-31-39"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="mf">-754.332</span><span class="p">,</span>
</span><span id="__span-31-40"><a id="__codelineno-31-40" name="__codelineno-31-40" href="#__codelineno-31-40"></a><span class="w"> </span><span class="mi">3</span><span class="p">:</span><span class="w"> </span><span class="mf">48.2151</span><span class="p">,</span>
</span><span id="__span-31-41"><a id="__codelineno-31-41" name="__codelineno-31-41" href="#__codelineno-31-41"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-31-42"><a id="__codelineno-31-42" name="__codelineno-31-42" href="#__codelineno-31-42"></a><span class="w"> </span><span class="err">vid</span><span class="p">:</span><span class="w"> </span><span class="mi">64822</span><span class="p">,</span>
</span><span id="__span-31-43"><a id="__codelineno-31-43" name="__codelineno-31-43" href="#__codelineno-31-43"></a><span class="w"> </span><span class="err">ig</span><span class="kc">n</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-31-44"><a id="__codelineno-31-44" name="__codelineno-31-44" href="#__codelineno-31-44"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="mpgetplayers-table"><code>MP.GetPlayers() -&gt; table</code></h4>
<p>返回所有已连接玩家的表。这个表将id映射到name,如下所示:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a><span class="p">{</span>
</span><span id="__span-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a><span class="w"> </span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;LionKor&quot;</span><span class="p">,</span>
</span><span id="__span-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;JohnDoe&quot;</span>
</span><span id="__span-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="mpisplayerguestplayer_id-number-boolean"><code>MP.IsPlayerGuest(player_id: number) -&gt; boolean</code></h4>
<p>玩家是否为游客。游客指未进行登录,而是直接选择以游客身份游玩的用户,其名称通常为<code>guest</code>后接一长串数字。</p>
<p>由于游客是匿名的,您可能希望禁止他们加入,如果是这样,建议使用<a href="#onplayerauth"><code>onPlayerAuth</code></a> <code>is_guest</code>参数。</p>
<h4 id="mpdropplayerplayer_id-number-reason-string"><code>MP.DropPlayer(player_id: number, [reason: string])</code></h4>
<p>踢出带有指定ID的玩家。reason为可选参数。</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-33-1"><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">ChatHandler</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="nv">player_name</span><span class="p">,</span><span class="w"> </span><span class="nv">message</span><span class="p">)</span>
</span><span id="__span-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="nb">string.match</span><span class="p">(</span><span class="nv">message</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;darn&quot;</span><span class="p">)</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-33-3"><a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-3"></a><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">DropPlayer</span><span class="p">(</span><span class="nv">player_id</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;Profanity is not allowed&quot;</span><span class="p">)</span>
</span><span id="__span-33-4"><a id="__codelineno-33-4" name="__codelineno-33-4" href="#__codelineno-33-4"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">1</span>
</span><span id="__span-33-5"><a id="__codelineno-33-5" name="__codelineno-33-5" href="#__codelineno-33-5"></a><span class="w"> </span><span class="kr">else</span>
</span><span id="__span-33-6"><a id="__codelineno-33-6" name="__codelineno-33-6" href="#__codelineno-33-6"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-33-7"><a id="__codelineno-33-7" name="__codelineno-33-7" href="#__codelineno-33-7"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-33-8"><a id="__codelineno-33-8" name="__codelineno-33-8" href="#__codelineno-33-8"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="mpgetstatememoryusage-number"><code>MP.GetStateMemoryUsage() -&gt; number</code></h4>
<p>以字节为单位返回当前Lua状态的内存使用情况。</p>
<h4 id="mpgetluamemoryusage-number"><code>MP.GetLuaMemoryUsage() -&gt; number</code></h4>
<p>返回所有lua状态的内存使用情况,以字节为单位。</p>
<h4 id="mpgetplayeridentifiersplayer_id-number-table"><code>MP.GetPlayerIdentifiers(player_id: number) -&gt; table</code></h4>
<p>返回一个包含玩家信息的表,例如 BeamMP 论坛 ID、IP 地址及 Discord 账户 ID。Discord ID 仅会在用户已将其绑定至论坛账户时返回。</p>
<p>您可通过访问<code>https://forum.beammp.com/u/USERNAME.json</code>并在返回数据中查找<code>"user": {"id": 123456}</code>以获取用户的论坛 ID。BeamMP ID 是玩家的唯一标识,与用户名不同,该 ID 一经设定便不可更改。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-34-1"><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span>
</span><span id="__span-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayerIdentifiers</span><span class="p">(</span><span class="nv">player_id</span><span class="p">))</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-35-1"><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a><span class="p">{</span>
</span><span id="__span-35-2"><a id="__codelineno-35-2" name="__codelineno-35-2" href="#__codelineno-35-2"></a><span class="w"> </span><span class="err">ip</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;127.0.0.1&quot;</span><span class="p">,</span>
</span><span id="__span-35-3"><a id="__codelineno-35-3" name="__codelineno-35-3" href="#__codelineno-35-3"></a><span class="w"> </span><span class="err">discord</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;12345678987654321&quot;</span><span class="p">,</span>
</span><span id="__span-35-4"><a id="__codelineno-35-4" name="__codelineno-35-4" href="#__codelineno-35-4"></a><span class="w"> </span><span class="err">beammp</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;1234567&quot;</span><span class="p">,</span>
</span><span id="__span-35-5"><a id="__codelineno-35-5" name="__codelineno-35-5" href="#__codelineno-35-5"></a><span class="p">}</span>
</span></code></pre></div>
<p><em>在 v3.1.0 之前的版本中,<code>ip</code> 字段存在错误且无法正常工作,该问题已在 v3.1.0 版本中修复。</em></p>
<h4 id="mpsetsetting-number"><code>MP.Set(setting: number, ...)</code></h4>
<p>临时设置服务器配置项。为此,<code>MP.Settings</code> 表格非常实用。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-36-1"><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">Set</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">.</span><span class="py">Debug</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">)</span><span class="w"> </span><span class="c1">-- Turns on debug mode</span>
</span></code></pre></div>
<h4 id="mpsettings-table"><code>MP.Settings -&gt; table</code></h4>
<p>设置项ID与名称的对照表。配合<code>MP.Set</code>使用,用于更改服务器配置项。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-37-1"><a id="__codelineno-37-1" name="__codelineno-37-1" href="#__codelineno-37-1"></a><span class="nb">print</span><span class="p">(</span><span class="nv">MP</span><span class="p">.</span><span class="py">Settings</span><span class="p">)</span>
</span></code></pre></div>
<p>输出:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-38-1"><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a><span class="p">{</span>
</span><span id="__span-38-2"><a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-2"></a><span class="w"> </span><span class="err">MaxPlayers</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
</span><span id="__span-38-3"><a id="__codelineno-38-3" name="__codelineno-38-3" href="#__codelineno-38-3"></a><span class="w"> </span><span class="err">Debug</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-38-4"><a id="__codelineno-38-4" name="__codelineno-38-4" href="#__codelineno-38-4"></a><span class="w"> </span><span class="err">Name</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span>
</span><span id="__span-38-5"><a id="__codelineno-38-5" name="__codelineno-38-5" href="#__codelineno-38-5"></a><span class="w"> </span><span class="err">Descrip</span><span class="kc">t</span><span class="err">io</span><span class="kc">n</span><span class="p">:</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span>
</span><span id="__span-38-6"><a id="__codelineno-38-6" name="__codelineno-38-6" href="#__codelineno-38-6"></a><span class="w"> </span><span class="err">MaxCars</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
</span><span id="__span-38-7"><a id="__codelineno-38-7" name="__codelineno-38-7" href="#__codelineno-38-7"></a><span class="w"> </span><span class="err">Priva</span><span class="kc">te</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-38-8"><a id="__codelineno-38-8" name="__codelineno-38-8" href="#__codelineno-38-8"></a><span class="w"> </span><span class="err">Map</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
</span><span id="__span-38-9"><a id="__codelineno-38-9" name="__codelineno-38-9" href="#__codelineno-38-9"></a><span class="p">}</span>
</span></code></pre></div>
<h3 id="util">Util 功能</h3>
<h4 id="utiljson"><code>Util.Json*</code></h4>
<p>从 BeamMP-Server <code>v3.1.0</code>以来。</p>
<p>这是内置JSON库,其性能通常远超任何Lua JSON库。底层使用C++的<code>nlohmann::json</code>库实现,严格遵循JSON规范,具备完整单元测试覆盖且持续进行模糊测试。</p>
<h4 id="utiljsonencodetable-table-string"><code>Util.JsonEncode(table: table) -&gt; string</code></h4>
<p>将Lua表递归编码为JSON字符串(支持表中有表、表中再有表……等多层嵌套结构),所有基本类型均会被保留,函数、userdata及类似数据则会被忽略。</p>
<p>生成的JSON为压缩格式,可使用<code>Util.JsonPrettify</code>对其进行美化排版。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-39-1"><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">player</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span>
</span><span id="__span-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="w"> </span><span class="nv">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span>
</span><span id="__span-39-4"><a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a><span class="w"> </span><span class="nv">skills</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span><span class="w"> </span><span class="p">}</span>
</span><span id="__span-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="p">}</span>
</span><span id="__span-39-6"><a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></a><span class="kd">local</span><span class="w"> </span><span class="nv">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonEncode</span><span class="p">(</span><span class="nv">player</span><span class="p">)</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-40-1"><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="mi">69</span><span class="p">,</span><span class="nt">&quot;skills&quot;</span><span class="p">:[</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="s2">&quot;skill B&quot;</span><span class="p">]}</span>
</span></code></pre></div>
<h4 id="utiljsondecodejson-string-table"><code>Util.JsonDecode(json: string) -&gt; table</code></h4>
<p>将JSON解码为Lua表。如果失败,将返回<code>nil</code>,并输出错误。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-41-1"><a id="__codelineno-41-1" name="__codelineno-41-1" href="#__codelineno-41-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;{</span><span class="se">\&quot;</span><span class="s2">message</span><span class="se">\&quot;</span><span class="s2">:</span><span class="se">\&quot;</span><span class="s2">OK</span><span class="se">\&quot;</span><span class="s2">,</span><span class="se">\&quot;</span><span class="s2">code</span><span class="se">\&quot;</span><span class="s2">:200}&quot;</span>
</span><span id="__span-41-2"><a id="__codelineno-41-2" name="__codelineno-41-2" href="#__codelineno-41-2"></a><span class="kd">local</span><span class="w"> </span><span class="nv">tbl</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonDecode</span><span class="p">(</span><span class="nv">json</span><span class="p">)</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-42-1"><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a><span class="p">{</span>
</span><span id="__span-42-2"><a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-2"></a><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;OK&quot;</span><span class="p">,</span>
</span><span id="__span-42-3"><a id="__codelineno-42-3" name="__codelineno-42-3" href="#__codelineno-42-3"></a><span class="w"> </span><span class="nv">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span>
</span><span id="__span-42-4"><a id="__codelineno-42-4" name="__codelineno-42-4" href="#__codelineno-42-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="utiljsonprettifyjson-string-string"><code>Util.JsonPrettify(json: string) -&gt; string</code></h4>
<p>向json中添加缩进和换行,使其更易于人们阅读。</p>
<p>实例:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-43-1"><a id="__codelineno-43-1" name="__codelineno-43-1" href="#__codelineno-43-1"></a>local myjson = Util.JsonEncode({ name=&quot;Lion&quot;, age = 69, skills = { &quot;skill A&quot;, &quot;skill B&quot; } })
</span><span id="__span-43-2"><a id="__codelineno-43-2" name="__codelineno-43-2" href="#__codelineno-43-2"></a>
</span><span id="__span-43-3"><a id="__codelineno-43-3" name="__codelineno-43-3" href="#__codelineno-43-3"></a>print(Util.JsonPrettify(myjson))
</span></code></pre></div>
<p>结果:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-44-1"><a id="__codelineno-44-1" name="__codelineno-44-1" href="#__codelineno-44-1"></a><span class="p">{</span>
</span><span id="__span-44-2"><a id="__codelineno-44-2" name="__codelineno-44-2" href="#__codelineno-44-2"></a><span class="w"> </span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">69.0</span><span class="p">,</span>
</span><span id="__span-44-3"><a id="__codelineno-44-3" name="__codelineno-44-3" href="#__codelineno-44-3"></a><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span>
</span><span id="__span-44-4"><a id="__codelineno-44-4" name="__codelineno-44-4" href="#__codelineno-44-4"></a><span class="w"> </span><span class="nt">&quot;skills&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
</span><span id="__span-44-5"><a id="__codelineno-44-5" name="__codelineno-44-5" href="#__codelineno-44-5"></a><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span>
</span><span id="__span-44-6"><a id="__codelineno-44-6" name="__codelineno-44-6" href="#__codelineno-44-6"></a><span class="w"> </span><span class="s2">&quot;skill B&quot;</span>
</span><span id="__span-44-7"><a id="__codelineno-44-7" name="__codelineno-44-7" href="#__codelineno-44-7"></a><span class="w"> </span><span class="p">]</span>
</span><span id="__span-44-8"><a id="__codelineno-44-8" name="__codelineno-44-8" href="#__codelineno-44-8"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="utiljsonminifyjson-string-string"><code>Util.JsonMinify(json: string) -&gt; string</code></h4>
<p>Removes indentation, newlines and any other whitespace. Not necessary unless you called <code>Util.JsonPrettify</code>, as all output from <code>Util.Json*</code> is already minified.</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-45-1"><a id="__codelineno-45-1" name="__codelineno-45-1" href="#__codelineno-45-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonPrettify</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonEncode</span><span class="p">({</span><span class="w"> </span><span class="nv">name</span><span class="o">=</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span><span class="w"> </span><span class="nv">skills</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}))</span>
</span><span id="__span-45-2"><a id="__codelineno-45-2" name="__codelineno-45-2" href="#__codelineno-45-2"></a>
</span><span id="__span-45-3"><a id="__codelineno-45-3" name="__codelineno-45-3" href="#__codelineno-45-3"></a><span class="nb">print</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonMinify</span><span class="p">(</span><span class="nv">pretty</span><span class="p">))</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-46-1"><a id="__codelineno-46-1" name="__codelineno-46-1" href="#__codelineno-46-1"></a><span class="p">{</span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="mf">69.0</span><span class="p">,</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;skills&quot;</span><span class="p">:[</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="s2">&quot;skill B&quot;</span><span class="p">]}</span>
</span></code></pre></div>
<h4 id="utiljsonflattenjson-string-string"><code>Util.JsonFlatten(json: string) -&gt; string</code></h4>
<p>创建符合RFC 6901标准的JSON扁平化对象(将键名转换为JSON指针路径)。您可通过<code>Util.JsonUnflatten()</code>还原原始结构,但要求所有键值必须为基本数据类型。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-47-1"><a id="__codelineno-47-1" name="__codelineno-47-1" href="#__codelineno-47-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">json</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonEncode</span><span class="p">({</span><span class="w"> </span><span class="nv">name</span><span class="o">=</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span><span class="w"> </span><span class="nv">skills</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">})</span>
</span><span id="__span-47-2"><a id="__codelineno-47-2" name="__codelineno-47-2" href="#__codelineno-47-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;normal: &quot;</span><span class="w"> </span><span class="o">..</span><span class="nv">json</span><span class="p">)</span>
</span><span id="__span-47-3"><a id="__codelineno-47-3" name="__codelineno-47-3" href="#__codelineno-47-3"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;flattened: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonFlatten</span><span class="p">(</span><span class="nv">json</span><span class="p">))</span>
</span><span id="__span-47-4"><a id="__codelineno-47-4" name="__codelineno-47-4" href="#__codelineno-47-4"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;flattened pretty: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonPrettify</span><span class="p">(</span><span class="nv">Util</span><span class="p">.</span><span class="nf">JsonFlatten</span><span class="p">(</span><span class="nv">json</span><span class="p">)))</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-48-1"><a id="__codelineno-48-1" name="__codelineno-48-1" href="#__codelineno-48-1"></a><span class="kc">n</span><span class="err">ormal</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;age&quot;</span><span class="p">:</span><span class="mf">69.0</span><span class="p">,</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;skills&quot;</span><span class="p">:[</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="s2">&quot;skill B&quot;</span><span class="p">]}</span>
</span><span id="__span-48-2"><a id="__codelineno-48-2" name="__codelineno-48-2" href="#__codelineno-48-2"></a><span class="kc">flattene</span><span class="err">d</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;/age&quot;</span><span class="p">:</span><span class="mf">69.0</span><span class="p">,</span><span class="nt">&quot;/name&quot;</span><span class="p">:</span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span><span class="nt">&quot;/skills/0&quot;</span><span class="p">:</span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span><span class="nt">&quot;/skills/1&quot;</span><span class="p">:</span><span class="s2">&quot;skill B&quot;</span><span class="p">}</span>
</span><span id="__span-48-3"><a id="__codelineno-48-3" name="__codelineno-48-3" href="#__codelineno-48-3"></a><span class="kc">flattene</span><span class="err">d</span><span class="w"> </span><span class="err">pre</span><span class="kc">tt</span><span class="err">y</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-48-4"><a id="__codelineno-48-4" name="__codelineno-48-4" href="#__codelineno-48-4"></a><span class="w"> </span><span class="nt">&quot;/age&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">69.0</span><span class="p">,</span>
</span><span id="__span-48-5"><a id="__codelineno-48-5" name="__codelineno-48-5" href="#__codelineno-48-5"></a><span class="w"> </span><span class="nt">&quot;/name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Lion&quot;</span><span class="p">,</span>
</span><span id="__span-48-6"><a id="__codelineno-48-6" name="__codelineno-48-6" href="#__codelineno-48-6"></a><span class="w"> </span><span class="nt">&quot;/skills/0&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;skill A&quot;</span><span class="p">,</span>
</span><span id="__span-48-7"><a id="__codelineno-48-7" name="__codelineno-48-7" href="#__codelineno-48-7"></a><span class="w"> </span><span class="nt">&quot;/skills/1&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;skill B&quot;</span>
</span><span id="__span-48-8"><a id="__codelineno-48-8" name="__codelineno-48-8" href="#__codelineno-48-8"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="utiljsonunflattenjson-string-string"><code>Util.JsonUnflatten(json: string) -&gt; string</code></h4>
<p>还原由<code>Util.JsonFlatten()</code>函数扁平化处理的JSON值的任意嵌套结构。</p>
<h4 id="utiljsondiffa-string-b-string-string"><code>Util.JsonDiff(a: string, b: string) -&gt; string</code></h4>
<p>根据RFC 6902规范(http://jsonpatch.com/)生成JSON差异文件。可通过<code>Util.JsonDiffApply()</code>方法应用该差异补丁,最终返回差异结果集</p>
<h4 id="utiljsondiffapplybase-string-diff-string-string"><code>Util.JsonDiffApply(base: string, diff: string) -&gt; string</code></h4>
<p>将JSON <code>diff</code>作为补丁应用于<code>base</code>(遵循RFC 6902标准,详见http://jsonpatch.com/),最终返回处理结果。</p>
<h3 id="utilrandom"><code>Util.Random*</code></h3>
<p>从 BeamMP-Server <code>v3.1.0</code>开始。</p>
<h4 id="utilrandom-float"><code>Util.Random() -&gt; float</code></h4>
<p>返回一个介于0到1之间的浮点数值。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-49-1"><a id="__codelineno-49-1" name="__codelineno-49-1" href="#__codelineno-49-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">rand</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">Random</span><span class="p">()</span>
</span><span id="__span-49-2"><a id="__codelineno-49-2" name="__codelineno-49-2" href="#__codelineno-49-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;rand: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">rand</span><span class="p">)</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-50-1"><a id="__codelineno-50-1" name="__codelineno-50-1" href="#__codelineno-50-1"></a><span class="nv">rand</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">135477</span>
</span></code></pre></div>
<h4 id="utilrandomintrangemin-int-max-int-int"><code>Util.RandomIntRange(min: int, max: int) -&gt; int</code></h4>
<p>返回一个介于min和max之间的整数。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-51-1"><a id="__codelineno-51-1" name="__codelineno-51-1" href="#__codelineno-51-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">randInt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">RandomIntRange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">)</span>
</span><span id="__span-51-2"><a id="__codelineno-51-2" name="__codelineno-51-2" href="#__codelineno-51-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;randInt: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">randInt</span><span class="p">)</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-52-1"><a id="__codelineno-52-1" name="__codelineno-52-1" href="#__codelineno-52-1"></a><span class="nv">randInt</span><span class="p">:</span><span class="w"> </span><span class="err">69</span>
</span></code></pre></div>
<h4 id="utilrandomrangemin-number-max-number-float"><code>Util.RandomRange(min: number, max: number) -&gt; float</code></h4>
<p>返回一个介于min和max之间的浮点数。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-53-1"><a id="__codelineno-53-1" name="__codelineno-53-1" href="#__codelineno-53-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">randFloat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">RandomRange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1000</span><span class="p">)</span>
</span><span id="__span-53-2"><a id="__codelineno-53-2" name="__codelineno-53-2" href="#__codelineno-53-2"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;randFloat: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">randFloat</span><span class="p">)</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-54-1"><a id="__codelineno-54-1" name="__codelineno-54-1" href="#__codelineno-54-1"></a><span class="nv">randFloat</span><span class="p">:</span><span class="w"> </span><span class="err">420</span><span class="p">.</span><span class="err">6969</span>
</span></code></pre></div>
<h4 id="utilloginfoparams-v330"><code>Util.LogInfo(params: ...)</code> 及其关联方法集(自 v3.3.0 版本起)</h4>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-55-1"><a id="__codelineno-55-1" name="__codelineno-55-1" href="#__codelineno-55-1"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogInfo</span><span class="p">(</span><span class="s2">&quot;Hello, World!&quot;</span><span class="p">)</span>
</span><span id="__span-55-2"><a id="__codelineno-55-2" name="__codelineno-55-2" href="#__codelineno-55-2"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogWarn</span><span class="p">(</span><span class="s2">&quot;Cool warning&quot;</span><span class="p">)</span>
</span><span id="__span-55-3"><a id="__codelineno-55-3" name="__codelineno-55-3" href="#__codelineno-55-3"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogError</span><span class="p">(</span><span class="s2">&quot;Oh no!&quot;</span><span class="p">)</span>
</span><span id="__span-55-4"><a id="__codelineno-55-4" name="__codelineno-55-4" href="#__codelineno-55-4"></a><span class="nv">Util</span><span class="p">.</span><span class="nf">LogDebug</span><span class="p">(</span><span class="s2">&quot;hi&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>输出的内容</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-56-1"><a id="__codelineno-56-1" name="__codelineno-56-1" href="#__codelineno-56-1"></a>[19/04/24 11:06:50.142] [Test] [INFO] Hello, World!
</span><span id="__span-56-2"><a id="__codelineno-56-2" name="__codelineno-56-2" href="#__codelineno-56-2"></a>[19/04/24 11:06:50.142] [Test] [WARN] Cool warning
</span><span id="__span-56-3"><a id="__codelineno-56-3" name="__codelineno-56-3" href="#__codelineno-56-3"></a>[19/04/24 11:06:50.142] [Test] [ERROR] Oh no!
</span><span id="__span-56-4"><a id="__codelineno-56-4" name="__codelineno-56-4" href="#__codelineno-56-4"></a>[19/04/24 11:06:50.142] [Test] [DEBUG] hi
</span></code></pre></div>
<p>支持与<code>print()</code>方法完全一致的数据打印/转储能力。</p>
<h4 id="utildebugexecutiontime-table"><code>Util.DebugExecutionTime() -&gt; table</code></h4>
<p>当Lua代码在服务器端运行时,系统会对每个事件处理器的执行进行计时。这些执行时间的最小值、最大值、平均值(算术平均数)和标准偏差会被计算,并通过本函数以表格形式返回。该计算采用增量方式进行,因此每当事件处理器运行时,最小值、最大值、平均值和标准偏差都会实时更新。这样设计确保<code>Util.DebugExecutionTime()</code>方法的执行时间通常极短(低于0.25毫秒)。</p>
<p>它会返回一个这样的表:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-57-1"><a id="__codelineno-57-1" name="__codelineno-57-1" href="#__codelineno-57-1"></a><span class="s">[[table: 0x7af6d400aca0]]</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-57-2"><a id="__codelineno-57-2" name="__codelineno-57-2" href="#__codelineno-57-2"></a><span class="w"> </span><span class="nv">printStuff</span><span class="p">:</span><span class="w"> </span><span class="err">[[</span><span class="py">table</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="py">x7af6d400be60</span><span class="p">]]:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-57-3"><a id="__codelineno-57-3" name="__codelineno-57-3" href="#__codelineno-57-3"></a><span class="w"> </span><span class="nv">mean</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">250433,</span>
</span><span id="__span-57-4"><a id="__codelineno-57-4" name="__codelineno-57-4" href="#__codelineno-57-4"></a><span class="w"> </span><span class="py">n</span><span class="p">:</span><span class="w"> </span><span class="err">76,</span>
</span><span id="__span-57-5"><a id="__codelineno-57-5" name="__codelineno-57-5" href="#__codelineno-57-5"></a><span class="w"> </span><span class="py">max</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">074475,</span>
</span><span id="__span-57-6"><a id="__codelineno-57-6" name="__codelineno-57-6" href="#__codelineno-57-6"></a><span class="w"> </span><span class="py">stdev</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">109405,</span>
</span><span id="__span-57-7"><a id="__codelineno-57-7" name="__codelineno-57-7" href="#__codelineno-57-7"></a><span class="w"> </span><span class="py">min</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">449274,</span>
</span><span id="__span-57-8"><a id="__codelineno-57-8" name="__codelineno-57-8" href="#__codelineno-57-8"></a><span class="w"> </span><span class="err">},</span>
</span><span id="__span-57-9"><a id="__codelineno-57-9" name="__codelineno-57-9" href="#__codelineno-57-9"></a><span class="w"> </span><span class="py">onInit</span><span class="p">:</span><span class="w"> </span><span class="err">[[</span><span class="py">table</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="py">x7af6d400b130</span><span class="p">]]:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-57-10"><a id="__codelineno-57-10" name="__codelineno-57-10" href="#__codelineno-57-10"></a><span class="w"> </span><span class="nv">mean</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">033095,</span>
</span><span id="__span-57-11"><a id="__codelineno-57-11" name="__codelineno-57-11" href="#__codelineno-57-11"></a><span class="w"> </span><span class="py">n</span><span class="p">:</span><span class="w"> </span><span class="err">1,</span>
</span><span id="__span-57-12"><a id="__codelineno-57-12" name="__codelineno-57-12" href="#__codelineno-57-12"></a><span class="w"> </span><span class="py">max</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">033095,</span>
</span><span id="__span-57-13"><a id="__codelineno-57-13" name="__codelineno-57-13" href="#__codelineno-57-13"></a><span class="w"> </span><span class="py">stdev</span><span class="p">:</span><span class="w"> </span><span class="err">0,</span>
</span><span id="__span-57-14"><a id="__codelineno-57-14" name="__codelineno-57-14" href="#__codelineno-57-14"></a><span class="w"> </span><span class="py">min</span><span class="p">:</span><span class="w"> </span><span class="err">0</span><span class="p">.</span><span class="err">033095,</span>
</span><span id="__span-57-15"><a id="__codelineno-57-15" name="__codelineno-57-15" href="#__codelineno-57-15"></a><span class="w"> </span><span class="err">},</span>
</span><span id="__span-57-16"><a id="__codelineno-57-16" name="__codelineno-57-16" href="#__codelineno-57-16"></a><span class="err">}</span>
</span></code></pre></div>
<p>对于每个事件<em>处理器</em>,将返回如下结构数据:</p>
<ul>
<li><code>n</code>: 触发事件和调用处理程序的次数</li>
<li><code>mean</code>: 所有执行时间的平均值/中间值,单位为ms</li>
<li><code>max</code>: 最长执行时间,单位为ms</li>
<li><code>min</code>: 最短的执行时间,单位为毫秒</li>
<li><code>stdev</code>: 所有执行时间平均值的标准偏差,单位为ms</li>
</ul>
<p>这里有一个函数,你可以用它来漂亮地输出这些数据:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-58-1"><a id="__codelineno-58-1" name="__codelineno-58-1" href="#__codelineno-58-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">printDebugExecutionTime</span><span class="p">()</span>
</span><span id="__span-58-2"><a id="__codelineno-58-2" name="__codelineno-58-2" href="#__codelineno-58-2"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">stats</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">Util</span><span class="p">.</span><span class="nf">DebugExecutionTime</span><span class="p">()</span>
</span><span id="__span-58-3"><a id="__codelineno-58-3" name="__codelineno-58-3" href="#__codelineno-58-3"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;DebugExecutionTime:</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span id="__span-58-4"><a id="__codelineno-58-4" name="__codelineno-58-4" href="#__codelineno-58-4"></a><span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
</span><span id="__span-58-5"><a id="__codelineno-58-5" name="__codelineno-58-5" href="#__codelineno-58-5"></a><span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">stats</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-58-6"><a id="__codelineno-58-6" name="__codelineno-58-6" href="#__codelineno-58-6"></a><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="o">#</span><span class="nv">name</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-58-7"><a id="__codelineno-58-7" name="__codelineno-58-7" href="#__codelineno-58-7"></a><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">#</span><span class="nv">name</span>
</span><span id="__span-58-8"><a id="__codelineno-58-8" name="__codelineno-58-8" href="#__codelineno-58-8"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-58-9"><a id="__codelineno-58-9" name="__codelineno-58-9" href="#__codelineno-58-9"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-58-10"><a id="__codelineno-58-10" name="__codelineno-58-10" href="#__codelineno-58-10"></a><span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">stats</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
</span><span id="__span-58-11"><a id="__codelineno-58-11" name="__codelineno-58-11" href="#__codelineno-58-11"></a><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">pretty</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nb">string.format</span><span class="p">(</span><span class="s2">&quot;%&quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">longest</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="s2">&quot;s: %12f +/- %12f (min: %12f, max: %12f) (called %d time(s))</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="w"> </span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">mean</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">stdev</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">min</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">max</span><span class="p">,</span><span class="w"> </span><span class="nv">t</span><span class="p">.</span><span class="py">n</span><span class="p">)</span>
</span><span id="__span-58-12"><a id="__codelineno-58-12" name="__codelineno-58-12" href="#__codelineno-58-12"></a><span class="w"> </span><span class="kr">end</span>
</span><span id="__span-58-13"><a id="__codelineno-58-13" name="__codelineno-58-13" href="#__codelineno-58-13"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="nv">pretty</span><span class="p">)</span>
</span><span id="__span-58-14"><a id="__codelineno-58-14" name="__codelineno-58-14" href="#__codelineno-58-14"></a><span class="kr">end</span>
</span></code></pre></div>
<p>如果它很慢,你可以像这样调用它来调试你的代码:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-59-1"><a id="__codelineno-59-1" name="__codelineno-59-1" href="#__codelineno-59-1"></a><span class="c1">-- event to print the debug times</span>
</span><span id="__span-59-2"><a id="__codelineno-59-2" name="__codelineno-59-2" href="#__codelineno-59-2"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;printStuff&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;printDebugExecutionTime&quot;</span><span class="p">)</span>
</span><span id="__span-59-3"><a id="__codelineno-59-3" name="__codelineno-59-3" href="#__codelineno-59-3"></a><span class="c1">-- run every 5000 ms = 5 seconds (or 10, or 60, whatever makes sense for you</span>
</span><span id="__span-59-4"><a id="__codelineno-59-4" name="__codelineno-59-4" href="#__codelineno-59-4"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateEventTimer</span><span class="p">(</span><span class="s2">&quot;printStuff&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">5000</span><span class="p">)</span>
</span></code></pre></div>
<h3 id="fs">FS的功能</h3>
<p><code>FS</code>函数是<strong>f</strong>ile<strong>s</strong> system函数,目的是比默认的Lua功能更好。</p>
<p>在指定路径时,请始终使用<code>/</code>作为分隔符,因为这是跨平台的(windows, linux, macos,…)。</p>
<h4 id="fscreatedirectorypath-string-boolstring"><code>FS.CreateDirectory(path: string) -&gt; bool,string</code></h4>
<p>创建指定的目录和任何父目录(如果父目录不存在)。其行为大致相当于常见的linux命令<code>mkdir -p</code></p>
<p>如果成功,返回<code>true</code><code>""</code>。如果创建目录失败,则返回<code>false</code>和错误消息(<code>string</code>)。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-60-1"><a id="__codelineno-60-1" name="__codelineno-60-1" href="#__codelineno-60-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">success</span><span class="p">,</span><span class="w"> </span><span class="nv">error_message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">FS</span><span class="p">.</span><span class="nf">CreateDirectory</span><span class="p">(</span><span class="s2">&quot;data/mystuff/somefolder&quot;</span><span class="p">)</span>
</span><span id="__span-60-2"><a id="__codelineno-60-2" name="__codelineno-60-2" href="#__codelineno-60-2"></a>
</span><span id="__span-60-3"><a id="__codelineno-60-3" name="__codelineno-60-3" href="#__codelineno-60-3"></a><span class="kr">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="nv">success</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-60-4"><a id="__codelineno-60-4" name="__codelineno-60-4" href="#__codelineno-60-4"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;failed to create directory: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">error_message</span><span class="p">)</span>
</span><span id="__span-60-5"><a id="__codelineno-60-5" name="__codelineno-60-5" href="#__codelineno-60-5"></a><span class="kr">else</span>
</span><span id="__span-60-6"><a id="__codelineno-60-6" name="__codelineno-60-6" href="#__codelineno-60-6"></a><span class="w"> </span><span class="c1">-- do something with the directory</span>
</span><span id="__span-60-7"><a id="__codelineno-60-7" name="__codelineno-60-7" href="#__codelineno-60-7"></a><span class="kr">end</span>
</span><span id="__span-60-8"><a id="__codelineno-60-8" name="__codelineno-60-8" href="#__codelineno-60-8"></a>
</span><span id="__span-60-9"><a id="__codelineno-60-9" name="__codelineno-60-9" href="#__codelineno-60-9"></a><span class="c1">-- Be careful not to do this! This will ALWAYS be true!</span>
</span><span id="__span-60-10"><a id="__codelineno-60-10" name="__codelineno-60-10" href="#__codelineno-60-10"></a><span class="kr">if</span><span class="w"> </span><span class="nv">error_message</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-60-11"><a id="__codelineno-60-11" name="__codelineno-60-11" href="#__codelineno-60-11"></a><span class="w"> </span><span class="c1">-- ...</span>
</span><span id="__span-60-12"><a id="__codelineno-60-12" name="__codelineno-60-12" href="#__codelineno-60-12"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="fsremovepath-string-boolstring"><code>FS.Remove(path: string) -&gt; bool,string</code></h4>
<p>删除指定的文件或文件夹。</p>
<p>如果发生错误,返回<code>true</code>,并在第二个返回值中显示错误消息。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-61-1"><a id="__codelineno-61-1" name="__codelineno-61-1" href="#__codelineno-61-1"></a><span class="kd">local</span><span class="w"> </span><span class="nb">error</span><span class="p">,</span><span class="w"> </span><span class="nv">error_message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">FS</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s2">&quot;myfile.txt&quot;</span><span class="p">)</span>
</span><span id="__span-61-2"><a id="__codelineno-61-2" name="__codelineno-61-2" href="#__codelineno-61-2"></a>
</span><span id="__span-61-3"><a id="__codelineno-61-3" name="__codelineno-61-3" href="#__codelineno-61-3"></a><span class="kr">if</span><span class="w"> </span><span class="nb">error</span><span class="w"> </span><span class="kr">then</span>
</span><span id="__span-61-4"><a id="__codelineno-61-4" name="__codelineno-61-4" href="#__codelineno-61-4"></a><span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;failed to delete myfile: &quot;</span><span class="w"> </span><span class="o">..</span><span class="w"> </span><span class="nv">error_message</span><span class="p">)</span>
</span><span id="__span-61-5"><a id="__codelineno-61-5" name="__codelineno-61-5" href="#__codelineno-61-5"></a><span class="kr">end</span>
</span></code></pre></div>
<h4 id="fsrenamepatha-string-pathb-string-boolstring"><code>FS.Rename(pathA: string, pathB: string) -&gt; bool,string</code></h4>
<p><code>pathA</code>重命名(或移动)为<code>pathB</code></p>
<p>如果发生错误,返回<code>true</code>,并在第二个返回值中显示错误消息。</p>
<h4 id="fscopypatha-string-pathb-string-boolstring"><code>FS.Copy(pathA: string, pathB: string) -&gt; bool,string</code></h4>
<p>复制 <code>pathA</code><code>pathB</code>.</p>
<p>如果发生错误,返回<code>true</code>,并在第二个返回值中显示错误消息。</p>
<h4 id="fsgetfilenamepath-string-string"><code>FS.GetFilename(path: string) -&gt; string</code></h4>
<p>返回路径的最后一部分,通常是文件名。下面是一些输入+输出示例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-62-1"><a id="__codelineno-62-1" name="__codelineno-62-1" href="#__codelineno-62-1"></a><span class="nv">input</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nv">output</span>
</span><span id="__span-62-2"><a id="__codelineno-62-2" name="__codelineno-62-2" href="#__codelineno-62-2"></a>
</span><span id="__span-62-3"><a id="__codelineno-62-3" name="__codelineno-62-3" href="#__codelineno-62-3"></a><span class="s2">&quot;my/path/a.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;a.txt&quot;</span>
</span><span id="__span-62-4"><a id="__codelineno-62-4" name="__codelineno-62-4" href="#__codelineno-62-4"></a><span class="s2">&quot;somefile.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;somefile.txt&quot;</span>
</span><span id="__span-62-5"><a id="__codelineno-62-5" name="__codelineno-62-5" href="#__codelineno-62-5"></a><span class="s2">&quot;/awesome/path&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;path&quot;</span>
</span></code></pre></div>
<h4 id="fsgetextensionpath-string-string"><code>FS.GetExtension(path: string) -&gt; string</code></h4>
<p>返回文件的扩展名,如果不存在扩展名则返回空字符串。下面是一些输入+输出示例</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-63-1"><a id="__codelineno-63-1" name="__codelineno-63-1" href="#__codelineno-63-1"></a><span class="nv">input</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nv">output</span>
</span><span id="__span-63-2"><a id="__codelineno-63-2" name="__codelineno-63-2" href="#__codelineno-63-2"></a>
</span><span id="__span-63-3"><a id="__codelineno-63-3" name="__codelineno-63-3" href="#__codelineno-63-3"></a><span class="s2">&quot;myfile.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.txt&quot;</span>
</span><span id="__span-63-4"><a id="__codelineno-63-4" name="__codelineno-63-4" href="#__codelineno-63-4"></a><span class="s2">&quot;somefile.&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.&quot;</span>
</span><span id="__span-63-5"><a id="__codelineno-63-5" name="__codelineno-63-5" href="#__codelineno-63-5"></a><span class="s2">&quot;/awesome/path&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;&quot;</span>
</span><span id="__span-63-6"><a id="__codelineno-63-6" name="__codelineno-63-6" href="#__codelineno-63-6"></a><span class="s2">&quot;/awesome/path/file.zip.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.txt&quot;</span>
</span><span id="__span-63-7"><a id="__codelineno-63-7" name="__codelineno-63-7" href="#__codelineno-63-7"></a><span class="s2">&quot;myexe.exe&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;.exe&quot;</span>
</span></code></pre></div>
<h4 id="fsgetparentfolderpath-string-string"><code>FS.GetParentFolder(path: string) -&gt; string</code></h4>
<p>返回父目录的路径,即包含文件或文件夹的文件夹。下面是一些输入+输出示例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-64-1"><a id="__codelineno-64-1" name="__codelineno-64-1" href="#__codelineno-64-1"></a><span class="nv">input</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nv">output</span>
</span><span id="__span-64-2"><a id="__codelineno-64-2" name="__codelineno-64-2" href="#__codelineno-64-2"></a>
</span><span id="__span-64-3"><a id="__codelineno-64-3" name="__codelineno-64-3" href="#__codelineno-64-3"></a><span class="s2">&quot;/var/tmp/example.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;/var/tmp&quot;</span>
</span><span id="__span-64-4"><a id="__codelineno-64-4" name="__codelineno-64-4" href="#__codelineno-64-4"></a><span class="s2">&quot;/&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;/&quot;</span>
</span><span id="__span-64-5"><a id="__codelineno-64-5" name="__codelineno-64-5" href="#__codelineno-64-5"></a><span class="s2">&quot;mydir/a/b/c.txt&quot;</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s2">&quot;mydir/a/b&quot;</span>
</span></code></pre></div>
<h4 id="fsexistspath-string-bool"><code>FS.Exists(path: string) -&gt; bool</code></h4>
<p>如果路径存在返回<code>true</code>,如果路径不存在返回<code>false</code></p>
<h4 id="fsisdirectorypath-string-bool"><code>FS.IsDirectory(path: string) -&gt; bool</code></h4>
<p>如果指定的路径是目录,返回<code>true</code>,如果不是,返回<code>false</code>。注意<code>false</code>并不意味着路径是一个文件(参见<code>FS.IsFile()</code>)。</p>
<h4 id="fsisfilepath-string-bool"><code>FS.IsFile(path: string) -&gt; bool</code></h4>
<p>如果指定的路径是目录,返回<code>true</code>,如果不是,返回<code>false</code>。注意<code>false</code>并不意味着路径是一个文件(参见<code>FS.IsFile()</code>)。</p>
<h4 id="fslistdirectoriespath-string-table"><code>FS.ListDirectories(path: string) -&gt; table</code></h4>
<p>返回给定路径中所有目录的表。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-65-1"><a id="__codelineno-65-1" name="__codelineno-65-1" href="#__codelineno-65-1"></a><span class="nb">print</span><span class="p">(</span><span class="nv">FS</span><span class="p">.</span><span class="nf">ListDirectories</span><span class="p">(</span><span class="s2">&quot;Resources&quot;</span><span class="p">))</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-66-1"><a id="__codelineno-66-1" name="__codelineno-66-1" href="#__codelineno-66-1"></a><span class="p">{</span>
</span><span id="__span-66-2"><a id="__codelineno-66-2" name="__codelineno-66-2" href="#__codelineno-66-2"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Client&quot;</span><span class="p">,</span>
</span><span id="__span-66-3"><a id="__codelineno-66-3" name="__codelineno-66-3" href="#__codelineno-66-3"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Server&quot;</span>
</span><span id="__span-66-4"><a id="__codelineno-66-4" name="__codelineno-66-4" href="#__codelineno-66-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="fslistfilespath-string-table"><code>FS.ListFiles(path: string) -&gt; table</code></h4>
<p>返回给定路径中所有目录的表。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-67-1"><a id="__codelineno-67-1" name="__codelineno-67-1" href="#__codelineno-67-1"></a><span class="nb">print</span><span class="p">(</span><span class="nv">FS</span><span class="p">.</span><span class="nf">ListFiles</span><span class="p">(</span><span class="s2">&quot;Resources/Server/examplePlugin&quot;</span><span class="p">))</span>
</span></code></pre></div>
<p>结果:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-68-1"><a id="__codelineno-68-1" name="__codelineno-68-1" href="#__codelineno-68-1"></a><span class="p">{</span>
</span><span id="__span-68-2"><a id="__codelineno-68-2" name="__codelineno-68-2" href="#__codelineno-68-2"></a><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;example.json&quot;</span><span class="p">,</span>
</span><span id="__span-68-3"><a id="__codelineno-68-3" name="__codelineno-68-3" href="#__codelineno-68-3"></a><span class="w"> </span><span class="mi">2</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;example.lua&quot;</span>
</span><span id="__span-68-4"><a id="__codelineno-68-4" name="__codelineno-68-4" href="#__codelineno-68-4"></a><span class="p">}</span>
</span></code></pre></div>
<h4 id="fsconcatpaths-string"><code>FS.ConcatPaths(...) -&gt; string</code></h4>
<p>使用系统的首选路径分隔符将所有参数加在一起(连接)。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-69-1"><a id="__codelineno-69-1" name="__codelineno-69-1" href="#__codelineno-69-1"></a><span class="nv">FS</span><span class="p">.</span><span class="nf">ConcatPaths</span><span class="p">(</span><span class="s2">&quot;a&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;b&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/c/d/e/&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;/f/&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;g&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;h.txt&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>结果</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-70-1"><a id="__codelineno-70-1" name="__codelineno-70-1" href="#__codelineno-70-1"></a>a/b/c/d/e/f/g/h.txt
</span></code></pre></div>
<p>当路径中存在<code>..</code>符号时,本函数会执行智能路径解析。该方法相较于Lua原生字符串拼接更为安全,且自动适配不同操作系统的路径分隔符。</p>
<p>在指定路径时,请始终使用 <code>/</code>作为分隔符,因为它是跨平台通用的(Windows,LinuxMacOS等)</p>
<h3 id="_10">事件</h3>
<h4 id="_11">说明</h4>
<ul>
<li>参数:给出此事件处理程序的参数列表</li>
<li>可取消:表示该事件是否可以被取消。如果事件可取消,处理函数可以通过返回 <code>1</code>, 来取消事件,例如 <code>return 1</code>.</li>
</ul>
<h4 id="_12">事件摘要</h4>
<p>玩家的加入将按照给定的顺序触发以下事件:</p>
<ol>
<li><code>onPlayerAuth</code></li>
<li><code>onPlayerConnecting</code></li>
<li><code>onPlayerJoining</code></li>
<li><code>onPlayerJoin</code></li>
</ol>
<h4 id="_13">系统事件</h4>
<h5 id="oninit"><code>onInit</code></h5>
<p>参数: NONE 可取消: NO</p>
<p>在插件中的所有文件初始化后触发。</p>
<h5 id="onconsoleinput"><code>onConsoleInput</code></h5>
<p>参数: <code>input: string</code> 可取消: NO</p>
<p>当BeamMP控制台接收到输入时触发。</p>
<h5 id="onshutdown"><code>onShutdown</code></h5>
<p>参数: NONE 可取消: NO</p>
<p>服务器关闭时触发。目前发生在所有玩家被踢之后。</p>
<h4 id="_14">游戏相关事件</h4>
<h5 id="onplayerauth"><code>onPlayerAuth</code></h5>
<p>参数: <code>player_name: string</code>, <code>player_role: string</code>, <code>is_guest: bool</code>, <code>identifiers: table -&gt; beammp, ip</code> 可取消: YES</p>
<p>当玩家尝试加入时触发的第一个事件。<br>处理函数可以通过返回<code>1</code> 或一个原因 (<code>string</code>) 来拒绝玩家加入。</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-71-1"><a id="__codelineno-71-1" name="__codelineno-71-1" href="#__codelineno-71-1"></a><span class="kr">function</span><span class="w"> </span><span class="nf">myPlayerAuthorizer</span><span class="p">(</span><span class="nv">name</span><span class="p">,</span><span class="w"> </span><span class="nv">role</span><span class="p">,</span><span class="w"> </span><span class="nv">is_guest</span><span class="p">,</span><span class="w"> </span><span class="nv">identifiers</span><span class="p">)</span>
</span><span id="__span-71-2"><a id="__codelineno-71-2" name="__codelineno-71-2" href="#__codelineno-71-2"></a><span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="s2">&quot;Sorry, you cannot join at this time.&quot;</span>
</span><span id="__span-71-3"><a id="__codelineno-71-3" name="__codelineno-71-3" href="#__codelineno-71-3"></a><span class="kr">end</span>
</span><span id="__span-71-4"><a id="__codelineno-71-4" name="__codelineno-71-4" href="#__codelineno-71-4"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onPlayerAuth&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;myPlayerAuthorizer&quot;</span><span class="p">)</span>
</span></code></pre></div>
<h5 id="onplayerconnecting"><code>onPlayerConnecting</code></h5>
<p>参数: <code>player_id: number</code> 可取消: NO</p>
<p>当玩家第一次开始连接时触发<code>onPlayerAuth</code></p>
<h5 id="onplayerjoining"><code>onPlayerJoining</code></h5>
<p>参数: <code>player_id: number</code> 可取消: NO</p>
<p>当玩家加载完所有mod后触发<code>onPlayerConnecting</code></p>
<h5 id="onplayerdisconnect"><code>onPlayerDisconnect</code></h5>
<p>参数: <code>player_id: number</code> 可取消: NO</p>
<p>当玩家断开连接时触发。</p>
<h5 id="onchatmessage"><code>onChatMessage</code></h5>
<p>参数: <code>player_id: number</code>, <code>player_name: string</code>, <code>message: string</code> 可取消: YES</p>
<p>当玩家发送聊天消息时触发。<br>如果该事件被取消,聊天消息将不会对任何人显示,甚至发送消息的玩家自己也看不到。</p>
<h5 id="onvehiclespawn"><code>onVehicleSpawn</code></h5>
<p>参数: <code>player_id: number</code>, <code>vehicle_id: number</code>, <code>data: string</code> 可取消: YES</p>
<p>当玩家生成一辆新车辆时触发。请注意,车辆切换/替换则会触发 <a href="#onvehicleedited"><code>onVehicleEdited</code></a><br><code>data</code> 参数包含该车辆的配置以及位置/旋转数据,并以 JSON 字符串形式提供。</p>
<details>
</details>
<summary><code>data</code> 值示例</summary>
<p>该数据字符串以一个唯一的车辆标识符开头,其格式为玩家 ID、一个连字符,以及车辆 ID。随后是一个 JSON 对象,其中包含车辆的配置信息以及位置数据。</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-72-1"><a id="__codelineno-72-1" name="__codelineno-72-1" href="#__codelineno-72-1"></a>0-0: {
</span><span id="__span-72-2"><a id="__codelineno-72-2" name="__codelineno-72-2" href="#__codelineno-72-2"></a> &quot;abs&quot;: &quot;realistic&quot;,
</span><span id="__span-72-3"><a id="__codelineno-72-3" name="__codelineno-72-3" href="#__codelineno-72-3"></a> &quot;ign&quot;: 3,
</span><span id="__span-72-4"><a id="__codelineno-72-4" name="__codelineno-72-4" href="#__codelineno-72-4"></a> &quot;jbm&quot;: &quot;van&quot;,
</span><span id="__span-72-5"><a id="__codelineno-72-5" name="__codelineno-72-5" href="#__codelineno-72-5"></a> &quot;pid&quot;: 0,
</span><span id="__span-72-6"><a id="__codelineno-72-6" name="__codelineno-72-6" href="#__codelineno-72-6"></a> &quot;pos&quot;: [
</span><span id="__span-72-7"><a id="__codelineno-72-7" name="__codelineno-72-7" href="#__codelineno-72-7"></a> 907.93902587891,
</span><span id="__span-72-8"><a id="__codelineno-72-8" name="__codelineno-72-8" href="#__codelineno-72-8"></a> 773.50201416016,
</span><span id="__span-72-9"><a id="__codelineno-72-9" name="__codelineno-72-9" href="#__codelineno-72-9"></a> 238.87800598145
</span><span id="__span-72-10"><a id="__codelineno-72-10" name="__codelineno-72-10" href="#__codelineno-72-10"></a> ],
</span><span id="__span-72-11"><a id="__codelineno-72-11" name="__codelineno-72-11" href="#__codelineno-72-11"></a> &quot;pro&quot;: &quot;0&quot;,
</span><span id="__span-72-12"><a id="__codelineno-72-12" name="__codelineno-72-12" href="#__codelineno-72-12"></a> &quot;rot&quot;: [
</span><span id="__span-72-13"><a id="__codelineno-72-13" name="__codelineno-72-13" href="#__codelineno-72-13"></a> 0,
</span><span id="__span-72-14"><a id="__codelineno-72-14" name="__codelineno-72-14" href="#__codelineno-72-14"></a> 0,
</span><span id="__span-72-15"><a id="__codelineno-72-15" name="__codelineno-72-15" href="#__codelineno-72-15"></a> 0.99999994039536,
</span><span id="__span-72-16"><a id="__codelineno-72-16" name="__codelineno-72-16" href="#__codelineno-72-16"></a> 0
</span><span id="__span-72-17"><a id="__codelineno-72-17" name="__codelineno-72-17" href="#__codelineno-72-17"></a> ],
</span><span id="__span-72-18"><a id="__codelineno-72-18" name="__codelineno-72-18" href="#__codelineno-72-18"></a> &quot;vcf&quot;: {
</span><span id="__span-72-19"><a id="__codelineno-72-19" name="__codelineno-72-19" href="#__codelineno-72-19"></a> &quot;licenseName&quot;: &quot;H30 9VV&quot;,
</span><span id="__span-72-20"><a id="__codelineno-72-20" name="__codelineno-72-20" href="#__codelineno-72-20"></a> &quot;mainPartName&quot;: &quot;van&quot;,
</span><span id="__span-72-21"><a id="__codelineno-72-21" name="__codelineno-72-21" href="#__codelineno-72-21"></a> &quot;mainPartPath&quot;: &quot;/van&quot;,
</span><span id="__span-72-22"><a id="__codelineno-72-22" name="__codelineno-72-22" href="#__codelineno-72-22"></a> &quot;model&quot;: &quot;van&quot;,
</span><span id="__span-72-23"><a id="__codelineno-72-23" name="__codelineno-72-23" href="#__codelineno-72-23"></a> &quot;paints&quot;: [
</span><span id="__span-72-24"><a id="__codelineno-72-24" name="__codelineno-72-24" href="#__codelineno-72-24"></a> {
</span><span id="__span-72-25"><a id="__codelineno-72-25" name="__codelineno-72-25" href="#__codelineno-72-25"></a> &quot;baseColor&quot;: [
</span><span id="__span-72-26"><a id="__codelineno-72-26" name="__codelineno-72-26" href="#__codelineno-72-26"></a> 0.21999999880791,
</span><span id="__span-72-27"><a id="__codelineno-72-27" name="__codelineno-72-27" href="#__codelineno-72-27"></a> 0.37000000476837003,
</span><span id="__span-72-28"><a id="__codelineno-72-28" name="__codelineno-72-28" href="#__codelineno-72-28"></a> 0.33000001311302,
</span><span id="__span-72-29"><a id="__codelineno-72-29" name="__codelineno-72-29" href="#__codelineno-72-29"></a> 1.2000000476837
</span><span id="__span-72-30"><a id="__codelineno-72-30" name="__codelineno-72-30" href="#__codelineno-72-30"></a> ],
</span><span id="__span-72-31"><a id="__codelineno-72-31" name="__codelineno-72-31" href="#__codelineno-72-31"></a> &quot;clearcoat&quot;: 0,
</span><span id="__span-72-32"><a id="__codelineno-72-32" name="__codelineno-72-32" href="#__codelineno-72-32"></a> &quot;clearcoatRoughness&quot;: 0,
</span><span id="__span-72-33"><a id="__codelineno-72-33" name="__codelineno-72-33" href="#__codelineno-72-33"></a> &quot;metallic&quot;: 0,
</span><span id="__span-72-34"><a id="__codelineno-72-34" name="__codelineno-72-34" href="#__codelineno-72-34"></a> &quot;roughness&quot;: 0.070000000298023
</span><span id="__span-72-35"><a id="__codelineno-72-35" name="__codelineno-72-35" href="#__codelineno-72-35"></a> },
</span><span id="__span-72-36"><a id="__codelineno-72-36" name="__codelineno-72-36" href="#__codelineno-72-36"></a> {
</span><span id="__span-72-37"><a id="__codelineno-72-37" name="__codelineno-72-37" href="#__codelineno-72-37"></a> &quot;baseColor&quot;: [
</span><span id="__span-72-38"><a id="__codelineno-72-38" name="__codelineno-72-38" href="#__codelineno-72-38"></a> 0.62300002574921,
</span><span id="__span-72-39"><a id="__codelineno-72-39" name="__codelineno-72-39" href="#__codelineno-72-39"></a> 0.62300002574921,
</span><span id="__span-72-40"><a id="__codelineno-72-40" name="__codelineno-72-40" href="#__codelineno-72-40"></a> 0.62300002574921,
</span><span id="__span-72-41"><a id="__codelineno-72-41" name="__codelineno-72-41" href="#__codelineno-72-41"></a> 1.2000000476837
</span><span id="__span-72-42"><a id="__codelineno-72-42" name="__codelineno-72-42" href="#__codelineno-72-42"></a> ],
</span><span id="__span-72-43"><a id="__codelineno-72-43" name="__codelineno-72-43" href="#__codelineno-72-43"></a> &quot;clearcoat&quot;: 0.80000001192093,
</span><span id="__span-72-44"><a id="__codelineno-72-44" name="__codelineno-72-44" href="#__codelineno-72-44"></a> &quot;clearcoatRoughness&quot;: 0.070000000298023,
</span><span id="__span-72-45"><a id="__codelineno-72-45" name="__codelineno-72-45" href="#__codelineno-72-45"></a> &quot;metallic&quot;: 0.80000001192093,
</span><span id="__span-72-46"><a id="__codelineno-72-46" name="__codelineno-72-46" href="#__codelineno-72-46"></a> &quot;roughness&quot;: 0.64999997615814
</span><span id="__span-72-47"><a id="__codelineno-72-47" name="__codelineno-72-47" href="#__codelineno-72-47"></a> },
</span><span id="__span-72-48"><a id="__codelineno-72-48" name="__codelineno-72-48" href="#__codelineno-72-48"></a> {
</span><span id="__span-72-49"><a id="__codelineno-72-49" name="__codelineno-72-49" href="#__codelineno-72-49"></a> &quot;baseColor&quot;: [
</span><span id="__span-72-50"><a id="__codelineno-72-50" name="__codelineno-72-50" href="#__codelineno-72-50"></a> 0.21999999880791,
</span><span id="__span-72-51"><a id="__codelineno-72-51" name="__codelineno-72-51" href="#__codelineno-72-51"></a> 0.37000000476837003,
</span><span id="__span-72-52"><a id="__codelineno-72-52" name="__codelineno-72-52" href="#__codelineno-72-52"></a> 0.33000001311302,
</span><span id="__span-72-53"><a id="__codelineno-72-53" name="__codelineno-72-53" href="#__codelineno-72-53"></a> 1.2000000476837
</span><span id="__span-72-54"><a id="__codelineno-72-54" name="__codelineno-72-54" href="#__codelineno-72-54"></a> ],
</span><span id="__span-72-55"><a id="__codelineno-72-55" name="__codelineno-72-55" href="#__codelineno-72-55"></a> &quot;clearcoat&quot;: 0,
</span><span id="__span-72-56"><a id="__codelineno-72-56" name="__codelineno-72-56" href="#__codelineno-72-56"></a> &quot;clearcoatRoughness&quot;: 0,
</span><span id="__span-72-57"><a id="__codelineno-72-57" name="__codelineno-72-57" href="#__codelineno-72-57"></a> &quot;metallic&quot;: 0,
</span><span id="__span-72-58"><a id="__codelineno-72-58" name="__codelineno-72-58" href="#__codelineno-72-58"></a> &quot;roughness&quot;: 0.070000000298023
</span><span id="__span-72-59"><a id="__codelineno-72-59" name="__codelineno-72-59" href="#__codelineno-72-59"></a> }
</span><span id="__span-72-60"><a id="__codelineno-72-60" name="__codelineno-72-60" href="#__codelineno-72-60"></a> ],
</span><span id="__span-72-61"><a id="__codelineno-72-61" name="__codelineno-72-61" href="#__codelineno-72-61"></a> &quot;partConfigFilename&quot;: &quot;vehicles/van/h15_xt_passenger.pc&quot;,
</span><span id="__span-72-62"><a id="__codelineno-72-62" name="__codelineno-72-62" href="#__codelineno-72-62"></a> &quot;parts&quot;: {
</span><span id="__span-72-63"><a id="__codelineno-72-63" name="__codelineno-72-63" href="#__codelineno-72-63"></a> &quot;brakepad_F&quot;: &quot;brakepad_F_premium&quot;,
</span><span id="__span-72-64"><a id="__codelineno-72-64" name="__codelineno-72-64" href="#__codelineno-72-64"></a> &quot;brakepad_R&quot;: &quot;brakepad_R_premium&quot;,
</span><span id="__span-72-65"><a id="__codelineno-72-65" name="__codelineno-72-65" href="#__codelineno-72-65"></a> &quot;gps&quot;: &quot;&quot;,
</span><span id="__span-72-66"><a id="__codelineno-72-66" name="__codelineno-72-66" href="#__codelineno-72-66"></a> &quot;licenseplate_design_2_1&quot;: &quot;&quot;,
</span><span id="__span-72-67"><a id="__codelineno-72-67" name="__codelineno-72-67" href="#__codelineno-72-67"></a> &quot;linelock&quot;: &quot;&quot;,
</span><span id="__span-72-68"><a id="__codelineno-72-68" name="__codelineno-72-68" href="#__codelineno-72-68"></a> &quot;load_seat_FR&quot;: &quot;&quot;,
</span><span id="__span-72-69"><a id="__codelineno-72-69" name="__codelineno-72-69" href="#__codelineno-72-69"></a> &quot;n2o_system&quot;: &quot;&quot;,
</span><span id="__span-72-70"><a id="__codelineno-72-70" name="__codelineno-72-70" href="#__codelineno-72-70"></a> &quot;paint_design&quot;: &quot;van_skin_twotone&quot;,
</span><span id="__span-72-71"><a id="__codelineno-72-71" name="__codelineno-72-71" href="#__codelineno-72-71"></a> &quot;pickup_engine_v8_ecu&quot;: &quot;pickup_engine_v8_ecu&quot;,
</span><span id="__span-72-72"><a id="__codelineno-72-72" name="__codelineno-72-72" href="#__codelineno-72-72"></a> &quot;pickup_engine_v8_internals&quot;: &quot;pickup_engine_v8_internals&quot;,
</span><span id="__span-72-73"><a id="__codelineno-72-73" name="__codelineno-72-73" href="#__codelineno-72-73"></a> &quot;pickup_enginemounts&quot;: &quot;pickup_enginemounts&quot;,
</span><span id="__span-72-74"><a id="__codelineno-72-74" name="__codelineno-72-74" href="#__codelineno-72-74"></a> &quot;pickup_oilpan_v8&quot;: &quot;pickup_oilpan_v8&quot;,
</span><span id="__span-72-75"><a id="__codelineno-72-75" name="__codelineno-72-75" href="#__codelineno-72-75"></a> &quot;pickup_reversewarn&quot;: &quot;&quot;,
</span><span id="__span-72-76"><a id="__codelineno-72-76" name="__codelineno-72-76" href="#__codelineno-72-76"></a> &quot;pickup_sparetire&quot;: &quot;pickup_sparetire_5l&quot;,
</span><span id="__span-72-77"><a id="__codelineno-72-77" name="__codelineno-72-77" href="#__codelineno-72-77"></a> &quot;pickup_towhitch&quot;: &quot;&quot;,
</span><span id="__span-72-78"><a id="__codelineno-72-78" name="__codelineno-72-78" href="#__codelineno-72-78"></a> &quot;skin_glass&quot;: &quot;van_skin_glass_tint&quot;,
</span><span id="__span-72-79"><a id="__codelineno-72-79" name="__codelineno-72-79" href="#__codelineno-72-79"></a> &quot;skin_interior&quot;: &quot;van_skin_interior_black&quot;,
</span><span id="__span-72-80"><a id="__codelineno-72-80" name="__codelineno-72-80" href="#__codelineno-72-80"></a> &quot;soundscape_horn&quot;: &quot;soundscape_horn_115&quot;,
</span><span id="__span-72-81"><a id="__codelineno-72-81" name="__codelineno-72-81" href="#__codelineno-72-81"></a> &quot;tire_F_16x7_alt&quot;: &quot;tire_F_225_75_16_alt_standard&quot;,
</span><span id="__span-72-82"><a id="__codelineno-72-82" name="__codelineno-72-82" href="#__codelineno-72-82"></a> &quot;tire_R_16x7_alt&quot;: &quot;tire_R_225_75_16_alt_standard&quot;,
</span><span id="__span-72-83"><a id="__codelineno-72-83" name="__codelineno-72-83" href="#__codelineno-72-83"></a> &quot;van_ABS&quot;: &quot;van_ABS&quot;,
</span><span id="__span-72-84"><a id="__codelineno-72-84" name="__codelineno-72-84" href="#__codelineno-72-84"></a> &quot;van_ESC&quot;: &quot;&quot;,
</span><span id="__span-72-85"><a id="__codelineno-72-85" name="__codelineno-72-85" href="#__codelineno-72-85"></a> &quot;van_ac&quot;: &quot;van_ac&quot;,
</span><span id="__span-72-86"><a id="__codelineno-72-86" name="__codelineno-72-86" href="#__codelineno-72-86"></a> &quot;van_body&quot;: &quot;van_body_passenger&quot;,
</span><span id="__span-72-87"><a id="__codelineno-72-87" name="__codelineno-72-87" href="#__codelineno-72-87"></a> &quot;van_brake_F&quot;: &quot;van_brake_F&quot;,
</span><span id="__span-72-88"><a id="__codelineno-72-88" name="__codelineno-72-88" href="#__codelineno-72-88"></a> &quot;van_brake_R&quot;: &quot;van_brake_R_drum&quot;,
</span><span id="__span-72-89"><a id="__codelineno-72-89" name="__codelineno-72-89" href="#__codelineno-72-89"></a> &quot;van_bumper_F&quot;: &quot;van_bumper_F_altb&quot;,
</span><span id="__span-72-90"><a id="__codelineno-72-90" name="__codelineno-72-90" href="#__codelineno-72-90"></a> &quot;van_bumper_F_lip&quot;: &quot;&quot;,
</span><span id="__span-72-91"><a id="__codelineno-72-91" name="__codelineno-72-91" href="#__codelineno-72-91"></a> &quot;van_bumper_R&quot;: &quot;van_bumper_R_altb&quot;,
</span><span id="__span-72-92"><a id="__codelineno-72-92" name="__codelineno-72-92" href="#__codelineno-72-92"></a> &quot;van_bumper_accessory_F&quot;: &quot;&quot;,
</span><span id="__span-72-93"><a id="__codelineno-72-93" name="__codelineno-72-93" href="#__codelineno-72-93"></a> &quot;van_bumpersignal_FL&quot;: &quot;van_bumpersignal_FL&quot;,
</span><span id="__span-72-94"><a id="__codelineno-72-94" name="__codelineno-72-94" href="#__codelineno-72-94"></a> &quot;van_bumpersignal_FR&quot;: &quot;van_bumpersignal_FR&quot;,
</span><span id="__span-72-95"><a id="__codelineno-72-95" name="__codelineno-72-95" href="#__codelineno-72-95"></a> &quot;van_coilover_IFS&quot;: &quot;van_coilover_IFS&quot;,
</span><span id="__span-72-96"><a id="__codelineno-72-96" name="__codelineno-72-96" href="#__codelineno-72-96"></a> &quot;van_converter&quot;: &quot;van_converter&quot;,
</span><span id="__span-72-97"><a id="__codelineno-72-97" name="__codelineno-72-97" href="#__codelineno-72-97"></a> &quot;van_differential_F&quot;: &quot;&quot;,
</span><span id="__span-72-98"><a id="__codelineno-72-98" name="__codelineno-72-98" href="#__codelineno-72-98"></a> &quot;van_differential_R&quot;: &quot;van_differential_R&quot;,
</span><span id="__span-72-99"><a id="__codelineno-72-99" name="__codelineno-72-99" href="#__codelineno-72-99"></a> &quot;van_door_FL&quot;: &quot;van_door_FL&quot;,
</span><span id="__span-72-100"><a id="__codelineno-72-100" name="__codelineno-72-100" href="#__codelineno-72-100"></a> &quot;van_door_FR&quot;: &quot;van_door_FR&quot;,
</span><span id="__span-72-101"><a id="__codelineno-72-101" name="__codelineno-72-101" href="#__codelineno-72-101"></a> &quot;van_doordetent_FL&quot;: &quot;van_doordetent_FL&quot;,
</span><span id="__span-72-102"><a id="__codelineno-72-102" name="__codelineno-72-102" href="#__codelineno-72-102"></a> &quot;van_doordetent_FR&quot;: &quot;van_doordetent_FR&quot;,
</span><span id="__span-72-103"><a id="__codelineno-72-103" name="__codelineno-72-103" href="#__codelineno-72-103"></a> &quot;van_doordetent_RL&quot;: &quot;van_doordetent_RL&quot;,
</span><span id="__span-72-104"><a id="__codelineno-72-104" name="__codelineno-72-104" href="#__codelineno-72-104"></a> &quot;van_doordetent_RR&quot;: &quot;van_doordetent_RR&quot;,
</span><span id="__span-72-105"><a id="__codelineno-72-105" name="__codelineno-72-105" href="#__codelineno-72-105"></a> &quot;van_doorglass_L&quot;: &quot;van_doorglass_L&quot;,
</span><span id="__span-72-106"><a id="__codelineno-72-106" name="__codelineno-72-106" href="#__codelineno-72-106"></a> &quot;van_doorglass_R&quot;: &quot;van_doorglass_R&quot;,
</span><span id="__span-72-107"><a id="__codelineno-72-107" name="__codelineno-72-107" href="#__codelineno-72-107"></a> &quot;van_doorpanel_FL&quot;: &quot;van_doorpanel_FL&quot;,
</span><span id="__span-72-108"><a id="__codelineno-72-108" name="__codelineno-72-108" href="#__codelineno-72-108"></a> &quot;van_doorpanel_FR&quot;: &quot;van_doorpanel_FR&quot;,
</span><span id="__span-72-109"><a id="__codelineno-72-109" name="__codelineno-72-109" href="#__codelineno-72-109"></a> &quot;van_driveshaft_R&quot;: &quot;van_driveshaft_R&quot;,
</span><span id="__span-72-110"><a id="__codelineno-72-110" name="__codelineno-72-110" href="#__codelineno-72-110"></a> &quot;van_engine&quot;: &quot;van_engine_v8_4.5&quot;,
</span><span id="__span-72-111"><a id="__codelineno-72-111" name="__codelineno-72-111" href="#__codelineno-72-111"></a> &quot;van_exhaust_v8&quot;: &quot;van_exhaust_v8&quot;,
</span><span id="__span-72-112"><a id="__codelineno-72-112" name="__codelineno-72-112" href="#__codelineno-72-112"></a> &quot;van_fascia_F&quot;: &quot;van_fascia_F_high&quot;,
</span><span id="__span-72-113"><a id="__codelineno-72-113" name="__codelineno-72-113" href="#__codelineno-72-113"></a> &quot;van_fender_L&quot;: &quot;van_fender_L&quot;,
</span><span id="__span-72-114"><a id="__codelineno-72-114" name="__codelineno-72-114" href="#__codelineno-72-114"></a> &quot;van_fender_R&quot;: &quot;van_fender_R&quot;,
</span><span id="__span-72-115"><a id="__codelineno-72-115" name="__codelineno-72-115" href="#__codelineno-72-115"></a> &quot;van_fenderflare_FL&quot;: &quot;&quot;,
</span><span id="__span-72-116"><a id="__codelineno-72-116" name="__codelineno-72-116" href="#__codelineno-72-116"></a> &quot;van_fenderflare_FR&quot;: &quot;&quot;,
</span><span id="__span-72-117"><a id="__codelineno-72-117" name="__codelineno-72-117" href="#__codelineno-72-117"></a> &quot;van_fenderflare_RL&quot;: &quot;&quot;,
</span><span id="__span-72-118"><a id="__codelineno-72-118" name="__codelineno-72-118" href="#__codelineno-72-118"></a> &quot;van_fenderflare_RR_sidedoor&quot;: &quot;&quot;,
</span><span id="__span-72-119"><a id="__codelineno-72-119" name="__codelineno-72-119" href="#__codelineno-72-119"></a> &quot;van_finaldrive_R&quot;: &quot;van_finaldrive_R_355&quot;,
</span><span id="__span-72-120"><a id="__codelineno-72-120" name="__codelineno-72-120" href="#__codelineno-72-120"></a> &quot;van_frame&quot;: &quot;van_frame&quot;,
</span><span id="__span-72-121"><a id="__codelineno-72-121" name="__codelineno-72-121" href="#__codelineno-72-121"></a> &quot;van_fueltank&quot;: &quot;van_fueltank&quot;,
</span><span id="__span-72-122"><a id="__codelineno-72-122" name="__codelineno-72-122" href="#__codelineno-72-122"></a> &quot;van_header&quot;: &quot;van_exhmanifold&quot;,
</span><span id="__span-72-123"><a id="__codelineno-72-123" name="__codelineno-72-123" href="#__codelineno-72-123"></a> &quot;van_headlight_L_high&quot;: &quot;van_headlight_L_high&quot;,
</span><span id="__span-72-124"><a id="__codelineno-72-124" name="__codelineno-72-124" href="#__codelineno-72-124"></a> &quot;van_headlight_R_high&quot;: &quot;van_headlight_R_high&quot;,
</span><span id="__span-72-125"><a id="__codelineno-72-125" name="__codelineno-72-125" href="#__codelineno-72-125"></a> &quot;van_hood&quot;: &quot;van_hood&quot;,
</span><span id="__span-72-126"><a id="__codelineno-72-126" name="__codelineno-72-126" href="#__codelineno-72-126"></a> &quot;van_hub_F&quot;: &quot;van_hub_F_5&quot;,
</span><span id="__span-72-127"><a id="__codelineno-72-127" name="__codelineno-72-127" href="#__codelineno-72-127"></a> &quot;van_hub_R&quot;: &quot;van_hub_R_5&quot;,
</span><span id="__span-72-128"><a id="__codelineno-72-128" name="__codelineno-72-128" href="#__codelineno-72-128"></a> &quot;van_intake_v8&quot;: &quot;van_intake_v8&quot;,
</span><span id="__span-72-129"><a id="__codelineno-72-129" name="__codelineno-72-129" href="#__codelineno-72-129"></a> &quot;van_intcarpet_roof&quot;: &quot;van_intcarpet_roof&quot;,
</span><span id="__span-72-130"><a id="__codelineno-72-130" name="__codelineno-72-130" href="#__codelineno-72-130"></a> &quot;van_interior&quot;: &quot;van_interior&quot;,
</span><span id="__span-72-131"><a id="__codelineno-72-131" name="__codelineno-72-131" href="#__codelineno-72-131"></a> &quot;van_lettering_doors_F&quot;: &quot;van_lettering_doors_F_h15&quot;,
</span><span id="__span-72-132"><a id="__codelineno-72-132" name="__codelineno-72-132" href="#__codelineno-72-132"></a> &quot;van_lettering_reardoor_L&quot;: &quot;van_lettering_gavril_reardoor_L&quot;,
</span><span id="__span-72-133"><a id="__codelineno-72-133" name="__codelineno-72-133" href="#__codelineno-72-133"></a> &quot;van_lettering_reardoor_R&quot;: &quot;van_lettering_h15_xt_reardoor_R&quot;,
</span><span id="__span-72-134"><a id="__codelineno-72-134" name="__codelineno-72-134" href="#__codelineno-72-134"></a> &quot;van_licenseplate_F&quot;: &quot;van_licenseplate_F&quot;,
</span><span id="__span-72-135"><a id="__codelineno-72-135" name="__codelineno-72-135" href="#__codelineno-72-135"></a> &quot;van_licenseplate_R&quot;: &quot;van_licenseplate_R&quot;,
</span><span id="__span-72-136"><a id="__codelineno-72-136" name="__codelineno-72-136" href="#__codelineno-72-136"></a> &quot;van_lightbar&quot;: &quot;&quot;,
</span><span id="__span-72-137"><a id="__codelineno-72-137" name="__codelineno-72-137" href="#__codelineno-72-137"></a> &quot;van_mirror_L&quot;: &quot;van_mirror_L&quot;,
</span><span id="__span-72-138"><a id="__codelineno-72-138" name="__codelineno-72-138" href="#__codelineno-72-138"></a> &quot;van_mirror_R&quot;: &quot;van_mirror_R&quot;,
</span><span id="__span-72-139"><a id="__codelineno-72-139" name="__codelineno-72-139" href="#__codelineno-72-139"></a> &quot;van_mod&quot;: &quot;&quot;,
</span><span id="__span-72-140"><a id="__codelineno-72-140" name="__codelineno-72-140" href="#__codelineno-72-140"></a> &quot;van_muffler&quot;: &quot;van_muffler&quot;,
</span><span id="__span-72-141"><a id="__codelineno-72-141" name="__codelineno-72-141" href="#__codelineno-72-141"></a> &quot;van_power_steering&quot;: &quot;&quot;,
</span><span id="__span-72-142"><a id="__codelineno-72-142" name="__codelineno-72-142" href="#__codelineno-72-142"></a> &quot;van_radiator&quot;: &quot;van_radiator&quot;,
</span><span id="__span-72-143"><a id="__codelineno-72-143" name="__codelineno-72-143" href="#__codelineno-72-143"></a> &quot;van_radio&quot;: &quot;van_radio&quot;,
</span><span id="__span-72-144"><a id="__codelineno-72-144" name="__codelineno-72-144" href="#__codelineno-72-144"></a> &quot;van_reardoor_L&quot;: &quot;van_reardoor_L&quot;,
</span><span id="__span-72-145"><a id="__codelineno-72-145" name="__codelineno-72-145" href="#__codelineno-72-145"></a> &quot;van_reardoor_R&quot;: &quot;van_reardoor_R&quot;,
</span><span id="__span-72-146"><a id="__codelineno-72-146" name="__codelineno-72-146" href="#__codelineno-72-146"></a> &quot;van_reardoorglass_L&quot;: &quot;van_reardoorglass_L&quot;,
</span><span id="__span-72-147"><a id="__codelineno-72-147" name="__codelineno-72-147" href="#__codelineno-72-147"></a> &quot;van_reardoorglass_R&quot;: &quot;van_reardoorglass_R&quot;,
</span><span id="__span-72-148"><a id="__codelineno-72-148" name="__codelineno-72-148" href="#__codelineno-72-148"></a> &quot;van_reardoorpanel_L&quot;: &quot;van_reardoorpanel_L&quot;,
</span><span id="__span-72-149"><a id="__codelineno-72-149" name="__codelineno-72-149" href="#__codelineno-72-149"></a> &quot;van_reardoorpanel_R&quot;: &quot;van_reardoorpanel_R&quot;,
</span><span id="__span-72-150"><a id="__codelineno-72-150" name="__codelineno-72-150" href="#__codelineno-72-150"></a> &quot;van_rollcage&quot;: &quot;&quot;,
</span><span id="__span-72-151"><a id="__codelineno-72-151" name="__codelineno-72-151" href="#__codelineno-72-151"></a> &quot;van_roof&quot;: &quot;van_roof&quot;,
</span><span id="__span-72-152"><a id="__codelineno-72-152" name="__codelineno-72-152" href="#__codelineno-72-152"></a> &quot;van_roof_accessory&quot;: &quot;&quot;,
</span><span id="__span-72-153"><a id="__codelineno-72-153" name="__codelineno-72-153" href="#__codelineno-72-153"></a> &quot;van_runningboard&quot;: &quot;&quot;,
</span><span id="__span-72-154"><a id="__codelineno-72-154" name="__codelineno-72-154" href="#__codelineno-72-154"></a> &quot;van_seat_1R&quot;: &quot;van_seat_1R&quot;,
</span><span id="__span-72-155"><a id="__codelineno-72-155" name="__codelineno-72-155" href="#__codelineno-72-155"></a> &quot;van_seat_2R&quot;: &quot;van_seat_2R&quot;,
</span><span id="__span-72-156"><a id="__codelineno-72-156" name="__codelineno-72-156" href="#__codelineno-72-156"></a> &quot;van_seat_3R&quot;: &quot;van_seat_3R&quot;,
</span><span id="__span-72-157"><a id="__codelineno-72-157" name="__codelineno-72-157" href="#__codelineno-72-157"></a> &quot;van_seat_FL&quot;: &quot;van_seat_FL&quot;,
</span><span id="__span-72-158"><a id="__codelineno-72-158" name="__codelineno-72-158" href="#__codelineno-72-158"></a> &quot;van_seat_FR&quot;: &quot;van_seat_FR&quot;,
</span><span id="__span-72-159"><a id="__codelineno-72-159" name="__codelineno-72-159" href="#__codelineno-72-159"></a> &quot;van_shifter&quot;: &quot;van_shifter_A&quot;,
</span><span id="__span-72-160"><a id="__codelineno-72-160" name="__codelineno-72-160" href="#__codelineno-72-160"></a> &quot;van_shock_R&quot;: &quot;van_shock_R&quot;,
</span><span id="__span-72-161"><a id="__codelineno-72-161" name="__codelineno-72-161" href="#__codelineno-72-161"></a> &quot;van_sidedoor_FR&quot;: &quot;van_sidedoor_FR_alt&quot;,
</span><span id="__span-72-162"><a id="__codelineno-72-162" name="__codelineno-72-162" href="#__codelineno-72-162"></a> &quot;van_sidedoor_RR&quot;: &quot;van_sidedoor_RR_alt&quot;,
</span><span id="__span-72-163"><a id="__codelineno-72-163" name="__codelineno-72-163" href="#__codelineno-72-163"></a> &quot;van_sidedoorglass_FR&quot;: &quot;van_sidedoorglass_FR&quot;,
</span><span id="__span-72-164"><a id="__codelineno-72-164" name="__codelineno-72-164" href="#__codelineno-72-164"></a> &quot;van_sidedoorglass_RR&quot;: &quot;van_sidedoorglass_RR&quot;,
</span><span id="__span-72-165"><a id="__codelineno-72-165" name="__codelineno-72-165" href="#__codelineno-72-165"></a> &quot;van_sidedoorpanel_FR&quot;: &quot;van_sidedoorpanel_FR&quot;,
</span><span id="__span-72-166"><a id="__codelineno-72-166" name="__codelineno-72-166" href="#__codelineno-72-166"></a> &quot;van_sidedoorpanel_RR&quot;: &quot;van_sidedoorpanel_RR&quot;,
</span><span id="__span-72-167"><a id="__codelineno-72-167" name="__codelineno-72-167" href="#__codelineno-72-167"></a> &quot;van_sideglass_FL&quot;: &quot;van_sideglass_FL&quot;,
</span><span id="__span-72-168"><a id="__codelineno-72-168" name="__codelineno-72-168" href="#__codelineno-72-168"></a> &quot;van_sideglass_ML&quot;: &quot;van_sideglass_ML&quot;,
</span><span id="__span-72-169"><a id="__codelineno-72-169" name="__codelineno-72-169" href="#__codelineno-72-169"></a> &quot;van_sideglass_RL&quot;: &quot;van_sideglass_RL&quot;,
</span><span id="__span-72-170"><a id="__codelineno-72-170" name="__codelineno-72-170" href="#__codelineno-72-170"></a> &quot;van_sideglass_RR&quot;: &quot;van_sideglass_RR&quot;,
</span><span id="__span-72-171"><a id="__codelineno-72-171" name="__codelineno-72-171" href="#__codelineno-72-171"></a> &quot;van_snorkel&quot;: &quot;&quot;,
</span><span id="__span-72-172"><a id="__codelineno-72-172" name="__codelineno-72-172" href="#__codelineno-72-172"></a> &quot;van_spring_R&quot;: &quot;van_spring_R&quot;,
</span><span id="__span-72-173"><a id="__codelineno-72-173" name="__codelineno-72-173" href="#__codelineno-72-173"></a> &quot;van_steer&quot;: &quot;van_steer&quot;,
</span><span id="__span-72-174"><a id="__codelineno-72-174" name="__codelineno-72-174" href="#__codelineno-72-174"></a> &quot;van_steering&quot;: &quot;van_steering&quot;,
</span><span id="__span-72-175"><a id="__codelineno-72-175" name="__codelineno-72-175" href="#__codelineno-72-175"></a> &quot;van_suspension_F&quot;: &quot;van_IFS&quot;,
</span><span id="__span-72-176"><a id="__codelineno-72-176" name="__codelineno-72-176" href="#__codelineno-72-176"></a> &quot;van_suspension_R&quot;: &quot;van_axle_R&quot;,
</span><span id="__span-72-177"><a id="__codelineno-72-177" name="__codelineno-72-177" href="#__codelineno-72-177"></a> &quot;van_swaybar_F&quot;: &quot;van_swaybar_F&quot;,
</span><span id="__span-72-178"><a id="__codelineno-72-178" name="__codelineno-72-178" href="#__codelineno-72-178"></a> &quot;van_swaybar_R&quot;: &quot;&quot;,
</span><span id="__span-72-179"><a id="__codelineno-72-179" name="__codelineno-72-179" href="#__codelineno-72-179"></a> &quot;van_taillight_L&quot;: &quot;van_taillight_L&quot;,
</span><span id="__span-72-180"><a id="__codelineno-72-180" name="__codelineno-72-180" href="#__codelineno-72-180"></a> &quot;van_taillight_R&quot;: &quot;van_taillight_R&quot;,
</span><span id="__span-72-181"><a id="__codelineno-72-181" name="__codelineno-72-181" href="#__codelineno-72-181"></a> &quot;van_taillightguard_L&quot;: &quot;&quot;,
</span><span id="__span-72-182"><a id="__codelineno-72-182" name="__codelineno-72-182" href="#__codelineno-72-182"></a> &quot;van_taillightguard_R&quot;: &quot;&quot;,
</span><span id="__span-72-183"><a id="__codelineno-72-183" name="__codelineno-72-183" href="#__codelineno-72-183"></a> &quot;van_transfer_case&quot;: &quot;van_transfer_case_RWD&quot;,
</span><span id="__span-72-184"><a id="__codelineno-72-184" name="__codelineno-72-184" href="#__codelineno-72-184"></a> &quot;van_transmission&quot;: &quot;van_transmission_4A&quot;,
</span><span id="__span-72-185"><a id="__codelineno-72-185" name="__codelineno-72-185" href="#__codelineno-72-185"></a> &quot;van_tubs&quot;: &quot;van_tubs&quot;,
</span><span id="__span-72-186"><a id="__codelineno-72-186" name="__codelineno-72-186" href="#__codelineno-72-186"></a> &quot;van_valance_F&quot;: &quot;van_valance_F&quot;,
</span><span id="__span-72-187"><a id="__codelineno-72-187" name="__codelineno-72-187" href="#__codelineno-72-187"></a> &quot;van_wheeldata_F&quot;: &quot;van_wheeldata_F&quot;,
</span><span id="__span-72-188"><a id="__codelineno-72-188" name="__codelineno-72-188" href="#__codelineno-72-188"></a> &quot;van_wheeldata_R&quot;: &quot;van_wheeldata_R&quot;,
</span><span id="__span-72-189"><a id="__codelineno-72-189" name="__codelineno-72-189" href="#__codelineno-72-189"></a> &quot;van_windshield&quot;: &quot;van_windshield&quot;,
</span><span id="__span-72-190"><a id="__codelineno-72-190" name="__codelineno-72-190" href="#__codelineno-72-190"></a> &quot;wheel_F_5&quot;: &quot;wheel_25a_16x7_5_F&quot;,
</span><span id="__span-72-191"><a id="__codelineno-72-191" name="__codelineno-72-191" href="#__codelineno-72-191"></a> &quot;wheel_R_5&quot;: &quot;wheel_25a_16x7_5_R&quot;
</span><span id="__span-72-192"><a id="__codelineno-72-192" name="__codelineno-72-192" href="#__codelineno-72-192"></a> },
</span><span id="__span-72-193"><a id="__codelineno-72-193" name="__codelineno-72-193" href="#__codelineno-72-193"></a> &quot;vars&quot;: {}
</span><span id="__span-72-194"><a id="__codelineno-72-194" name="__codelineno-72-194" href="#__codelineno-72-194"></a> },
</span><span id="__span-72-195"><a id="__codelineno-72-195" name="__codelineno-72-195" href="#__codelineno-72-195"></a> &quot;vid&quot;: 29339
</span><span id="__span-72-196"><a id="__codelineno-72-196" name="__codelineno-72-196" href="#__codelineno-72-196"></a>}
</span></code></pre></div>
<h5 id="onvehicleedited"><code>onVehicleEdited</code></h5>
<p>参数: <code>player_id: number</code>, <code>vehicle_id: number</code>, <code>data: string</code> 可取消: YES</p>
<p>当玩家编辑或替换其车辆时触发。<code>data</code> 参数包含车辆更新后的配置,并以 JSON 字符串形式提供,但 <strong></strong> 包含位置或旋转数据。<br>你可以使用 <a href="#mpgetpositionrawpid-number-vid-number-tablestring">MP.GetPositionRaw</a> 来获取位置与旋转数据。</p>
<details>
</details>
<summary><code>data</code> 值示例</summary>
<p>该数据字符串以一个唯一的车辆标识符开头,其格式为玩家 ID、一个连字符,以及车辆 ID。随后是一个 JSON 对象,其中包含车辆配置信息。</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-73-1"><a id="__codelineno-73-1" name="__codelineno-73-1" href="#__codelineno-73-1"></a>0-0: {
</span><span id="__span-73-2"><a id="__codelineno-73-2" name="__codelineno-73-2" href="#__codelineno-73-2"></a> &quot;abs&quot;: &quot;realistic&quot;,
</span><span id="__span-73-3"><a id="__codelineno-73-3" name="__codelineno-73-3" href="#__codelineno-73-3"></a> &quot;ign&quot;: 3,
</span><span id="__span-73-4"><a id="__codelineno-73-4" name="__codelineno-73-4" href="#__codelineno-73-4"></a> &quot;jbm&quot;: &quot;van&quot;,
</span><span id="__span-73-5"><a id="__codelineno-73-5" name="__codelineno-73-5" href="#__codelineno-73-5"></a> &quot;pid&quot;: 0,
</span><span id="__span-73-6"><a id="__codelineno-73-6" name="__codelineno-73-6" href="#__codelineno-73-6"></a> &quot;pro&quot;: &quot;0&quot;,
</span><span id="__span-73-7"><a id="__codelineno-73-7" name="__codelineno-73-7" href="#__codelineno-73-7"></a> &quot;vcf&quot;: {
</span><span id="__span-73-8"><a id="__codelineno-73-8" name="__codelineno-73-8" href="#__codelineno-73-8"></a> &quot;licenseName&quot;: &quot;P60 1EP&quot;,
</span><span id="__span-73-9"><a id="__codelineno-73-9" name="__codelineno-73-9" href="#__codelineno-73-9"></a> &quot;mainPartName&quot;: &quot;van&quot;,
</span><span id="__span-73-10"><a id="__codelineno-73-10" name="__codelineno-73-10" href="#__codelineno-73-10"></a> &quot;mainPartPath&quot;: &quot;/van&quot;,
</span><span id="__span-73-11"><a id="__codelineno-73-11" name="__codelineno-73-11" href="#__codelineno-73-11"></a> &quot;model&quot;: &quot;van&quot;,
</span><span id="__span-73-12"><a id="__codelineno-73-12" name="__codelineno-73-12" href="#__codelineno-73-12"></a> &quot;paints&quot;: [
</span><span id="__span-73-13"><a id="__codelineno-73-13" name="__codelineno-73-13" href="#__codelineno-73-13"></a> {
</span><span id="__span-73-14"><a id="__codelineno-73-14" name="__codelineno-73-14" href="#__codelineno-73-14"></a> &quot;baseColor&quot;: [
</span><span id="__span-73-15"><a id="__codelineno-73-15" name="__codelineno-73-15" href="#__codelineno-73-15"></a> 0.40000000596046,
</span><span id="__span-73-16"><a id="__codelineno-73-16" name="__codelineno-73-16" href="#__codelineno-73-16"></a> 0.050000000745058,
</span><span id="__span-73-17"><a id="__codelineno-73-17" name="__codelineno-73-17" href="#__codelineno-73-17"></a> 0.050000000745058,
</span><span id="__span-73-18"><a id="__codelineno-73-18" name="__codelineno-73-18" href="#__codelineno-73-18"></a> 1.2000000476837
</span><span id="__span-73-19"><a id="__codelineno-73-19" name="__codelineno-73-19" href="#__codelineno-73-19"></a> ],
</span><span id="__span-73-20"><a id="__codelineno-73-20" name="__codelineno-73-20" href="#__codelineno-73-20"></a> &quot;clearcoat&quot;: 0,
</span><span id="__span-73-21"><a id="__codelineno-73-21" name="__codelineno-73-21" href="#__codelineno-73-21"></a> &quot;clearcoatRoughness&quot;: 0,
</span><span id="__span-73-22"><a id="__codelineno-73-22" name="__codelineno-73-22" href="#__codelineno-73-22"></a> &quot;metallic&quot;: 0,
</span><span id="__span-73-23"><a id="__codelineno-73-23" name="__codelineno-73-23" href="#__codelineno-73-23"></a> &quot;roughness&quot;: 0.070000000298023
</span><span id="__span-73-24"><a id="__codelineno-73-24" name="__codelineno-73-24" href="#__codelineno-73-24"></a> },
</span><span id="__span-73-25"><a id="__codelineno-73-25" name="__codelineno-73-25" href="#__codelineno-73-25"></a> {
</span><span id="__span-73-26"><a id="__codelineno-73-26" name="__codelineno-73-26" href="#__codelineno-73-26"></a> &quot;baseColor&quot;: [
</span><span id="__span-73-27"><a id="__codelineno-73-27" name="__codelineno-73-27" href="#__codelineno-73-27"></a> 0.40000000596046,
</span><span id="__span-73-28"><a id="__codelineno-73-28" name="__codelineno-73-28" href="#__codelineno-73-28"></a> 0.050000000745058,
</span><span id="__span-73-29"><a id="__codelineno-73-29" name="__codelineno-73-29" href="#__codelineno-73-29"></a> 0.050000000745058,
</span><span id="__span-73-30"><a id="__codelineno-73-30" name="__codelineno-73-30" href="#__codelineno-73-30"></a> 1.2000000476837
</span><span id="__span-73-31"><a id="__codelineno-73-31" name="__codelineno-73-31" href="#__codelineno-73-31"></a> ],
</span><span id="__span-73-32"><a id="__codelineno-73-32" name="__codelineno-73-32" href="#__codelineno-73-32"></a> &quot;clearcoat&quot;: 0,
</span><span id="__span-73-33"><a id="__codelineno-73-33" name="__codelineno-73-33" href="#__codelineno-73-33"></a> &quot;clearcoatRoughness&quot;: 0,
</span><span id="__span-73-34"><a id="__codelineno-73-34" name="__codelineno-73-34" href="#__codelineno-73-34"></a> &quot;metallic&quot;: 0,
</span><span id="__span-73-35"><a id="__codelineno-73-35" name="__codelineno-73-35" href="#__codelineno-73-35"></a> &quot;roughness&quot;: 0.070000000298023
</span><span id="__span-73-36"><a id="__codelineno-73-36" name="__codelineno-73-36" href="#__codelineno-73-36"></a> },
</span><span id="__span-73-37"><a id="__codelineno-73-37" name="__codelineno-73-37" href="#__codelineno-73-37"></a> {
</span><span id="__span-73-38"><a id="__codelineno-73-38" name="__codelineno-73-38" href="#__codelineno-73-38"></a> &quot;baseColor&quot;: [
</span><span id="__span-73-39"><a id="__codelineno-73-39" name="__codelineno-73-39" href="#__codelineno-73-39"></a> 0.40000000596046,
</span><span id="__span-73-40"><a id="__codelineno-73-40" name="__codelineno-73-40" href="#__codelineno-73-40"></a> 0.050000000745058,
</span><span id="__span-73-41"><a id="__codelineno-73-41" name="__codelineno-73-41" href="#__codelineno-73-41"></a> 0.050000000745058,
</span><span id="__span-73-42"><a id="__codelineno-73-42" name="__codelineno-73-42" href="#__codelineno-73-42"></a> 1.2000000476837
</span><span id="__span-73-43"><a id="__codelineno-73-43" name="__codelineno-73-43" href="#__codelineno-73-43"></a> ],
</span><span id="__span-73-44"><a id="__codelineno-73-44" name="__codelineno-73-44" href="#__codelineno-73-44"></a> &quot;clearcoat&quot;: 0,
</span><span id="__span-73-45"><a id="__codelineno-73-45" name="__codelineno-73-45" href="#__codelineno-73-45"></a> &quot;clearcoatRoughness&quot;: 0,
</span><span id="__span-73-46"><a id="__codelineno-73-46" name="__codelineno-73-46" href="#__codelineno-73-46"></a> &quot;metallic&quot;: 0,
</span><span id="__span-73-47"><a id="__codelineno-73-47" name="__codelineno-73-47" href="#__codelineno-73-47"></a> &quot;roughness&quot;: 0.070000000298023
</span><span id="__span-73-48"><a id="__codelineno-73-48" name="__codelineno-73-48" href="#__codelineno-73-48"></a> }
</span><span id="__span-73-49"><a id="__codelineno-73-49" name="__codelineno-73-49" href="#__codelineno-73-49"></a> ],
</span><span id="__span-73-50"><a id="__codelineno-73-50" name="__codelineno-73-50" href="#__codelineno-73-50"></a> &quot;partConfigFilename&quot;: &quot;vehicles/van/h15_passenger.pc&quot;,
</span><span id="__span-73-51"><a id="__codelineno-73-51" name="__codelineno-73-51" href="#__codelineno-73-51"></a> &quot;parts&quot;: {
</span><span id="__span-73-52"><a id="__codelineno-73-52" name="__codelineno-73-52" href="#__codelineno-73-52"></a> &quot;brakepad_F&quot;: &quot;brakepad_F_premium&quot;,
</span><span id="__span-73-53"><a id="__codelineno-73-53" name="__codelineno-73-53" href="#__codelineno-73-53"></a> &quot;brakepad_R&quot;: &quot;brakepad_R_premium&quot;,
</span><span id="__span-73-54"><a id="__codelineno-73-54" name="__codelineno-73-54" href="#__codelineno-73-54"></a> &quot;gps&quot;: &quot;&quot;,
</span><span id="__span-73-55"><a id="__codelineno-73-55" name="__codelineno-73-55" href="#__codelineno-73-55"></a> &quot;hubcap_F_16&quot;: &quot;hubcap_09c_F_altd&quot;,
</span><span id="__span-73-56"><a id="__codelineno-73-56" name="__codelineno-73-56" href="#__codelineno-73-56"></a> &quot;hubcap_R_16&quot;: &quot;hubcap_09c_R_altd&quot;,
</span><span id="__span-73-57"><a id="__codelineno-73-57" name="__codelineno-73-57" href="#__codelineno-73-57"></a> &quot;licenseplate_design_2_1&quot;: &quot;&quot;,
</span><span id="__span-73-58"><a id="__codelineno-73-58" name="__codelineno-73-58" href="#__codelineno-73-58"></a> &quot;linelock&quot;: &quot;&quot;,
</span><span id="__span-73-59"><a id="__codelineno-73-59" name="__codelineno-73-59" href="#__codelineno-73-59"></a> &quot;load_seat_FR&quot;: &quot;&quot;,
</span><span id="__span-73-60"><a id="__codelineno-73-60" name="__codelineno-73-60" href="#__codelineno-73-60"></a> &quot;n2o_system&quot;: &quot;&quot;,
</span><span id="__span-73-61"><a id="__codelineno-73-61" name="__codelineno-73-61" href="#__codelineno-73-61"></a> &quot;paint_design&quot;: &quot;&quot;,
</span><span id="__span-73-62"><a id="__codelineno-73-62" name="__codelineno-73-62" href="#__codelineno-73-62"></a> &quot;pickup_engine_v8_ecu&quot;: &quot;pickup_engine_v8_ecu_late&quot;,
</span><span id="__span-73-63"><a id="__codelineno-73-63" name="__codelineno-73-63" href="#__codelineno-73-63"></a> &quot;pickup_engine_v8_internals&quot;: &quot;pickup_engine_v8_internals&quot;,
</span><span id="__span-73-64"><a id="__codelineno-73-64" name="__codelineno-73-64" href="#__codelineno-73-64"></a> &quot;pickup_enginemounts&quot;: &quot;pickup_enginemounts&quot;,
</span><span id="__span-73-65"><a id="__codelineno-73-65" name="__codelineno-73-65" href="#__codelineno-73-65"></a> &quot;pickup_oilpan_v8&quot;: &quot;pickup_oilpan_v8&quot;,
</span><span id="__span-73-66"><a id="__codelineno-73-66" name="__codelineno-73-66" href="#__codelineno-73-66"></a> &quot;pickup_reversewarn&quot;: &quot;&quot;,
</span><span id="__span-73-67"><a id="__codelineno-73-67" name="__codelineno-73-67" href="#__codelineno-73-67"></a> &quot;pickup_sparetire&quot;: &quot;pickup_sparetire_6l&quot;,
</span><span id="__span-73-68"><a id="__codelineno-73-68" name="__codelineno-73-68" href="#__codelineno-73-68"></a> &quot;pickup_towhitch&quot;: &quot;&quot;,
</span><span id="__span-73-69"><a id="__codelineno-73-69" name="__codelineno-73-69" href="#__codelineno-73-69"></a> &quot;skin_glass&quot;: &quot;&quot;,
</span><span id="__span-73-70"><a id="__codelineno-73-70" name="__codelineno-73-70" href="#__codelineno-73-70"></a> &quot;skin_interior&quot;: &quot;van_skin_interior_ivory&quot;,
</span><span id="__span-73-71"><a id="__codelineno-73-71" name="__codelineno-73-71" href="#__codelineno-73-71"></a> &quot;soundscape_horn&quot;: &quot;soundscape_horn_115&quot;,
</span><span id="__span-73-72"><a id="__codelineno-73-72" name="__codelineno-73-72" href="#__codelineno-73-72"></a> &quot;tire_F_16x7_alt&quot;: &quot;tire_F_225_75_16_alt_standard&quot;,
</span><span id="__span-73-73"><a id="__codelineno-73-73" name="__codelineno-73-73" href="#__codelineno-73-73"></a> &quot;tire_R_16x7_alt&quot;: &quot;tire_R_225_75_16_alt_standard&quot;,
</span><span id="__span-73-74"><a id="__codelineno-73-74" name="__codelineno-73-74" href="#__codelineno-73-74"></a> &quot;trimring_F_16x7&quot;: &quot;&quot;,
</span><span id="__span-73-75"><a id="__codelineno-73-75" name="__codelineno-73-75" href="#__codelineno-73-75"></a> &quot;trimring_R_16x7&quot;: &quot;&quot;,
</span><span id="__span-73-76"><a id="__codelineno-73-76" name="__codelineno-73-76" href="#__codelineno-73-76"></a> &quot;van_ABS&quot;: &quot;van_ABS&quot;,
</span><span id="__span-73-77"><a id="__codelineno-73-77" name="__codelineno-73-77" href="#__codelineno-73-77"></a> &quot;van_ac&quot;: &quot;van_ac&quot;,
</span><span id="__span-73-78"><a id="__codelineno-73-78" name="__codelineno-73-78" href="#__codelineno-73-78"></a> &quot;van_body&quot;: &quot;van_body_passenger&quot;,
</span><span id="__span-73-79"><a id="__codelineno-73-79" name="__codelineno-73-79" href="#__codelineno-73-79"></a> &quot;van_brake_F&quot;: &quot;van_brake_F&quot;,
</span><span id="__span-73-80"><a id="__codelineno-73-80" name="__codelineno-73-80" href="#__codelineno-73-80"></a> &quot;van_brake_R&quot;: &quot;van_brake_R&quot;,
</span><span id="__span-73-81"><a id="__codelineno-73-81" name="__codelineno-73-81" href="#__codelineno-73-81"></a> &quot;van_bumper_accessory_F_late&quot;: &quot;&quot;,
</span><span id="__span-73-82"><a id="__codelineno-73-82" name="__codelineno-73-82" href="#__codelineno-73-82"></a> &quot;van_bumper_F&quot;: &quot;van_bumper_F_late_alt&quot;,
</span><span id="__span-73-83"><a id="__codelineno-73-83" name="__codelineno-73-83" href="#__codelineno-73-83"></a> &quot;van_bumper_F_lip_late&quot;: &quot;&quot;,
</span><span id="__span-73-84"><a id="__codelineno-73-84" name="__codelineno-73-84" href="#__codelineno-73-84"></a> &quot;van_bumper_R&quot;: &quot;van_bumper_R_late_alt&quot;,
</span><span id="__span-73-85"><a id="__codelineno-73-85" name="__codelineno-73-85" href="#__codelineno-73-85"></a> &quot;van_coilover_IFS&quot;: &quot;van_coilover_IFS&quot;,
</span><span id="__span-73-86"><a id="__codelineno-73-86" name="__codelineno-73-86" href="#__codelineno-73-86"></a> &quot;van_converter&quot;: &quot;van_converter&quot;,
</span><span id="__span-73-87"><a id="__codelineno-73-87" name="__codelineno-73-87" href="#__codelineno-73-87"></a> &quot;van_differential_F&quot;: &quot;&quot;,
</span><span id="__span-73-88"><a id="__codelineno-73-88" name="__codelineno-73-88" href="#__codelineno-73-88"></a> &quot;van_differential_R&quot;: &quot;van_differential_R&quot;,
</span><span id="__span-73-89"><a id="__codelineno-73-89" name="__codelineno-73-89" href="#__codelineno-73-89"></a> &quot;van_door_FL&quot;: &quot;van_door_FL&quot;,
</span><span id="__span-73-90"><a id="__codelineno-73-90" name="__codelineno-73-90" href="#__codelineno-73-90"></a> &quot;van_door_FR&quot;: &quot;van_door_FR&quot;,
</span><span id="__span-73-91"><a id="__codelineno-73-91" name="__codelineno-73-91" href="#__codelineno-73-91"></a> &quot;van_doordetent_FL&quot;: &quot;van_doordetent_FL&quot;,
</span><span id="__span-73-92"><a id="__codelineno-73-92" name="__codelineno-73-92" href="#__codelineno-73-92"></a> &quot;van_doordetent_FR&quot;: &quot;van_doordetent_FR&quot;,
</span><span id="__span-73-93"><a id="__codelineno-73-93" name="__codelineno-73-93" href="#__codelineno-73-93"></a> &quot;van_doordetent_RL&quot;: &quot;van_doordetent_RL&quot;,
</span><span id="__span-73-94"><a id="__codelineno-73-94" name="__codelineno-73-94" href="#__codelineno-73-94"></a> &quot;van_doordetent_RR&quot;: &quot;van_doordetent_RR&quot;,
</span><span id="__span-73-95"><a id="__codelineno-73-95" name="__codelineno-73-95" href="#__codelineno-73-95"></a> &quot;van_doorglass_L&quot;: &quot;van_doorglass_L&quot;,
</span><span id="__span-73-96"><a id="__codelineno-73-96" name="__codelineno-73-96" href="#__codelineno-73-96"></a> &quot;van_doorglass_R&quot;: &quot;van_doorglass_R&quot;,
</span><span id="__span-73-97"><a id="__codelineno-73-97" name="__codelineno-73-97" href="#__codelineno-73-97"></a> &quot;van_doorpanel_FL&quot;: &quot;van_doorpanel_FL&quot;,
</span><span id="__span-73-98"><a id="__codelineno-73-98" name="__codelineno-73-98" href="#__codelineno-73-98"></a> &quot;van_doorpanel_FR&quot;: &quot;van_doorpanel_FR&quot;,
</span><span id="__span-73-99"><a id="__codelineno-73-99" name="__codelineno-73-99" href="#__codelineno-73-99"></a> &quot;van_driveshaft_R&quot;: &quot;van_driveshaft_R&quot;,
</span><span id="__span-73-100"><a id="__codelineno-73-100" name="__codelineno-73-100" href="#__codelineno-73-100"></a> &quot;van_engine&quot;: &quot;van_engine_v8_4.5&quot;,
</span><span id="__span-73-101"><a id="__codelineno-73-101" name="__codelineno-73-101" href="#__codelineno-73-101"></a> &quot;van_ESC&quot;: &quot;van_ESC&quot;,
</span><span id="__span-73-102"><a id="__codelineno-73-102" name="__codelineno-73-102" href="#__codelineno-73-102"></a> &quot;van_exhaust_v8&quot;: &quot;van_exhaust_v8&quot;,
</span><span id="__span-73-103"><a id="__codelineno-73-103" name="__codelineno-73-103" href="#__codelineno-73-103"></a> &quot;van_fascia_F&quot;: &quot;van_fascia_F_late&quot;,
</span><span id="__span-73-104"><a id="__codelineno-73-104" name="__codelineno-73-104" href="#__codelineno-73-104"></a> &quot;van_fender_L&quot;: &quot;van_fender_L&quot;,
</span><span id="__span-73-105"><a id="__codelineno-73-105" name="__codelineno-73-105" href="#__codelineno-73-105"></a> &quot;van_fender_R&quot;: &quot;van_fender_R&quot;,
</span><span id="__span-73-106"><a id="__codelineno-73-106" name="__codelineno-73-106" href="#__codelineno-73-106"></a> &quot;van_fenderflare_FL&quot;: &quot;&quot;,
</span><span id="__span-73-107"><a id="__codelineno-73-107" name="__codelineno-73-107" href="#__codelineno-73-107"></a> &quot;van_fenderflare_FR&quot;: &quot;&quot;,
</span><span id="__span-73-108"><a id="__codelineno-73-108" name="__codelineno-73-108" href="#__codelineno-73-108"></a> &quot;van_fenderflare_RL&quot;: &quot;&quot;,
</span><span id="__span-73-109"><a id="__codelineno-73-109" name="__codelineno-73-109" href="#__codelineno-73-109"></a> &quot;van_fenderflare_RR_sidedoor&quot;: &quot;&quot;,
</span><span id="__span-73-110"><a id="__codelineno-73-110" name="__codelineno-73-110" href="#__codelineno-73-110"></a> &quot;van_finaldrive_R&quot;: &quot;van_finaldrive_R_355&quot;,
</span><span id="__span-73-111"><a id="__codelineno-73-111" name="__codelineno-73-111" href="#__codelineno-73-111"></a> &quot;van_frame&quot;: &quot;van_frame&quot;,
</span><span id="__span-73-112"><a id="__codelineno-73-112" name="__codelineno-73-112" href="#__codelineno-73-112"></a> &quot;van_fueltank&quot;: &quot;van_fueltank&quot;,
</span><span id="__span-73-113"><a id="__codelineno-73-113" name="__codelineno-73-113" href="#__codelineno-73-113"></a> &quot;van_grille_F_late&quot;: &quot;van_grille_F_late&quot;,
</span><span id="__span-73-114"><a id="__codelineno-73-114" name="__codelineno-73-114" href="#__codelineno-73-114"></a> &quot;van_header&quot;: &quot;van_exhmanifold&quot;,
</span><span id="__span-73-115"><a id="__codelineno-73-115" name="__codelineno-73-115" href="#__codelineno-73-115"></a> &quot;van_headlight_L_late&quot;: &quot;van_headlight_L_late&quot;,
</span><span id="__span-73-116"><a id="__codelineno-73-116" name="__codelineno-73-116" href="#__codelineno-73-116"></a> &quot;van_headlight_R_late&quot;: &quot;van_headlight_R_late&quot;,
</span><span id="__span-73-117"><a id="__codelineno-73-117" name="__codelineno-73-117" href="#__codelineno-73-117"></a> &quot;van_hood&quot;: &quot;van_hood_late&quot;,
</span><span id="__span-73-118"><a id="__codelineno-73-118" name="__codelineno-73-118" href="#__codelineno-73-118"></a> &quot;van_hub_F&quot;: &quot;van_hub_F_6&quot;,
</span><span id="__span-73-119"><a id="__codelineno-73-119" name="__codelineno-73-119" href="#__codelineno-73-119"></a> &quot;van_hub_R&quot;: &quot;van_hub_R_6&quot;,
</span><span id="__span-73-120"><a id="__codelineno-73-120" name="__codelineno-73-120" href="#__codelineno-73-120"></a> &quot;van_intake_v8&quot;: &quot;van_intake_v8_late&quot;,
</span><span id="__span-73-121"><a id="__codelineno-73-121" name="__codelineno-73-121" href="#__codelineno-73-121"></a> &quot;van_intcarpet_roof&quot;: &quot;van_intcarpet_roof&quot;,
</span><span id="__span-73-122"><a id="__codelineno-73-122" name="__codelineno-73-122" href="#__codelineno-73-122"></a> &quot;van_interior&quot;: &quot;van_interior&quot;,
</span><span id="__span-73-123"><a id="__codelineno-73-123" name="__codelineno-73-123" href="#__codelineno-73-123"></a> &quot;van_lettering_doors_F&quot;: &quot;van_lettering_doors_F_h15&quot;,
</span><span id="__span-73-124"><a id="__codelineno-73-124" name="__codelineno-73-124" href="#__codelineno-73-124"></a> &quot;van_lettering_reardoor_L&quot;: &quot;van_lettering_gavril_reardoor_L&quot;,
</span><span id="__span-73-125"><a id="__codelineno-73-125" name="__codelineno-73-125" href="#__codelineno-73-125"></a> &quot;van_lettering_reardoor_R&quot;: &quot;van_lettering_h15_reardoor_R&quot;,
</span><span id="__span-73-126"><a id="__codelineno-73-126" name="__codelineno-73-126" href="#__codelineno-73-126"></a> &quot;van_licenseplate_F_late&quot;: &quot;van_licenseplate_F_late&quot;,
</span><span id="__span-73-127"><a id="__codelineno-73-127" name="__codelineno-73-127" href="#__codelineno-73-127"></a> &quot;van_licenseplate_R_late&quot;: &quot;van_licenseplate_R_late&quot;,
</span><span id="__span-73-128"><a id="__codelineno-73-128" name="__codelineno-73-128" href="#__codelineno-73-128"></a> &quot;van_lightbar&quot;: &quot;&quot;,
</span><span id="__span-73-129"><a id="__codelineno-73-129" name="__codelineno-73-129" href="#__codelineno-73-129"></a> &quot;van_mirror_L&quot;: &quot;van_mirror_L&quot;,
</span><span id="__span-73-130"><a id="__codelineno-73-130" name="__codelineno-73-130" href="#__codelineno-73-130"></a> &quot;van_mirror_R&quot;: &quot;van_mirror_R&quot;,
</span><span id="__span-73-131"><a id="__codelineno-73-131" name="__codelineno-73-131" href="#__codelineno-73-131"></a> &quot;van_mod&quot;: &quot;&quot;,
</span><span id="__span-73-132"><a id="__codelineno-73-132" name="__codelineno-73-132" href="#__codelineno-73-132"></a> &quot;van_muffler&quot;: &quot;van_muffler&quot;,
</span><span id="__span-73-133"><a id="__codelineno-73-133" name="__codelineno-73-133" href="#__codelineno-73-133"></a> &quot;van_power_steering&quot;: &quot;&quot;,
</span><span id="__span-73-134"><a id="__codelineno-73-134" name="__codelineno-73-134" href="#__codelineno-73-134"></a> &quot;van_radiator&quot;: &quot;van_radiator&quot;,
</span><span id="__span-73-135"><a id="__codelineno-73-135" name="__codelineno-73-135" href="#__codelineno-73-135"></a> &quot;van_radio&quot;: &quot;van_radio&quot;,
</span><span id="__span-73-136"><a id="__codelineno-73-136" name="__codelineno-73-136" href="#__codelineno-73-136"></a> &quot;van_reardoor_L&quot;: &quot;van_reardoor_L&quot;,
</span><span id="__span-73-137"><a id="__codelineno-73-137" name="__codelineno-73-137" href="#__codelineno-73-137"></a> &quot;van_reardoor_R&quot;: &quot;van_reardoor_R&quot;,
</span><span id="__span-73-138"><a id="__codelineno-73-138" name="__codelineno-73-138" href="#__codelineno-73-138"></a> &quot;van_reardoorglass_L&quot;: &quot;van_reardoorglass_L&quot;,
</span><span id="__span-73-139"><a id="__codelineno-73-139" name="__codelineno-73-139" href="#__codelineno-73-139"></a> &quot;van_reardoorglass_R&quot;: &quot;van_reardoorglass_R&quot;,
</span><span id="__span-73-140"><a id="__codelineno-73-140" name="__codelineno-73-140" href="#__codelineno-73-140"></a> &quot;van_reardoorpanel_L&quot;: &quot;van_reardoorpanel_L&quot;,
</span><span id="__span-73-141"><a id="__codelineno-73-141" name="__codelineno-73-141" href="#__codelineno-73-141"></a> &quot;van_reardoorpanel_R&quot;: &quot;van_reardoorpanel_R&quot;,
</span><span id="__span-73-142"><a id="__codelineno-73-142" name="__codelineno-73-142" href="#__codelineno-73-142"></a> &quot;van_rollcage&quot;: &quot;&quot;,
</span><span id="__span-73-143"><a id="__codelineno-73-143" name="__codelineno-73-143" href="#__codelineno-73-143"></a> &quot;van_roof&quot;: &quot;van_roof&quot;,
</span><span id="__span-73-144"><a id="__codelineno-73-144" name="__codelineno-73-144" href="#__codelineno-73-144"></a> &quot;van_roof_accessory&quot;: &quot;&quot;,
</span><span id="__span-73-145"><a id="__codelineno-73-145" name="__codelineno-73-145" href="#__codelineno-73-145"></a> &quot;van_runningboard&quot;: &quot;&quot;,
</span><span id="__span-73-146"><a id="__codelineno-73-146" name="__codelineno-73-146" href="#__codelineno-73-146"></a> &quot;van_seat_1R&quot;: &quot;van_seat_1R&quot;,
</span><span id="__span-73-147"><a id="__codelineno-73-147" name="__codelineno-73-147" href="#__codelineno-73-147"></a> &quot;van_seat_2R&quot;: &quot;van_seat_2R&quot;,
</span><span id="__span-73-148"><a id="__codelineno-73-148" name="__codelineno-73-148" href="#__codelineno-73-148"></a> &quot;van_seat_3R&quot;: &quot;van_seat_3R&quot;,
</span><span id="__span-73-149"><a id="__codelineno-73-149" name="__codelineno-73-149" href="#__codelineno-73-149"></a> &quot;van_seat_FL&quot;: &quot;van_seat_FL&quot;,
</span><span id="__span-73-150"><a id="__codelineno-73-150" name="__codelineno-73-150" href="#__codelineno-73-150"></a> &quot;van_seat_FR&quot;: &quot;van_seat_FR&quot;,
</span><span id="__span-73-151"><a id="__codelineno-73-151" name="__codelineno-73-151" href="#__codelineno-73-151"></a> &quot;van_shifter&quot;: &quot;van_shifter_A&quot;,
</span><span id="__span-73-152"><a id="__codelineno-73-152" name="__codelineno-73-152" href="#__codelineno-73-152"></a> &quot;van_shock_R&quot;: &quot;van_shock_R&quot;,
</span><span id="__span-73-153"><a id="__codelineno-73-153" name="__codelineno-73-153" href="#__codelineno-73-153"></a> &quot;van_sidedoor_FR&quot;: &quot;van_sidedoor_FR_alt&quot;,
</span><span id="__span-73-154"><a id="__codelineno-73-154" name="__codelineno-73-154" href="#__codelineno-73-154"></a> &quot;van_sidedoor_RR&quot;: &quot;van_sidedoor_RR_alt&quot;,
</span><span id="__span-73-155"><a id="__codelineno-73-155" name="__codelineno-73-155" href="#__codelineno-73-155"></a> &quot;van_sidedoorglass_FR&quot;: &quot;van_sidedoorglass_FR&quot;,
</span><span id="__span-73-156"><a id="__codelineno-73-156" name="__codelineno-73-156" href="#__codelineno-73-156"></a> &quot;van_sidedoorglass_RR&quot;: &quot;van_sidedoorglass_RR&quot;,
</span><span id="__span-73-157"><a id="__codelineno-73-157" name="__codelineno-73-157" href="#__codelineno-73-157"></a> &quot;van_sidedoorpanel_FR&quot;: &quot;van_sidedoorpanel_FR&quot;,
</span><span id="__span-73-158"><a id="__codelineno-73-158" name="__codelineno-73-158" href="#__codelineno-73-158"></a> &quot;van_sidedoorpanel_RR&quot;: &quot;van_sidedoorpanel_RR&quot;,
</span><span id="__span-73-159"><a id="__codelineno-73-159" name="__codelineno-73-159" href="#__codelineno-73-159"></a> &quot;van_sideglass_FL&quot;: &quot;van_sideglass_FL&quot;,
</span><span id="__span-73-160"><a id="__codelineno-73-160" name="__codelineno-73-160" href="#__codelineno-73-160"></a> &quot;van_sideglass_ML&quot;: &quot;van_sideglass_ML&quot;,
</span><span id="__span-73-161"><a id="__codelineno-73-161" name="__codelineno-73-161" href="#__codelineno-73-161"></a> &quot;van_sideglass_RL&quot;: &quot;van_sideglass_RL&quot;,
</span><span id="__span-73-162"><a id="__codelineno-73-162" name="__codelineno-73-162" href="#__codelineno-73-162"></a> &quot;van_sideglass_RR&quot;: &quot;van_sideglass_RR&quot;,
</span><span id="__span-73-163"><a id="__codelineno-73-163" name="__codelineno-73-163" href="#__codelineno-73-163"></a> &quot;van_snorkel&quot;: &quot;&quot;,
</span><span id="__span-73-164"><a id="__codelineno-73-164" name="__codelineno-73-164" href="#__codelineno-73-164"></a> &quot;van_spring_R&quot;: &quot;van_spring_R&quot;,
</span><span id="__span-73-165"><a id="__codelineno-73-165" name="__codelineno-73-165" href="#__codelineno-73-165"></a> &quot;van_steer&quot;: &quot;van_steer_facelift&quot;,
</span><span id="__span-73-166"><a id="__codelineno-73-166" name="__codelineno-73-166" href="#__codelineno-73-166"></a> &quot;van_steering&quot;: &quot;van_steering&quot;,
</span><span id="__span-73-167"><a id="__codelineno-73-167" name="__codelineno-73-167" href="#__codelineno-73-167"></a> &quot;van_suspension_F&quot;: &quot;van_IFS&quot;,
</span><span id="__span-73-168"><a id="__codelineno-73-168" name="__codelineno-73-168" href="#__codelineno-73-168"></a> &quot;van_suspension_R&quot;: &quot;van_axle_R&quot;,
</span><span id="__span-73-169"><a id="__codelineno-73-169" name="__codelineno-73-169" href="#__codelineno-73-169"></a> &quot;van_swaybar_F&quot;: &quot;van_swaybar_F&quot;,
</span><span id="__span-73-170"><a id="__codelineno-73-170" name="__codelineno-73-170" href="#__codelineno-73-170"></a> &quot;van_swaybar_R&quot;: &quot;&quot;,
</span><span id="__span-73-171"><a id="__codelineno-73-171" name="__codelineno-73-171" href="#__codelineno-73-171"></a> &quot;van_taillight_L&quot;: &quot;van_taillight_L&quot;,
</span><span id="__span-73-172"><a id="__codelineno-73-172" name="__codelineno-73-172" href="#__codelineno-73-172"></a> &quot;van_taillight_R&quot;: &quot;van_taillight_R&quot;,
</span><span id="__span-73-173"><a id="__codelineno-73-173" name="__codelineno-73-173" href="#__codelineno-73-173"></a> &quot;van_taillightguard_L&quot;: &quot;&quot;,
</span><span id="__span-73-174"><a id="__codelineno-73-174" name="__codelineno-73-174" href="#__codelineno-73-174"></a> &quot;van_taillightguard_R&quot;: &quot;&quot;,
</span><span id="__span-73-175"><a id="__codelineno-73-175" name="__codelineno-73-175" href="#__codelineno-73-175"></a> &quot;van_transfer_case&quot;: &quot;van_transfer_case_RWD&quot;,
</span><span id="__span-73-176"><a id="__codelineno-73-176" name="__codelineno-73-176" href="#__codelineno-73-176"></a> &quot;van_transmission&quot;: &quot;van_transmission_4A&quot;,
</span><span id="__span-73-177"><a id="__codelineno-73-177" name="__codelineno-73-177" href="#__codelineno-73-177"></a> &quot;van_tubs&quot;: &quot;van_tubs&quot;,
</span><span id="__span-73-178"><a id="__codelineno-73-178" name="__codelineno-73-178" href="#__codelineno-73-178"></a> &quot;van_valance_F&quot;: &quot;van_valance_F_late&quot;,
</span><span id="__span-73-179"><a id="__codelineno-73-179" name="__codelineno-73-179" href="#__codelineno-73-179"></a> &quot;van_wheeldata_F&quot;: &quot;van_wheeldata_F&quot;,
</span><span id="__span-73-180"><a id="__codelineno-73-180" name="__codelineno-73-180" href="#__codelineno-73-180"></a> &quot;van_wheeldata_R&quot;: &quot;van_wheeldata_R&quot;,
</span><span id="__span-73-181"><a id="__codelineno-73-181" name="__codelineno-73-181" href="#__codelineno-73-181"></a> &quot;van_windshield&quot;: &quot;van_windshield&quot;,
</span><span id="__span-73-182"><a id="__codelineno-73-182" name="__codelineno-73-182" href="#__codelineno-73-182"></a> &quot;wheel_F_6&quot;: &quot;steelwheel_02b_16x7_F&quot;,
</span><span id="__span-73-183"><a id="__codelineno-73-183" name="__codelineno-73-183" href="#__codelineno-73-183"></a> &quot;wheel_R_6&quot;: &quot;steelwheel_02b_16x7_R&quot;
</span><span id="__span-73-184"><a id="__codelineno-73-184" name="__codelineno-73-184" href="#__codelineno-73-184"></a> },
</span><span id="__span-73-185"><a id="__codelineno-73-185" name="__codelineno-73-185" href="#__codelineno-73-185"></a> &quot;vars&quot;: {}
</span><span id="__span-73-186"><a id="__codelineno-73-186" name="__codelineno-73-186" href="#__codelineno-73-186"></a> }
</span><span id="__span-73-187"><a id="__codelineno-73-187" name="__codelineno-73-187" href="#__codelineno-73-187"></a>}
</span></code></pre></div>
<h5 id="onvehicledeleted"><code>onVehicleDeleted</code></h5>
<p>参数: <code>player_id: number</code>, <code>vehicle_id: number</code> 可取消: NO</p>
<p>当玩家删除其车辆时触发。</p>
<h5 id="onvehiclereset"><code>onVehicleReset</code></h5>
<p>参数: <code>player_id: number</code>, <code>vehicle_id: number</code>, <code>data: string</code> 可取消: NO</p>
<p>当玩家重置其车辆时触发。参数 <code>data</code>包含车辆更新后的位置和旋转信息,但 <strong></strong> 包含车辆的配置,你可以使用 <a href="#mpgetplayervehiclesplayer_id-number-table">MP.GetPlayerVehicles</a> 来获取车辆配置。</p>
<h5 id="onfilechanged"><code>onFileChanged</code></h5>
<p><em>在 v3.1.0</em></p>
<p>参数: <code>path: string</code> 可取消: NO</p>
<p><code>Resources/Server</code> 目录或其任意子目录中的文件发生变化时触发。</p>
<p><code>Resources/Server/&lt;plugin&gt;</code> 目录中的任意文件(不包括其子文件夹)发生变化时,将触发一次 Lua 状态重载,并触发一个 <code>onFileChanged</code> 事件。</p>
<p>位于 <code>Resources/Server/&lt;plugin&gt;</code> 子文件夹中的任何文件(例如 <code>Resources/Server/&lt;plugin&gt;/lua/stuff.lua</code>)发生变化时,不会触发 Lua 状态重载,而只会触发一个 <code>onFileChanged</code> 事件。<br>这样你可以自行选择是否以及如何以正确的方式重新加载它。</p>
<p>这适用于所有文件,不仅仅是<code>.lua</code> 文件。</p>
<p>参数 <code>path</code> 是相对于服务器根目录的路径,例如<code>Resources/Server/myplugin/myfile.txt</code>。你可以使用<code>FS.*</code>系列函数对该字符串进行进一步处理,例如提取文件名或扩展名(如(<code>FS.GetExtension(...)</code>, <code>FS.GetFilename(...)</code>, ...)。</p>
<p>注意: 自 v3.1.0 起,服务器启动后新增的文件将<em>不会</em>被追踪。</p>
<h3 id="lua_1">从旧Lua迁移</h3>
<p>本文简要介绍了从旧lua迁移到新lua的基本步骤。</p>
<h4 id="lua_2">理解新的lua如何工作</h4>
<p>为此,请仔细阅读<a href="#how-to-start-writing-a-plugin">“介绍”</a>部分及其所有子部分。这是正确进行后续步骤所必需的。</p>
<h4 id="_15">搜索和替换</h4>
<p>首先,你需要搜索并替换所有 MP 函数。替换时应在所有 MP 函数前加上 <code>MP.</code> 前缀,但<code>print()</code>函数除外。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-74-1"><a id="__codelineno-74-1" name="__codelineno-74-1" href="#__codelineno-74-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">players</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">GetPlayers</span><span class="p">()</span>
</span><span id="__span-74-2"><a id="__codelineno-74-2" name="__codelineno-74-2" href="#__codelineno-74-2"></a><span class="nb">print</span><span class="p">(</span><span class="o">#</span><span class="nv">players</span><span class="p">)</span>
</span></code></pre></div>
<p>替换为</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-75-1"><a id="__codelineno-75-1" name="__codelineno-75-1" href="#__codelineno-75-1"></a><span class="kd">local</span><span class="w"> </span><span class="nv">players</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">MP</span><span class="p">.</span><span class="nf">GetPlayers</span><span class="p">()</span>
</span><span id="__span-75-2"><a id="__codelineno-75-2" name="__codelineno-75-2" href="#__codelineno-75-2"></a><span class="nb">print</span><span class="p">(</span><span class="o">#</span><span class="nv">players</span><span class="p">)</span><span class="w"> </span><span class="c1">-- note how print() doesn&#39;t change</span>
</span></code></pre></div>
<h4 id="_16">再见线程,你好事件计时器!</h4>
<p>如在 <a>“介绍”</a> 部分所述,线程(threads)即事件定时器(event timers)。<br>对于所有调用 <code>CreateThread</code> 的地方,应将其替换为 <code>CreateEventTimer</code><br><br>请仔细检查你原先的 <code>CreateThread</code> 的执行频率(每秒运行 X 次),并据此计算出事件定时器的超时时间(以毫秒为单位)。<br><br>另外请注意,<code>CreateEventTimer</code> 传入的不是函数名,而是事件名,因此你还需要注册一个事件来配合使用。</p>
<p>范例:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-76-1"><a id="__codelineno-76-1" name="__codelineno-76-1" href="#__codelineno-76-1"></a><span class="nf">CreateThread</span><span class="p">(</span><span class="s2">&quot;myFunction&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1">-- calls &quot;myFunction&quot; twice per second</span>
</span></code></pre></div>
<p>替换为</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-77-1"><a id="__codelineno-77-1" name="__codelineno-77-1" href="#__codelineno-77-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;myEvent&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;myFunction&quot;</span><span class="p">)</span><span class="w"> </span><span class="c1">-- registering our event for the timer</span>
</span><span id="__span-77-2"><a id="__codelineno-77-2" name="__codelineno-77-2" href="#__codelineno-77-2"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">CreateEventTimer</span><span class="p">(</span><span class="s2">&quot;myEvent&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">500</span><span class="p">)</span><span class="w"> </span><span class="c1">-- 500 milliseconds = 2 times per second</span>
</span></code></pre></div>
<p>如果你有很多事件定时器,那么可以考虑将它们合并。<br>例如,你可以创建一个 “每分钟” 事件,然后将所有需要每分钟调用的函数都注册到这个事件上,而不是为每个函数单独创建一个事件定时器。<br><br>因为每个事件定时器在触发时都会让服务器多消耗一点时间。</p>
<h4 id="_17">不再支持隐式事件调用</h4>
<p>你需要注册所有的事件,不能再依赖函数名。<br>在旧版 Lua 中,这一点并不明确,但在新版 Lua 中通常会强制要求这样做。<br>一个好的示例模式是:</p>
<div class="language-lua highlight"><pre><span></span><code><span id="__span-78-1"><a id="__codelineno-78-1" name="__codelineno-78-1" href="#__codelineno-78-1"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;chatMessageHandler&quot;</span><span class="p">)</span>
</span><span id="__span-78-2"><a id="__codelineno-78-2" name="__codelineno-78-2" href="#__codelineno-78-2"></a><span class="c1">-- or</span>
</span><span id="__span-78-3"><a id="__codelineno-78-3" name="__codelineno-78-3" href="#__codelineno-78-3"></a><span class="nv">MP</span><span class="p">.</span><span class="nf">RegisterEvent</span><span class="p">(</span><span class="s2">&quot;onChatMessage&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;handleChatMessage&quot;</span><span class="p">)</span>
</span></code></pre></div>
<p>这种做法比让事件处理函数与事件同名要更好,因为后者容易造成误导和混淆。</p>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="最后更新">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="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">
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../../mod-reference/" class="md-footer__link md-footer__link--prev" aria-label="上一页: Client Scripting Reference">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
上一页
</span>
<div class="md-ellipsis">
Client Scripting Reference
</div>
</div>
</a>
<a href="../v2-server-reference/" class="md-footer__link md-footer__link--next" aria-label="下一页: Version 2.X (Deprecated)">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
Version 2.X (Deprecated)
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2019 - 2024 BeamMP Mod Team
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/beammp" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://twitter.com/beamng_mp" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M459.4 151.7c.3 4.5.3 9.1.3 13.6 0 138.7-105.6 298.6-298.6 298.6-59.5 0-114.7-17.2-161.1-47.1 8.4 1 16.6 1.3 25.3 1.3 49.1 0 94.2-16.6 130.3-44.8-46.1-1-84.8-31.2-98.1-72.8 6.5 1 13 1.6 19.8 1.6 9.4 0 18.8-1.3 27.6-3.6-48.1-9.7-84.1-52-84.1-103v-1.3c14 7.8 30.2 12.7 47.4 13.3-28.3-18.8-46.8-51-46.8-87.4 0-19.5 5.2-37.4 14.3-53C87.4 130.8 165 172.4 252.1 176.9c-1.6-7.8-2.6-15.9-2.6-24C249.5 95.1 296.3 48 354.4 48c30.2 0 57.5 12.7 76.7 33.1 23.7-4.5 46.5-13.3 66.6-25.3-7.8 24.4-24.4 44.8-46.1 57.8 21.1-2.3 41.6-8.1 60.4-16.2-14.3 20.8-32.2 39.3-52.6 54.3"/></svg>
</a>
<a href="https://discord.gg/beammp" target="_blank" rel="noopener" title="discord.gg" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M492.5 69.8c-.2-.3-.4-.6-.8-.7-38.1-17.5-78.4-30-119.7-37.1-.4-.1-.8 0-1.1.1s-.6.4-.8.8c-5.5 9.9-10.5 20.2-14.9 30.6-44.6-6.8-89.9-6.8-134.4 0-4.5-10.5-9.5-20.7-15.1-30.6-.2-.3-.5-.6-.8-.8s-.7-.2-1.1-.2C162.5 39 122.2 51.5 84.1 69c-.3.1-.6.4-.8.7C7.1 183.5-13.8 294.6-3.6 404.2c0 .3.1.5.2.8s.3.4.5.6c44.4 32.9 94 58 146.8 74.2.4.1.8.1 1.1 0s.7-.4.9-.7c11.3-15.4 21.4-31.8 30-48.8.1-.2.2-.5.2-.8s0-.5-.1-.8-.2-.5-.4-.6-.4-.3-.7-.4c-15.8-6.1-31.2-13.4-45.9-21.9-.3-.2-.5-.4-.7-.6s-.3-.6-.3-.9 0-.6.2-.9.3-.5.6-.7c3.1-2.3 6.2-4.7 9.1-7.1.3-.2.6-.4.9-.4s.7 0 1 .1c96.2 43.9 200.4 43.9 295.5 0 .3-.1.7-.2 1-.2s.7.2.9.4c2.9 2.4 6 4.9 9.1 7.2.2.2.4.4.6.7s.2.6.2.9-.1.6-.3.9-.4.5-.6.6c-14.7 8.6-30 15.9-45.9 21.8-.2.1-.5.2-.7.4s-.3.4-.4.7-.1.5-.1.8.1.5.2.8c8.8 17 18.8 33.3 30 48.8.2.3.6.6.9.7s.8.1 1.1 0c52.9-16.2 102.6-41.3 147.1-74.2.2-.2.4-.4.5-.6s.2-.5.2-.8c12.3-126.8-20.5-236.9-86.9-334.5zm-302 267.7c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.4 59.2-52.8 59.2m195.4 0c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.2 59.2-52.8 59.2"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
<div class="md-consent__overlay"></div>
<aside class="md-consent__inner">
<form class="md-consent__form md-grid md-typeset" name="consent">
<h4>Cookie consent</h4>
<p>We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation and whether users find what they're searching for. With your consent, you're helping us to make our documentation better.</p>
<input class="md-toggle" type="checkbox" id="__settings" >
<div class="md-consent__settings">
<ul class="task-list">
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="analytics" checked>
<span class="task-list-indicator"></span>
Google Analytics
</label>
</li>
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="github" checked>
<span class="task-list-indicator"></span>
GitHub
</label>
</li>
</ul>
</div>
<div class="md-consent__controls">
<button class="md-button md-button--primary">同意</button>
<label class="md-button" for="__settings">管理设定</label>
</div>
</form>
</aside>
</div>
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
<script id="__config" type="application/json">{"annotate": null, "base": "../../../..", "features": ["search.suggest", "search.highlight", "search.share", "content.code.annotate", "content.code.copy", "content.action.edit", "content.action.view", "content.tooltips", "navigation.footer", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.path", "navigation.tracking", "navigation.indexes", "toc.follow"], "search": "../../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "\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>