meta data for this page
📚 差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
scripting:native:core [2025/06/13 07:47] – 移除 - 外部编辑 (Unknown date) 127.0.0.1 | scripting:native:core [2025/07/11 13:56] (当前版本) – bibiboxs | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | < | ||
+ | # ==Native/ | ||
+ | 原生脚本是一个内置的通用脚本功能类,此分类下还有更多通用的扩展工具类。 | ||
+ | |||
+ | > 标注原生(Native)类型的常量、类型、事件、函数方法等,它们都基于原生`Native`类。 | ||
+ | |||
+ | [note2] | ||
+ | ==此文档内代码均可在**Client**和**World**脚本及其子脚本直接进行使用。== | ||
+ | [/note] | ||
+ | |||
+ | |||
+ | ## Const | ||
+ | |||
+ | ### VECTOR_NULL | ||
+ | |||
+ | > 三维坐标默认“空”坐标,通常表示**不合理或者默认值**。 | ||
+ | > | ||
+ | > 由于`Vector`是一个**值类型**,所以表示为空时不应该直接设为`null`,在通常情况下应该使用**常量代替**。 | ||
+ | |||
+ | ```javascript | ||
+ | const VECTOR_NULL = Vector(-128000, | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ## Type | ||
+ | |||
+ | ### Vector() | ||
+ | |||
+ | > 三维坐标结构类型,沙盘引擎世界坐标的通用形式,其中Y轴表示高度。 | ||
+ | > | ||
+ | > **==此方法必须使用`Equals()`判断相等。==** | ||
+ | |||
+ | ```javascript | ||
+ | let pos = Vector(0, 0, 10); //X, Y, Z | ||
+ | |||
+ | //Extend | ||
+ | pos.magnitude; | ||
+ | pos.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) | ||
+ | { | ||
+ | // | ||
+ | DLog(" | ||
+ | return; | ||
+ | } | ||
+ | | ||
+ | // | ||
+ | DLog(" | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ## 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)); | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### LoadScript() | ||
+ | |||
+ | > 加载**脚本目录**下其他脚本文件(js)。 | ||
+ | > | ||
+ | > 目标脚本将续写当前代码作用域(续写),**共享**当前脚本环境的代码,开发者应避免主副脚本之间使用相同名称的变量及方法等。 | ||
+ | > | ||
+ | > **此方法适合对目录规范有需求的开发者,或者制作模块化功能使用。** | ||
+ | |||
+ | [note2] | ||
+ | 注意:此方法目前不支持[脚本插件](developer/ | ||
+ | [/note] | ||
+ | |||
+ | ```javascript | ||
+ | function LoadScript( path: string ) | ||
+ | ``` | ||
+ | |||
+ | - `path`:脚本目录下的 同级或子级 脚本文件路径(例如:`Test/ | ||
+ | |||
+ | ```javascript | ||
+ | //Path Rule | ||
+ | LoadScript(" | ||
+ | LoadScript(" | ||
+ | LoadScript(" | ||
+ | LoadScript(" | ||
+ | |||
+ | //Test | ||
+ | LoadScript(" | ||
+ | TestAction(); | ||
+ | |||
+ | //Test.js | ||
+ | function TestAction() | ||
+ | { | ||
+ | DLog(" | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | [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(" | ||
+ | DLog(" | ||
+ | }); | ||
+ | |||
+ | function OnPlayerJoin( player ) | ||
+ | { | ||
+ | DLog(" | ||
+ | } | ||
+ | |||
+ | //Output | ||
+ | //" | ||
+ | //" | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | Env.AddListener(" | ||
+ | DLog(" | ||
+ | }); | ||
+ | |||
+ | function OnPlayerJoin( player ) | ||
+ | { | ||
+ | DLog(" | ||
+ | } | ||
+ | |||
+ | //Output | ||
+ | //" | ||
+ | //" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### Env.RemoveListener() | ||
+ | |||
+ | > 移除一个`function()`事件监听。 | ||
+ | |||
+ | ```javascript | ||
+ | function Env.RemoveListener( eventHash: string ) | ||
+ | ``` | ||
+ | |||
+ | - `eventHash`:希望取消监听的`eventHash`,通过`AddListener()`返回值获取 | ||
+ | |||
+ | ```javascript | ||
+ | let listenerHash = Env.AddListener(" | ||
+ | DLog(" | ||
+ | }); | ||
+ | |||
+ | Env.RemoveListener(listenerHash); | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### Env.Emit() | ||
+ | |||
+ | > 手动触发一个`function()`事件及监听。 | ||
+ | |||
+ | ```javascript | ||
+ | function Env.Emit( functionName: | ||
+ | ``` | ||
+ | |||
+ | - `functionName`:触发的函数\事件名称 | ||
+ | - `params`:附带参数(如存在) | ||
+ | |||
+ | ```javascript | ||
+ | Env.Emit(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### CreateHost() | ||
+ | |||
+ | > 建立一个当前模组的服务器\房间世界。 | ||
+ | > | ||
+ | > 任何情况下,使用此方法都将**直接断开当前服务器并建立新的服务器**,请确保相关数据提前保存。 | ||
+ | > | ||
+ | > **补充:如果不填写任何参数,则表示加载到初始入口世界(`Main`世界)。** | ||
+ | > | ||
+ | > **==注意:我们建议不指定固定的端口号,而是使用`Mod.json -> NetworkPort`机制设定模组端口,并设置当前方法参数`Port=0`(自动识别模组`NetworkPort`)。==** | ||
+ | |||
+ | ```javascript | ||
+ | function CreateHost( map: string, script: string, port: int = 0, address: string = "", | ||
+ | ``` | ||
+ | |||
+ | > 载入并创建一个地图为“test2”且脚本为“Main2”的服务器。 | ||
+ | |||
+ | ```javascript | ||
+ | CreateHost(" | ||
+ | ``` | ||
+ | |||
+ | > 载入并创建一个地图为“test2”且脚本为“Main2”,端口指定为8195的服务器(0为默认端口,并非随机端口)。 | ||
+ | > | ||
+ | > 默认端口配置文件:Mod.json `[" | ||
+ | |||
+ | ```javascript | ||
+ | CreateHost(" | ||
+ | ``` | ||
+ | |||
+ | > 载入并创建一个地图为“test2”且脚本为“Main2”,端口随意,但使用SteamP2P网络的房间(地址参数填写`steam`)。 | ||
+ | |||
+ | ```javascript | ||
+ | CreateHost(" | ||
+ | ``` | ||
+ | |||
+ | > `UserData`参数可传递给服务器一个前置字符串参数(长度限制0~256,可用Json扩展),可提前告知服务器一些【玩家自身】自定义信息。 | ||
+ | > | ||
+ | > **(World脚本可用player.UserData读取内容)** | ||
+ | |||
+ | ```javascript | ||
+ | CreateHost(" | ||
+ | ``` | ||
+ | |||
+ | > `additional`参数可指定是否使用地图附加内容(例如:地图内创建的载具),默认为`true`,如果只希望加载纯净的地图则设置为`false`。 | ||
+ | |||
+ | ```javascript | ||
+ | CreateHost(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### ConnectHost() | ||
+ | |||
+ | > 连接并加载到指定的多人游戏服务器,开发者应自行编写代码,确保参数信息正确。 | ||
+ | > | ||
+ | > 任何情况下,使用此方法都将**直接断开当前服务器并尝试连接到新的服务器**。 | ||
+ | |||
+ | ```javascript | ||
+ | function ConnectHost(address: | ||
+ | ``` | ||
+ | |||
+ | > 尝试连接并加载到指定IP地址的服务器 | ||
+ | > | ||
+ | > 方法与CreateHost部分相同,`0`表示默认端口,服务器密码可空 | ||
+ | > | ||
+ | > `UserData`参数可传递给服务器一个前置字符串参数(长度限制0~256,可用Json扩展),可提前告知服务器一些【玩家自身】自定义信息 | ||
+ | > | ||
+ | > **(World脚本可用player.UserData读取内容)** | ||
+ | |||
+ | ```javascript | ||
+ | ConnectHost(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### Disconnect() | ||
+ | |||
+ | > 断开当前正在连接的服务器\房间\世界,并回到入口场景(`Main`)。 | ||
+ | > | ||
+ | > 任何情况下,使用此方法都将**直接断开当前服务器**。 | ||
+ | |||
+ | ```javascript | ||
+ | function Disconnect() | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### Reconnect() | ||
+ | |||
+ | > 断开当前正在连接的服务器\房间\世界,并尝试重新连接到上次的服务器(如果没有记录,则不会生效)。 | ||
+ | > | ||
+ | > 任何情况下,使用此方法都将**直接断开当前服务器**。 | ||
+ | > | ||
+ | |||
+ | ```javascript | ||
+ | function Reconnect() | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### IsServerMode() | ||
+ | |||
+ | > 获取当前是否为**服务端模式**(仅作为专用服务器启动,通常由`bat`格式扩展)。 | ||
+ | |||
+ | ```javascript | ||
+ | function IsServerMode(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### IsNewPlayer() | ||
+ | |||
+ | > 判断当前是否为**玩家初次进入此模组**。 | ||
+ | |||
+ | ```javascript | ||
+ | function IsNewPlayer(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### IsHost() | ||
+ | |||
+ | > 判断当前是否为**服务器\主机模式**,反之则为常规客户端。 | ||
+ | |||
+ | ```javascript | ||
+ | function IsHost(): bool | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetVersionInfo() | ||
+ | |||
+ | > 获取**沙盘引擎版本信息**。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetVersionInfo(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetModPackage() | ||
+ | |||
+ | > 获取**当前模组包名**。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetModPackage(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetModName() | ||
+ | |||
+ | > 获取**当前模组名称**(本地化翻译)。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetModName(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetEngineTickCount() | ||
+ | |||
+ | > 获取**游戏启动**至此已运行的时间(秒)。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetEngineTickCount(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetModTickCount() | ||
+ | |||
+ | > 获取**模组启动**至此已运行的时间(秒)。 | ||
+ | > | ||
+ | > 如果期间发生了延迟加载、重载模组等情况,此时间也会被随之重置。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetModTickCount(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetDateTime() | ||
+ | |||
+ | > 获取**系统时间**。 | ||
+ | > | ||
+ | > 返回格式会按照`yyyy-MM-dd|HH: | ||
+ | |||
+ | ```javascript | ||
+ | function GetDateTime(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetTimestamp() | ||
+ | |||
+ | > 获取**Unix时间戳**(格林威治时间1970年01月01日00时00分00秒)。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetDateTime(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetNetworkTime() | ||
+ | |||
+ | > 获取**服务器同步时间**,服务器至此运行了多长时间(秒)。 | ||
+ | > | ||
+ | > **此数值无论是服务端\客户端执行,均取得最新同步后时间。** | ||
+ | |||
+ | ```javascript | ||
+ | function GetNetworkTime(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetDeltaTime() | ||
+ | |||
+ | > 获取**游戏帧增量时间**。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetDeltaTime(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### Env.SetGlobalVars() | ||
+ | |||
+ | > 设置一个**全局变量(可跨脚本使用)**,支持绝大部分类型的JavaScript变量(如:数组、对象等)。 | ||
+ | > | ||
+ | > 此功能可善用扩展,例如:菜单界面设置【服务器名称、服务器模式等】全局变量对象,待服务器加载完毕事件读取,并根据数值来修改逻辑。 | ||
+ | > | ||
+ | > 如果一个全局变量不再使用,可以将其设置为`value = null`删除全局变量。 | ||
+ | |||
+ | [note] | ||
+ | 注意:`Startup`作为[前置配置文件](developer/ | ||
+ | [/note] | ||
+ | |||
+ | ```javascript | ||
+ | function Env.SetGlobalVars( key: string, value: any ) | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | // | ||
+ | Env.SetGlobalVars(" | ||
+ | |||
+ | // | ||
+ | Env.SetGlobalVars(" | ||
+ | serverName: " | ||
+ | gameMode: 1, | ||
+ | openPVP: false | ||
+ | }); | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### Env.GetGlobalVars() | ||
+ | |||
+ | > 读取一个全局变量(可跨脚本使用),支持绝大部分类型的JavaScript变量(如:数组、对象等)。 | ||
+ | > | ||
+ | > 如指定`key`不存在则返回`null`。 | ||
+ | |||
+ | ```javascript | ||
+ | function Env.GetGlobalVars( key: string ): any | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | // | ||
+ | Env.SetGlobalVars(" | ||
+ | serverName: " | ||
+ | gameMode: 1, | ||
+ | openPVP: false | ||
+ | }); | ||
+ | |||
+ | // | ||
+ | let getConfig = Env.GetGlobalVars(" | ||
+ | DLog(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetScriptName() | ||
+ | |||
+ | > 获取**当前加载脚本**的名称。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetScriptName(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetScriptNames() | ||
+ | |||
+ | > 获取**当前模组**存在的全部脚本名称(`StringValueResult`),可使用`Get() | GetCount()`遍历使用。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetScriptNames(): | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | let scriptsResult = GetScriptNames(); | ||
+ | for(let i=0; | ||
+ | { | ||
+ | DLog(scriptsResult.Get(i)); | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetCurrentScriptNames() | ||
+ | |||
+ | > 获取**当前正在使用脚本**下存在的全部脚本名称(`StringValueResult | *.js`),包含子目录及后缀名,可使用`Get() | GetCount()`遍历使用。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetCurrentScriptNames(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetPluginNames() | ||
+ | |||
+ | > 获取**当前模组**存在的全部插件名称(即使没有被加载)(`StringValueResult`),可使用`Get() | GetCount()`遍历使用。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetPluginNames(): | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | let scriptsResult = GetPluginNames(); | ||
+ | for(let i=0; | ||
+ | { | ||
+ | DLog(scriptsResult.Get(i)); | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetCurrentPluginNames() | ||
+ | |||
+ | > 获取**当前正在使用脚本**已加载完成的全部插件名称(`StringValueResult | *.js`),可使用`Get() | GetCount()`遍历使用。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetCurrentPluginNames(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetGameFPS() | ||
+ | |||
+ | > 获取当前游戏FPS帧数。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetGameFPS(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetMapName() | ||
+ | |||
+ | > 获取当前正在使用的地图文件名(不包含后缀),可用作判定特定地图。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetMapName(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### 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; | ||
+ | { | ||
+ | DLog(i + ">" | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GenerateUUID() | ||
+ | |||
+ | > 生成一段唯一的UUID字符串(GUID)。 | ||
+ | > | ||
+ | > 在绝大部分情况下,由此方法生成的UUID应该是全球唯一的。 | ||
+ | |||
+ | ```javascript | ||
+ | function GenerateUUID(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### 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/ | ||
+ | |||
+ | ```javascript | ||
+ | function IsLogicFrame(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### RayTrace() | ||
+ | |||
+ | > 生成一条**检测射线**,可用于检测**两点之间**实体对象的碰撞。 | ||
+ | > | ||
+ | > 如果只希望获取`Entity`部分类型,可使用`layer`参数进行[实体类型层(位)](reference/ | ||
+ | > | ||
+ | > **注意:此方法会检测世界地形(除非参数`includeTerrain = false`),如果`IsHit == true && Entity == null`,表示最终检测到地形**。 | ||
+ | |||
+ | ```javascript | ||
+ | function RayTrace( start: Vector, over: Vector, layer: int = 0, includeTerrain: | ||
+ | ``` | ||
+ | |||
+ | - `start`:起始点 | ||
+ | - `over`:结束点 | ||
+ | - `layer`:筛选layer层,默认为`0`,可用于筛选判断[实体类型层(位)](reference/ | ||
+ | - `RayTraceResult`:返回值([类型参考](scripting/ | ||
+ | |||
+ | ```javascript | ||
+ | // | ||
+ | let result = RayTrace(Vector(0, | ||
+ | DLog(result.IsHit); | ||
+ | DLog(result.Point); | ||
+ | DLog(result.Entity) | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### OverlapEntity() | ||
+ | |||
+ | > **获取指定位置+范围的世界实体**(某坐标指定范围内所有对象),可用于检测指定位置的范围内实体对象(基于`Entity`的核心对象)。 | ||
+ | > | ||
+ | > 如果只希望获取`Entity`部分类型,可使用`filter`参数进行[实体类型层(位)](reference/ | ||
+ | |||
+ | [note2] | ||
+ | |||
+ | 此方法最终返回`OverlapEntityResult`结构,可使用`GetCount() | Get()`方法进行遍历结果。 | ||
+ | |||
+ | [/note] | ||
+ | |||
+ | ```javascript | ||
+ | function OverlapEntity( pos: Vector, radius: float, filter: int = 0 ): OverlapEntityResult | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | //Only check ' | ||
+ | let result = OverlapEntity(Vector(0, | ||
+ | |||
+ | //Result | ||
+ | result.GetCount(); | ||
+ | result.Get(0); | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | let result = OverlapEntity(Vector(0, | ||
+ | if(result.GetCount() > 0) | ||
+ | { | ||
+ | let getEntity = result.Get(0); | ||
+ | | ||
+ | DLog(getEntity.GetType()); | ||
+ | DLog(getEntity.GetInstance()); | ||
+ | } | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### OverlapPlayer() | ||
+ | |||
+ | > **获取指定位置+范围的玩家对象**(某坐标指定范围内所有可见玩家)。 | ||
+ | > | ||
+ | > **注意:玩家`Player`是一个非实体类型,这里获取的是所有视角(`player.Pos`)在范围内的玩家。** | ||
+ | |||
+ | [note2] | ||
+ | |||
+ | 此方法最终返回`OverlapEntityResult`结构,可使用`GetCount() | Get()`方法进行遍历结果。 | ||
+ | |||
+ | [/note] | ||
+ | |||
+ | ```javascript | ||
+ | function OverlapPlayer( pos: Vector, radius: float ): OverlapEntityResult | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | let result = OverlapPlayer(Vector(0, | ||
+ | if(result.GetCount() > 0) | ||
+ | { | ||
+ | let getPlayer = result.Get(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, | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetLanguage() | ||
+ | |||
+ | > 获取**当前[引擎语言](developer/ | ||
+ | > | ||
+ | > **例如:沙盘引擎本体支持A语言,但当前模组可能仅支持B语言,此时返回的是A语言的标准英文名称。** | ||
+ | > | ||
+ | > ==通常情况下,开发者应该主动参考此方法获得的语言名称。此方法也会在游戏启动时自动识别`GetSystemLanguage()`系统语言兼容。== | ||
+ | |||
+ | ```javascript | ||
+ | function GetLanguage(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetModLanguage() | ||
+ | |||
+ | > 获取**当前[模组语言](developer/ | ||
+ | > | ||
+ | > **例如:沙盘引擎默认暂不支持A语言,但当前模组支持B语言,此时返回的是B语言的标准英文名称。** | ||
+ | |||
+ | ```javascript | ||
+ | function GetLanguage(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetSystemLanguage() | ||
+ | |||
+ | > 获取**当前[系统识别语言](developer/ | ||
+ | > | ||
+ | |||
+ | ```javascript | ||
+ | function GetLanguage(): | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetLanguageText() | ||
+ | |||
+ | > 获取[游戏语言文件](developer/ | ||
+ | |||
+ | ```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(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetVectorPoints() | ||
+ | |||
+ | > 获取当前世界所有满足`Tag`标签筛选的`VectorPoint`坐标点**对象结果数据**。 | ||
+ | > | ||
+ | > **具体`VectorPoint`数值对象参考本文上方`Type`部分。** | ||
+ | > | ||
+ | > **==注意:通过此方法获取的对象允许进行set修改其内部属性,仅限本地使用,不会同步到其他客户端。==** | ||
+ | |||
+ | ```javascript | ||
+ | function GetVectorPoints( tag: string ): VectorPointResult | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | //Test Code | ||
+ | let tag = " | ||
+ | let result = GetVectorPoints(tag); | ||
+ | for(let i=0; | ||
+ | { | ||
+ | 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("", | ||
+ | AddVectorPoint(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### RemoveVectorPoint() | ||
+ | |||
+ | > 移除**所有**符合指定`Tag`标签条件的`VectorPoint`坐标点**对象**(也可以留空`Tag`标签,会删除所有坐标点对象)。 | ||
+ | |||
+ | ```javascript | ||
+ | function RemoveVectorPoint( tag: string = "" | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | //Test Code | ||
+ | RemoveVectorPoint(); | ||
+ | RemoveVectorPoint(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### FormatRichText() | ||
+ | |||
+ | > 格式化指定文本为引擎富文本(并非传统意义的`Richtext`),这将使一段文本执行以下操作:**链接地址标蓝、@玩家名(高亮)、# | ||
+ | > | ||
+ | > **==注意:沙盘引擎只有默认`OnPlayerChat`聊天事件自动执行格式化(也可拦截重写),其他相关文本传递功能(`Message | Announce | Subtitle...`)如需高亮等效果需要前置格式化。==** | ||
+ | |||
+ | ```javascript | ||
+ | function FormatRichText( text: string, onlyEmoji: bool = false ) | ||
+ | ``` | ||
+ | |||
+ | - `onlyEmoji`:如果设置为`true`,则`# | ||
+ | |||
+ | ```javascript | ||
+ | FormatRichText("# | ||
+ | FormatRichText("# | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### FormatDefineText() | ||
+ | |||
+ | > 格式化指定文本为[引擎宏文本](reference/ | ||
+ | |||
+ | ```javascript | ||
+ | function FormatDefineText( text: string, includeColor: | ||
+ | ``` | ||
+ | |||
+ | - `includeColor`:如果设置为`true`,则正确识别的宏文本将附带颜色代码。 | ||
+ | |||
+ | ```javascript | ||
+ | Message(" | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### ExistImmunityFlag() | ||
+ | |||
+ | > 检查对象[伤害免疫数值](reference/ | ||
+ | |||
+ | ```javascript | ||
+ | function ExistImmunityFlag( immunity: int, checkFlag: int ) | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | DLog(ExistImmunityFlag(6, | ||
+ | DLog(ExistImmunityFlag(6, | ||
+ | DLog(ExistImmunityFlag(6, | ||
+ | ``` | ||
+ | |||
+ | |||
+ | |||
+ | ### GetRandomPoint() | ||
+ | |||
+ | > 获取指定坐标范围内的随机坐标点(受建筑碰撞影响)。 | ||
+ | > | ||
+ | > 与常规坐标增加随机偏移的方式不同,此方法将尝试**最终定位坐标点在任何地面上**。 | ||
+ | |||
+ | ```javascript | ||
+ | function GetRandomPoint( pos: Vector, radius: float, changeHeight: | ||
+ | ``` | ||
+ | |||
+ | - `changeHeight`:高度坐标是否参与随机,默认为`false`(即只计算X\Z轴) | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </ |