8. 服务端消息¶
客户端与服务端通过 WebSocket 通讯,当相关信息发生变化时,服务端会主动发送消息给客户端,让客户端及时响应变化。
8.1. 消息格式¶
服务端发送给客户端的数据为 JSON 格式的字符串,格式如下:
{
消息类型: 数据
}
或:
[
{
消息类型: 数据
},
{
消息类型: 数据
},
...
{
消息类型: 数据
}
]
消息可以是一个key/value对,也可以是一个key/value对的列表。 如果是列表格式的消息,必须按列表中的次序逐个处理消息。
Muddery 向客户端发送的全部消息如下:
8.2. 文本类消息¶
服务器发给客户端的文本信息,通常需要显示给用户看。
8.2.1. msg¶
向客户端发送普通信息。
格式为:
{
"msg": <(str)文本信息>
}
消息内容为文本信息,客户端收到消息后需要在界面上显示消息内容。信息支持富文本标记,如设置文字颜色的标记等。
8.2.2. alert¶
向客户端发送警告信息。
格式为:
{
"alert": <(str)文本信息>
}
消息内容为文本信息,客户端收到消息后需要用弹窗提醒用户。信息支持富文本标记,如设置文字颜色的标记等。
8.3. 环境信息¶
和玩家周围环境发生变化时发送的消息。
8.3.1. state¶
玩家角色的最新状态。
格式为:
{
"state": {
<状态1的名称>: <状态1的值>,
<状态2的名称>: <状态2的值>,
...
}
}
当玩家角色的状态被动变化时,服务器会将玩家角色的最新状态发送给客户端
8.3.2. move_to¶
玩家角色移动到新位置。
格式为:
{
"location": { // 玩家角色所在的新位置
"area": <(str)所在区域的key>,
"room": <(str)所在房间的key>
},
"at_leave": <(list)离开之前房间的信息>(可选),
"at_arrive": <(list)到达当前房间的信息>(可选),
"events": <(list)触发的事件>(可选),
"quests": <(list)影响的任务>(可选)
}
当玩家角色被动移动到新的位置时,服务器会将新位置的信息发送到客户端。
- area
新位置所在区域的 key。
- room
新位置所在房间的 key。
- at_leave
玩家角色在离开之前房间时可能有一些信息需要显示给用户。格式为:
[ <(str)信息文本>, ... ]
- at_arrive
玩家角色在进入当前房间时可能有一些信息需要显示给用户。格式为:
[ <(str)信息文本>, ... ]
- events
如果玩家的行动触发了事件,会返回相关事件的信息。格式为:
[ { <事件动作的id>: <(any)事件动作的信息> } ... ]
- quests
如果玩家的行动引起任务目标达成,会返回相关的任务信息。格式为:
{ "accomplished": [ // 达成的任务 { "key": <(str)任务的key>, "name": <(str)任务的名字>, }, ... ] }
8.3.3. obj_moved_in¶
角色进入房间。
格式为:
{
"obj_moved_in": {
"type": <(str)角色的类型>, // "players"或"npcs"
"id": <(int)角色的id>,
"name": <(str)角色的名字>,
"icon": <(str)角色的图标>
}
}
有角色进入玩家当前所在的房间时,服务器会通知客户端。
- type
角色的类型,players 为玩家角色、npcs 为NPC。
- id
角色对象的id。
- name
角色显示的名字。
- icon
角色的图标信息,如图标的名字、路径,如果没有则为空。
8.3.4. obj_moved_out¶
角色离开房间。
格式为:
{
"obj_moved_out": {
"type": <(str)角色的类型>,
"id": <(int)角色的id>,
"name": <(str)角色的名字>
}
}
有角色离开玩家当前所在的房间时,服务器会通知客户端。
- type
角色的类型有两种:players 为玩家角色、npcs 为NPC。
- id
角色对象的id。
- name
角色显示的名字。
8.3.5. conversation¶
玩家之间聊天的内容。
格式为:
{
"conversation": {
"type": <(str)聊天的类型>,
"from_id": <(str)说话者的id>,
"from_name": <(str)说话者的名字>,
"to": <(str)聊天对象的名字>,
"msg": <(str)聊天的内容>
}
}
玩家之间进行的聊天会通过该消息传送。
- type
默认有三种类型的聊天:
PRIVATE 私聊,玩家一对一的聊天。
LOCAL 本地,和当前房间内的所有玩家聊天。
CHANNEL 公共频道,和公共频道内的所有玩家聊天。
- from_id
说话者的id。
- from_name
说话者的名字。
- to
聊天对象的名字:
PRIVATE 类型:为聊天玩家对象的名字。
LOCAL 类型:为房间的名字。
CHANNEL 类型:为聊天频道的名字。
- msg
聊天的文本内容。
8.4. 战斗信息¶
与战斗有关的信息。
8.4.1. attack¶
玩家被攻击。
格式为:
{
"from": <(str)攻击发起者的名字>,
"target": <(str)被攻击者的名字>,
"combat_info": { // 战斗的基本信息
{
"desc": <(str)战斗的描述信息>,
"timeout": <(int)战斗的最长时间>,
"characters": <(list)参与战斗的所有角色>
}
},
"combat_commands": <(list)该角色可在战斗中使用的技能>,
"combat_states": <(dict)战斗相关所有角色的状态>
}
玩家角色被攻击时服务端会发送该消息通知客户端。客户端需要切换到战斗界面进入战斗状态。
消息格式与 attack 命令返回的格式相同,请参见 attack 。
8.4.2. honour_combat¶
开始荣誉战斗。
格式为:
{
"from": <(str)攻击发起者的名字>,
"target": <(str)被攻击者的名字>,
"combat_info": { // 战斗的基本信息
{
"desc": <(str)战斗的描述信息>,
"timeout": <(int)战斗的最长时间>,
"characters": <(list)参与战斗的所有角色>
}
},
"combat_commands": <(list)该角色可在战斗中使用的技能>,
"combat_states": <(dict)战斗相关所有角色的状态>
}
荣誉战斗开始时服务端会发送该消息通知客户端。客户端需要切换到战斗界面进入战斗状态。
消息格式与 attack 命令返回的格式相同,请参见 attack 。
8.4.3. combat_skill_cast¶
战斗中有技能施放。
格式为:
{
"combat_skill_cast": { // 技能施放结果
"skill": <(str)技能的key>,
"main_type": <(str)技能的主类型>,
"sub_type": <(str)技能的次类型>,
"caller": <(int)技能施放者的id>,
"target": <(int)技能施放目标的id>(可选),
"states": <(dict)技能施放后相关对象的状态>,
"cast": <(str)施放技能的文字描述信息>,
"result": <(str)技能施放结果的文字描述信息>
}
}
战斗中的角色施放技能后,服务器会把技能发送的情况发送给所有参与战斗的玩家。
消息格式与 cast_skill 命令返回的 result 相同,请参见 cast_skill 。
8.4.4. combat_finish¶
战斗结束。
格式为:
{
"combat_finish": {
"type": <(str)战斗的类型>,
"result": <(str)战斗结果>,
"rewards": <(dict)战斗奖励>
}
}
战斗结束时发送给客户端,通知客户端战斗已结束,告知战斗的结果。
- type
战斗的类型:
NORMAL 普通战斗
HONOUR 荣誉战斗
- result
战斗结果:
COMBAT_WIN 胜利
COMBAT_LOSE 失败
COMBAT_DRAW 平局
COMBAT_ESCAPED 逃离战斗
- rewards
战斗获得的奖励,如果有相应奖励就会传输该项内容,没有传输则没有获得相关奖励。格式为:
{ "exp": <(int)获得经验值>, "honour": <(int)获得荣誉值>, "level_up": <(int)升到等级>, "loots": <(dict)获得物品> }
8.4.5. prepare_match¶
准备荣誉战斗。
格式为:
{
"prepare_match": <(int)准备时间>
}
荣誉战斗匹配到对战对手后,会给玩家一定的时间准备进入战斗。准备完毕需要发送 confirm_combat 确认战斗的命令给服务器。如果超过准备时间不确认战斗,或者在准备期间发送 reject_combat 拒绝战斗的命令给服务器,则不会进入荣誉战斗并且退出荣誉战斗队列。
准备时间单位为秒。
8.4.6. match_rejected¶
拒绝荣誉战斗。
格式为:
{
"match_rejected": <(int)拒绝方的id(可选)>
}
荣誉战斗匹配到对战对手后,如果参与荣誉战的一方拒绝战的,服务器会通知客户端。
如果玩家超时没有确认战斗,传送的参数是玩家自己的id,玩家会自动退出荣誉战的队列。如果是匹配的对方拒绝战斗,传送的参数为空,玩家仍保留在荣誉战的队列中继续匹配新的对手。