<本站文本内容除另有声明外,转载时均必须注明出处。(详情…本站文本内容除另有声明外,转载时均必须注明出处。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。>

教程/WebSocket

来自Minecraft Wiki
跳转至: 导航搜索
Information icon.svg
此特性为教育版基岩版独有。

本页面是指基岩版/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事件进行监听,玩家在聊天栏发的消息以及其它相关信息将被通过数据包发回。

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能执行一些游戏内无法执行的命令,例如: /agent create(创建agent)

返回数据包[编辑 | 编辑源代码]

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

  • 对服务器订阅的事件的响应
  • 对服务器发送的命令事件的反馈

event包(订阅事件响应)[编辑 | 编辑源代码]

标准Event包示例[编辑 | 编辑源代码]

{
	"body": {
        "eventName": "",
        "measurements":null,
        "properties": {
        }
    },
	"header": {
        "meesagePurpose": "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是/list命令特有的,在执行其他命令时不存在。

say命令[编辑 | 编辑源代码]

本示例使用了/say oh命令

{"body":{"message":"oh","statusCode":0},"header":{"messagePurpose":"commandResponse","requestId":"00000000-0001-0000-000000000000","version":1}}
  • body.message是/say特有的,而/say命令没有statusMessage项。

注释[编辑 | 编辑源代码]

  • body.statusCode 是命令完成状态,成功时为0,失败时小于0。
  • body.statusMessage 是状态消息,相当于执行命令后聊天里的命令返回,少数命令(如/say命令)无返回显示,故无此项。
  • 返回请求的 header.requestId 与发送请求时附带的 header.requestId 相同。

事件表[编辑 | 编辑源代码]

下面是目前已知的所有可订阅事件,写了触发调条件的是确认可用或者已知触发条件的
事件名称 触发条件
AdditionalContentLoaded
AgentCommand
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
SignOutOfXboxLive
SpecialMobBuilt
StartClient
StartWorld
TextToSpeechToggled
UgcDownloadCompleted
UgcDownloadStarted
UploadSkin
VehicleExited 玩家离开矿车
WorldExported
WorldFilesListed
WorldGenerated
WorldLoaded
WorldUnloaded

你知道吗[编辑 | 编辑源代码]

  • WebSocket在执行/say命令时,国际版显示的发送者名称是外部,而在教育版中,发送者会被显示为教师

历史[编辑 | 编辑源代码]

携带版(Alpha)
0.16.0 build 1 加入了/connect命令,可以连接WebSocket了。
基岩版
1.2 commandRequest包格式发生改变。

参考[编辑 | 编辑源代码]

  1. https://github.com/mcpews/MyAgent
  2. https://github.com/CAIMEOX/FastBuilder