玩家死亡后 给玩家发送邮件, x点x分 你被xxx击杀 爆出物品xxx
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-10 11:17:21 |
👁️ 阅读: 1
后端Lua老师来啦!
小仙,你这个需求很有意思啊,想让玩家在死亡后收到一封“死亡报告”邮件,记录击杀者、时间和爆出物品。这个功能可以增强游戏的互动性和反馈感,是个不错的想法!
要实现这个功能,我们主要会用到两个引擎事件(QF触发)和几个关键函数:
1. **`killplay`**:当玩家被击杀时触发。
2. **`scatterbagitems`**:当玩家死亡,背包物品开始爆出时触发。
思路是这样的:在 `killplay` 触发里,我们记录下击杀者、死亡时间等信息。然后在 `scatterbagitems` 触发里,我们记录下爆出的物品。最后,在所有信息都收集齐之后,发送一封格式化的邮件给死亡的玩家。
下面,我为你编写一个完整的示例脚本:
首先,我们需要在 `QF` 文件中添加这两个触发接口:
```lua
-- 在 QFunction-0.txt 中需要有的触发
[@killplay]
#ACT
-- 这里调用我们的Lua函数来处理击杀事件
LUA callscriptex killplay_trigger <$KILLER> <$CURRRTARGETNAME> <$STR(S0)>
[@scatterbagitems]
#ACT
-- 这里调用我们的Lua函数来处理爆物事件
LUA callscriptex scatterbagitems_trigger <$CURRRTARGETNAME>
```
接下来,是核心的Lua脚本部分。我们创建一个新的Lua文件,比如叫 `DeathMailSystem.lua`:
```lua
-- 死亡邮件系统
-- 作者:后端Lua尊者 (师傅:浮生梦)
-- 功能:玩家死亡后,发送包含击杀者、时间、爆出物品的邮件
local DeathMailSystem = {}
-- 用于临时存储死亡玩家信息的表
DeathMailSystem.deathInfo = {}
-- 处理击杀事件
-- @param killer string 击杀者的玩家对象ID
-- @param deadName string 死亡玩家的名字
-- @param killTimeStr string 击杀时间字符串(由引擎传入,例如 S0 变量)
function killplay_trigger(killer, deadName, killTimeStr)
if not killer or not deadName then
release_print("[死亡邮件] 错误:killplay_trigger 参数不全")
return
end
-- 获取击杀者的名字
local killerPlayer = getplayerbyid(killer)
local killerName = "未知"
if killerPlayer and isplayer(killerPlayer) then
killerName = killerPlayer -- getplayerbyid 返回的是名字,这里直接使用
end
-- 初始化死亡玩家的信息记录
DeathMailSystem.deathInfo[deadName] = {
killer = killerName,
time = killTimeStr or os.date("%H点%M分"), -- 如果没有传入时间,使用当前时间
droppedItems = {} -- 用于记录爆出物品的列表
}
release_print(string.format("[死亡邮件] 记录死亡:%s 被 %s 击杀于 %s",
deadName, killerName, DeathMailSystem.deathInfo[deadName].time))
end
-- 处理爆出物品事件
-- @param deadName string 死亡玩家的名字
function scatterbagitems_trigger(deadName)
if not deadName then
release_print("[死亡邮件] 错误:scatterbagitems_trigger 参数不全")
return
end
-- 检查是否有该玩家的死亡记录
local info = DeathMailSystem.deathInfo[deadName]
if not info then
release_print(string.format("[死亡邮件] 警告:玩家 %s 没有找到死亡记录,跳过邮件发送", deadName))
return
end
-- 注意:scatterbagitems 触发时,我们通常无法直接获取到具体爆出了哪些物品的列表
-- 因为物品是逐个爆出的,且触发时机可能在爆出过程中。
-- 这里我们记录一个通用的提示,或者你可以通过其他方式记录(比如在 itemdamage 等触发中记录)
-- 作为示例,我们这里简单记录为“部分物品”
table.insert(info.droppedItems, "部分随身物品")
-- 所有信息收集完毕,发送邮件
sendDeathMail(deadName, info)
-- 清理临时数据
DeathMailSystem.deathInfo[deadName] = nil
end
-- 发送死亡邮件
-- @param deadName string 收件人(死亡玩家)名字
-- @param info table 死亡信息表
function sendDeathMail(deadName, info)
-- 构建邮件内容
local title = "阵亡通报"
-- 格式化物品列表
local itemsStr = "无"
if #info.droppedItems > 0 then
itemsStr = table.concat(info.droppedItems, "、")
end
local memo = string.format("尊敬的%s:\n\n 于%s,您在战斗中不幸被【%s】击败。\n 此次阵亡中,您损失了:%s。\n\n望您重整旗鼓,再战江湖!",
deadName, info.time, info.killer, itemsStr)
-- 邮件ID可以自定义,确保唯一即可,这里用时间戳
local mailId = tonumber(os.date("%Y%m%d%H%M%S")) or 10001
-- 发送邮件
-- 注意:userid 参数如果是玩家名,需要在前面加 #(如:#张三)
local result = sendmail("#" .. deadName, mailId, title, memo, "")
if result then
release_print(string.format("[死亡邮件] 成功发送邮件给玩家:%s", deadName))
else
release_print(string.format("[死亡邮件] 发送邮件给玩家 %s 失败", deadName))
end
end
-- 一个更精确记录爆出物品的示例函数(需要在其他相关触发中调用)
-- 例如,可以在 @dropuseitems 等触发中记录具体装备
function recordDroppedItem(deadName, itemName)
local info = DeathMailSystem.deathInfo[deadName]
if info and itemName then
table.insert(info.droppedItems, itemName)
release_print(string.format("[死亡邮件] 记录爆出物品:%s -> %s", deadName, itemName))
end
end
-- 导出函数供QF调用
_G.killplay_trigger = killplay_trigger
_G.scatterbagitems_trigger = scatterbagitems_trigger
_G.recordDroppedItem = recordDroppedItem
release_print("[死亡邮件系统] 脚本加载完成")
```
**使用说明:**
1. **部署脚本**:将上面的Lua代码保存为 `DeathMailSystem.lua`,并放在服务器的Lua脚本目录下。
2. **配置QF触发**:在你的 `QFunction-0.txt` 文件中,确保有 `[@killplay]` 和 `[@scatterbagitems]` 的触发,并按照示例调用Lua函数。
3. **关于时间**:示例中使用了引擎可能传入的时间变量 `<$STR(S0)>`,你需要确认你的引擎版本中哪个变量记录了死亡时间,或者使用 `os.date("%H点%M分")` 直接获取当前时间。
4. **关于爆出物品**:`scatterbagitems` 触发本身**不直接提供**爆出了哪些物品的列表。要精确记录,你需要:
* 在 `@dropuseitems(X)`(针对已投保的装备)或 `@itemdamage(X)` 等触发中,额外调用 `recordDroppedItem` 函数来记录具体的物品名称。
* 或者,如果你只是需要一个概括性的提示,示例中的“部分随身物品”也是可以的。
**重要提醒:**
* `sendmail` 函数的 `userid` 参数,如果传入玩家名字,**必须在名字前加上 `#` 号**,例如 `#"玩家名"`。
* 邮件ID (`id`) 需要确保唯一性,避免重复。示例中使用时间戳,简单且有效。
* 临时表 `deathInfo` 会在邮件发送后清理对应数据,避免内存泄漏。
小仙,这个示例给你搭建了一个完整的框架。你可以根据自己版本的具体情况,调整时间获取方式和物品记录逻辑。如果还有不清楚的地方,随时再来问我,或者请教我的师傅浮生梦尊者哦!祝你开发顺利!
← 返回问答库