我是lua后端老师!
小仙,我来帮你完善这两个脚本。从你的问题来看,你对人数统计和地图传送的逻辑考虑得很细致,这很好!
## 1. 领奖地图人数统计优化
```lua
-- 领奖地图人数统计优化版
function lingjiang(actor)
-- 获取领奖地图所有玩家
local failplayList = getplaycountinmap("lingjiang_map")
-- 类型安全判断
local failPlayCount = 0
if type(failplayList) == "table" then
failPlayCount = #failplayList
end
release_print("领奖地图人数:", failPlayCount)
-- 检查是否有玩家
if failPlayCount <= 0 then
sendmsg(actor, "领奖地图没有玩家,无法发放奖励!", 1)
return
end
-- 计算每人奖励(假设总奖励为10000元宝)
local totalReward = 10000
local rewardPerPlayer = math.floor(totalReward / failPlayCount)
-- 发放奖励给每个玩家
for _, player in ipairs(failplayList) do
if isnotnull(player) then
changemoney(player, rewardPerPlayer, 0) -- 0代表元宝
sendmsg(player, "恭喜获得攻城奖励:"..rewardPerPlayer.."元宝", 1)
end
end
sendmsg(actor, "成功给"..failPlayCount.."名玩家发放奖励,每人"..rewardPerPlayer.."元宝", 1)
end
```
## 2. 地图传送与清理优化
```lua
-- 攻城开始传送优化版
function castlewarstart(actor)
-- 获取全服玩家列表
local allPlayers = getplayerlst(0)
if type(allPlayers) == "table" then
for _, player in ipairs(allPlayers) do
if isnotnull(player) then
-- 获取玩家当前地图
local mapName = getbaseinfo(player, 2) -- 类型2获取地图名
-- 只传送不在皇宫地图的玩家
if mapName ~= "3" then -- 假设"3"是皇宫地图ID
mapmove(player, "0", 330, 330) -- 传回土城
sendmsg(player, "攻城战开始,非皇宫玩家已被传回土城!", 1)
end
end
end
end
-- 设置攻城状态
setsysvar("integer", "castlewar_status", 1)
sendmsg(actor, "攻城战已开始,非皇宫玩家已清理完毕!", 1)
end
-- 攻沙期间杀怪回城优化版
function killMon(actor, mon, monName)
-- 先判断是否在攻沙状态
local warStatus = getsysvar("integer", "castlewar_status")
if warStatus == 1 then -- 攻沙进行中
-- 获取玩家当前地图
local mapName = getbaseinfo(actor, 2)
-- 如果玩家在皇宫地图杀怪,则传回土城
if mapName == "3" then -- 皇宫地图
mapmove(actor, "0", 330, 330) -- 传回土城
sendmsg(actor, "攻沙期间在皇宫击杀怪物,已被传回土城!", 1)
end
end
-- 其他杀怪逻辑...
changeexp(actor, 1000) -- 示例:给经验
end
```
## 关键改进点说明:
1. **类型安全判断**:使用 `type() == "table"` 确保返回值是表格,避免因返回"0"而报错
2. **除零保护**:在计算平分奖励前检查 `failPlayCount > 0`
3. **精准传送**:只传送不在皇宫地图的玩家,避免误传
4. **状态判断**:通过系统变量控制攻沙期间的特殊逻辑
5. **地图判断**:使用 `getbaseinfo(player, 2)` 获取玩家当前地图名
小仙,这样修改后你的脚本会更加健壮和安全。记住,好的脚本不仅要功能正确,还要考虑各种边界情况!如果还有不明白的地方,随时问我,或者请教浮生梦尊师!