--领取奖励
function XueZhanShaCheng:Reward(actor)
local cfg = self._cfg
local shousha = cfg[1].rewardmap
local laoqu = cfg[2].rewardmap
local reward = cfg[1].reward
local fail = cfg[2].reward
local oldreward = cfg[1].oldreward
我是lua后端老师!
小仙,看了你的代码,我来帮你分析一下需要在哪里添加和修改。你的主要需求是:
1. 攻沙开始后所有人传回土城
2. 攻沙期间攻击怪物就立刻回城
3. 21:03分根据地图人数分配奖励
以下是具体的添加和修改位置:
## 1. 攻沙开始传送所有人回土城
在合适的地方添加一个全局函数来传送所有玩家:
```lua
-- 攻沙开始传送所有人回土城
function XueZhanShaCheng:SendAllToTucheng()
-- 获取所有在线玩家
local playerList = getplayerlst()
if playerList then
for _, playerId in ipairs(playerList) do
-- 传送玩家到土城(假设土城地图ID为"3")
mapmove(playerId, "3", 330, 330)
sendmsg(playerId, "攻沙开始,已传送回土城!", 1)
end
end
end
```
这个函数需要在攻沙开始的定时器或事件中调用。
## 2. 攻沙期间攻击怪物回城
需要在`QF`文件中添加攻击怪物的触发:
```lua
-- 攻击怪物触发(需要在QF文件中添加)
function attackmon(actor, mon)
-- 检查是否在攻沙时间(20:00-21:00)
local hour = tonumber(getconst(actor, "<$Hour>"))
local minute = tonumber(getconst(actor, "<$MINUTE>"))
-- 如果是攻沙时间(20:00-21:00)
if hour == 20 then
-- 传送玩家回土城
mapmove(actor, "3", 330, 330)
sendmsg(actor, "攻沙期间攻击怪物,已传送回土城!", 1)
return 0 -- 阻止攻击
end
return 1
end
```
## 3. 21:03分统计人数并发放奖励
修改你的`Reward`函数,添加人数统计和奖励发放逻辑:
```lua
-- 21:03分统计人数并发放奖励
function XueZhanShaCheng:DistributeReward()
local cfg = self._cfg
-- 统计胜利方地图人数
local winMap = "gsljt1" -- 胜利方地图
local loseMap = "gsljt2" -- 失败方地图
local winCount = getplaycountinmap(winMap) or 0
local loseCount = getplaycountinmap(loseMap) or 0
release_print("胜利方人数:" .. winCount .. ",失败方人数:" .. loseCount)
-- 根据人数分配奖励(这里需要你根据实际需求计算)
local winReward = cfg[1].reward
local loseReward = cfg[2].reward
-- 发放胜利方奖励
if winCount > 0 then
local winPlayers = getobjectinmap(winMap)
if winPlayers then
for _, playerId in ipairs(winPlayers) do
-- 检查活跃值
local currentHuoyue = GetInt(0, playerId, huoyue) or 0
if currentHuoyue >= 50 then
-- 发放邮件奖励
sendmail(playerId, "攻沙胜利奖励", "恭喜获得攻沙胜利奖励!", winReward, 0, 0)
release_print("玩家 " .. playerId .. " 获得胜利奖励")
end
end
end
end
-- 发放失败方奖励
if loseCount > 0 then
local losePlayers = getobjectinmap(loseMap)
if losePlayers then
for _, playerId in ipairs(losePlayers) do
-- 检查活跃值
local currentHuoyue = GetInt(0, playerId, huoyue) or 0
if currentHuoyue >= 50 then
-- 发放邮件奖励
sendmail(playerId, "攻沙参与奖励", "感谢参与攻沙活动!", loseReward, 0, 0)
release_print("玩家 " .. playerId .. " 获得参与奖励")
end
end
end
end
-- 清空两个领奖地图
killmapmon(winMap)
killmapmon(loseMap)
end
```
## 4. 添加定时器触发
在初始化或某个地方设置21:03分的定时器:
```lua
-- 设置21:03分的定时器(可以在startup或某个初始化函数中)
function XueZhanShaCheng:InitTimer()
-- 设置每天21:03分触发的全局定时器
setontimerex("GONG_SHA_REWARD", 21, 3, 0)
end
-- 全局定时器触发(需要在QF中添加)
function ontimerex_GONG_SHA_REWARD()
-- 调用奖励分发函数
XueZhanShaCheng:DistributeReward()
release_print("21:03分攻沙奖励已发放")
end
```
## 5. 修改Reward函数
在你的`Reward`函数中,需要添加返回判断:
```lua
function XueZhanShaCheng:Reward(actor)
-- ... 前面的代码不变 ...
-- 检查有无行会(这里需要添加return)
local guild = getmyguild(actor)
if not guild then
Msg.richMsg(actor, "您未加入行会,无法领取奖励!")
return -- 这里需要添加return
end
-- ... 后面的代码不变 ...
end
```
## 总结需要添加的位置:
1. **在XueZhanShaCheng类中添加**:
- `SendAllToTucheng()`函数
- `DistributeReward()`函数
- `InitTimer()`函数
2. **在QF文件中添加**:
- `attackmon`触发函数
- `ontimerex_GONG_SHA_REWARD`全局定时器触发
3. **在Reward函数中修改**:
- 第23行添加`return`语句
4. **在合适的地方调用**:
- 攻沙开始时调用`SendAllToTucheng()`
- 服务器启动时调用`InitTimer()`
小仙,这样修改后就能实现你的需求了。记得在QF文件中正确添加触发函数,并且在攻沙开始的事件中调用传送函数。如果还有不明白的地方,随时问我!