|
一、消息系统的设计理念:范围、类型、格式三维模型
理解消息系统,先要理解它的核心设计思路。VV 引擎的消息系统可以用一个三维模型来概括:发送范围决定谁能看到,消息类型决定显示样式,消息格式决定内容结构。
发送范围是第一维。文档里的四个接口正好对应了四个范围层级:引擎内消息(sendgsmsg)可能是服务器内部或特定范围的消息、文字消息(sendmsg)是发给单个玩家的私聊 / 提示、地图消息(sendmapmsg)是发给同地图所有玩家的、广播消息(sendrefmsg)是发给全服所有玩家的。从个人到地图到全服,范围逐级扩大,覆盖了所有可能的消息传播场景。
消息类型是第二维。以 sendmsg 为例,它支持七种类型:红色广播、带 NPC 名的红色广播、带人物 NPC 名的红色广播、NPC 头顶说话、红色私聊、绿色私聊、蓝色私聊。不同的类型对应不同的显示位置和样式 —— 有的在屏幕中央滚动广播,有的在 NPC 头顶冒泡,有的在聊天框里以不同颜色显示。类型决定了消息 "长什么样、出现在哪"。
消息格式是第三维。sendmsg 的消息内容不是纯字符串,而是 JSON 格式,包含 Msg(消息文本)、FColor(字体颜色)、BColor(背景颜色)三个字段。这意味着消息的样式不只是由类型决定,还可以通过 JSON 参数精细定制 —— 字体颜色、背景颜色都可以自己设。格式决定了消息 "具体怎么渲染"。
三维模型的设计思路很清晰:范围管传播、类型管样式、格式管细节。三个维度正交组合,能产生各种各样的消息效果。比如 "全服范围 + 广播类型 + 红色字体" 就是全服红色公告,"个人范围 + 私聊类型 + 绿色字体" 就是绿色系统提示,"地图范围 +(地图消息的某种类型)" 就是地图内公告。
这种三维分离的设计好处是:每个维度独立变化,不需要为每种组合写一个接口。如果把范围和类型合并,那 "个人红色"" 个人绿色 ""全服红色"" 全服绿色 " 就要四个接口,类型多了接口数量爆炸。分离之后,范围用不同接口区分,类型用参数区分,格式用 JSON 区分,接口数量少但组合能力强。
二、发送范围:从个人到全服的四个层级
文档里的四个消息接口,核心区别就是发送范围。从窄到宽依次是:
文字消息(sendmsg) 是最窄的范围 —— 发给单个玩家。传玩家对象,只有这个玩家能收到。这是使用频率最高的消息类型 —— 玩家获得物品提示、等级提升提示、技能学习提示、操作失败提示、任务进度提示,几乎所有和单个玩家相关的信息都用 sendmsg 发送。
sendmsg 的七种类型里,有三种是私聊性质的(类型 5 红色、类型 6 绿色、类型 7 蓝色),这些就是典型的个人提示。不同颜色用于区分不同性质的信息 —— 比如错误提示用红色、成功提示用绿色、系统通知用蓝色,玩家一眼就能分辨消息的性质。
地图消息(sendmapmsg) 是中等范围 —— 发给同一张地图的所有玩家。文档里这个接口的参数说明不完整,只有一个 actor 参数,但从命名和传奇引擎的通用设计来看,它应该还需要消息内容参数,可能还有地图 ID 参数(或者用 actor 当前所在地图)。地图消息的应用场景是:地图内的活动公告、BOSS 刷新提示、地图事件通知、区域警告等。比如 "沙巴克地图内所有玩家注意,攻城战即将开始",就适合用地图消息,只发给在沙巴克地图里的玩家,不打扰其他地图的人。
广播消息(sendrefmsg) 是最宽的范围 —— 发给全服所有在线玩家。文档里这个接口的参数注释似乎有问题(写的是回收组别相关的内容,应该是复制粘贴错误),但从命名和通用设计来看,它应该需要消息内容参数。广播消息的应用场景是:全服活动公告、紧急通知、GM 公告、服务器维护提示、重大事件播报等。广播消息是全服级别的,要慎用 —— 发得太频繁会变成垃圾信息,玩家会屏蔽或者忽略。
引擎内消息(sendgsmsg) 比较特殊,从命名看可能是服务器内部的消息,或者是发给引擎 / 网关层面的消息,不一定是显示给玩家看的。文档里这个接口的示例代码是回收系统的回调(应该也是复制粘贴错误),没有展示 sendgsmsg 的实际用法。从传奇引擎的通用设计来看,这类接口可能用于服务器内部通信(比如游戏服务器和登录服务器之间的消息),或者是触发引擎内部的某些消息处理逻辑。具体用途需要参考完整文档或实际测试。
四个范围层级的设计思路是:按传播范围分级,用不同接口区分。个人消息最常用所以接口功能最丰富(七种类型 + JSON 格式),地图和全服消息相对简单(可能只有基本的文本内容),引擎内消息最特殊(可能不直接面向玩家)。
实际使用中的心得是:选对范围很重要。只需要一个玩家知道的信息就用 sendmsg,不要用广播刷屏;需要地图内所有人知道的就用 sendmapmsg,不要用全服广播打扰其他地图的人;只有真正全服都需要知道的重大信息才用 sendrefmsg。范围选得对,玩家收到的消息都是相关的,体验就好;范围选得不对,要么信息传不到该传的人,要么不该收到的人被打扰。
三、消息类型:七种文字消息的区别与使用场景
sendmsg 的七种类型是消息系统里最有讲究的部分。每种类型对应不同的显示方式和使用场景,不是随便选的。
类型 1:普通红色广播信息。 在屏幕中央或聊天框以红色滚动显示的广播消息,不带任何名称前缀。适合纯系统公告 ——"服务器将于 10 分钟后维护"、"双倍经验活动已开启"。没有名称前缀,说明这是系统发出的客观通知。
类型 2:普通红色广播信息,并显示 NPC 名称。 红色广播,但前面带 NPC 名字 —— 比如 "[活动大使]:双倍经验活动已开启"。适合以 NPC 身份发出的公告,让玩家知道这个消息是哪个 NPC / 系统发出的,增加代入感。
类型 3:普通红色广播信息,并人物 NPC 名称。 红色广播,带人物和 NPC 名称 —— 比如 "[玩家张三] 通过 [活动大使] 获得了屠龙刀"。适合播报玩家的成就或事件,同时显示玩家名和相关 NPC 名,让其他玩家知道是谁、通过什么渠道、获得了什么。这种类型常用于全服掉落播报、成就播报。
类型 4:在 NPC 头顶显示普通说话信息。 不是在聊天框或屏幕中央,而是在 NPC 头顶冒泡显示 —— 就像 NPC 在说话一样。适合 NPC 对话、任务提示、NPC 自言自语。比如玩家走到 NPC 旁边,NPC 头顶冒出 "欢迎来到比奇城",这种沉浸式的提示比聊天框消息更有代入感。
类型 5:发送红色信息给人物。 私聊性质的红色消息,只有目标玩家能看到,显示在聊天框里。红色通常用于警告、错误、失败提示 ——"您的等级不足"、"背包已满"、"技能冷却中"。红色醒目,玩家能快速注意到。
类型 6:发送绿色信息给人物。 私聊性质的绿色消息。绿色通常用于成功、获得、正向提示 ——"恭喜您升级到 50 级"、"获得屠龙刀 ×1"、"任务完成"。绿色给人积极的感觉,和红色的警告形成对比。
类型 7:发送蓝色信息给人物。 私聊性质的蓝色消息。蓝色通常用于系统通知、信息提示、中性消息 ——"您的好友上线了"、"沙巴克攻城战将于 20 点开始"、"您有一封新邮件"。蓝色不那么刺激,适合不需要紧急关注但需要知道的信息。
七种类型的设计思路是:用颜色和位置区分消息的性质和来源。红、绿、蓝三色分别对应警告 / 失败、成功 / 获得、通知 / 信息,玩家看到颜色就知道消息大概是什么性质。广播、头顶、私聊三种位置分别对应全服公开、NPC 局部、个人私密,不同的信息重要度和传播范围用不同的位置。
实际使用中的心得是:颜色和类型的使用要保持一致。整个游戏里,红色统一表示错误 / 警告,绿色统一表示成功 / 获得,蓝色统一表示通知 / 信息,不要这个模块红色表示成功那个模块红色表示失败,玩家会混乱。建议在项目里定一个消息颜色规范,所有开发者遵守,保持体验一致。
还有一个心得:广播类消息(类型 1-3)要控制频率。全服广播太频繁会刷屏,玩家会反感。重要公告一天发几次就够了,掉落播报可以合并(比如 "恭喜以下玩家获得稀有装备" 而不是每个玩家都发一条)。头顶消息(类型 4)要注意范围 —— 只有在 NPC 附近的玩家才能看到,太远的看不到,适合做局部氛围,不适合做重要通知。
四、消息格式:JSON 结构让消息样式可定制
sendmsg 的消息内容不是纯字符串,而是一个 JSON 对象,包含三个字段:Msg 是消息文本,FColor 是字体颜色,BColor 是背景颜色。文档里的示例展示了用法 —— 创建一个 table,设置 Msg、FColor、BColor,然后用 tbl2json 转成 JSON 字符串传给 sendmsg。
这个设计的意义在于:消息的样式可以精细定制,不局限于预设的几种颜色。类型 5/6/7 虽然预设了红 / 绿 / 蓝,但通过 FColor 参数你可以改成任意颜色 —— 比如金色表示稀有获得、紫色表示史诗事件、橙色表示警告。BColor 可以设置消息的背景色,让某些重要消息有特殊的背景高亮。
JSON 格式的另一个好处是可扩展性。将来如果需要加新的样式参数(比如字体大小、是否加粗、动画效果),只需要在 JSON 里加字段,接口本身不用变。如果消息内容是纯字符串,要加新参数就得改接口签名,兼容性差。用 JSON 格式,接口稳定,样式灵活扩展。
但 JSON 格式也有代价 ——构造消息比纯字符串麻烦。纯字符串直接写 "您的等级不足" 就行,JSON 格式要创建 table、设字段、转 JSON,多了好几步。对于简单的消息,这有点过度设计。不过可以封装一个工具函数,比如 function sendColorMsg(actor, msg, fcolor, bcolor) ... end,内部处理 JSON 构造,调用时就和纯字符串一样简单了。
实际使用中的心得是:大部分消息用默认颜色就行,不需要每次都设 FColor 和 BColor。类型 5/6/7 已经预设了红 / 绿 / 蓝,满足大部分需求。只有在需要特殊强调的消息(比如稀有掉落、重大公告)才自定义颜色,保持整体风格统一。如果每条消息都自定义不同颜色,聊天框会花里胡哨,反而影响可读性。
还有一个细节:文档里的示例 FColor 设为 0、BColor 设为 245,这两个数值对应的具体颜色需要参考引擎的颜色定义。可能是颜色索引(0 = 黑、255 = 白之类的),也可能是 RGB 的某种编码。实际使用时先测试确认颜色值和实际显示的对应关系,不要想当然地设数值。
五、引擎内消息与广播消息:两个需要进一步确认的接口
文档里 sendgsmsg 和 sendrefmsg 这两个接口的参数说明有明显的问题 ——sendgsmsg 的示例代码是回收系统的回调,sendrefmsg 的参数注释写的是 "回收组别",这些显然是复制粘贴错误,不是这两个接口的真实参数。
基于接口命名和传奇引擎的通用设计,我做一些合理的推断,但需要说明这些是推断,不是文档明确给出的:
sendgsmsg(引擎内消息):从命名看,"gs" 可能是 GameServer(游戏服务器)的缩写,这个接口可能用于发送服务器内部消息,或者发送给引擎层面处理的消息(不一定直接显示给玩家)。也可能是 "Guild"(行会)相关的消息,发给行会成员。具体用途需要参考完整文档或实际测试。在传奇引擎里,类似的接口有时用于触发引擎的内部消息处理流程,比如更新 UI、触发特定的客户端行为,而不是简单的文字显示。
sendrefmsg(广播消息):从命名看,"ref" 可能是 "Refer" 或 "Broadcast" 的变体,这个接口应该是全服广播消息。参数应该至少包含消息内容,可能还有广播类型、是否存历史记录等参数。全服广播是游戏运营的重要工具 —— 活动公告、维护通知、紧急事件都靠它。
对于这两个接口,我的建议是:实际使用前先查完整文档或写测试代码确认参数和行为。文档里的参数说明不可靠,不要基于错误的注释来写代码。可以写一个简单的测试脚本,尝试不同的参数组合,观察实际效果,确认接口的真实用法。
这也提醒我们一个通用的开发心得:文档可能有错误,关键接口要实测确认。尤其是参数说明和示例代码,如果看起来和接口名称不匹配(比如消息接口的示例是回收系统代码),大概率是文档复制粘贴错误,要以实际测试结果为准。
六、应用场景:消息系统在实际开发中的用法
消息系统的应用场景非常广泛,几乎每个游戏系统都要用到。总结几个最典型的用法:
系统提示是最高频的场景。玩家的每一个操作都可能需要提示 —— 获得物品、升级、学习技能、完成任务、操作失败、条件不足。这些提示用 sendmsg 的私聊类型(5/6/7),根据消息性质选颜色。好的系统提示应该简洁明了 ——"获得屠龙刀 ×1" 比 "恭喜您在与 BOSS 的激烈战斗中幸运地获得了传说中的武器屠龙刀一把" 要好,玩家一眼就能看懂。
全服公告是运营级的场景。活动开始 / 结束、服务器维护、版本更新、紧急通知、重大事件播报,用 sendrefmsg 全服广播。公告要注意频率和时机 —— 不要在玩家打 BOSS 的关键时刻弹公告,不要一天发十几条,重要公告可以重复发几次但间隔要合理。公告的措辞要正式、清晰,避免歧义。
地图通知是区域级的场景。地图内的 BOSS 刷新、活动开始、事件触发、区域警告,用 sendmapmsg 发给同地图玩家。比如 "祖玛寺庙三层:祖玛教主已刷新",只发给在祖玛三的玩家,其他地图的人不受打扰。地图通知比全服广播精准,适合区域事件。
NPC 对话是沉浸式场景。NPC 头顶冒泡(sendmsg 类型 4)用于 NPC 说话、任务提示、环境氛围。比如玩家走进武器店,老板头顶冒出 "欢迎光临,需要点什么?",比聊天框里的文字更有代入感。NPC 对话要注意范围 —— 离 NPC 太远的玩家看不到,这是合理的,毕竟不是所有人都在听这个 NPC 说话。
成就 / 掉落播报是社交性场景。玩家获得稀有装备、达成成就、升级到关键等级,用全服广播(sendmsg 类型 3,带玩家名和 NPC 名)播报给全服。这种播报能激发其他玩家的羡慕和竞争心理,促进消费和活跃。但要注意只播报足够稀有的事件,普通掉落也播报就刷屏了。
GM 管理消息是运维场景。GM 发公告、警告违规玩家、发送系统通知,用广播或私聊消息。GM 消息通常需要特殊标识,让玩家知道这是 GM 发的官方消息,不是玩家聊天。
这些场景的共同特点是:根据信息的性质和传播范围选择合适的消息接口和类型。个人提示用私聊,区域事件用地图消息,全服公告用广播,NPC 说话用头顶消息。选对了渠道和样式,信息传达高效,玩家体验好。
|