meta data for this page
  •  

📚 差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
scripting:world:player [2024/07/27 03:06] bibiboxsscripting:world:player [2025/08/29 15:50] (当前版本) bibiboxs
行 12: 行 12:
 ### OnPlayerJoin( player ) ### OnPlayerJoin( player )
  
-> 当新玩家加入主机房间时调用。+> 当新玩家**加入主机**时调用,此事件通常较少使用。
 > >
-==注意:此时玩家只是连接成功,并非加载完成,完整加载使用`OnPlayerComplete`。==+> 注意:此时玩家只是连接成功,并非加载完成,完整加载使用`OnPlayerComplete`。
  
  
行 20: 行 20:
 ### OnPlayerComplete( player ) ### OnPlayerComplete( player )
  
-> 当玩家完全加载完成时调用。+> 当玩家**完全加载**时调用。
 > >
-==此事件是获取玩家完全载入状态正确方法==+通常情况下,应该使用此事件作为玩家的**入口事件**
  
  
行 28: 行 28:
 ### OnPlayerPart ( player, reason ) ### OnPlayerPart ( player, reason )
  
-> 当玩家离开房间时调用。+> 当玩家**离开主机**时调用。 
 +>  
 +> 注意:如果玩家是主机,且直接关闭游戏进程时,此方法可能**不会按照预期**工作
  
 - **Reason:**离开原因(int)(0=断开连接;1=被服务器踢出;2=被服务器封禁) - **Reason:**离开原因(int)(0=断开连接;1=被服务器踢出;2=被服务器封禁)
行 38: 行 40:
 > 当玩家发送消息时调用。 > 当玩家发送消息时调用。
 > >
-> 此事件有返回值机制,如果返回为`false`则不使用内置的聊天输出机制不会输出任何消息),默认返回`true`。+> 此事件有**返回值机制**,如果返回为`false`则不使用内置的聊天输出(不会输出任何消息),默认返回`true`。
 > >
-*如果有自定义输出聊天样式需求,可以通过`return 0`然后使用`Message("[color#=ff0000]"+player.Name+":"+text)`等方式实现自定义*+> 如果有**自定义聊天样式**需求,可以通过`return 0`然后使用`Message("[color#=ff0000]"+player.Name+":"+text)`等方式实现。
 > >
-**注意:沙盘引擎默认聊天消息经过了`Native.FormatRichText()`格式化,这将使文本支持[URL\@AT\Emoji]等高亮显示,如果有自定义Chat需求并希望支持这些功能,可以在手动发送Message前使用API格式化一次。**+> 注意:默认聊天消息经过了`Native.FormatRichText()`格式化,这将使文本支持`[URL\@AT\Emoji]`等高亮显示,如果有自定义输出需求并希望支持这些功能,可以在手动发送Message前使用API格式化一次。** 
 + 
 +[note] 
 +游戏聊天框默认支持`UBB|HTML`格式的消息,如果不希望玩家随意使用,可以通过`Misc.IsUBBText()`或其他方式检测文本,并决定哪些内容允许被发送。 
 +[/note]
  
 ```javascript ```javascript
行 54: 行 60:
 ``` ```
  
 +
 +
 +### OnPlayerNetworkCMD( player, cmd, arg0, arg1, arg2 )
 +
 +> 当接收到来自玩家客户端发送的**CMD消息**时调用,这是客户端与服务端**传输自定义信息**的方式之一。
 +>
 +> **对于一些特殊情况,可以利用`json to string`进行更详细的内容传输。**
 +
 +[note2]
 +
 +注意:`CMD\RPC`传输支持几个基础类型(`int | float | string | bool | Vector | Color`)。
 +
 +[/note]
  
  
行 93: 行 112:
 ```javascript ```javascript
 function OnPlayerVoiceStateChange( player: Player, state: bool ) function OnPlayerVoiceStateChange( player: Player, state: bool )
 +```
 +
 +
 +
 +### OnPlayerFocusEntityChange( player, entity )
 +
 +> 当玩家焦点对象发生改变时调用。
 +
 +```javascript
 +function OnPlayerFocusEntityChange( player: Player, entity: Entity )
 ``` ```
  
行 111: 行 140:
 ### OnPlayerKeyDown( player, keyTag ) ### OnPlayerKeyDown( player, keyTag )
  
-> 当玩家按下**服务器绑定按键**时调用,只有服务器绑定的按键才会触发。+> 当玩家按下**服务器监听按键**时调用,只有服务器监听的按键(`RegisterKeyListener`)才会触发。
  
  
行 117: 行 146:
 ### OnPlayerKeyUp( player, keyTag ) ### OnPlayerKeyUp( player, keyTag )
  
-> 当玩家抬起**服务器绑定按键**时调用,只有服务器绑定的按键才会触发。+> 当玩家抬起**服务器监听按键**时调用,只有服务器监听的按键(`RegisterKeyListener`)才会触发。
  
  
  
-### OnPlayerNativeKeyDown( player, keyTag )+### OnPlayerWorldChange( player, world )
  
-> 当玩家按下**服务器监听的原公开按键**时调用,只有服务器监听的原生按键才会触发+> 当玩家世界ID发改变时调用。
  
  
  
-### OnPlayerNativeKeyUp( player, keyTag )+### OnPlayerColorChange( player, color )
  
-> 当玩家抬起**服务器监听的原公开按键**时调用,只有服务器监听的原生按键才会触发+> 当玩家颜色发改变时调用。
  
  
  
-### OnPlayerWorldChange( player, world )+### OnPlayerNameChange( player, name )
  
-> 当玩家世界ID发生改变时调用。+> 当玩家名称发生改变时调用。
  
  
  
-### OnPlayerColorChange( player, color )+### OnPlayerBackpackPropOperation( player, slot, isMain, isShift )
  
-> 当玩家颜色发生改变时调用。+> 当玩家背包请求操作物品时调用。 
 +
 +> 此方法可配合`player.GetBackpackTempProp()`使用。 
 + 
 +- `isMain`:是否为左键(主要)点击(否则为右键) 
 +- `isShift`:是否按住Shift键 
 +- `return`:默认返回`true`,决定是否允许后续操作 
 + 
 + 
 + 
 +### OnPlayerBackpackPropDiscard( player, prop, isDelete ) 
 + 
 +> 当玩家背包请求扔掉物品时调用。 
 + 
 +- `isDelete`:是否为请求删除物品(否则视为丢弃) 
 +- `return`:默认返回`true`,决定是否允许后续操作
  
  
行 229: 行 273:
 | 索引 | 版本                 | | 索引 | 版本                 |
 | ---- | -------------------- | | ---- | -------------------- |
-| 0    | 免费版(Demo\Steam) | +| 0    | 标准版(Demo\Steam) | 
-| 1    | 标准版(Steam)      |+| 1    | 白金版(Steam+DLC)  |
  
  
行 246: 行 290:
 | ---- | ------------------------------------- | | ---- | ------------------------------------- |
 | 0    | 本地用户,非Steam用户(可能非安全的) | | 0    | 本地用户,非Steam用户(可能非安全的) |
-| 1    | Steam用户(包含免费版+标准版)        |+| 1    | Steam用户(标准版\白金版)            |
  
  
行 290: 行 334:
 > >
 > **注意:如果世界被修改时玩家绑定的`Character`已存在,那么将同步`Character`修改为新的World,并且不会解除绑定控制。如果不希望这样,可以提前`player.SetEntity(null)`解除绑定,再修改World。** > **注意:如果世界被修改时玩家绑定的`Character`已存在,那么将同步`Character`修改为新的World,并且不会解除绑定控制。如果不希望这样,可以提前`player.SetEntity(null)`解除绑定,再修改World。**
-+>
 > **==注意:`player.UniqueWorld`的机制是`10000 + player.ID`,因此应该避免手动将世界设置为`10000`及以上的数值。==** > **==注意:`player.UniqueWorld`的机制是`10000 + player.ID`,因此应该避免手动将世界设置为`10000`及以上的数值。==**
  
行 302: 行 346:
  
 > 获取玩家**私人同步世界ID**,此项与`player.World`功能相似,不同的是,如果将某个对象设置为`player.UniqueWorld`,则指定对象只有此玩家可见,哪怕此玩家仍然在默认世界(0)。 > 获取玩家**私人同步世界ID**,此项与`player.World`功能相似,不同的是,如果将某个对象设置为`player.UniqueWorld`,则指定对象只有此玩家可见,哪怕此玩家仍然在默认世界(0)。
-+>
 > **==注意:`player.UniqueWorld`的机制是`10000 + player.ID`,因此应该避免手动将世界设置为`10000`及以上的数值。==** > **==注意:`player.UniqueWorld`的机制是`10000 + player.ID`,因此应该避免手动将世界设置为`10000`及以上的数值。==**
  
行 336: 行 380:
  
 > 获取玩家绑定的实体对象(角色)。 > 获取玩家绑定的实体对象(角色)。
 +
 +> 此方法也可以设置赋值对象(等同于`player.SetEntity(value, true)`,默认执行`isBind`)。
  
 ```javascript ```javascript
行 349: 行 395:
 ```javascript ```javascript
 player.Character: Character player.Character: Character
 +```
 +
 +
 +
 +### player.IsAdmin
 +
 +> 设置玩家**是否为管理员**,管理员可通过`TAB`菜单进行基础的玩家管理。
 +>
 +> 通常情况下,此属性是一个验证管理员权限的**预制抽象属性**,开发者可考虑自行编写更高级的管理员系统。
 +
 +> 如果服务器由**本地主机**建立,主机玩家会自动激活此属性。
 +
 +```javascript
 +player.IsAdmin = false;
 ``` ```
  
行 375: 行 435:
 ### player.FocusPos ### player.FocusPos
  
-> 获取玩家控制焦点坐标,如果玩家正在控制一个角色,则两者坐相同(同步于此属性)。+> 获取玩家视角焦点坐标(屏幕中心、准星&位置)。
 > >
-> 在玩家不同视角模式(`Client.Camera.Mode`)下(鸟瞰、第三人称),此部分的坐标获取方式会发生变化。+> 在玩家不同视角模式(`Client.Camera.Mode`)下(鸟瞰、第一人称、第三人称),坐标获取方式会发生变化。
 > >
-> 主要表现于:鸟瞰】基于陆地坐标;【第三人称屏幕准星焦点+> 主要表现于:[鸟瞰]鼠标坐标、[第三人称]屏幕准星坐标
  
 ```javascript ```javascript
行 387: 行 447:
  
  
-### player.Angle+### player.FocusEntity
  
-> 获取玩家**屏幕方向**角度+> 获取玩家**视角焦点实体**,如果不存在则返回`null`
  
 ```javascript ```javascript
-player.Anglefloat+player.FocusEntityEntity
 ``` ```
  
  
  
-### player.EngineLanguage+### player.FocusEntityDistance
  
-> 获取玩家正在使用引擎语言(如中途改动语言不会更新)。+> 获取玩家**视角焦点实体检测距离**,此数值直接影响`FocusEntity`检测结果,默认距离为`3.0`(`0.0~512.0`)。
 > >
-根据《沙盘引擎》语言机制通常应该采用作为玩家语言的判定+**注意:对于远距离视角、鸟瞰视角等情况,应该在合理范围内调高数值,否则可能距离过短导致无正确检测**
  
 ```javascript ```javascript
-player.EngineLanguagestring+player.FocusEntityDistancefloat
 ``` ```
  
  
  
-### player.ModLanguage+### player.FocusVAngle
  
-> 获取玩家正在使用的模组语言如果中途改动语言,不会更新)。+设置&获取玩家**控制视角上下角度**`Camera.VAngle`)。
  
 ```javascript ```javascript
-player.ModLanguagestring+player.FocusVAnglefloat
 ``` ```
  
  
  
-### player.IsTyping+### player.FocusHAngle
  
-> 获取玩家聊天框输入状态是否正在输入)。+设置&获取玩家**控制视角横向角度**`Camera.HAngle`)。
  
 ```javascript ```javascript
-player.IsTypingbool+player.FocusHAnglefloat
 ``` ```
  
  
  
-### player.IsComplete+### player.FocusEulerAngle
  
-> 获取玩家是否完全加载完毕+设置&获取玩家**控制焦点(游戏视角+屏幕方向)**XY角度(`Vector2(x, y)`) 
 +
 +> 在玩家不同视角模式(`Client.Camera.Mode`)下,坐标处理方式会发生变化。 
 + 
 +[note2] 
 +注意:多数情况下,应该使用`Client\Camera`实现视角相关逻辑。 
 +[/note]
  
 ```javascript ```javascript
-player.IsCompletebool+player.FocusAngleVector2
 ``` ```
  
  
  
-### player.VoiceState+### player.FocusAngleForward
  
-> 获取玩家语音聊天状态(是否正在语音聊天)+> 获取玩家**控制焦点**前方向量
 > >
-**注意:玩家必须`player.SetVoiceAuthority(true)`给予语音权限(默认),且由玩家主动触按键才会进行聊天**+玩家不同视角模式(`Client.Camera.Mode`)坐标处理方式会生变化
  
 ```javascript ```javascript
-player.VoiceStatebool+player.FocusAngleForwardVector2
 ``` ```
  
  
  
-### player.CameraMode+### player.EngineLanguage
  
-> 获取(只读)玩家相机模式参考`Client.Camera.Mode`)。+> 获取玩家正在使用的引擎语言如果中途改动语言,不会更新。 
 +
 +> 根据《沙盘引擎》语言机制,通常应该采用此方法作为玩家语言的判定
  
 ```javascript ```javascript
-player.CameraModeint+player.EngineLanguagestring
 ``` ```
  
  
  
-### player.CameraFreeMode+### player.ModLanguage
  
-设置玩家的相机自由式开关`Client.Camera.FreeMode`)。+获取玩家正在使用的模组语言如果中途改动语言,不会更新)。
  
 ```javascript ```javascript
-player.CameraFreeMode = false; //bool+player.ModLanguage: string
 ``` ```
  
  
  
-### player.CameraSlowMode+### player.IsTyping
  
-设置玩家的相机慢速延迟模式开关`Client.Camera.SlowMode`)。+获取玩家聊天框输入状态是否正在输入)。
  
 ```javascript ```javascript
-player.CameraSlowMode = false; //bool+player.IsTyping: bool
 ``` ```
  
  
  
-### player.AudioReverbInternal+### player.IsComplete
  
-设置玩家的音频混响模式(建筑内部),枚举索引参考[《AudioReverbPreset》](https://docs.unity.cn/cn/current/ScriptReference/AudioReverbPreset.html "《AudioReverbPreset》") +获取玩家是否完全加载完毕
->+
  
 ```javascript ```javascript
-player.AudioReverbInternal = 3; //Room+player.IsComplete: bool
 ``` ```
  
  
  
-### player.AudioReverbExternal+### player.IsObserver
  
-设置玩家的音频混响模式(默认,建筑外部),枚举索引参考[《AudioReverbPreset》](https://docs.unity.cn/cn/current/ScriptReference/AudioReverbPreset.html "《AudioReverbPreset》")+获取玩家是否当前为相机观察模式(`Client.Camera.IsObserver`)。 
 + 
 +```javascript 
 +player.IsObserver: bool 
 +``` 
 + 
 + 
 + 
 +### player.VoiceState 
 + 
 +> 获取玩家语音聊天状态(是否正在语音聊天)
 > >
 +> **注意:玩家必须`player.SetVoiceAuthority(true)`给予语音权限(默认),且由玩家主动触发按键才会进行聊天。**
  
 ```javascript ```javascript
-player.AudioReverbExternal = 16; //Forest+player.VoiceState: bool 
 +``` 
 + 
 + 
 + 
 +### player.CameraMode 
 + 
 +> 获取(只读)玩家相机模式(参考`Client.Camera.Mode`)。 
 + 
 +```javascript 
 +player.CameraMode: int
 ``` ```
  
行 517: 行 605:
 ### Player.Search() ### Player.Search()
  
-> 寻找一个玩家实例(通过模糊查找,通常根据玩家名称,不区分大小写),不存在则返回`null`。+> 寻找一个玩家实例(通过模糊查找,通常根据玩家名称\ID,不区分大小写),不存在则返回`null`。
  
 ```javascript ```javascript
行 528: 行 616:
 Player.Search("Tomm"); //Tommy(相似匹配) Player.Search("Tomm"); //Tommy(相似匹配)
 Player.Search("To"); //Tommy(以最先搜索到的为主) Player.Search("To"); //Tommy(以最先搜索到的为主)
 +Player.Search("0"); //By ID
 ``` ```
  
行 631: 行 720:
 ### player.Kick() ### player.Kick()
  
-> 从服务器踢出指定玩家。+> 从服务器踢出玩家。
  
 ```javascript ```javascript
行 641: 行 730:
 ### player.Ban() ### player.Ban()
  
-> 从服务器封禁指定玩家(仅在当前服务器运行时生效,重启服务器将清空封禁列表)。+> 从服务器封禁玩家(仅在服务器运行时生效,重启服务器将清空封禁列表)。
 > >
 > 如果希望实现持久化的封禁列表,请考虑自行实现维护一个`txt|json`文件表,在每次服务器建立后读取文件+遍历执行`Player.BanUUID()`。 > 如果希望实现持久化的封禁列表,请考虑自行实现维护一个`txt|json`文件表,在每次服务器建立后读取文件+遍历执行`Player.BanUUID()`。
行 648: 行 737:
 function player.Ban( reason: string = "Banned" ) function player.Ban( reason: string = "Banned" )
 ``` ```
- 
- 
- 
-### player.CreateNativeMenu() 
- 
-> 为玩家建立一个`NativeMenu`菜单([NativeMenu菜单](scripting/extend/nativemenu)),用法与[客户端NativeMenu](scripting/client/main)相同。 
- 
-```javascript 
-let view = { 
-    Cover: 5, 
-    Tag: "Test", 
-    Title: "XXX", 
-    Info: "ABC", 
-    Width: 500, 
-    Align: 1, 
-    Layout: 1, 
-    Items: [ 
-        { 
-            Text: "点击:输出玩家Name", 
-            OnClick: () => { 
-                DLog("PlayerName: " + player.Name); 
-            } 
-        },{ 
-            Input: "xxx", 
-            Restrict: "*", 
-            OnFocus: (text) => { 
-                DLog("输入框文本: " + text); 
-            } 
-        },{ 
-            Text: "点击:刷一辆载具+关闭菜单", 
-            OnClick: () => { 
-                Vehicle.Create(10, player.Entity.Pos, player.Entity.Angle); 
-                player.DestroyNativeMenu(); 
-            } 
-        } 
-    ] 
-}; 
- 
-player.CreateNativeMenu(view); 
-``` 
- 
- 
- 
-### player.DestroyNativeMenu() 
- 
-> 为玩家关闭`NativeMenu`菜单,用法与[客户端NativeMenu](scripting/client/main)相同。 
- 
- 
- 
-### player.SetNativeMenuText() 
- 
-> 为玩家关闭`NativeMenu`菜单,用法与[客户端NativeMenu](scripting/client/main)相同。 
  
  
行 733: 行 770:
  
  
-### player.StoryDialog()+### player.NetworkRPC()
  
-> 为玩家发送一条**故事对话框**消息,并加入到队列中,等待上次对话框结束后陆续执行+> 为玩家发送一条RPC指令
 > >
-> **解释方法执行后可能不会立即显示默认加入到队列中,按加入顺序依次执行历史对话框。**+> 目标玩家客户端脚本通过`OnServerNetworkRPC()`接收数据。 
 +
 +> **注意`CMD\RPC`方法仅支持基础类型并且自动类型转换。**
  
 ```javascript ```javascript
-function player.StoryDialogtitle: string, textstringavatarint = -1sound: int = -1, buttons: any = null, onComplete: Action = null )+function NetworkRPCrpc: string, arg0anyarg1anyarg2: any )
 ``` ```
  
-- **title:**标题、故事对话人昵称 
-- **text:**主要文本内容(可用`html`语法,以及`\n`换行) 
-- **avatar:**故事对话人形象图片ID(基于Texture文件机制),默认为`-1` 
-- **sound:**故事对话时音频ID(例如配音等,基于Sound文件机制),默认为`-1`,仅在当前对话框生命周期有效,对话结束(或切换对话框)后将自动停止播放 
-- **buttons:**附加按钮(最多支持3个),以数组的形式传递数据(见下方示例) 
-- **onComplete:**对话结束时触发事件 
  
-```javascript 
-player.StoryDialog("测试角色", "风平浪静……", -1, -1, [ 
-    { 
-        Button: "Button A",  
-        Action: () => { 
-            DLog("Click A"); 
-        } 
-    },{ 
-        Button: "Button B",  
-        Action: () => { 
-            DLog("Click B"); 
-        } 
-    } 
-], () => { 
-    DLog("OnComplete Invoke!"); 
-}); //1 
-player.StoryDialog("测试角色2", "风平浪静1……", -1, 1124); //2 
-player.StoryDialog("测试角色2", "风平浪静2……", -1, 1124); //3 
-``` 
  
 +### player.SendData()
  
- +> 为玩家发送**服务端>客户端**定义Stream数据信息。 
-### player.NextStoryDialog() +
- +> 目标玩家客户端脚本通`OnServerStreamData()`接收数据。 
-> 为玩家切换下**故事对话框(如有队列)**,相当于动为玩家执行了跳方法,并且会忽略Buttons焦点(无论是否设Buttons,都会切换到下一个队列)。+
 +> **注意:这里不应该放特别大的数据内容(4096,否则可能造成网络阻塞**
  
 ```javascript ```javascript
-function player.NextStoryDialog()+function player.SendDatanumber: float, data: string = "" )
 ``` ```
  
  
  
-### player.ClearStoryDialog()+### player.ClientExec()
  
-> 为玩家清空**故事对话框队列**,并结束全部故事对话框(会触发队列最后一个`OnComplete`)。 +> 为玩家发送一条**客户端脚本代码**,目标玩家**客户端**将执行对应脚本代码
- +
-```javascript +
-function player.ClearStoryDialog() +
-``` +
- +
- +
- +
-### player.SendData() +
- +
-> 为玩家发送一条**服务端>客户端**的自定义Stream数据信息+
 > >
-> 目标玩家客户端脚本通过`OnServerStreamData()`接收数据。 +> **注意:这里不应该放置特别大的数据内容(2048),否则可能造成网络阻塞。**
-+
-> **注意:这里不应该放置特别大的数据内容,否则可能造成网络阻塞。**+
  
 ```javascript ```javascript
-function player.SendDatanumber: float, data: string = "" )+function player.ClientExeccode: string )
 ``` ```
  
行 808: 行 812:
 ### player.PlaySound() ### player.PlaySound()
  
-> 为玩家播放一段声音,用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家播放一段**声音**,用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 818: 行 822:
 ### player.Play3DSound() ### player.Play3DSound()
  
-> 为玩家播放一段3D空间声音,用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家播放一段**3D空间声音**,用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 828: 行 832:
 ### player.StopSound() ### player.StopSound()
  
-> 为玩家停止播放并销毁一段声音实例,用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家停止播放并销毁一段**声音实例**,用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 838: 行 842:
 ### player.PlayMusic() ### player.PlayMusic()
  
-> 为玩家播放音乐(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家播放**音乐**(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 848: 行 852:
 ### player.Play3DMusic() ### player.Play3DMusic()
  
-> 为玩家播放3D空间音乐(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家播放**3D空间音乐**(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 858: 行 862:
 ### player.PauseMusic() ### player.PauseMusic()
  
-> 为玩家暂停播放音乐(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家暂停播放**音乐**(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 868: 行 872:
 ### player.ResumeMusic() ### player.ResumeMusic()
  
-> 为玩家继续播放音乐(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家继续播放**音乐**(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 878: 行 882:
 ### player.StopMusic() ### player.StopMusic()
  
-> 为玩家停止播放并销毁音乐实例(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家停止播放并销毁**音乐实例**(音乐轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 888: 行 892:
 ### player.PlayNatural() ### player.PlayNatural()
  
-> 为玩家播放背景音(背景音轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家播放**背景环境**(背景音轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 898: 行 902:
 ### player.StopNatural() ### player.StopNatural()
  
-> 为玩家停止播放并销毁指定背景音实例(背景音轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家停止播放并销毁指定**背景环境音实例**(背景音轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 908: 行 912:
 ### player.StopAllNatural() ### player.StopAllNatural()
  
-> 为玩家停止播放并销毁全部背景音实例(背景音轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。+> 为玩家停止播放并销毁全部**背景环境音实例**(背景音轨道),用法及详细说明与[客户端Audio](scripting/client/audio)相同。
  
 ```javascript ```javascript
行 916: 行 920:
  
  
-### player.FocusCamera()+### player.RunTaskAction()
  
-立即将**玩家相机定位到追踪目标位置**,适用于希望立即到相机目标位置不需要平移效果)时调用。+玩家执行一次**倒计时任务**(UI进度条+倒计时,每个玩家**同一间**只能执行一个任务
  
 ```javascript ```javascript
-function player.FocusCamera()+function player.RunTaskActiontag: string, time: float, title: string, onComplete: Action, theme: int = 0 )
 ``` ```
  
 +- `tag`识别标签,仅供参考记录
 +- `time`倒计时时间(秒)
 +- `title`文本标题(支持宏文本)
 +- `theme`范围0~4,表示不同的颜色
  
 +```javascript
 +player.RunTaskAction("install", 5, "Installation in progress...", () => {
 +    //OnComplete
 +});
 +```
  
-### player.BindKeyPresser() 
  
-玩家绑定**按键快捷对象**的UI布局方式(2D屏幕、3D坐标、实体对象跟随),具体取决于参数类型。 + 
-+### player.StopTaskAction() 
-> ==注意:每次建立的**按键快捷对象**全部移出后,再次建立时,UI布局方式将自动切换至`Null(2D屏幕偏右)`==+ 
 +停止玩家**倒计时任务**。
  
 ```javascript ```javascript
-function player.BindKeyPressertarget: any ) +function player.StopTaskAction()
-/* +
- target可选类型:null\Vector\Entity(Vector\Entity类型将作为3D坐标展示,Entity会有自动跟随) +
-*/+
 ``` ```
  
  
  
-### player.AddKeyPresser()+### player.UpdateTaskActionData()
  
-玩家建立一个**按键快捷对象**,默认将加入到玩家**屏幕偏右**位置,如果你希望目标UI作为3D空间、跟随实体效果,使用`BindKeyPresser`提前绑定即可。 +更新玩家**倒计任务**信息
-+
-> 这将在目标玩家的屏幕中显示`[按键] XXXX`的效果(例如`[F]进入此载具`,并为其绑定进入载具的事件)。 +
-+
-> 同时,此功能支持同时**绑定至多6个按键对象**(同列表下,并非不同位置),只需要为其填写不同的index即可 +
-+
-> **Index目前只是标签占位,排序仍然根据代码添加顺序。**+
  
 ```javascript ```javascript
-function player.AddKeyPresserindex: int, keyCode: string, textstring, onPress: Action null ) +function player.UpdateTaskActionDatatitle: string, themeint -1 )
-/* +
- index:指引索引(如索引已存在指引,将会替换修改,一个index只能存在并表示一个指引实例),相当于一个标签作用 +
- keyCode:绑定按键,最好不要和其他按键冲突,除非知道在做什么 +
- text:按键后面的文本内容 +
- onPress:当玩家按下后执行的事件 +
-*/ +
- +
-//通常情况下,如果同时只使用1个指引功能,只需要一直将index填写0即可 +
-//在可能处理多个按键对象的情况下,可以将index作为区分标签作用,比如上车index是100,下车可能是101,这样可以随时用ExistKeyPresser来检查某个按键对象是否存在+
 ``` ```
 +
 +- `title`文本标题(支持宏文本)
 +- `theme`颜色主题,默认`-1`不进行修改
 +
 +
 +
 +### player.GetTaskActionTag()
 +
 +> 获取玩家**倒计时任务**标签。
  
 ```javascript ```javascript
-//同时绑定多个按键对象的示例 +function player.GetTaskActionTag(): string 
-player.AddKeyPresser(0, "F", "进入当前载具", () => { 进入代码... }); +```
-player.AddKeyPresser(3, "H", "修复当前载具", () => { 修复代码... });+
  
-//此时将会在玩家屏幕中,显示竖向的两(最多支持6行) + 
-【F】进入当前载具 + 
-【H】修复当前载具+### player.ExistTaskAction() 
 + 
 +> 获取玩家**倒计时任务**是否**存在**并进中。 
 + 
 +```javascript 
 +function player.ExistTaskAction(): bool
 ``` ```
  
  
  
-### player.RemoveKeyPresser()+### player.SetVoiceMode()
  
-玩家移除一个**按键快捷对象**。+设置玩家语音聊天模式,**默认关闭**。
 > >
-> ==注意:每次建立的**按键快捷对象**全部移出后再次建立时,UI布局方将自动切换至`Null(2D屏幕右下)`。==+> ==**如果希望激活语音聊天功能请为玩家设定一个非关闭的语音模式。**==
  
 ```javascript ```javascript
-function player.RemoveKeyPresserindex: int )+function player.SetVoiceModemode: int = 0 )
 ``` ```
  
 +| 索引 | 语音聊天模式   | 说明                                                         |
 +| ---- | -------------- | ------------------------------------------------------------ |
 +| 0    | 关闭           | 不会发送与接收任何语音聊天                                   |
 +| 1    | 全局模式       | 发送与接收所有聊天,除特定情况及权限、禁言等                 |
 +| 2    | (频道)组模式 | 发送与接收相同频道组(`VoiceGroup`)的聊天,除特定情况及权限、禁言等 |
  
  
-### player.ExistKeyPresser() 
  
-> 获取玩家**指定索引**的**按键快捷对象**是否存在+### player.GetVoiceMode() 
 + 
 +> 获取玩家语音聊天模式
  
 ```javascript ```javascript
-function player.ExistKeyPresserindex: int ): bool+function player.GetVoiceMode(): int
 ``` ```
  
  
  
-### player.ClearKeyPressers()+### player.SetVoiceWorldMode()
  
-移除玩家所有**按键快捷对象**+设置玩家语音聊天世界模式开关(3D空间音频,跟随玩家的实体对象
 > >
-==注意:每次建立的**按键快捷对象**全移出后再次建立时,UI布局方式将自动切换至`Null2D屏幕右下)`。==+> **此选项可能在分玩法中提高玩家沉浸感就像其他玩家真的在不远处说话一样。** 
 +
 +> *可通过`GameRule > voice_worlddistance `控制3D空间声音的传播距离)*
  
 ```javascript ```javascript
-function player.ClearKeyPressers()+function player.SetVoiceWorldModeactive: bool )
 ``` ```
  
  
  
-### player.AddGuider()+### player.GetVoiceWorldMode()
  
-玩家建立一个指引目标(屏幕边缘箭头)+获取玩家语音聊天世界模式开关
  
 ```javascript ```javascript
-function player.AddGuiderindex: int, target: any, autoDestroy: bool = false ) +function player.GetVoiceWorldMode(): bool 
-/* +```
- index:指引索引(如索引已存在指引,将会替换修改,一个index只能存在并表示一个指引实例),相当于一个标签作用 +
- target:目标对象(可以是Vector|Entity等类型,分别表示静态坐标与动态跟随目标) +
- autoDestroy:到达指引目标附近是否自动移除指引,默认为false +
-*/+
  
-//通常情况下如果同时只使用1个指引功能只需要一直index填写0即可+ 
 + 
 +### player.SetVoiceAuthority() 
 + 
 +> 设置玩家语音聊天**权限**开关(静音\禁言)默认开启(`true`)。 
 +
 +> **==注意:此选项必须设置为`true`玩家才有资格进行说话,否则玩家无法在语音聊天中说话(禁言Muted)。==** 
 +
 +> ==**(此选项并非是玩家麦克风控制开关,安全考虑,只有玩家自行按住【说话按键】时才会录入音频)**== 
 + 
 +```javascript 
 +function player.SetVoiceAuthority( active: bool )
 ``` ```
  
  
  
-### player.RemoveGuider()+### player.GetVoiceAuthority()
  
-玩家移除一个指引目标(屏幕边缘箭头)+获取玩家语音聊天**权限**开关
  
 ```javascript ```javascript
-function player.RemoveGuiderindex: int )+function player.GetVoiceAuthority(): bool
 ``` ```
  
  
  
-### player.ExistGuider()+### player.SetVoiceIgnore()
  
-获取玩家**指定索引**指引实例是否存在+设置玩家屏蔽指定玩家语音开关,可用于屏蔽其他玩家语音输出,但不会屏蔽自身对其他玩家的声音
  
 ```javascript ```javascript
-function player.ExistGuiderindexint ): bool+function player.SetVoiceIgnoreplayerPlayer, active: bool )
 ``` ```
  
  
  
-### player.SetCinematicBorder()+### player.GetVoiceIgnore()
  
-设置玩家屏幕电影边框开关,与客户端API作用相同+获取玩家语音聊天**权限**开关。
  
 ```javascript ```javascript
-function player.SetCinematicBorderactivebool, time: float = 1.0 ): bool+function player.GetVoiceIgnoreplayerPlayer ): bool
 ``` ```
  
  
  
-### player.GetCinematicBorder() 
  
-获取玩家屏幕电影框开关+### player.TestVisiblePoint() 
 + 
 +检测玩家相机是否能看到指定坐标(模糊检测,缘检测并非绝对准确,模拟本地`Camera.TestVisiblePoint()`)
  
 ```javascript ```javascript
-function player.GetCinematicBorder(): bool+function player.TestVisiblePointpos: Vector ): bool
 ``` ```
  
  
  
-### player.SetVoiceMode()+### player.SetBackpackOtherTarget()
  
-> 设置玩家语音聊天模式,**默认关闭**。+> 设置玩家**额外的观察背包实例**(除本地对象外的另一个背包)。 
 +
 +> 此功能可扩展许多玩法,例如:商店、交易、背包共享等
 > >
-==**如果希望激活语音聊天功能请为玩家设定一个非关闭的语音模式**==+> 如果没有设置其他背包实例,玩家背包UI将仅显示自身对象背包
  
 ```javascript ```javascript
-function player.SetVoiceModemode: int = 0 )+function player.SetBackpackOtherTargetotherBackpack: Backpack, observerMode: int = 0 )
 ``` ```
  
-| 索引 | 语音聊天模式   | 说明                                                         | +`observerMode`:观察模式,默认为`0`(0=可读写,1=只读
----- | -------------- | ------------------------------------------------------------ | +
-| 0    | 关闭           | 不会发送与接收任何语音聊天                                   | +
-| 1    | 全局模式       | 发送与接收所有聊天除特定情况及权限、禁言等                 | +
-| 2    | (频道)组模式 | 发送与接收相同频道组(`VoiceGroup`)的聊天,除特定情况及权限、禁言等 |+
  
  
  
-### player.GetVoiceMode()+### player.GetBackpackOtherTarget()
  
-> 获取玩家语音聊天模式+> 获取玩家**额外的观察背包实例**
  
 ```javascript ```javascript
-function player.GetVoiceMode(): int+function player.GetBackpackOtherTarget(): Backpack
 ``` ```
  
  
  
-### player.SetVoiceWorldMode()+### player.SetBackpackTempProp()
  
-> 设置玩家语音聊天世界模式开关3D空间音频,跟玩家实体对象)。 +> 设置玩家**临时背包物品**(随鼠标移动临时选项,可设置为`null`
-+
-> **此选项可能在部分玩法中提高玩家沉浸感就像其他玩家真的在不远处说话一样。** +
-+
-> *(通过`GameRule > voice_worlddistance `控制3D空间声音的传播距离)*+
  
 ```javascript ```javascript
-function player.SetVoiceWorldModeactivebool )+function player.SetBackpackTempProppropProp )
 ``` ```
  
  
  
-### player.GetVoiceWorldMode()+### player.GetBackpackTempProp()
  
-> 获取玩家语音聊天世界模式开关+> 获取玩家**临时背包物品**(随鼠标移动的临时选项),如不存在则为`prop.IsValid() == false`
  
 ```javascript ```javascript
-function player.GetVoiceWorldMode(): bool+function player.GetBackpackTempProp(): Prop
 ``` ```
  
  
  
-### player.SetVoiceAuthority()+### player.ReturnBackpackTempProp()
  
-设置玩家语音聊天**权限**开关或理解为静音),默认开启(`true`)+尝试返回玩家**临时背包物品**(随鼠标移动的临时选项),尝试自动将临时物品添加到背包
 > >
-**==注意:选项必须设置为`true`,玩家资格进行说话玩家将无法在语音聊天中说话==**+> 此方法与玩家**存在临时物品时关闭背包**效果相同,如果空位则自动添加到背包并移出临时物品如果没有空位触发丢弃事件
 > >
-==**(此选项并非是玩家麦克风控制开关安全考虑,只有玩家自行按住【说话按键】录入音频)**==+> **注意:有时可能希望处理玩家的背包(例如清空背包)可能玩家正在操作临物品,这样的话`Backpack`常规方式不处理到临时物品,因此需要留意玩家手中的临时物品。**
  
 ```javascript ```javascript
-function player.SetVoiceWorldModeactive: bool )+function player.ReturnBackpackTempProp(): bool
 ``` ```
 +
 +- `return`:是否正常返回(如果没有临时物品,也会返回`true`)
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
  
  
-### player.GetVoiceAuthority() 
  
-> 获取玩家语音聊天**权限**开关。 
  
-```javascript 
-function player.GetVoiceAuthority(): bool 
-``` 
  
  
  
-### player.SetVoiceIgnore() 
  
-> 设置玩家屏蔽指定玩家语音开关,可用于屏蔽其他玩家的语音输出,但不会屏蔽自身对其他玩家的声音。 
  
-```javascript 
-function player.SetVoiceIgnore( player: Player, active: bool ) 
-``` 
  
  
  
-### player.GetVoiceIgnore() 
  
-> 获取玩家语音聊天**权限**开关。 
  
-```javascript 
-function player.GetVoiceIgnore( player: Player ): bool 
-```