local MoYuZhiWang = {}
MoYuZhiWang.ID = "摸鱼之王"
local config = include("QuestDiary/cfgcsv/cfg_MoYuZhiWang.lua") --配置
local mapID = "moyu"
local pointMap = {
["潮鲅鱼群【十积分】"] = 10,
["沙丁鱼群【三十积分】"] = 30,
["大鱼群【五十积分】"] = 50,
["超大鱼群【八十积分】"] = 80,
["黄金鲸【一百二十积分】"] = 120,
["宝石鲸【一百二十积分】"] = 120,
["红锦鲤【二百积分】"] = 200,
}
local monNum = {
{ name = "潮鲅鱼群【十积分】", num = 500 },
{ name = "沙丁鱼群【三十积分】", num = 200 },
{ name = "大鱼群【五十积分】", num = 120 },
{ name = "超大鱼群【八十积分】", num = 60 },
{ name = "黄金鲸【一百二十积分】", num = 60 },
{ name = "宝石鲸【一百二十积分】", num = 60 },
{ name = "红锦鲤【二百积分】", num = 10 },
}
--接收请求
function MoYuZhiWang.Request(actor)
--local name, num = Player.checkItemNumByTable(actor, cost)
--if name then
--Player.sendmsgEx(actor, string.format("你的|%s#249|不足|%d#249", name, num))
--return
--end
end
function MoYuZhiWang.EnterMap(actor)
local min = getsysvar(VarCfg["G_开区分钟计时器"])
if min >= 105 and min < 115 then
FMapEx(actor, mapID)
local name = getbaseinfo(actor, ConstCfg.gbase.name)
sendmsg("0", 2,
'{"Msg":"[' ..
name .. ']参加了摸鱼之王活动","FColor":251,"BColor":0,"Type":6,"Time":6,"SendName":"系统:","SendId":"123","X":"-300"}')
else
Player.sendmsgEx(actor, "当前不在开启时间段内,无法进入#249")
end
end
--发送通知
local function _onMYZWTongZhi()
FsendHuoDongGongGao("摸鱼之王活动1分钟后开启,请各位玩家合理安排时间,做好活动准备!!!")
end
GameEvent.add(EventCfg.onMYZWTongZhi, _onMYZWTongZhi, MoYuZhiWang)
--[[
函数名: _onMYZWStart
功能: 摸鱼之王活动开始时的处理函数,负责生成各类鱼群怪物
触发: 通过EventCfg.onMYZWStart事件触发,在活动开始时执行
参数说明:
mapID - 活动地图ID("moyu")
monNum - 怪物生成配置表,包含以下字段:
- name: 怪物名称(如"潮鲅鱼群【十积分】")
- num: 生成数量
]]
local function _onMYZWStart()
-- 遍历怪物配置表,生成所有类型的鱼群
for index, value in ipairs(monNum) do
-- 在指定地图生成怪物
-- 参数说明:地图ID, X坐标(148), Y坐标(144), 怪物名称, 活动范围(150), 生成数量, 存活时间(250)
genmon(mapID, 148, 144, value.name, 150, value.num, 250)
end
end
-- 注册事件监听器,当活动开始时触发_onMYZWStart函数
-- 第三个参数MoYuZhiWang指定了函数所属的模块上下文
GameEvent.add(EventCfg.onMYZWStart, _onMYZWStart, MoYuZhiWang)
--[[
函数名: _onMYZWEnd
功能: 处理摸鱼之王活动结束时的清理工作
触发: 通过EventCfg.onMYZWEnd事件触发,在活动结束时执行
参数说明: 无
实现逻辑:
1. 清理活动地图
- 使用killmonsters清除所有怪物
- 参数说明:地图ID, 怪物名称("*"表示所有), 范围(0), 是否保留尸体(false)
2. 发送活动结束公告
- 连续发送5次系统消息
- 使用JSON格式配置消息样式(颜色、类型、显示时间等)
3. 传送玩家离开
- 获取活动地图内所有玩家列表
- 将玩家传送到指定位置(地图:"n3", 坐标:330,330)
注意事项:
- 使用getplaycount获取地图内玩家列表
- 通过mapmove确保所有玩家安全离开活动地图
- 系统消息使用特定颜色代码(FColor:250)提高可见性
]]
local function _onMYZWEnd()
// ... existing code ...
end
GameEvent.add(EventCfg.onMYZWEnd, _onMYZWEnd, MoYuZhiWang)
--活动结束
local function _onMYZWEnd()
killmonsters(mapID, "*", 0, false)
for i = 1, 5, 1 do
sendmsg("0", 2,
'{"Msg":"摸鱼之王活动已结束!!!","FColor":250,"BColor":0,"Type":6,"Time":6,"SendName":"系统:","SendId":"123","Y":"0"}')
end
local list = getplaycount(mapID, 0, 0)
if list ~= "0" then
for _, actor in ipairs(list) do
mapmove(actor, "n3", 330, 330, 3)
end
end
end
GameEvent.add(EventCfg.onMYZWEnd, _onMYZWEnd, MoYuZhiWang)
--[[
函数名: addPoints
功能: 为玩家增加摸鱼积分并处理奖励发放
参数说明:
actor - 玩家对象
points - 要增加的积分数量
实现逻辑:
1. 获取并更新玩家积分
- 从VarCfg["U_摸鱼积分"]获取当前积分
- 计算新的总积分并保存
- 向玩家发送积分增加提示
2. 处理奖励发放
- 获取玩家已领取奖励记录
- 遍历奖励配置表检查是否达到新的积分档位
- 对于未领取且达到条件的奖励:
a. 更新领取记录
b. 发送领取提示
c. 通过邮件发送奖励
3. 更新客户端UI
- 发送最新积分和领奖记录到客户端
注意事项:
- 使用Player.giveMailByTable确保奖励发放的可靠性
- 通过JSON存储领奖记录避免重复发放
]]
local function addPoints(actor, points)
local currPoint = getplaydef(actor, VarCfg["U_摸鱼积分"])
local userPoints = currPoint + points
setplaydef(actor, VarCfg["U_摸鱼积分"], userPoints)
Player.sendmsgEx(actor, string.format("摸鱼积分|+%d#249", points))
-- 从玩家变量中获取已领取的奖励记录
-- 使用JSON格式存储,键为奖励档位索引,值为是否已领取
local claimedRewards = Player.getJsonTableByVar(actor, VarCfg["T_摸鱼记录"])
-- 遍历所有奖励配置,检查是否有新达成的奖励
-- config表包含每个档位的积分要求和奖励内容
for i, info in ipairs(config) do
-- 检查是否达到积分要求且未领取过该档位奖励
-- userPoints为玩家当前总积分
-- tostring(i)将档位索引转为字符串作为JSON的键
if userPoints >= info.points and not claimedRewards[tostring(i)] then
-- 标记该档位奖励为已领取
claimedRewards[tostring(i)] = true
-- 保存更新后的领取记录
Player.setJsonVarByTable(actor, VarCfg["T_摸鱼记录"], claimedRewards)
-- 向玩家发送奖励领取提示,#249为特殊颜色代码
Player.sendmsgEx(actor, "摸鱼第|" .. i .. "#249|已发送到邮箱")
-- 准备邮件内容
local mailTitle = "摸鱼积分" -- 邮件标题
-- 邮件正文,包含档位信息
local mailContent = "请领取您的第 " .. i .. " 档摸鱼奖励"
-- 获取玩家ID用于邮件发送
local userID = getbaseinfo(actor, ConstCfg.gbase.id)
-- 发送奖励邮件
-- 参数说明:玩家ID, 邮件类型(1), 标题, 内容, 奖励物品, 有效期(1), 是否立即生效(true)
Player.giveMailByTable(userID, 1, mailTitle, mailContent, info.rewards, 1, true)
end
end
Message.sendmsg(actor, ssrNetMsgCfg.MoYuZhiWang_UpdateUI, userPoints, 0, 0, claimedRewards)
end
--[[
函数名: _onCollectTask
功能: 处理摸鱼之王活动中玩家击杀鱼群后的积分奖励
触发: 通过EventCfg.onCollectTask事件触发,在玩家击杀怪物时执行
参数说明:
actor - 玩家对象
monName - 被击杀的怪物名称(如"潮鲅鱼群【十积分】")
monMakeIndex - 怪物的唯一标识符
itemName - 相关物品名称
实现逻辑:
1. 检查玩家是否在活动地图内
2. 根据怪物名称从pointMap查找对应积分值
3. 调用addPoints函数增加玩家积分
]]
local function _onCollectTask(actor, monName, monMakeIndex, itemName)
if FCheckMap(actor, mapID) then
local points = pointMap[monName] or 0
addPoints(actor, points)
end
end
GameEvent.add(EventCfg.onCollectTask, _onCollectTask, MoYuZhiWang)
--[[
函数名: _goSwitchMap
功能: 处理玩家进入/离开摸鱼之王活动地图时的状态变化
触发: 通过EventCfg.goSwitchMap事件触发,在玩家切换地图时执行
参数说明:
actor - 玩家对象
cur_mapid - 玩家当前所在地图ID
former_mapid - 玩家之前所在地图ID
实现逻辑:
1. 进入活动地图时:
- 设置定时器(ID:8, 间隔:2秒)
- 添加特定buff(ID:31053)
- 获取玩家积分和奖励领取记录
- 向客户端发送进入活动地图消息
2. 离开活动地图时:
- 移除特定buff
- 关闭定时器
- 向客户端发送离开活动地图消息
注意事项:
- 使用Message.sendmsg同步客户端UI状态
- 通过定时器和buff管理活动中的特殊状态
]]
local function _goSwitchMap(actor, cur_mapid, former_mapid)
if cur_mapid == mapID then
setontimer(actor, 8, 2, 0)
addbuff(actor, 31053)
local points = getplaydef(actor, VarCfg["U_摸鱼积分"])
local claimedRewards = Player.getJsonTableByVar(actor, VarCfg["T_摸鱼记录"])
Message.sendmsg(actor, ssrNetMsgCfg.MoYuZhiWang_Enter, points, 0, 0, claimedRewards)
end
if former_mapid == mapID then
FkfDelBuff(actor, 31053)
setofftimer(actor, 8)
Message.sendmsg(actor, ssrNetMsgCfg.MoYuZhiWang_Leave)
end
end
GameEvent.add(EventCfg.goSwitchMap, _goSwitchMap, MoYuZhiWang)
--定时器
local function _onMYZWimer(actor)
changemoney(actor, 3, "+", 2000, "摸鱼之王", true)
end
GameEvent.add(EventCfg.onMYZWimer, _onMYZWimer, MoYuZhiWang)
--同步消息
-- function MoYuZhiWang.SyncResponse(actor, logindatas)
-- local data = {}
-- local _login_data = {ssrNetMsgCfg.MoYuZhiWang_SyncResponse, 0, 0, 0, data}
-- if logindatas then
-- table.insert(logindatas, _login_data)
-- else
-- Message.sendmsg(actor, ssrNetMsgCfg.MoYuZhiWang_SyncResponse, 0, 0, 0, data)
-- end
-- end
-- --登录触发
-- local function _onLoginEnd(actor, logindatas)
-- MoYuZhiWang.SyncResponse(actor, logindatas)
-- end
-- --事件派发
-- GameEvent.add(EventCfg.onLoginEnd, _onLoginEnd, MoYuZhiWang)
--注册网络消息
Message.RegisterNetMsg(ssrNetMsgCfg.MoYuZhiWang, MoYuZhiWang)
return MoYuZhiWang