-- 气泡定时器
function ontimer11(actor)
-- release_print("触发气泡")
-- printusetime(actor,1)
-- 特殊合成
local biaoji = false
for i = 1, 4, 1 do
-- 检查该分类下是否有可合成的物品
local t = DATA.teshuhecheng[i]
for _, v in ipairs(t) d
我是lua后端老师!
小仙,你这个想法非常棒!从定时器轮询改为事件驱动触发,可以大大减少服务器性能消耗,让代码更高效。根据你的需求,我们可以用`addbagbefore`(物品进包前触发)和`moneychange`(货币改变触发)来重构。
不过要注意,`addbagbefore`**不能阻止进包**,但我们可以用它来检测物品变化,然后触发气泡检查。另外,货币改变触发需要为每种货币单独注册。
下面是我帮你重构的思路和代码:
```lua
-- 首先,在QF中注册货币改变触发(比如金币idx=1,元宝idx=2)
for moneyIdx = 1, 100 do
_G["moneychange"..moneyIdx] = function(actor)
-- 货币改变时触发气泡检查
checkAllBubbles(actor)
end
end
-- 物品进包前触发
addbagbefore = function(actor, item, itemidx, itemMakeIndex)
-- 物品进入背包前触发气泡检查
checkAllBubbles(actor)
end
-- 添加背包触发(物品已进入背包)
addbag = function(actor, item)
-- 物品进入背包后触发气泡检查
checkAllBubbles(actor)
end
-- 统一的检查所有气泡函数
function checkAllBubbles(actor)
-- 特殊合成气泡检查
local teshuFlag = false
for i = 1, 4, 1 do
local t = DATA.teshuhecheng[i]
for _, v in ipairs(t) do
local check_1 = getbagitemcount(actor, v.item[1][1])
local check_2 = v.item[1][2]
local check_3 = getbindmoney(actor, v.item[2][1])
local check_4 = v.item[2][2]
if check_1 >= check_2 and check_3 >= check_4 then
teshuFlag = true
break
end
end
if teshuFlag then
break
end
end
if teshuFlag then
addbutshow(actor, 1, "特殊合成", "@qipao,特殊合成")
else
delbutshow(actor, 1)
end
-- 怪物克星气泡检查(这里需要你的DATA.guaiwukexing配置)
local kexingFlag = false
local item_obj = linkbodyitem(actor, 2)
if item_obj ~= "0" then
local item_id = getiteminfo(actor, item_obj, 2)
local item_name = getstditeminfo(item_id, 1)
if DATA.guaiwukexing and DATA.guaiwukexing[item_name] then
local t = DATA.guaiwukexing[item_name]
for _, item in pairs(t.take) do
if checkitems(actor, item[1].."#"..item[2], 0, 0) then
kexingFlag = true
break
end
end
end
end
if kexingFlag then
addbutshow(actor, 2, "怪物克星", "@qipao,怪物克星")
else
delbutshow(actor, 2)
end
-- 境界传承气泡检查(这里需要你的DATA.jingjie配置)
local jingjieFlag = false
if getplaydef(actor, "U28") == 0 then
setplaydef(actor, "U28", 1)
end
local lv = getplaydef(actor, "U28") or 1
if DATA.jingjie and DATA.jingjie[lv] and lv < 100 then
local t = DATA.jingjie[lv]
for _, item in pairs(t.take) do
if checkitems(actor, item[1].."#"..item[2], 0, 0) then
jingjieFlag = true
break
end
end
end
if jingjieFlag then
addbutshow(actor, 3, "境界传承", "@qipao,境界传承")
else
delbutshow(actor, 3)
end
-- 本命元神气泡检查
local t_name = {"圣战元神等级", "法神元神等级", "天尊元神等级"}
local ys_t = DATA.yuanshen.item
local ys_job = getint(actor, "元神职业") or 0
if ys_job > 0 then
local ys_lv = getint(actor, t_name[ys_job]) or 0
if ys_lv >= 1 and ys_lv < 7 then
local yuanshenFlag = true
for _, item in pairs(ys_t[ys_lv + 1]) do
if not checkitems(actor, item[1].."#"..item[2], 0, 0) then
yuanshenFlag = false
break
end
end
if yuanshenFlag then
addbutshow(actor, 4, "本命元神", "@qipao,本命元神")
else
delbutshow(actor, 4)
end
else
delbutshow(actor, 4)
end
else
delbutshow(actor, 4)
end
end
-- 登录时初始化检查一次
login = function(actor)
checkAllBubbles(actor)
end
-- 原有的qipao函数保持不变
function qipao(actor, p1)
if p1 == "特殊合成" then
TeShuHeCheng_main(actor)
end
if p1 == "怪物克星" then
GuaiWuKeXing_main(actor)
end
if p1 == "境界传承" then
JingJieChuanCheng_main(actor)
end
if p1 == "本命元神" then
YuanShen_main(actor)
end
end
```
**重构要点说明:**
1. **事件驱动**:现在气泡显示会在`物品进包`、`货币改变`、`玩家登录`时自动触发检查,不再需要定时器轮询。
2. **性能优化**:避免了每秒多次的无用检查,只在相关事件发生时才执行逻辑。
3. **统一函数**:把原来的`ontimer11`函数拆分为`checkAllBubbles`统一检查函数,便于维护。
4. **注意事项**:
- 需要确保`DATA.guaiwukexing`和`DATA.jingjie`配置表已正确配置
- 货币触发需要根据你实际使用的货币ID来注册(上面示例注册了1-100)
- 记得删除原来的`setontimer(actor, 11, 1, 0)`定时器设置
5. **扩展性**:如果后续增加新的气泡功能,只需要在`checkAllBubbles`函数中添加对应的检查逻辑即可。
这样重构后,你的气泡系统会更加高效和响应及时!小仙如果还有不明白的地方,随时问我哦~