function send(actor, type, msg)
sendmsg(actor, type, '{"Msg":"' .. msg .. '","FColor":249,"BColor":0,"Type":' .. type .. ',"Time":2}')
end
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-06-03 22:10:31 |
👁️ 阅读: 9
我是lua后端老师!
小仙,你写的这个 `send` 函数思路是对的,是想封装一个更简单的消息发送函数,不过有几个小地方需要注意一下,咱们来优化一下:
1. **参数 `type`**:在你的函数里,`type` 参数被用来构建 JSON 的 `Type` 字段,这个字段对应的是消息频道(比如1是系统频道,2是行会频道等)。但是 `sendmsg` 函数本身也有一个 `type` 参数,它表示消息的发送范围(比如 0-自己,1-所有人等)。你这里把两个 `type` 混用了,可能会造成混淆。建议把函数参数名改一下,或者明确注释。
2. **JSON 构建**:你现在的写法在 `msg` 内容如果包含英文双引号 `"` 时,会导致 JSON 格式错误而发送失败。更安全的做法是使用 `tbl2json` 函数来构建。
3. **函数注释**:好的封装函数一定要有清晰的注释,说明每个参数的用途。
下面是根据你提供的资料,优化后的版本:
```lua
--- 发送格式化聊天消息的便捷函数
--- @param actor string 玩家对象ID
--- @param channel_type integer 消息频道类型 (对应JSON中的Type字段,例如: 1=系统频道, 2=行会频道, 3=组队频道, 4=顶部跑马灯等)
--- @param message string 要发送的消息内容
function send(actor, channel_type, message)
-- 使用tbl2json安全构建消息JSON,避免msg内容中的引号破坏格式
local msg_table = {
Msg = message, -- 消息内容
FColor = 249, -- 前景色 (黄色)
BColor = 0, -- 背景色 (黑色)
Type = channel_type,-- 消息频道类型
Time = 2 -- 显示时间(秒)
}
local json_msg = tbl2json(msg_table)
-- 调用引擎函数发送消息,第二个参数2表示发送Json格式消息
sendmsg(actor, 2, json_msg)
end
```
**使用示例:**
```lua
-- 给玩家actor在系统频道发送一条黄色消息
send(actor, 1, "欢迎来到传奇世界!")
-- 给玩家actor在行会频道发送一条消息
send(actor, 2, "行会活动开始了!")
```
**优化点说明:**
* **参数更清晰**:将参数名改为 `channel_type`,明确它是用于指定消息频道的。
* **构建更安全**:使用 `tbl2json` 将Lua表转换为JSON字符串,完全不用担心消息内容里的特殊字符。
* **注释完整**:函数和参数都有详细说明,方便以后自己和别人阅读。
* **颜色可调**:你现在固定了颜色(FColor=249是黄色),如果想做成可配置的,可以再增加 `fcolor` 和 `bcolor` 参数。
这样封装后,你以后发送各种格式的公告消息就只需要一行代码啦!如果还有不明白的,随时可以问我,或者去请教浮生梦尊师哦!
← 返回问答库