一天一点raknet_Editing 教程/WebSocket

Anti-spam check.

Do not fill this in!{{exclusive|education|bedrock}}

本页面是指基岩版{{cmd|connect}}命令连接的WebSocket(该服务器不是多人游戏所使用的服务器,以下简称服务器)。

本教程展示的是客户端与服务端的数据包,不涉及WebSocket服务端的开发,但您可以参考底部的链接来进行服务端的开发。

== 数据包 ==

Websocket服务器需要向mcpe发送数据包来进行交互。

Websocket服务器可以向游戏发送json格式的数据包,目前已知的有三种:

* 订阅请求

* 取消订阅请求

* 命令请求

这里有几个示例数据包。

=== subscribe(订阅请求) ===

订阅事件就是服务器向游戏说明自己要监听哪些事件,当游戏发生该事件后游戏就会向服务器发送该事件的相关信息,下面是一个订阅事件数据报的例子。

注意:目前有一部分事件在新版本当中是无效的

{

"body": {

"eventName": "PlayerMessage"

},

"header": {

"requestId": "00000000-0000-0000-0000-000000000000",

"messagePurpose": "subscribe",

"version": 1,

"messageType": "commandRequest"

}

}

这将对PlayerMessage事件进行监听,玩家在聊天栏发的消息以及其他相关信息将被通过数据包发回。看一看这个包,你会发现requestId的value是一些0,这不是固定的,你完全可以对它进行更改。

=== unsubscribe(取消订阅请求) ===

Unsubscribe包是用来在监听事件之后取消监听。

{

"body": {

"eventName": "PlayerMessage"

},

"header": {

"requestId": "00000000-0000-0000-0000-000000000000",

"messagePurpose": "unsubscribe",

"version": 1,

"messageType": "commandRequest"

}

}

这是一个对PlayerMessage事件进行unsubscribe的数据包,取消订阅后玩家在聊天栏发送的消息将不再会被服务器监听。

=== CommandRequest(命令请求) ===

该数据包会在游戏内执行指定的命令。

{

"body": {

"origin": {

"type": "player"

},

"commandLine": "say Hello",

"version": 1

},

"header": {

"requestId": "00000000-0000-0000-0000-000000000000",

"messagePurpose": "commandRequest",

"version": 1,

"messageType": "commandRequest"

}

}

这将在客户端执行commandLine项(say Hello)的命令,执行结果会被发回。

* commandRequest能执行一些游戏内无法执行的命令,例如: {{cmd|agent create}}(创建agent)

== 返回数据包 ==

返回的数据包指的是游戏向服务器发送的数据包,这些数据包有两种类型:

* 对服务器订阅的事件的响应

* 对服务器发送的命令事件的反馈

=== event包(订阅事件响应) ===

==== 标准Event包示例 ====

{

"body": {

"eventName": "",

"measurements":null,

"properties": {

}

},

"header": {

"messagePurpose": "event",

"requestId": "00000000-0000-0000-0000-000000000000",

"version":1

}

}

* 不同的事件在"body"和"properties"字段中填入的数据有些许不同(不同的事件会有不同的包含关键信息的字段),上方是一个标准数据包的例子

==== PlayerMessage event示例 ====

示例:

{

"body": {

"eventName": "PlayerMessage",

"measurements": {

"Count": 1,

"RecordCnt": 1,

"SeqMax": 1355,

"SeqMin": 1355

},

"properties": {

"AccountType": 1,

"ActiveSessionID": "a9f8087b-2e3d-495c-b3c3-aef515b7e19a",

"AppSessionID": "43408684-6cb0-4896-b89d-66a2a1e48a73",

"Biome": 1,

"Build": "1.13.1",

"BuildPlat": 7,

"Cheevos": false,

"ClientId": "0ceeb3a3-f96c-34b0-895f-b0d4ca7b129a",

"CurrentInput": 1,

"DeviceSessionId": "43408684-6cb0-4896-b89d-66a2a1e48a73",

"Dim": 0,

"GlobalMultiplayerCorrelationId": "0694aabd-ddde-466d-ae99-1f88faf1580a",

"Message": "a",

"MessageType": "chat",

"Mode": 1,

"MultiplayerCorrelationId": "ab4e37fe-2836-18a0-6d21-a85f781f8e70",

"NetworkType": 0,

"Plat": "Win 10.0.18362.1",

"PlayerGameMode": 1,

"SchemaCommitHash": "19b6ec0744c3c83a00ecbd840f48cb080c7bc64d",

"Sender": "hhhxiao",

"ServerId": "raknet:11376205654463177128",

"Treatments": "mc-perf-plat-12-20:mc-perf-plat-1-20:mc-perf-plat-2-20:mc-perf-plat-4-20:mc-perf-plat-7-20:mc-perf-plat-13-20:mc-perf-plat-11-1:mc-rp-frozenbuttonandpanel:mc-rp-playfab",

"UserId": "2535451099196973",

"WorldFeature": 0,

"WorldSessionId": "f7d8ca20-4be0-4d01-aa83-3c2c64dabc88",

"editionType": "win10",

"isTrial": 0,

"locale": "zh_CN",

"vrMode": false

}

},

"header": {

"messagePurpose": "event",

"requestId": "00000000-0000-0000-0000-000000000000",

"version": 1

}

}

这是一个PlayerMessage返回包示例。

* body.properties.Message是用户发出的消息

* body.properties.MessageType是消息类型(say、me、chat等)

* body.properties.Sender是发送者名称

* body.properties.locale是设备使用的语言

*body.properties.UserId 与用户Xbox Live相关,登录同一Xbox Live时总为一个值,未登录时为空或未定义。

=== CommandResponse (CommandRequest返回) ===

一般格式:

{

"body":{

"statusCode": 0,

"statusMessage": ""

},

"header": {

"messagePurpose":"commandResponse",

"requestId": "00000000-0000-0000-000000000000"

}

}

示例:

==== list命令 ====

{

"body":{

"currentPlayerCount":1,

"maxPlayerCount":5,

"players":"LNSSPsd",

"statusCode":0,

"statusMessage":"There are 1/5 players online:\nLNSSPsd"

},

"header":{

"messagePurpose":"commandResponse",

"requestId":"00000000-0000-0000-000000000000",

"version":1

}

}

* body.currentPlayerCount、body.maxPlayerCount、body.players是{{cmd|list}}命令特有的,在执行其他命令时不存在。

==== say命令 ====

本示例使用了{{cmd|say oh}}命令

{

"body":{

"message":"oh",

"statusCode":0

},

"header":{

"messagePurpose":"commandResponse",

"requestId":"00000000-0001-0000-000000000000",

"version":1

}

}

* body.message是{{cmd|say}}特有的,而{{Cmd|say}}命令没有statusMessage项。

==== tp命令 ====

本示例使用了{{cmd|tp Steve ~ ~ ~}}命令

{

"body": {

"destination": {

"x": 73.37560272216797,

"y": 71.12252044677734,

"z": 36.96865081787109

},

"statusCode": 0,

"statusMessage": '已将 Steve 传送至 73.38, 71.12, 36.97',

"victim": [ 'Steve' ]

},

"header": {

"messagePurpose": 'commandResponse',

"requestId": '00000000-0000-0000-0000-000000000000',

"version": 1

}

}

* body.destination、body.victim、header.version 是{{cmd|tp}}特有的。

==== 注释 ====

* body.statusCode 是命令完成状态,成功时为0,失败时小于0。

* body.statusMessage 是状态消息,相当于执行命令后聊天里的命令返回,少数命令(如{{Cmd|say}}命令)无返回显示,故无此项。

* 返回请求的 header.requestId 与发送请求时附带的 header.requestId 相同。

== 事件表 ==

:下面是目前已知的所有可订阅事件,写了触发调条件的是确认可用或者已知触发条件的

{| class="wikitable"

! 事件名称

! 触发条件

|-

| AdditionalContentLoaded

|

|-

| AgentCommand

|agent实体执行指令时(移动,攻击等等)

|-

| AgentCreated

|创建agent

|-

| ApiInit

|

|-

| AppPaused

|

|-

| AppResumed

|

|-

| AppSuspended

|

|-

| AwardAchievement

|当玩家获得游戏成就时触发

|-

| BlockBroken

| 在玩家破坏方块时触发

|-

| BlockPlaced

| 在玩家放置方块时触发

|-

| BoardTextUpdated

|

|-

| BossKilled

|杀死boss(指令无效)

|-

| CameraUsed

|使用相机时触发

|-

| CauldronUsed

|炼药锅交互

|-

| ChunkChanged

|

|-

| ChunkLoaded

|区块加载完成时触发

|-

| ChunkUnloaded

|

|-

| ConfigurationChanged

|

|-

| ConnectionFailed

|

|-

| CraftingSessionCompleted

|关闭工作台界面或者背包界面

|-

| EndOfDay

|在一天自然结束时触发(命令修改时间将不会触发)

|-

| EntitySpawned

|通过指令生成实体

|-

| FileTransmissionCancelled

|

|-

| FileTransmissionCompleted

|

|-

| FileTransmissionStarted

|

|-

| FirstTimeClientOpen

|

|-

| FocusGained

|

|-

| FocusLost

|

|-

| GameSessionComplete

|

|-

| GameSessionStart

|进入存档(世界加载的时候)

|-

| HardwareInfo

|

|-

| HasNewContent

|

|-

| ItemAcquired

|捡起掉落物,拿起合成的物品

|-

| ItemCrafted

|物品从工作台拿出的那一刻

|-

| ItemDestroyed

|

|-

| ItemDropped

| 在玩家扔出物品时触发

|-

| ItemEnchanted

|物品被附魔时触发

|-

| ItemSmelted

| 在玩家取出熔炉内物品时触发

|-

| ItemUsed

|使用物品(吃东西,放置方块,扔鸡蛋,使用弓箭等等)

|-

| JoinCanceled

|

|-

| JukeboxUsed

|CD放入音符盒的时候

|-

| LicenseCensus

|

|-

| MascotCreated

|

|-

| MenuShown

|

|-

| MobInteracted

|

|-

| MobKilled

| 在玩家击杀生物时触发

|-

| MultiplayerConnectionStateChanged

|

|-

| MultiplayerRoundEnd

|

|-

| MultiplayerRoundStart

|

|-

| NpcPropertiesUpdated

|

|-

| OptionsUpdated

|

|-

| performanceMetrics

|

|-

| PackImportStage

|

|-

| PlayerBounced

|玩家被床和粘液块弹起

|-

| PlayerDied

|玩家死亡

|-

| PlayerJoin

|玩家进入游戏

|-

| PlayerLeave

|

|-

| PlayerMessage

| 在玩家收到一条消息时触发

|-

| PlayerTeleported

| 在玩家被传送时触发

|-

| PlayerTransform

|玩家移动

|-

| PlayerTravelled

| 在玩家移动时触发(和Transform几乎同时)

|-

| PortalBuilt

|玩家创建传送门(下界和末地)

|-

| PortalUsed

|玩家使用传送门

|-

| PortfolioExported

|

|-

| PotionBrewed

|从酿造台拿出药水的时候

|-

| PurchaseAttempt

|

|-

| PurchaseResolved

|

|-

| RegionalPopup

|

|-

| RespondedToAcceptContent

|

|-

| ScreenChanged

|打开任何UI都触发,点击任何设置页面也触发

|-

| ScreenHeartbeat

|

|-

| SignInToEdu

|

|-

| SignInToXboxLive

|当点击登录Xbox的按钮时触发

|-

| SignOutOfXboxLive

|但注销Xbox时触发

|-

| SpecialMobBuilt

|

|-

| StartClient

|

|-

| StartWorld

|在主菜单进入世界时触发

|-

| TextToSpeechToggled

|

|-

| UgcDownloadCompleted

|

|-

| UgcDownloadStarted

|

|-

| UploadSkin

|玩家更新皮肤时触发

|-

| VehicleExited

|玩家离开矿车

|-

| WorldExported

|

|-

| WorldFilesListed

|

|-

| WorldGenerated

|创建一个新世界时触发

|-

| WorldLoaded

|

|-

| WorldUnloaded

|

|}

== 你知道吗 ==

* WebSocket在执行{{cmd|say}}命令时,国际版显示的发送者名称是外部,而在[[教育版]]中,发送者会被显示为教师

== 历史 ==

{{History|pocket alpha}}

{{History||0.16.0|snap=build 1|加入了{{cmd|connect}}命令,可以连接WebSocket了。}}

{{History|bedrock}}

{{History||1.2|commandRequest包格式发生改变。}}

{{History|foot}}

== 参考 ==

# https://github.com/mcpews/MyAgent

# https://github.com/CAIMEOX/FastBuilder

#https://github.com/liumingedwin/Minecraft-Mod-Configer

摘要:(请简述您所作的修改)

请留意所有对Minecraft Wiki的贡献都默认在《知识共享 署名-非商业性使用-相同方式分享 3.0》下发表(详阅Minecraft Wiki:著作权)。若您不愿意您的作品被任意编辑或者二次发布,请勿在此处提交。

您同时也承诺这些内容的作者是您自己,或得自公有领域及类似的自由来源。请勿私自提交受著作权保护的材料!

您也可以将取自Mojang(及其网站、说明、指南、艺术概念、渲染图、出版物、第三方网站组件,以及其他此类Mojang已对外公开的受保护材料)的内容上传至Minecraft Wiki。所有权力、署名与利益在合适时仍归属Mojang,也不依照服务条款被授权。

Editing help (opens in new window)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。   Radnet有以下特点:   l 高性能 在同一台计算机上,Raknet可以实现在两个程序之间每秒传输25,000条信息;   l 容易使用 Radnet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;   l 跨平台,当前Radnet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code: Blocks, DevCPP 和其它平台上;   l 在线技术支持 RakNet有一个活跃的论坛,邮件列表,你只要给他们发信,他们可以在几小时之内回复你。   l 安全的传输 RakNet在你的代码中自动使用SHA1, AES128, SYN,用RSA避免传输受到攻击   l 音频传输 用Speex编码解码,8位的音频只需要每秒500字节传输。   l 远程终端 用RakNet,你能远程管理你的程序,包括程序的设置,密码的管理和日志的管理。   l 目录服务器 目录服务器允许服务器列举他们自己需要的客户端,并与他们连接。   l Autopatcher Autopatcher系统将限制客户端传输到服务端的文件,这样是为了避免一些不合法的用户将一些不合法的文件传输到服务端。   l 对象重载系统   l 网络数据压缩 BitStream类允许压缩矢量,矩阵,四元数和在-1到1之间的实数。   l 远程功能调用   l 强健的通信层 可以保障信息按照不同的信道传输   RakNet支持两种版权,如果你是做免费游戏,RakNet将是免费的。相反,你必须支付一定的费用。   从这里你可以下载到最新的RakNet:   http://www.rakkarsoft.com/raknet/downloads/RakNet.zip   例子:   #include   #include   #include   #include "RakClientInterface.h" //建立客服端所需要的信息,其中包括客服端的建立,连接和数据的发送和接收   #include "RakNetworkFactory.h" //用于管理我们在程序中使用的类,包括类内存分配和类内存的释放   #include "RakServerInterface.h" //用于建立服务器所需用的信息,包括服务器的建立,连接和数据的发送和接收   #include "PacketEnumerations.h" //用于处理网络引擎在运行过程中得到的信息   Packet *packet;//网络传输中用于存储数据的一个数据结构   /////////////////////////////////////////////////////   /*   Struct Packet   {   PlayerID playerId; //表明了包的出处。每一个连接服务器的客户端都将被分配一个唯一的ID号,用于标识自己。   Unsigned long length; //数据长度   Unsigned long bitsize; //比特大小   Char *data; //包中的数据   }   */   /////////////////////////////////////////////////////   int main(void)   {   char str[512];   RakClientInterface *rakClientInterface;   RakServerInterface *rakServerInterface;   printf("(C)客服端 (S)服务器?\n");   gets(str);   if (str[0]=='c')   {   rakClientInterface=RakNetworkFactory::GetRakClientInterface();//初始化一个客户端实例,为它分配内存   rakServerInterface=0;   printf("客服端已经建立。");   }   else   {   rakClientInterface=0;   rakServerInterface=RakNetworkFactory::GetRakServerInterface();//初始化一个服务器实例,为它分配内存   printf("服务器已经建立。");   }   if (rakServerInterface)   {  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值