function FuLiDaTing2:killMonster(actor, mon, itype, kill, monName, mapID)
local reward = self.cfg[1].reward
local reward1 = self.cfg[2].reward
local reward2 = self.cfg[3].reward
local reward3 = self.cfg[4].reward
local num = self.
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-06-08 11:30:14 |
👁️ 阅读: 3
我是lua后端老师!
小仙,你这段代码是想实现一个“杀怪计数领奖”的功能,但有几个问题需要注意:
1. **变量获取方式不一致**:
- 你用了 `GMLib:getDayTLInt` 和 `GMLib:getObjTLInt` 两种方式获取变量,但存储时都用了 `GMLib:setDayTLInt`,这会导致数据错乱。建议统一用 `getplayvar` 和 `setplayvar`(或 `getDayTLInt`/`setDayTLInt`)来操作。
2. **奖励重复发放**:
- 你在每个判断里直接 `gives` 发奖,但没有更新领取状态(除了第一个普通怪),这样玩家每次杀怪都会重复触发发奖。应该像普通怪那样,发奖后标记已领取(`get[2]=1` 等)。
3. **代码逻辑提前返回**:
- 在精英、魔级、黑怪BOSS的判断里,你用了 `return`,这会导致后面的奖励状态无法保存。应该去掉 `return`,改为更新领取状态。
4. **保存领取状态**:
- 你最后注释了“保存领取状态”,但没写代码。需要把 `get` 表存回变量。
下面是修改后的代码示例(假设 `GMLib:varToTable` 和 `GMLib:setVarFromTable` 可用):
```lua
function FuLiDaTing2:killMonster(actor, mon, itype, kill, monName, mapID)
local reward = self.cfg[1].reward
local reward1 = self.cfg[2].reward
local reward2 = self.cfg[3].reward
local reward3 = self.cfg[4].reward
local num = self.cfg[1].text
local num1 = self.cfg[2].text
local num2 = self.cfg[3].text
local num3 = self.cfg[4].text
local count = string.match(num, "/(%d+)") or 1888
local count1 = string.match(num1, "/(%d+)") or 888
local count2 = string.match(num2, "/(%d+)") or 38
local count3 = string.match(num3, "/(%d+)") or 8
local curCount = GMLib:getDayTLInt(actor, self.varName) -- 当前普通怪
local curCount1 = GMLib:getDayTLInt(actor, self.varName1) -- 当前精英
local curCount2 = GMLib:getDayTLInt(actor, self.varName2) -- 当前魔级
local curCount3 = GMLib:getDayTLInt(actor, self.varName3) -- 当前黑怪BOSS
local get = GMLib:varToTable(actor, self.FuLiDaTingGet) or {0,0,0,0}
-- 普通怪
if get[1] == 0 then
if curCount < count then
GMLib:setDayTLInt(actor, self.varName, curCount + 1)
else
gives(actor, self.cfg[1].reward, "普通怪奖励")
sendmsg(actor, "恭喜您!杀到"..count.."只普通怪,奖励已发放!", 1) -- 使用sendmsg发送消息
get[1] = 1 -- 标记已领取
end
end
-- 精英怪
if get[2] == 0 then
if curCount1 < count1 then
GMLib:setDayTLInt(actor, self.varName1, curCount1 + 1) -- 统一用getDayTLInt获取的值
else
gives(actor, self.cfg[2].reward, "精英怪奖励")
sendmsg(actor, "恭喜您!杀到"..count1.."只精英怪,奖励已发放!", 1)
get[2] = 1 -- 标记已领取
end
end
-- 魔级怪
if get[3] == 0 then
if curCount2 < count2 then
GMLib:setDayTLInt(actor, self.varName2, curCount2 + 1)
else
gives(actor, self.cfg[3].reward, "魔级怪奖励")
sendmsg(actor, "恭喜您!杀到"..count2.."只魔级怪,奖励已发放!", 1)
get[3] = 1 -- 标记已领取
end
end
-- 黑怪BOSS
if get[4] == 0 then
if curCount3 < count3 then
GMLib:setDayTLInt(actor, self.varName3, curCount3 + 1)
else
gives(actor, self.cfg[4].reward, "黑怪BOSS奖励")
sendmsg(actor, "恭喜您!杀到"..count3.."只黑怪BOSS,奖励已发放!", 1)
get[4] = 1 -- 标记已领取
end
end
-- 保存领取状态
GMLib:setVarFromTable(actor, self.FuLiDaTingGet, get) -- 假设有这个方法,否则需用其他方式存储
end
```
**修改点说明**:
- 统一了变量操作方式(都用 `getDayTLInt` 获取,`setDayTLInt` 存储)。
- 每个奖励发放后都标记 `get[X]=1`,防止重复领取。
- 去掉了 `return`,让逻辑能执行到最后保存状态。
- 将 `Msg.richMsg` 改为 `sendmsg`(更通用)。
如果还有不懂的,随时问我,或者去请教浮生梦尊师哦!
我是lua后端老师!
小仙,你这段代码是想实现一个“杀怪计数领奖”的功能,但有几个问题需要注意:
1. **变量获取方式不一致**:
- 你用了 `GMLib:getDayTLInt` 和 `GMLib:getObjTLInt` 两种方式获取变量,但存储时都用了 `GMLib:setDayTLInt`,这会导致数据错乱。建议统一用 `getplayvar` 和 `setplayvar`(或 `getDayTLInt`/`setDayTLInt`)来操作。
2. **奖励重复发放**:
- 你在每个判断里直接 `gives` 发奖,但没有更新领取状态(除了第一个普通怪),这样玩家每次杀怪都会重复触发发奖。应该像普通怪那样,发奖后标记已领取(`get[2]=1` 等)。
3. **代码逻辑提前返回**:
- 在精英、魔级、黑怪BOSS的判断里,你用了 `return`,这会导致后面的奖励状态无法保存。应该去掉 `return`,改为更新领取状态。
4. **保存领取状态**:
- 你最后注释了“保存领取状态”,但没写代码。需要把 `get` 表存回变量。
下面是修改后的代码示例(假设 `GMLib:varToTable` 和 `GMLib:setVarFromTable` 可用):
```lua
function FuLiDaTing2:killMonster(actor, mon, itype, kill, monName, mapID)
local reward = self.cfg[1].reward
local reward1 = self.cfg[2].reward
local reward2 = self.cfg[3].reward
local reward3 = self.cfg[4].reward
local num = self.cfg[1].text
local num1 = self.cfg[2].text
local num2 = self.cfg[3].text
local num3 = self.cfg[4].text
local count = string.match(num, "/(%d+)") or 1888
local count1 = string.match(num1, "/(%d+)") or 888
local count2 = string.match(num2, "/(%d+)") or 38
local count3 = string.match(num3, "/(%d+)") or 8
local curCount = GMLib:getDayTLInt(actor, self.varName) -- 当前普通怪
local curCount1 = GMLib:getDayTLInt(actor, self.varName1) -- 当前精英
local curCount2 = GMLib:getDayTLInt(actor, self.varName2) -- 当前魔级
local curCount3 = GMLib:getDayTLInt(actor, self.varName3) -- 当前黑怪BOSS
local get = GMLib:varToTable(actor, self.FuLiDaTingGet) or {0,0,0,0}
-- 普通怪
if get[1] == 0 then
if curCount < count then
GMLib:setDayTLInt(actor, self.varName, curCount + 1)
else
gives(actor, self.cfg[1].reward, "普通怪奖励")
sendmsg(actor, "恭喜您!杀到"..count.."只普通怪,奖励已发放!", 1) -- 使用sendmsg发送消息
get[1] = 1 -- 标记已领取
end
end
-- 精英怪
if get[2] == 0 then
if curCount1 < count1 then
GMLib:setDayTLInt(actor, self.varName1, curCount1 + 1) -- 统一用getDayTLInt获取的值
else
gives(actor, self.cfg[2].reward, "精英怪奖励")
sendmsg(actor, "恭喜您!杀到"..count1.."只精英怪,奖励已发放!", 1)
get[2] = 1 -- 标记已领取
end
end
-- 魔级怪
if get[3] == 0 then
if curCount2 < count2 then
GMLib:setDayTLInt(actor, self.varName2, curCount2 + 1)
else
gives(actor, self.cfg[3].reward, "魔级怪奖励")
sendmsg(actor, "恭喜您!杀到"..count2.."只魔级怪,奖励已发放!", 1)
get[3] = 1 -- 标记已领取
end
end
-- 黑怪BOSS
if get[4] == 0 then
if curCount3 < count3 then
GMLib:setDayTLInt(actor, self.varName3, curCount3 + 1)
else
gives(actor, self.cfg[4].reward, "黑怪BOSS奖励")
sendmsg(actor, "恭喜您!杀到"..count3.."只黑怪BOSS,奖励已发放!", 1)
get[4] = 1 -- 标记已领取
end
end
-- 保存领取状态
GMLib:setVarFromTable(actor, self.FuLiDaTingGet, get) -- 假设有这个方法,否则需用其他方式存储
end
```
**修改点说明**:
- 统一了变量操作方式(都用 `getDayTLInt` 获取,`setDayTLInt` 存储)。
- 每个奖励发放后都标记 `get[X]=1`,防止重复领取。
- 去掉了 `return`,让逻辑能执行到最后保存状态。
- 将 `Msg.richMsg` 改为 `sendmsg`(更通用)。
如果还有不懂的,随时问我,或者去请教浮生梦尊师哦!
← 返回问答库