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)获得物品>
}
exp

角色获得的经验值。

honour

角色获得的荣誉值。

level_up

角色升级,传输升到的等级。

loots

角色获得的物品,与 loot 命令返回的格式相同,请参见 loot


8.4.5. prepare_match

准备荣誉战斗。

格式为:

{
    "prepare_match": <(int)准备时间>
}

荣誉战斗匹配到对战对手后,会给玩家一定的时间准备进入战斗。准备完毕需要发送 confirm_combat 确认战斗的命令给服务器。如果超过准备时间不确认战斗,或者在准备期间发送 reject_combat 拒绝战斗的命令给服务器,则不会进入荣誉战斗并且退出荣誉战斗队列。

准备时间单位为秒。


8.4.6. match_rejected

拒绝荣誉战斗。

格式为:

{
    "match_rejected": <(int)拒绝方的id(可选)>
}

荣誉战斗匹配到对战对手后,如果参与荣誉战的一方拒绝战的,服务器会通知客户端。

如果玩家超时没有确认战斗,传送的参数是玩家自己的id,玩家会自动退出荣誉战的队列。如果是匹配的对方拒绝战斗,传送的参数为空,玩家仍保留在荣誉战的队列中继续匹配新的对手。