货币给了,但又发送了邮件,邮件里有货币,相当于是给了2倍的货币,怎么取消系统给的那次
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-08 16:55:21 |
👁️ 阅读: 6
我是Lua后端老师!
小仙,这个问题很常见,通常发生在脚本里同时使用了`giveitem`(或`changemoney`)和`sendmail`来发放货币,导致玩家收到了双份。
要解决这个问题,核心思路是**在发送邮件的触发器中,阻止系统自动发放货币**。
根据引擎的机制,当你在`sendmail`函数中指定了附件物品时,系统会默认将物品(包括货币)发给玩家。所以,我们需要在邮件发送的**后置触发**里,把系统自动给的那份货币**扣除**。
这里的关键触发是 **`getmailitem`**(提取邮件触发)。当玩家从邮件中提取物品(货币)时,这个触发会执行。我们可以在这里把系统自动发放的货币拿回来。
下面是一个示例代码,假设你的货币ID是100(元宝),并且通过邮件发放了:
```lua
-- 在 QF 中,getmailitem 触发器的处理函数
function getmailitem(actor, mailId)
-- 首先,获取这封邮件的附件信息(这里需要你知道邮件里附带的货币ID和数量)
-- 注意:实际项目中,你可能需要将邮件ID和发放的货币数量关联存储(比如用变量),这里仅为示例逻辑。
local currencyIdx = 100 -- 假设货币ID是100
local mailCurrencyAmount = 500 -- 假设这封邮件附带了500个该货币
-- 系统已经自动将 mailCurrencyAmount 数量的货币给了玩家
-- 现在,我们将其扣除,只保留我们脚本里通过其他途径(如giveitem)给的那一份
takeitem(actor, currencyIdx, mailCurrencyAmount)
-- 可以给玩家一个提示
sendmsg(actor, "系统自动发放的邮件货币已回收,您已通过其他途径获得奖励。", 1)
end
```
**更优的实践方案:**
为了避免这种“给-收”的绕圈子操作,**最佳实践是在发送邮件时,邮件里不要附带货币**。
1. **脚本发放奖励时**:只使用 `giveitem` 或 `changemoney` 函数直接给玩家货币。
2. **发送通知邮件时**:使用 `sendmail` 函数,但**不附带任何物品**,邮件内容仅作为文字通知。
```lua
-- 正确的做法示例
local player = "玩家的名字或对象"
local rewardAmount = 500
local currencyIdx = 100
-- 1. 直接给予货币
giveitem(player, currencyIdx, rewardAmount)
-- 2. 发送一封不带附件的纯文本通知邮件
sendmsg(player, "恭喜您获得了" .. rewardAmount .. "元宝!", 1) -- 游戏内提示
-- 如果需要邮件记录,可以发一封空附件的邮件
sendmail(player, "奖励通知", "您获得了" .. rewardAmount .. "元宝,已直接发放至您的账户。")
```
**总结一下:**
* **治标**:在 `getmailitem` 触发中,用 `takeitem` 扣除系统自动发放的货币。
* **治本**:修改你的奖励发放逻辑,**货币直接给,邮件只通知**,两者分离,一劳永逸。
小仙,检查一下你的奖励发放脚本,看看是不是同时走了两条发放途径。按照上面的“治本”方法修改,就能完美解决啦。如果还有不清楚的,随时再来问我,或者请教浮生梦尊师哦!
← 返回问答库