GoldFirstKill = {} local this = {} GoldFirstKill.Var = { GOLD_FIRST_KILL_TASK = "T$goldfirstkilltask", -- 个人首杀任务 GOLD_FIRST_KILL_ENVELOPE = "T$firstkillenvelope", -- 全服首杀红包 SERVER_FIRST_KILL_GOLD_BOSS = "R$serverfirstkillgoldboss" -- 全服首杀 } ---任务状态 GoldFirstKill.TASK_STATUS = { ---已接取 ACCEPT = 1, ---已完成 FINISH = 2, ---已提交 SUBMIT = 3 } -- 请求领取首杀红包 function GoldFirstKill.receiveFirstKillAward(actor, msgData) -- if not GoldFirstKill.tableOpen(actor) then -- tipinfo(actor, "活动未开启") -- return -- end -- local monsterId = msgData.monsterId -- local envelope = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_ENVELOPE) or {} -- local isReceive = envelope[tostring(monsterId)] -- if isReceive then -- sendluamsg(actor, LuaMessageIdToClient.TIPS, "请勿重复领取!") -- return -- end -- if not isReceive then -- envelope[tostring(monsterId)] = true -- setplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_ENVELOPE, envelope) -- -- 发奖励 -- local config = ConfigDataManager.getTable("cfg_goldFirstKill", "id", monsterId) -- if not config then -- return -- end -- local weight = string.split(config[1].redenvelopeweight, "#") -- local map = {} -- for k, v in pairs(weight) do -- map[k] = tonumber(v) -- end -- local index = math.weightedRandom(map) -- local redEnvelope = string.split(config[1].redenvelope, "|")[tonumber(index)] -- local reward = splitbyshuxianandjinghao2(redEnvelope) -- for itemCfgId, count in pairs(reward) do -- additemtobag(actor, itemCfgId, count, 0, 9999, '黄金首杀') -- end -- -- 奖励弹框 -- sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, reward) -- -- 通知客户端 -- sendluamsg(actor, LuaMessageIdToClient.RES_RECEIVE_FIRST_KILL_ENVELOPE, table.valueConvertToString(envelope)) -- end end -- 根据权重进行随机 function math.weightedRandom(weights) local total = 0 for _, weight in pairs(weights) do total = total + weight end local rand = math.random() * total local cumulative = 0 for item, weight in pairs(weights) do cumulative = cumulative + weight if cumulative >= rand then return item end end end -- 请求获取全服首杀数据和红包数据 function GoldFirstKill.getFirstKillInfo(actor) if not GoldFirstKill.tableOpen(actor) then return end local allServerData = getsysvar(GoldFirstKill.Var.SERVER_FIRST_KILL_GOLD_BOSS) or {} local envelope = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_ENVELOPE) or {} local taskInfo = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK) or {} local taskStatus = {} for mId, v in pairs(taskInfo) do taskStatus[mId] = v.status end local result = {} result.allServerData = allServerData result.envelope = envelope result.taskInfo = taskStatus sendluamsg(actor, LuaMessageIdToClient.RES_ALL_SERVER_FIRST_KILL_INFO, table.valueConvertToString(result)) end -- 活动是否开启 function GoldFirstKill.isActivityOpen(actor) local config = ConfigDataManager.getTable("sub_mainActivity", "id", 1) if config == nil then return false end return ConditionManager.Check(actor, config[1].actualcondition) end -- 页签是否开启 function GoldFirstKill.tableOpen(actor) local config = ConfigDataManager.getTable("sub_mainActivity", "id", 1) if config == nil then return false end return ConditionManager.Check(actor, config[1].showcondition) end -- 登录时尝试接取任务 function GoldFirstKill.login(actor) GoldFirstKill.AcceptTask(actor) end ---接取任务 function GoldFirstKill.AcceptTask(actor) -- 活动是否开启 if not GoldFirstKill.isActivityOpen(actor) then return end local taskInfo = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK) if taskInfo ~= nil then -- 通知客户端 local result = {} for mId, v in pairs(taskInfo) do result[mId] = v.status end sendluamsg(actor, LuaMessageIdToClient.RES_GOAL_FIRST_KILL_CHANGE, table.valueConvertToString(result)) return end taskInfo = {} local config = ConfigDataManager.getTable("cfg_goldFirstKill") if not config then return end -- 接取任务 for i = 1, #config, 1 do local cfg = config[i] local monsterId = cfg.id local taskId = cfg.taskid -- local targetId = ConfigDataManager.getTableValue("cfg_task","taskTargetId","id",taskId) local targetCfg = ConfigDataManager.getTable("cfg_task_target", "id", taskId) if targetCfg ~= nil then local task = {} task.taskGoalId = targetCfg[1].taskgoalparam task.goalCount = targetCfg[1].goalcount task.nowCount = 0 task.status = GoldFirstKill.TASK_STATUS.ACCEPT taskInfo[monsterId] = task end end setplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK, taskInfo) local result = {} for mId, v in pairs(taskInfo) do result[mId] = v.status end result = table.valueConvertToString(result) -- 通知客户端 sendluamsg(actor, LuaMessageIdToClient.RES_GOAL_FIRST_KILL_CHANGE, result) end function GoldFirstKill.UpdateTaskProgress(actor, monsterId) local success, errorInfo = xpcall(this.UpdateTaskProgress, debug.traceback, actor, monsterId) gameDebug.assertPrint(success, "怪物死亡黄金任务更新进度异常:", actor, monsterId, errorInfo) end ---更新任务进度 function this.UpdateTaskProgress(actor, monsterId) if actor == nil then return end -- 活动是否开启 if not GoldFirstKill.isActivityOpen(actor) then return end local taskInfo = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK) if not taskInfo then return end local task = taskInfo[tostring(monsterId)] if not task then return end if task.status ~= GoldFirstKill.TASK_STATUS.ACCEPT then return end if tonumber(task.taskGoalId) ~= tonumber(monsterId) then return end task.nowCount = task.nowCount + 1 if task.nowCount >= tonumber(task.goalCount) then task.status = GoldFirstKill.TASK_STATUS.FINISH end taskInfo[tostring(monsterId)] = task setplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK, taskInfo) -- 更新全服黄金首杀数据 callonserial(actor, "update_gold_first_kill_data", monsterId) -- 通知客户端 local result = {} for mId, v in pairs(taskInfo) do result[mId] = v.status end sendluamsg(actor, LuaMessageIdToClient.RES_GOAL_FIRST_KILL_CHANGE, table.valueConvertToString(result)) end function update_gold_first_kill_data(actor, monsterId) -- 更新全服黄金首杀数据 -- local allServerData = getsysvar(GoldFirstKill.Var.SERVER_FIRST_KILL_GOLD_BOSS) -- if allServerData == nil or allServerData == "" then -- allServerData = {} -- end -- local killInfo = allServerData[tostring(monsterId)] -- if not killInfo then -- killInfo = {} -- killInfo.killer = getbaseinfo(actor, "rid") -- killInfo.killerName = getbaseinfo(actor, "rolename") -- killInfo.killTime = getbaseinfo("now") -- allServerData[tostring(monsterId)] = killInfo -- setsysvar(GoldFirstKill.Var.SERVER_FIRST_KILL_GOLD_BOSS, allServerData) -- local config = ConfigDataManager.getTable("cfg_goldFirstKill", "id", monsterId) -- if config ~= nil then -- local itemMap = string.toIntIntMap(config[1].serreward) -- local monsterCfg = ConfigDataManager.getTable("cfg_monster", "id", monsterId) -- local name = monsterCfg[1].name -- sendconfigmailbyrid(actor, getbaseinfo(actor, "rid"), MailConfig.SERVER_FIRST_KILL_GOLD_BOSS, itemMap, name) -- noticeTip.noticeinfo(actor, StringIdConst.ALL_SERVER_FIRST_KILL, getbaseinfo(actor, "rolename"), name) -- end -- end end ---提交任务 function GoldFirstKill.SubmitTask(actor, msgData) -- if not GoldFirstKill.tableOpen(actor) then -- tipinfo(actor, "活动未开启") -- return -- end -- local monsterId = msgData.monsterId -- local taskInfo = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK) -- if not taskInfo then -- tipinfo(actor, "任务未接取") -- return -- end -- local task = taskInfo[tostring(monsterId)] -- if not task then -- tipinfo(actor, "任务不存在") -- return -- end -- if tonumber(task.status) ~= GoldFirstKill.TASK_STATUS.FINISH then -- tipinfo(actor, "任务未完成") -- return -- end -- -- 修改任务状态 -- task.status = GoldFirstKill.TASK_STATUS.SUBMIT -- taskInfo[tostring(monsterId)] = task -- setplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK, taskInfo) -- -- 发奖励 -- local reward = GoldFirstKill.GetTaskReward(monsterId) -- for itemCfgId, count in pairs(reward) do -- additemtobag(actor, itemCfgId, count, 0, 9999, '黄金首杀') -- end -- -- 奖励弹框 -- sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, reward) -- -- 通知客户端 -- local ti = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK) -- local result = {} -- for mId, v in pairs(ti) do -- result[mId] = v.status -- end -- sendluamsg(actor, LuaMessageIdToClient.RES_RECEIVE_PERSONAL_FIRST_KILL_AWARD, table.valueConvertToString(result)) end -- 获取任务奖励 function GoldFirstKill.GetTaskReward(monsterId) local reward = {} local config = ConfigDataManager.getTable("cfg_goldFirstKill", "id", monsterId) if not config then return reward end return string.toIntIntMap(config[1].perreward) end -- 全服奖励 function GoldFirstKill.endTimeReward() -- local allData = getsysvar(GoldFirstKill.Var.SERVER_FIRST_KILL_GOLD_BOSS) -- if allData == nil or allData == "" then -- return -- end -- local allRoleInfos = getallrolesummaryinfos() -- if allRoleInfos == nil or next(allRoleInfos) == nil then -- return -- end -- for _, roleInfo in pairs(allRoleInfos) do -- local reward = {} -- local actor = roleInfo["actor"] -- if GoldFirstKill.tableOpen(actor) then -- return -- end -- -- 全服首杀红包奖励 -- local envelope = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_ENVELOPE) or {} -- for monsterId, v in pairs(envelope) do -- if not v then -- local config = ConfigDataManager.getTable("cfg_goldFirstKill", "id", monsterId) -- if not config then -- return -- end -- local weight = string.split(config[1].redenvelopeweight, "#") -- local map = {} -- for k, value in pairs(weight) do -- map[k] = tonumber(value) -- end -- local index = math.weightedRandom(map) -- local redEnvelope = string.split(config[1].redenvelope, "|")[tonumber(index)] -- string.putIntIntMap(reward, redEnvelope) -- end -- end -- -- 怪物个人首杀奖励 -- local taskInfo = getplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK) -- if taskInfo == nil or taskInfo == "" then -- taskInfo = {} -- end -- for monsterId, v in pairs(taskInfo) do -- if v.status == GoldFirstKill.TASK_STATUS.FINISH then -- table.mergeAdd(reward, GoldFirstKill.GetTaskReward(monsterId)) -- end -- end -- -- 发邮件 -- if table.count(reward) > 0 then -- sendconfigmailbyrid(actor, getbaseinfo(actor, "rid"), MailConfig.END_TIME_GOLD_BOSS_REWARD, reward, "") -- end -- setplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_ENVELOPE, nil) -- setplaydef(actor, GoldFirstKill.Var.GOLD_FIRST_KILL_TASK, nil) -- end -- setsysvar(GoldFirstKill.Var.SERVER_FIRST_KILL_GOLD_BOSS, nil) end