--进入对应奖励地图
function XueZhanShaCheng:Reward(actor)
local cfg = self._cfg
local shengli = cfg[1].rewardmap -- 胜利领奖地图
local shibai = cfg[2].rewardmap -- 失败领奖地图
--检查时间是否在领取奖励时间段
if not checkLTime(actor) then
Msg.richM
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-21 12:07:14 |
👁️ 阅读: 0
我是lua后端老师!小仙,你好呀!我来帮你看看这段攻城战领奖脚本,并且根据你的要求进行补充。
首先,我注意到你的脚本里已经有很多功能了,包括检查时间、检查行会、检查活跃值、判断胜负方进入不同地图,以及定时发放奖励。你希望在此基础上增加功能,对吗?
从你的代码来看,有几个地方可以优化和完善:
1. **定时器逻辑问题**:你的 `setTimer` 函数和 `setontimerex` 函数没有正确关联。`setTimer` 只是检查当前时间,并没有真正设置定时器。`setontimerex` 是一个空函数。
2. **领奖触发时机**:`lingjiang` 函数只在 `setTimer` 返回 `true` 时执行,这意味着它只会在21点03分那一分钟里,当玩家调用 `Reward` 函数并进入地图后才会触发领奖。这很可能不是你想要的。你应该是希望在21点03分这个时间点,**自动**给所有在奖励地图里的玩家发奖。
3. **功能补充**:你提到了“在此基础上加”,但没有具体说加什么。结合攻城战常见的需求,我猜你可能想增加:
* **攻城战状态判断**:在进入奖励地图前,检查攻城战是否已经结束。
* **更安全的奖励发放**:确保奖励只发放一次。
* **使用全局定时器**:在指定时间自动触发发奖逻辑。
让我根据攻城战相关的知识,帮你重构和补充这个脚本。我们将使用 `castleinfo` 来检查攻城状态,并使用 `setontimerex` 来设置一个在21:03触发的全局定时器。
```lua
-- 假设你的模块叫 XueZhanShaCheng
XueZhanShaCheng = XueZhanShaCheng or {}
-- 进入对应奖励地图
function XueZhanShaCheng:Reward(actor)
local cfg = self._cfg
local shengli = cfg[1].rewardmap -- 胜利领奖地图
local shibai = cfg[2].rewardmap -- 失败领奖地图
-- 1. 检查攻城战是否已结束
-- castleinfo(5) 返回布尔值,true表示正在攻沙状态
if castleinfo(5) then
Msg.richMsg(actor, "【提醒】攻城战尚未结束,无法领取奖励!")
return
end
-- 2. 检查时间是否在领取奖励时间段 (你的原逻辑)
if not checkLTime(actor) then
Msg.richMsg(actor, "【提醒】领取奖励时间为【21:00 ~ 21:03】!")
return
end
-- 3. 检查有无行会
local guild = getmyguild(actor)
if not guild then
Msg.richMsg(actor, "您未加入行会,无法领取奖励!")
return
end
-- 4. 检查活跃值>=50
local currentHuoyue = GetInt(0, actor, huoyue) or 0
if currentHuoyue < 50 then
Msg.richMsg(actor, "活跃值不足50,无法领取奖励!当前活跃值:"..currentHuoyue)
return
end
-- 5. 检查是否已经领过奖(防止重复进入)
-- 假设我们用一个玩家变量来标记是否已进入领奖地图
if getplayvar(actor, "已领取攻城奖励") == "1" then
Msg.richMsg(actor, "您已经领取过本次攻城战的奖励了!")
return
end
-- 6. 飞奖励地图
local cast = castleidentity(actor) -- 获取玩家沙巴克身份 0-非成员 1-成员 2-老大
if cast == 0 then
map(actor, shibai)
Msg.richMsg(actor, "你进入失败方领奖地图")
-- 记录玩家进入了失败方地图
setplayvar(actor, "奖励地图类型", "失败")
else
map(actor, shengli)
Msg.richMsg(actor, "你进入胜利方领奖地图")
-- 记录玩家进入了胜利方地图
setplayvar(actor, "奖励地图类型", "胜利")
end
-- 标记玩家已进入领奖流程
setplayvar(actor, "已进入攻城领奖", "1")
-- 注意:这里不再直接调用 lingjiang,领奖将由定时器触发
release_print("玩家", actor, "进入了攻城战领奖地图")
end
-- 在服务器启动或加载脚本时,设置21:03的全局定时器
function XueZhanShaCheng:InitRewardTimer()
-- 计算到今晚21:03的秒数
local currentTime = os.time()
local targetTime = os.time{year=os.date("%Y"), month=os.date("%m"), day=os.date("%d"), hour=21, min=3, sec=0}
-- 如果今天21:03已过,就设置为明天21:03
if currentTime > targetTime then
targetTime = targetTime + 86400 -- 加一天
end
local secondsToTarget = targetTime - currentTime
-- 设置全局定时器,触发器ID设为 "GongChengReward2103"
-- setontimerex(触发器ID, 延迟秒数) -- 设置全局定时器
setontimerex("GongChengReward2103", secondsToTarget)
release_print("已设置攻城战奖励定时器,将在", secondsToTarget, "秒后触发")
end
-- 全局定时器触发函数 - 这个需要在QFunction-0.lua中定义
-- 注意:这个函数名必须和上面设置的触发器ID对应,且需要在QF中注册
function ontimerex_GongChengReward2103(sysObj)
release_print("攻城战奖励定时器触发,开始发放奖励")
XueZhanShaCheng:DistributeRewards()
end
-- 发放奖励的主要函数
function XueZhanShaCheng:DistributeRewards()
local cfg = self._cfg
local shengli = cfg[1].rewardmap -- 胜利领奖地图
local shibai = cfg[2].rewardmap -- 失败领奖地图
local reward = cfg[1].reward -- 首沙胜利总奖励
local fail = cfg[2].reward -- 首沙失败总奖励
local oldreward = cfg[1].oldreward -- 老区胜利总奖励
local oldfail = cfg[2].oldreward -- 老区失败总奖励
local winTotal, failTotal
-- 注意:checkNewZone 需要传入玩家对象,这里我们需要分别处理
-- 我们先获取地图里的玩家,再逐个判断
local failPlayCount = getplaycountinmap(nil, shibai, 0) -- 获取失败地图玩家数量
local winPlayCount = getplaycountinmap(nil, shengli, 0) -- 获取胜利地图玩家数量
-- 获取地图内的玩家列表
local failplayList = getplaycount(shibai, 1, 1) -- 获取失败地图玩家列表
local winplayerList = getplaycount(shengli, 1, 1) -- 获取胜利地图玩家列表
-- 处理失败方玩家
if type(failplayList) == "table" then
for _, playerId in ipairs(failplayList) do
-- 检查玩家是否标记为已进入领奖流程
if getplayvar(playerId, "已进入攻城领奖") == "1" then
local isNewZone = checkNewZone(playerId) -- 需要你的 checkNewZone 函数支持
local failTotalForPlayer = isNewZone and fail or oldfail
local faijiangli = failPlayCount > 0 and math.floor(failTotalForPlayer / failPlayCount) or 0
-- 发送奖励邮件
sendmail(
playerId,
2, -- 使用不同的邮件ID,避免冲突
"攻城战失败奖励",
"恭喜您在血战沙城中获得失败奖励:"..faijiangli.."元宝",
"元宝#"..faijiangli.."#0"
)
-- 发送系统提示
sendmsg(playerId, 1, "恭喜获得攻城战失败奖励:"..faijiangli.."元宝,已通过邮件发放!")
-- 标记奖励已领取
setplayvar(playerId, "已领取攻城奖励", "1")
setplayvar(playerId, "已进入攻城领奖", "0") -- 重置状态
release_print("向玩家", playerId, "发放失败奖励", faijiangli, "元宝")
end
end
end
-- 处理胜利方玩家
if type(winplayerList) == "table" then
for _, playerId in ipairs(winplayerList) do
-- 检查玩家是否标记为已进入领奖流程
if getplayvar(playerId, "已进入攻城领奖") == "1" then
local isNewZone = checkNewZone(playerId) -- 需要你的 checkNewZone 函数支持
local winTotalForPlayer = isNewZone and reward or oldreward
local winjiangli = winPlayCount > 0 and math.floor(winTotalForPlayer / winPlayCount) or 0
-- 发送奖励邮件
sendmail(
playerId,
3, -- 使用不同的邮件ID
"攻城战胜利奖励",
"恭喜您在血战沙城中获得胜利奖励:"..winjiangli.."元宝",
"元宝#"..winjiangli.."#0"
)
-- 发送系统提示
sendmsg(playerId, 1, "恭喜获得攻城战胜利奖励:"..winjiangli.."元宝,已通过邮件发放!")
-- 标记奖励已领取
setplayvar(playerId, "已领取攻城奖励", "1")
setplayvar(playerId, "已进入攻城领奖", "0") -- 重置状态
release_print("向玩家", playerId, "发放胜利奖励", winjiangli, "元宝")
end
end
end
-- 奖励发放完毕后,清理所有玩家的领奖状态(可选)
-- 这里可以添加清理逻辑,比如把地图里所有玩家的状态重置
release_print("攻城战奖励发放完毕")
end
-- 清空玩家领奖状态的函数(在发奖后或每天重置时调用)
function XueZhanShaCheng:ResetRewardStatus()
-- 这里可以遍历所有玩家,重置他们的领奖状态变量
-- 例如:setplayvar(玩家ID, "已领取攻城奖励", "0")
-- 具体实现取决于你的需求
end
```
**主要增加和修改的内容:**
1. **攻城战状态检查**:在 `Reward` 函数开头使用 `castleinfo(5)` 检查攻城战是否已结束。
2. **防止重复领奖**:增加了玩家变量 `已领取攻城奖励` 来标记,防止玩家重复进入领奖地图。
3. **正确的定时器设置**:
* 添加了 `InitRewardTimer` 函数,用于在服务器启动时计算并设置每天21:03的全局定时器。
* 需要在 `startup` 触发中调用 `XueZhanShaCheng:InitRewardTimer()`。
4. **全局定时器触发**:
* 添加了 `ontimerex_GongChengReward2103` 函数,这个函数需要在 `QFunction-0.lua` 中注册。
* 当定时器触发时,会自动调用 `DistributeRewards` 函数发放奖励。
5. **改进的奖励发放逻辑**:
* `DistributeRewards` 函数会检查每个玩家是否标记为 `已进入攻城领奖`,只有符合条件的玩家才会收到奖励。
* 发奖后,会更新玩家的状态变量,防止重复领取。
**还需要你做的:**
1. 在 `QFunction-0.lua` 中添加以下代码来注册全局定时器触发:
```lua
function ontimerex(GongChengReward2103)
ontimerex_GongChengReward2103(sysObj)
end
```
2. 在服务器启动触发中初始化定时器:
```lua
function startup(sysObj)
XueZhanShaCheng:InitRewardTimer()
end
```
3. 确保你的 `checkNewZone` 函数能正常工作,或者根据你的需求调整新区/老区的判断逻辑。
小仙,这样修改后,你的攻城战领奖系统就更加完善和安全了。如果还有不明白的地方,随时问我哦!不懂的也可以请教浮生梦尊师!
我是lua后端老师!小仙,你好呀!我来帮你看看这段攻城战领奖脚本,并且根据你的要求进行补充。
首先,我注意到你的脚本里已经有很多功能了,包括检查时间、检查行会、检查活跃值、判断胜负方进入不同地图,以及定时发放奖励。你希望在此基础上增加功能,对吗?
从你的代码来看,有几个地方可以优化和完善:
1. **定时器逻辑问题**:你的 `setTimer` 函数和 `setontimerex` 函数没有正确关联。`setTimer` 只是检查当前时间,并没有真正设置定时器。`setontimerex` 是一个空函数。
2. **领奖触发时机**:`lingjiang` 函数只在 `setTimer` 返回 `true` 时执行,这意味着它只会在21点03分那一分钟里,当玩家调用 `Reward` 函数并进入地图后才会触发领奖。这很可能不是你想要的。你应该是希望在21点03分这个时间点,**自动**给所有在奖励地图里的玩家发奖。
3. **功能补充**:你提到了“在此基础上加”,但没有具体说加什么。结合攻城战常见的需求,我猜你可能想增加:
* **攻城战状态判断**:在进入奖励地图前,检查攻城战是否已经结束。
* **更安全的奖励发放**:确保奖励只发放一次。
* **使用全局定时器**:在指定时间自动触发发奖逻辑。
让我根据攻城战相关的知识,帮你重构和补充这个脚本。我们将使用 `castleinfo` 来检查攻城状态,并使用 `setontimerex` 来设置一个在21:03触发的全局定时器。
```lua
-- 假设你的模块叫 XueZhanShaCheng
XueZhanShaCheng = XueZhanShaCheng or {}
-- 进入对应奖励地图
function XueZhanShaCheng:Reward(actor)
local cfg = self._cfg
local shengli = cfg[1].rewardmap -- 胜利领奖地图
local shibai = cfg[2].rewardmap -- 失败领奖地图
-- 1. 检查攻城战是否已结束
-- castleinfo(5) 返回布尔值,true表示正在攻沙状态
if castleinfo(5) then
Msg.richMsg(actor, "【提醒】攻城战尚未结束,无法领取奖励!")
return
end
-- 2. 检查时间是否在领取奖励时间段 (你的原逻辑)
if not checkLTime(actor) then
Msg.richMsg(actor, "【提醒】领取奖励时间为【21:00 ~ 21:03】!")
return
end
-- 3. 检查有无行会
local guild = getmyguild(actor)
if not guild then
Msg.richMsg(actor, "您未加入行会,无法领取奖励!")
return
end
-- 4. 检查活跃值>=50
local currentHuoyue = GetInt(0, actor, huoyue) or 0
if currentHuoyue < 50 then
Msg.richMsg(actor, "活跃值不足50,无法领取奖励!当前活跃值:"..currentHuoyue)
return
end
-- 5. 检查是否已经领过奖(防止重复进入)
-- 假设我们用一个玩家变量来标记是否已进入领奖地图
if getplayvar(actor, "已领取攻城奖励") == "1" then
Msg.richMsg(actor, "您已经领取过本次攻城战的奖励了!")
return
end
-- 6. 飞奖励地图
local cast = castleidentity(actor) -- 获取玩家沙巴克身份 0-非成员 1-成员 2-老大
if cast == 0 then
map(actor, shibai)
Msg.richMsg(actor, "你进入失败方领奖地图")
-- 记录玩家进入了失败方地图
setplayvar(actor, "奖励地图类型", "失败")
else
map(actor, shengli)
Msg.richMsg(actor, "你进入胜利方领奖地图")
-- 记录玩家进入了胜利方地图
setplayvar(actor, "奖励地图类型", "胜利")
end
-- 标记玩家已进入领奖流程
setplayvar(actor, "已进入攻城领奖", "1")
-- 注意:这里不再直接调用 lingjiang,领奖将由定时器触发
release_print("玩家", actor, "进入了攻城战领奖地图")
end
-- 在服务器启动或加载脚本时,设置21:03的全局定时器
function XueZhanShaCheng:InitRewardTimer()
-- 计算到今晚21:03的秒数
local currentTime = os.time()
local targetTime = os.time{year=os.date("%Y"), month=os.date("%m"), day=os.date("%d"), hour=21, min=3, sec=0}
-- 如果今天21:03已过,就设置为明天21:03
if currentTime > targetTime then
targetTime = targetTime + 86400 -- 加一天
end
local secondsToTarget = targetTime - currentTime
-- 设置全局定时器,触发器ID设为 "GongChengReward2103"
-- setontimerex(触发器ID, 延迟秒数) -- 设置全局定时器
setontimerex("GongChengReward2103", secondsToTarget)
release_print("已设置攻城战奖励定时器,将在", secondsToTarget, "秒后触发")
end
-- 全局定时器触发函数 - 这个需要在QFunction-0.lua中定义
-- 注意:这个函数名必须和上面设置的触发器ID对应,且需要在QF中注册
function ontimerex_GongChengReward2103(sysObj)
release_print("攻城战奖励定时器触发,开始发放奖励")
XueZhanShaCheng:DistributeRewards()
end
-- 发放奖励的主要函数
function XueZhanShaCheng:DistributeRewards()
local cfg = self._cfg
local shengli = cfg[1].rewardmap -- 胜利领奖地图
local shibai = cfg[2].rewardmap -- 失败领奖地图
local reward = cfg[1].reward -- 首沙胜利总奖励
local fail = cfg[2].reward -- 首沙失败总奖励
local oldreward = cfg[1].oldreward -- 老区胜利总奖励
local oldfail = cfg[2].oldreward -- 老区失败总奖励
local winTotal, failTotal
-- 注意:checkNewZone 需要传入玩家对象,这里我们需要分别处理
-- 我们先获取地图里的玩家,再逐个判断
local failPlayCount = getplaycountinmap(nil, shibai, 0) -- 获取失败地图玩家数量
local winPlayCount = getplaycountinmap(nil, shengli, 0) -- 获取胜利地图玩家数量
-- 获取地图内的玩家列表
local failplayList = getplaycount(shibai, 1, 1) -- 获取失败地图玩家列表
local winplayerList = getplaycount(shengli, 1, 1) -- 获取胜利地图玩家列表
-- 处理失败方玩家
if type(failplayList) == "table" then
for _, playerId in ipairs(failplayList) do
-- 检查玩家是否标记为已进入领奖流程
if getplayvar(playerId, "已进入攻城领奖") == "1" then
local isNewZone = checkNewZone(playerId) -- 需要你的 checkNewZone 函数支持
local failTotalForPlayer = isNewZone and fail or oldfail
local faijiangli = failPlayCount > 0 and math.floor(failTotalForPlayer / failPlayCount) or 0
-- 发送奖励邮件
sendmail(
playerId,
2, -- 使用不同的邮件ID,避免冲突
"攻城战失败奖励",
"恭喜您在血战沙城中获得失败奖励:"..faijiangli.."元宝",
"元宝#"..faijiangli.."#0"
)
-- 发送系统提示
sendmsg(playerId, 1, "恭喜获得攻城战失败奖励:"..faijiangli.."元宝,已通过邮件发放!")
-- 标记奖励已领取
setplayvar(playerId, "已领取攻城奖励", "1")
setplayvar(playerId, "已进入攻城领奖", "0") -- 重置状态
release_print("向玩家", playerId, "发放失败奖励", faijiangli, "元宝")
end
end
end
-- 处理胜利方玩家
if type(winplayerList) == "table" then
for _, playerId in ipairs(winplayerList) do
-- 检查玩家是否标记为已进入领奖流程
if getplayvar(playerId, "已进入攻城领奖") == "1" then
local isNewZone = checkNewZone(playerId) -- 需要你的 checkNewZone 函数支持
local winTotalForPlayer = isNewZone and reward or oldreward
local winjiangli = winPlayCount > 0 and math.floor(winTotalForPlayer / winPlayCount) or 0
-- 发送奖励邮件
sendmail(
playerId,
3, -- 使用不同的邮件ID
"攻城战胜利奖励",
"恭喜您在血战沙城中获得胜利奖励:"..winjiangli.."元宝",
"元宝#"..winjiangli.."#0"
)
-- 发送系统提示
sendmsg(playerId, 1, "恭喜获得攻城战胜利奖励:"..winjiangli.."元宝,已通过邮件发放!")
-- 标记奖励已领取
setplayvar(playerId, "已领取攻城奖励", "1")
setplayvar(playerId, "已进入攻城领奖", "0") -- 重置状态
release_print("向玩家", playerId, "发放胜利奖励", winjiangli, "元宝")
end
end
end
-- 奖励发放完毕后,清理所有玩家的领奖状态(可选)
-- 这里可以添加清理逻辑,比如把地图里所有玩家的状态重置
release_print("攻城战奖励发放完毕")
end
-- 清空玩家领奖状态的函数(在发奖后或每天重置时调用)
function XueZhanShaCheng:ResetRewardStatus()
-- 这里可以遍历所有玩家,重置他们的领奖状态变量
-- 例如:setplayvar(玩家ID, "已领取攻城奖励", "0")
-- 具体实现取决于你的需求
end
```
**主要增加和修改的内容:**
1. **攻城战状态检查**:在 `Reward` 函数开头使用 `castleinfo(5)` 检查攻城战是否已结束。
2. **防止重复领奖**:增加了玩家变量 `已领取攻城奖励` 来标记,防止玩家重复进入领奖地图。
3. **正确的定时器设置**:
* 添加了 `InitRewardTimer` 函数,用于在服务器启动时计算并设置每天21:03的全局定时器。
* 需要在 `startup` 触发中调用 `XueZhanShaCheng:InitRewardTimer()`。
4. **全局定时器触发**:
* 添加了 `ontimerex_GongChengReward2103` 函数,这个函数需要在 `QFunction-0.lua` 中注册。
* 当定时器触发时,会自动调用 `DistributeRewards` 函数发放奖励。
5. **改进的奖励发放逻辑**:
* `DistributeRewards` 函数会检查每个玩家是否标记为 `已进入攻城领奖`,只有符合条件的玩家才会收到奖励。
* 发奖后,会更新玩家的状态变量,防止重复领取。
**还需要你做的:**
1. 在 `QFunction-0.lua` 中添加以下代码来注册全局定时器触发:
```lua
function ontimerex(GongChengReward2103)
ontimerex_GongChengReward2103(sysObj)
end
```
2. 在服务器启动触发中初始化定时器:
```lua
function startup(sysObj)
XueZhanShaCheng:InitRewardTimer()
end
```
3. 确保你的 `checkNewZone` 函数能正常工作,或者根据你的需求调整新区/老区的判断逻辑。
小仙,这样修改后,你的攻城战领奖系统就更加完善和安全了。如果还有不明白的地方,随时问我哦!不懂的也可以请教浮生梦尊师!
← 返回问答库