meta data for this page
  •  

📚 差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
scripting:native:core [2025/06/13 07:47] – 移除 - 外部编辑 (Unknown date) 127.0.0.1scripting:native:core [2025/07/11 13:56] (当前版本) bibiboxs
行 1: 行 1:
 +<markdown>
 +# ==Native/Core==
  
 +原生脚本是一个内置的通用脚本功能类,此分类下还有更多通用的扩展工具类。
 +
 +> 标注原生(Native)类型的常量、类型、事件、函数方法等,它们都基于原生`Native`类。
 +
 +[note2]
 +==此文档内代码均可在**Client**和**World**脚本及其子脚本直接进行使用。==
 +[/note]
 +
 +
 +## Const
 +
 +### VECTOR_NULL
 +
 +> 三维坐标默认“空”坐标,通常表示**不合理或者默认值**。
 +>
 +> 由于`Vector`是一个**值类型**,所以表示为空时不应该直接设为`null`,在通常情况下应该使用**常量代替**。
 +
 +```javascript
 +const VECTOR_NULL = Vector(-128000, -128000, -128000);
 +```
 +
 +
 +
 +## Type
 +
 +### Vector()
 +
 +> 三维坐标结构类型,沙盘引擎世界坐标的通用形式,其中Y轴表示高度。
 +>
 +> **==此方法必须使用`Equals()`判断相等。==**
 +
 +```javascript
 +let pos = Vector(0, 0, 10); //X, Y, Z
 +
 +//Extend
 +pos.magnitude; //magnitude(向量长度)
 +pos.normalized; //normalized(归一化)
 +```
 +
 +- `x`:X轴数值(左右)
 +- `y`:Y轴数值(上下)
 +- `z`:Z轴数值(前后)
 +
 +
 +
 +### Vector2()
 +
 +> 二维坐标结构类型,沙盘引擎世界坐标的2D形式。
 +>
 +> **==此方法必须使用`Equals()`判断相等。==**
 +
 +```javascript
 +let pos = Vector2(0, 0); //X, Y
 +```
 +
 +- `x`:X轴数值
 +- `y`:Y轴数值
 +
 +
 +
 +### Color()
 +
 +> 颜色结构类型,表示一种RGBA组成的颜色,默认情况下`A=255`(可省略)。
 +>
 +> **==此方法必须使用`Equals()`判断相等。==**
 +
 +```javascript
 +let newColor = Color(255, 255, 255, 255); //R, G, B, A
 +let newColor2 = Color(255, 255, 255); //R, G, B, A=255
 +```
 +
 +- `r`:颜色数值
 +- `g`:颜色数值
 +- `b`:颜色数值
 +- `a`:透明度数值
 +
 +
 +
 +### ArrayValueResult()
 +
 +> (只读)Array检测函数的返回值,属性可获取数组(封装)信息。
 +
 +- `GetCount()`:获取数组长度
 +- `Get(index: int)`:获取指定索引的内容
 +
 +
 +
 +### RayTraceResult()
 +
 +> (只读)射线检测函数的返回值,属性可获取射线检测结果(是否碰撞、最终坐标、检测实体等)。
 +
 +- `IsHit`:是否碰撞射线(如果`IsHit == true && Entity == null`,可能表示检测到世界地形)
 +- `Point`:射线检测坐标(如没有产生碰撞,则坐标即是默认终点)
 +- `Entity`:射线碰撞实体(如果对象不是标准的`Entity`实体,或对象为**静态模型(本地静态模型)**,则返回为`null`)
 +
 +
 +
 +### VectorPoint()
 +
 +> 坐标点结构类型,表示一组由**坐标、旋转、缩放**三个Vector类型组成的对象,并且包含一个**Tag标签**以供可选筛选。
 +>
 +> 此类型只有坐标记录的功能,通常用于地图编辑器(`ID5`物体)与脚本的可见预设坐标交互。
 +>
 +> 使用此结构时**不应该使用**`new VectorPoint| VectorPoint()`这类方法,而是应该使用`AddVectorPoint() | RemoveVectorPoint()`等方法增删到脚本记录。
 +>
 +> **注意:结构内的三种Vector类型虽然命名不同,但均是以`Vector`作为属性类型,因此在某些情况下可以忽略命名问题。**
 +
 +- `Tag`:筛选标签(可空`""`)
 +- `Pos`:坐标(Vector,不可空,至少要有一个)
 +- `Angle`:旋转角度(Vector,可空)
 +- `Scale`:缩放(Vector,可空)
 +
 +
 +
 +## Event
 +
 +### OnGameOptionUpdate( optionKey )
 +
 +> 当游戏配置(通过`SetGameOption`被绑定过的)发生主动更新时触发(或有数值被改变)。
 +>
 +> 每次客户端脚本加载完成时,都会自动触发一次(`optionKey==null`)。
 +
 +```javascript
 +function OnGameOptionUpdate( optionKey: string )
 +```
 +
 +```javascript
 +function OnGameOptionUpdate( optionKey )
 +{
 +    if(optionKey == null)
 +    {
 +        //如果参数==null,表示不是由某个选项更新触发,而是引擎主动刷新
 +        DLog("Force Update.");
 +        return;
 +    }
 +    
 +    //如果不为空,则OptionKey返回具体哪个选项发生更新
 +    DLog("OnGameOptionUpdate: " + optionKey);
 +}
 +```
 +
 +
 +
 +## Function
 +
 +### UnloadMod()
 +
 +> 卸载当前引擎,回到沙盘引擎初始界面。
 +>
 +> **注意:通常情况下,可以考虑优先将【退出游戏】操作替换为此方法,而不是直接`QuitGame()`关闭游戏。**
 +
 +```javascript
 +function UnloadMod()
 +```
 +
 +
 +
 +### QuitGame()
 +
 +> 退出游戏,关闭沙盘引擎程序。
 +>
 +> **==由于安全考虑,此功能暂不可用,应考虑替换为`UnloadMod()`。==**
 +
 +```javascript
 +function QuitGame()
 +```
 +
 +
 +
 +### GCCollect()
 +
 +> 主动执行一次GC垃圾清理,在适当的时机清理有助于缓解性能压力。
 +
 +```javascript
 +function GCCollect( all: bool = false )
 +```
 +
 +- **`all`:**是否包含对引擎的GC清理,这可能会造成临时卡顿,否则将只清理脚本GC
 +
 +
 +
 +### Equals()
 +
 +> 判断两个对象是否相同(相等)。
 +>
 +> **注意:此方法是判断两者相同的最佳方法,同时也是==浮点数据类型(`Vector | Vector2 | Color`)==的唯一判断方法。**
 +
 +[note2]
 +
 +**对于浮点类型相关的扩展类型,直接使用`==`无法进行有效判断(将始终返回`false`),相关类型必须使用此方法判断相同。
 +
 +除此之外,常规数据类型可正常使用`==`进行判断。
 +
 +[/note]
 +
 +```javascript
 +function Equals( a, b ): bool
 +```
 +
 +
 +
 +### IsNullVector()
 +
 +> 判断坐标(`Vector`)是否为理论空(`VECTOR_NULL`)。
 +>
 +> **注意:因为`Vector`是值类型,理论上无法直接判断为`Null`,因此需要用此方法判断是否为空(一个正常不可能存在的值)。**
 +
 +```javascript
 +function IsNullVector( pos: Vector ): bool
 +```
 +
 +
 +
 +### GetStringToken()
 +
 +> 获取字符串分割后字符串结果,通常用于Command指令参数分割等。
 +
 +> 注意:此方法出于特性考虑,如果没有找到分割内容,则会返回包含`text[0]`的结果,而不是空结果。
 +
 +```javascript
 +function GetStringToken( text: string, symbol: string ): StringValueResult
 +```
 +
 +```javascript
 +let source = "test a b c";
 +let result = GetStringToken(source, " ");
 +DLog(result.Get(2));  //Output: "b"
 +```
 +
 +
 +
 +### LoadScript()
 +
 +> 加载**脚本目录**下其他脚本文件(js)。
 +>
 +> 目标脚本将续写当前代码作用域(续写),**共享**当前脚本环境的代码,开发者应避免主副脚本之间使用相同名称的变量及方法等。
 +>
 +> **此方法适合对目录规范有需求的开发者,或者制作模块化功能使用。**
 +
 +[note2]
 +注意:此方法目前不支持[脚本插件](developer/plugins/main "脚本插件")使用,脚本插件无法加载子脚本。
 +[/note]
 +
 +```javascript
 +function LoadScript( path: string )
 +```
 +
 +- `path`:脚本目录下的 同级或子级 脚本文件路径(例如:`Test/MyCode.js`)
 +
 +```javascript
 +//Path Rule
 +LoadScript("Test/MyCode.js"); //√ 正确,读取Test目录下的MyCode.js
 +LoadScript("Test/MyCode"); //√ 正确,读取Test目录下的MyCode.js(可忽略".js"
 +LoadScript("MyCode.js"); //√ 正确,读取脚本目录下的MyCode.js
 +LoadScript("../MyCode.js"); //× 错误,安全性考虑无法使用层级符号
 +
 +//Test
 +LoadScript("Test.js")
 +TestAction(); //Test.js >> TestAction()
 +
 +//Test.js
 +function TestAction()
 +{
 +    DLog("TestMode");
 +}
 +```
 +
 +[note2]
 +
 +扩展:如果`Main`脚本原有一个`TestAction()`方法,但是后续加载了`Test.js`脚本(且同样包含`TestAction()`),那么执行的是`Test.js >> TestAction()`,因为后载入脚本覆写了更早的方法。
 +
 +[/note]
 +
 +
 +
 +### Env.AddListener()
 +
 +> 增加一个`function()`事件监听,当指定`function`被调用时触发。
 +>
 +> **注意:仅支持引擎主动调用、`Emit()`手动冒泡方式触发,直接调用原生`function()`不会触发监听事件。**
 +
 +[note2]
 +
 +注意:如果监听`OnScriptLoad`等优先级较高的方法,请确保监听时脚本未加载完成。
 +
 +否则可能导致监听成功,但由于脚本已加载(事件已经触发),所以监听永远不会再次被触发。
 +
 +[/note]
 +
 +```javascript
 +function Env.AddListener( eventName: string, action: Action, sort: int = 1 ): string
 +```
 +
 +- `eventName`:希望监听的`function`名称,通常用于监听引擎原生事件,但也支持自定义事件
 +- `action`:当事件触发时执行的`function`,支持`Lambda`表达式
 +- `sort`:监听方法的执行顺序,**数值越小越靠前**,默认顺序为`1`(在原方法执行后执行),原方法Sort默认保持为`0`(唯一)
 +- `return`:监听事件的Hash值,可用于取消监听
 +
 +```javascript
 +Env.AddListener("OnPlayerJoin", function( player ){
 +    DLog("Player: " + player.Name + " joined!");
 +});
 +
 +function OnPlayerJoin( player )
 +{
 +    DLog("Welcome: " + player.Name);
 +}
 +
 +//Output
 +//"Welcome XXX";
 +//"Player: XXX joined!"
 +```
 +
 +```javascript
 +Env.AddListener("OnPlayerJoin", function( player ){
 +    DLog("Player: " + player.Name + " joined!", -1); //-1 < 0(Native)
 +});
 +
 +function OnPlayerJoin( player )
 +{
 +    DLog("Welcome: " + player.Name);
 +}
 +
 +//Output
 +//"Player: XXX joined!" //Because sort set -1(<0)
 +//"Welcome XXX";
 +```
 +
 +
 +
 +### Env.RemoveListener()
 +
 +> 移除一个`function()`事件监听。
 +
 +```javascript
 +function Env.RemoveListener( eventHash: string )
 +```
 +
 +- `eventHash`:希望取消监听的`eventHash`,通过`AddListener()`返回值获取
 +
 +```javascript
 +let listenerHash = Env.AddListener("OnPlayerJoin", function( player ){
 +    DLog("Player: " + player.Name + " joined!");
 +});
 +
 +Env.RemoveListener(listenerHash);
 +```
 +
 +
 +
 +### Env.Emit()
 +
 +> 手动触发一个`function()`事件及监听。
 +
 +```javascript
 +function Env.Emit( functionName: string, params: any = ... )
 +```
 +
 +- `functionName`:触发的函数\事件名称
 +- `params`:附带参数(如存在)
 +
 +```javascript
 +Env.Emit("OnPlayerChat", Player.Find(0), "Hello!");
 +```
 +
 +
 +
 +### CreateHost()
 +
 +> 建立一个当前模组的服务器\房间世界。
 +>
 +> 任何情况下,使用此方法都将**直接断开当前服务器并建立新的服务器**,请确保相关数据提前保存。
 +>
 +> **补充:如果不填写任何参数,则表示加载到初始入口世界(`Main`世界)。**
 +>
 +> **==注意:我们建议不指定固定的端口号,而是使用`Mod.json -> NetworkPort`机制设定模组端口,并设置当前方法参数`Port=0`(自动识别模组`NetworkPort`)。==**
 +
 +```javascript
 +function CreateHost( map: string, script: string, port: int = 0, address: string = "", userData: string = "", additional: bool = true ): bool //是否建立成功
 +```
 +
 +> 载入并创建一个地图为“test2”且脚本为“Main2”的服务器。
 +
 +```javascript
 +CreateHost("test2", "Main2");
 +```
 +
 +> 载入并创建一个地图为“test2”且脚本为“Main2”,端口指定为8195的服务器(0为默认端口,并非随机端口)。
 +>
 +> 默认端口配置文件:Mod.json `["NetworkPort": 8192]`。
 +
 +```javascript
 +CreateHost("test2", "Main2", 8195);
 +```
 +
 +> 载入并创建一个地图为“test2”且脚本为“Main2”,端口随意,但使用SteamP2P网络的房间(地址参数填写`steam`)。
 +
 +```javascript
 +CreateHost("test2", "Main2", 0, "steam");
 +```
 +
 +> `UserData`参数可传递给服务器一个前置字符串参数(长度限制0~256,可用Json扩展),可提前告知服务器一些【玩家自身】自定义信息。
 +>
 +> **(World脚本可用player.UserData读取内容)**
 +
 +```javascript
 +CreateHost("test2", "Main2", 0, "", "TestStringOrJson...");
 +```
 +
 +> `additional`参数可指定是否使用地图附加内容(例如:地图内创建的载具),默认为`true`,如果只希望加载纯净的地图则设置为`false`。
 +
 +```javascript
 +CreateHost("test2", "Main2", 0, "", "", false);
 +```
 +
 +
 +
 +### ConnectHost()
 +
 +> 连接并加载到指定的多人游戏服务器,开发者应自行编写代码,确保参数信息正确。
 +>
 +> 任何情况下,使用此方法都将**直接断开当前服务器并尝试连接到新的服务器**。
 +
 +```javascript
 +function ConnectHost(address: string, port: int = 0, password: string = "", userData: string = "")
 +```
 +
 +> 尝试连接并加载到指定IP地址的服务器
 +>
 +> 方法与CreateHost部分相同,`0`表示默认端口,服务器密码可空
 +>
 +> `UserData`参数可传递给服务器一个前置字符串参数(长度限制0~256,可用Json扩展),可提前告知服务器一些【玩家自身】自定义信息
 +>
 +> **(World脚本可用player.UserData读取内容)**
 +
 +```javascript
 +ConnectHost("127.0.0.1"); 
 +```
 +
 +
 +
 +### Disconnect()
 +
 +> 断开当前正在连接的服务器\房间\世界,并回到入口场景(`Main`)。
 +>
 +> 任何情况下,使用此方法都将**直接断开当前服务器**。
 +
 +```javascript
 +function Disconnect()
 +```
 +
 +
 +
 +### Reconnect()
 +
 +> 断开当前正在连接的服务器\房间\世界,并尝试重新连接到上次的服务器(如果没有记录,则不会生效)。
 +>
 +> 任何情况下,使用此方法都将**直接断开当前服务器**。
 +>
 +
 +```javascript
 +function Reconnect()
 +```
 +
 +
 +
 +### IsServerMode()
 +
 +> 获取当前是否为**服务端模式**(仅作为专用服务器启动,通常由`bat`格式扩展)。
 +
 +```javascript
 +function IsServerMode(): bool
 +```
 +
 +
 +
 +### IsNewPlayer()
 +
 +> 判断当前是否为**玩家初次进入此模组**。
 +
 +```javascript
 +function IsNewPlayer(): bool
 +```
 +
 +
 +
 +### IsHost()
 +
 +> 判断当前是否为**服务器\主机模式**,反之则为常规客户端。
 +
 +```javascript
 +function IsHost(): bool
 +```
 +
 +
 +
 +### GetVersionInfo()
 +
 +> 获取**沙盘引擎版本信息**。
 +
 +```javascript
 +function GetVersionInfo(): string
 +```
 +
 +
 +
 +### GetModPackage()
 +
 +> 获取**当前模组包名**。
 +
 +```javascript
 +function GetModPackage(): string
 +```
 +
 +
 +
 +### GetModName()
 +
 +> 获取**当前模组名称**(本地化翻译)。
 +
 +```javascript
 +function GetModName(): string
 +```
 +
 +
 +
 +### GetEngineTickCount()
 +
 +> 获取**游戏启动**至此已运行的时间(秒)。
 +
 +```javascript
 +function GetEngineTickCount(): float
 +```
 +
 +
 +
 +### GetModTickCount()
 +
 +> 获取**模组启动**至此已运行的时间(秒)。
 +>
 +> 如果期间发生了延迟加载、重载模组等情况,此时间也会被随之重置。
 +
 +```javascript
 +function GetModTickCount(): float
 +```
 +
 +
 +
 +### GetDateTime()
 +
 +> 获取**系统时间**。
 +>
 +> 返回格式会按照`yyyy-MM-dd|HH:mm:ss`进行字符串处理,开发者可通过`split`得到的数组获取单独的值。
 +
 +```javascript
 +function GetDateTime(): string
 +```
 +
 +
 +
 +### GetTimestamp()
 +
 +> 获取**Unix时间戳**(格林威治时间1970年01月01日00时00分00秒)。
 +
 +```javascript
 +function GetDateTime(): int
 +```
 +
 +
 +
 +### GetNetworkTime()
 +
 +> 获取**服务器同步时间**,服务器至此运行了多长时间(秒)。
 +
 +> **此数值无论是服务端\客户端执行,均取得最新同步后时间。**
 +
 +```javascript
 +function GetNetworkTime(): double
 +```
 +
 +
 +
 +### GetDeltaTime()
 +
 +> 获取**游戏帧增量时间**。
 +
 +```javascript
 +function GetDeltaTime(): float
 +```
 +
 +
 +
 +### Env.SetGlobalVars()
 +
 +> 设置一个**全局变量(可跨脚本使用)**,支持绝大部分类型的JavaScript变量(如:数组、对象等)。
 +>
 +> 此功能可善用扩展,例如:菜单界面设置【服务器名称、服务器模式等】全局变量对象,待服务器加载完毕事件读取,并根据数值来修改逻辑。
 +>
 +> 如果一个全局变量不再使用,可以将其设置为`value = null`删除全局变量。
 +
 +[note]
 +注意:`Startup`作为[前置配置文件](developer/config/startup_json),无法通过此方法写入,只能通过加载时自动读取。
 +[/note]
 +
 +```javascript
 +function Env.SetGlobalVars( key: string, value: any )
 +```
 +
 +```javascript
 +//设置一个字符串类型的全局变量
 +Env.SetGlobalVars("myWebsite", "www.abc.com");
 +
 +//设置一个JavaScript扩展对象全局变量
 +Env.SetGlobalVars("createServerConfig", {
 +    serverName: "服务器名称",
 +    gameMode: 1,
 +    openPVP: false
 +});
 +```
 +
 +
 +
 +### Env.GetGlobalVars()
 +
 +> 读取一个全局变量(可跨脚本使用),支持绝大部分类型的JavaScript变量(如:数组、对象等)。
 +>
 +> 如指定`key`不存在则返回`null`。
 +
 +```javascript
 +function Env.GetGlobalVars( key: string ): any
 +```
 +
 +```javascript
 +//设置一个JavaScript扩展对象全局变量
 +Env.SetGlobalVars("createServerConfig", {
 +    serverName: "服务器名称",
 +    gameMode: 1,
 +    openPVP: false
 +});
 +
 +//读取时可正常进行读取
 +let getConfig = Env.GetGlobalVars("createServerConfig");
 +DLog("serverName: " + getConfig.serverName);
 +```
 +
 +
 +
 +### GetScriptName()
 +
 +> 获取**当前加载脚本**的名称。
 +
 +```javascript
 +function GetScriptName(): string
 +```
 +
 +
 +
 +### GetScriptNames()
 +
 +> 获取**当前模组**存在的全部脚本名称(`StringValueResult`),可使用`Get() | GetCount()`遍历使用。
 +
 +```javascript
 +function GetScriptNames(): StringValueResult
 +```
 +
 +```javascript
 +let scriptsResult = GetScriptNames();
 +for(let i=0;i<scriptsResult.GetCount();i++)
 +{
 +    DLog(scriptsResult.Get(i)); //string
 +}
 +```
 +
 +
 +
 +### GetCurrentScriptNames()
 +
 +> 获取**当前正在使用脚本**下存在的全部脚本名称(`StringValueResult | *.js`),包含子目录及后缀名,可使用`Get() | GetCount()`遍历使用。
 +
 +```javascript
 +function GetCurrentScriptNames(): StringValueResult 
 +```
 +
 +
 +
 +### GetPluginNames()
 +
 +> 获取**当前模组**存在的全部插件名称(即使没有被加载)(`StringValueResult`),可使用`Get() | GetCount()`遍历使用。
 +
 +```javascript
 +function GetPluginNames(): StringValueResult
 +```
 +
 +```javascript
 +let scriptsResult = GetPluginNames();
 +for(let i=0;i<scriptsResult.GetCount();i++)
 +{
 +    DLog(scriptsResult.Get(i)); //string
 +}
 +```
 +
 +
 +
 +### GetCurrentPluginNames()
 +
 +> 获取**当前正在使用脚本**已加载完成的全部插件名称(`StringValueResult | *.js`),可使用`Get() | GetCount()`遍历使用。
 +
 +```javascript
 +function GetCurrentPluginNames(): StringValueResult 
 +```
 +
 +
 +
 +### GetGameFPS()
 +
 +> 获取当前游戏FPS帧数。
 +
 +```javascript
 +function GetGameFPS(): int
 +```
 +
 +
 +
 +### GetMapName()
 +
 +> 获取当前正在使用的地图文件名(不包含后缀),可用作判定特定地图。
 +
 +```javascript
 +function GetMapName(): string
 +```
 +
 +
 +
 +### GetMapNames()
 +
 +> 获取当前用户本地全部地图文件名(不包含后缀)(`StringValueResult`),可使用`filter`进行条件过滤。
 +
 +```javascript
 +function GetMapNames( filter: int = 0 ): StringValueResult
 +```
 +
 +| 过滤Filter | 说明                         |
 +| ---------- | ---------------------------- |
 +| 0          | 默认全部(模组>地图>下载)   |
 +| 1          | 只获取模组内置地图           |
 +| 2          | 只获取`Map`地图目录          |
 +| 3          | 只获取`Map\Download`地图目录 |
 +
 +```javascript
 +let result = GetMapNames();
 +for(let i=0;i<result.GetCount();i++)
 +{
 +    DLog(i + ">" + result.Get(i));
 +}
 +```
 +
 +
 +
 +### GenerateUUID()
 +
 +> 生成一段唯一的UUID字符串(GUID)。
 +>
 +> 在绝大部分情况下,由此方法生成的UUID应该是全球唯一的。
 +
 +```javascript
 +function GenerateUUID(): string
 +```
 +
 +
 +
 +### Distance()
 +
 +> 获取两个坐标点之间的距离,单位是沙盘引擎世界距离。
 +>
 +> **注意:此方法将获得精准的距离数据,如果大量调用可能会影响性能,考虑使用距离平方(`DistanceSqrt`)。**
 +
 +```javascript
 +function Distance( pos: Vector, pos2: Vector ): float
 +```
 +
 +
 +
 +### DistanceSqrt()
 +
 +> 获取两个坐标点之间的距离平方。
 +>
 +> **注意:此方法将获得距离平方,应该使用`Distance * Distance`作为最终距离判断。**
 +
 +```javascript
 +function DistanceSqrt( pos: Vector, pos2: Vector ): float
 +```
 +
 +
 +
 +### GreaterDistance()
 +
 +> 获取**两个坐标点之间距离**是否**大于目标距离。**
 +>
 +> **注意:此方法内部使用距离平方运算,距离可能不会特别精准(性能会更高),目标距离无需进行平方运算,==可以按照常规`Distance`使用。==**
 +
 +```javascript
 +function GreaterDistance( pos: Vector, pos2: Vector, distance: float ): bool
 +```
 +
 +
 +
 +### IsLogicFrame()
 +
 +> 获取**当前是否为逻辑帧**,通常适用于`OnFrameUpdate()`事件的优化传递。
 +>
 +> **逻辑帧:以固定时间速率返回为`true`,而不是每一帧都返回`true`,此方法可以避免某些逻辑受到帧数影响。==**
 +>
 +> *服务端`World/OnFrameUpdate()`,默认以逻辑帧间隔执行。*
 +
 +```javascript
 +function IsLogicFrame(): bool
 +```
 +
 +
 +
 +### RayTrace()
 +
 +> 生成一条**检测射线**,可用于检测**两点之间**实体对象的碰撞。
 +>
 +> 如果只希望获取`Entity`部分类型,可使用`layer`参数进行[实体类型层(位)](reference/instances)(位操作),默认`0`表示检测全部。
 +>
 +> **注意:此方法会检测世界地形(除非参数`includeTerrain = false`),如果`IsHit == true && Entity == null`,表示最终检测到地形**。
 +
 +```javascript
 +function RayTrace( start: Vector, over: Vector, layer: int = 0, includeTerrain: bool = true ): RayTraceResult
 +```
 +
 +-  `start`:起始点
 +-  `over`:结束点
 +-  `layer`:筛选layer层,默认为`0`,可用于筛选判断[实体类型层(位)](reference/instances)
 +-  `RayTraceResult`:返回值([类型参考](scripting/native/main))
 +
 +```javascript
 +//只判断Character + Vehicle
 +let result = RayTrace(Vector(0, 0, 0), Vector(10, 0, 10), 2 + 4);
 +DLog(result.IsHit);
 +DLog(result.Point);
 +DLog(result.Entity)
 +```
 +
 +
 +
 +### OverlapEntity()
 +
 +> **获取指定位置+范围的世界实体**(某坐标指定范围内所有对象),可用于检测指定位置的范围内实体对象(基于`Entity`的核心对象)。
 +>
 +> 如果只希望获取`Entity`部分类型,可使用`filter`参数进行[实体类型层(位)](reference/instances)(位操作),默认`0`表示检测全部。
 +
 +[note2]
 +
 +此方法最终返回`OverlapEntityResult`结构,可使用`GetCount() | Get()`方法进行遍历结果。
 +
 +[/note]
 +
 +```javascript
 +function OverlapEntity( pos: Vector, radius: float, filter: int = 0 ): OverlapEntityResult
 +```
 +
 +```javascript
 +//Only check 'Character' and 'Vehicle'
 +let result = OverlapEntity(Vector(0, 0, 0), 20, 2 + 4);
 +
 +//Result
 +result.GetCount(); //Result Count
 +result.Get(0); //GetEntity by index
 +```
 +
 +```javascript
 +let result = OverlapEntity(Vector(0, 0, 0), 2, 0);
 +if(result.GetCount() > 0)
 +{
 +    let getEntity = result.Get(0); //Get index 0
 +    
 +    DLog(getEntity.GetType()); //"EntityType", maybe "Character" (string)
 +    DLog(getEntity.GetInstance()); //EntityObject, maybe Character (object)
 +}
 +```
 +
 +
 +
 +### OverlapPlayer()
 +
 +> **获取指定位置+范围的玩家对象**(某坐标指定范围内所有可见玩家)。
 +>
 +> **注意:玩家`Player`是一个非实体类型,这里获取的是所有视角(`player.Pos`)在范围内的玩家。**
 +
 +[note2]
 +
 +此方法最终返回`OverlapEntityResult`结构,可使用`GetCount() | Get()`方法进行遍历结果。
 +
 +[/note]
 +
 +```javascript
 +function OverlapPlayer( pos: Vector, radius: float ): OverlapEntityResult
 +```
 +
 +```javascript
 +let result = OverlapPlayer(Vector(0, 0, 0), 2);
 +if(result.GetCount() > 0)
 +{
 +    let getPlayer = result.Get(0); //Get index 0
 +    
 +    DLog(getPlayer.Name);
 +}
 +```
 +
 +
 +
 +### InPoly()
 +
 +> 获取某个点是否在多边形点范围内(X\Z是否在某片2D形状范围内)。
 +>
 +> **注意:此方法判断坐标系只需要X\Z轴,Y轴数值可以忽略(最低要求输入3个多边形点,最多支持8个多边形点验证)。**
 +
 +```javascript
 +function InPoly( pos: Vector, p1: Vector, p2: Vector, p3: Vector, p4: Vector = null, p5: Vector = null, p6: Vector = null, p7: Vector = null, p8: Vector = null ): bool
 +```
 +```javascript
 +DLog(InPoly(Vector(0, 0, 0), Vector(-10, 0, -10), Vector(-10, 0, 10), Vector(10, 0, 10), Vector(10, 0, -10))); //返回true
 +```
 +
 +
 +
 +### GetLanguage()
 +
 +> 获取**当前[引擎语言](developer/mod/language)的==标准英文名称==**(在部分情况下,可能会出现引擎语言与模组语言不同的情况,这里返回的是引擎语言)。
 +>
 +> **例如:沙盘引擎本体支持A语言,但当前模组可能仅支持B语言,此时返回的是A语言的标准英文名称。**
 +>
 +> ==通常情况下,开发者应该主动参考此方法获得的语言名称。此方法也会在游戏启动时自动识别`GetSystemLanguage()`系统语言兼容。==
 +
 +```javascript
 +function GetLanguage(): string
 +```
 +
 +
 +
 +### GetModLanguage()
 +
 +> 获取**当前[模组语言](developer/mod/language)的==标准英文名称==**(在部分情况下,可能会出现引擎语言与模组语言不同的情况,这里返回的是模组语言)。
 +>
 +> **例如:沙盘引擎默认暂不支持A语言,但当前模组支持B语言,此时返回的是B语言的标准英文名称。**
 +
 +```javascript
 +function GetLanguage(): string
 +```
 +
 +
 +
 +### GetSystemLanguage()
 +
 +> 获取**当前[系统识别语言](developer/mod/language)的==标准英文名称==**,此方法仅供参考用户系统语言。
 +>
 +
 +```javascript
 +function GetLanguage(): string
 +```
 +
 +
 +
 +### GetLanguageText()
 +
 +> 获取[游戏语言文件](developer/mod/language)的解析内容(根据Key),**此函数是获取【不同语言文本翻译结果】的正确方法**。
 +
 +```javascript
 +function GetLanguageText( key: string, params: any... ): string
 +function GetLanguageText( key: string, index: int = 0, params: any... ): string
 +```
 +
 +- `key`:游戏语言文件内的完整路径
 +- `index`:可省略参数,表示语言结构数组索引,默认或省略为`0`
 +- `params`:如果目标语言文本拥有`{0}{1}{2}`占位替换符号,可以根据索引填写后续参数
 +
 +> 此方法的使用扩展性比较强,几乎可覆盖大多数多语言文本需求。
 +
 +```javascript
 +GetLanguageText("Native.Common.Exception"); //"发生异常错误!"
 +```
 +
 +
 +
 +### GetVectorPoints()
 +
 +> 获取当前世界所有满足`Tag`标签筛选的`VectorPoint`坐标点**对象结果数据**。
 +>
 +> **具体`VectorPoint`数值对象参考本文上方`Type`部分。**
 +>
 +> **==注意:通过此方法获取的对象允许进行set修改其内部属性,仅限本地使用,不会同步到其他客户端。==**
 +
 +```javascript
 +function GetVectorPoints( tag: string ): VectorPointResult
 +```
 +
 +```javascript
 +//Test Code
 +let tag = "test";
 +let result = GetVectorPoints(tag);
 +for(let i=0;i<result.GetCount();i++)
 +{
 +    let getResult = result.Get(i);
 +    DLog(getResult.Tag + ": " + getResult.Pos);
 +}
 +```
 +
 +
 +
 +### AddVectorPoint()
 +
 +> 增加一条指定`Tag`标签的`VectorPoint`坐标点**对象**,如果不需要`Tag`标签也可以留空(这会导致无法通过`RemoveVectorPoint()`针对删除)。
 +
 +```javascript
 +function AddVectorPoint( tag: string, pos: Vector, angle: Vector = null, scale: Vector = null ): VectorPoint
 +```
 +
 +```javascript
 +//Test Code
 +AddVectorPoint("", Vector(10, 0, 0));
 +AddVectorPoint("HomePos", Vector(10, 0, 0), Vector(0, 0, 0));
 +```
 +
 +
 +
 +### RemoveVectorPoint()
 +
 +> 移除**所有**符合指定`Tag`标签条件的`VectorPoint`坐标点**对象**(也可以留空`Tag`标签,会删除所有坐标点对象)。
 +
 +```javascript
 +function RemoveVectorPoint( tag: string = "" )
 +```
 +
 +```javascript
 +//Test Code
 +RemoveVectorPoint();
 +RemoveVectorPoint("HomePos");
 +```
 +
 +
 +
 +### FormatRichText()
 +
 +> 格式化指定文本为引擎富文本(并非传统意义的`Richtext`),这将使一段文本执行以下操作:**链接地址标蓝、@玩家名(高亮)、#数字(根据ID转换为Texture图片或Emoji表情)**。
 +>
 +> **==注意:沙盘引擎只有默认`OnPlayerChat`聊天事件自动执行格式化(也可拦截重写),其他相关文本传递功能(`Message | Announce | Subtitle...`)如需高亮等效果需要前置格式化。==**
 +
 +```javascript
 +function FormatRichText( text: string, onlyEmoji: bool = false )
 +```
 +
 +- `onlyEmoji`:如果设置为`true`,则`#Number`的行为将被识别为表情(0~74),否则`#Number`将识别全局`TextureID`。
 +
 +```javascript
 +FormatRichText("#0", false); //Out id 0 (Asset Texture_0, not emoji)
 +FormatRichText("#0", true); //Out id 200 (Emoji Texture, 200~274 is emoji texture)
 +```
 +
 +
 +
 +### FormatDefineText()
 +
 +> 格式化指定文本为[引擎宏文本](reference/define "引擎宏文本"),这将使一段文本自动将宏文本替换为最终结果。
 +
 +```javascript
 +function FormatDefineText( text: string, includeColor: bool = true )
 +```
 +
 +- `includeColor`:如果设置为`true`,则正确识别的宏文本将附带颜色代码。
 +
 +```javascript
 +Message("Your EngineVersion: %EngineVersion%"); //"Your EngineVersion: V0.77"
 +```
 +
 +
 +
 +### ExistImmunityFlag()
 +
 +> 检查对象[伤害免疫数值](reference/instances "伤害免疫数值")是否包含指定Flag。
 +
 +```javascript
 +function ExistImmunityFlag( immunity: int, checkFlag: int )
 +```
 +
 +```javascript
 +DLog(ExistImmunityFlag(6, 1)); //AntiNormal: false
 +DLog(ExistImmunityFlag(6, 2)); //AntiBullet: true
 +DLog(ExistImmunityFlag(6, 4)); //AntiExplode: true
 +```
 +
 +
 +
 +### GetRandomPoint()
 +
 +> 获取指定坐标范围内的随机坐标点(受建筑碰撞影响)。
 +
 +> 与常规坐标增加随机偏移的方式不同,此方法将尝试**最终定位坐标点在任何地面上**。
 +
 +```javascript
 +function GetRandomPoint( pos: Vector, radius: float, changeHeight: bool = false )
 +```
 +
 +- `changeHeight`:高度坐标是否参与随机,默认为`false`(即只计算X\Z轴)
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +</markdown>