YunYingLogic.lua 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. ---------------------------------------------------------
  2. -- 图标管理
  3. -- updateIcon 刷新图标
  4. -- module接口
  5. -- isOpen 如果模块没有这个函数默认是开启 human, YYInfo, funcConfig
  6. -- isRed 如果模块没这个函数 默认是没红点 human, YYInfo, funcConfig
  7. -- getIcon 如果模块没这个函数 默认从yunying表里面读iconid
  8. -- isActive 跟模块关联的激活状态
  9. -- updateDaily 隔天处理
  10. -- onCharge 充值回调
  11. -- onZero 0点处理
  12. -- onLevelUp 升级回调
  13. -- onLogin 登陆回调
  14. ---------------------------------------------------------
  15. local YunYingExcel = require("excel.yunying")
  16. local Lang = require("common.Lang")
  17. local Config = require("Config")
  18. local Util = require("common.Util")
  19. local Msg = require("core.Msg")
  20. local Broadcast = require("broadcast.Broadcast")
  21. local ObjHuman = require("core.ObjHuman")
  22. local BannerExcel = require("excel.yunying")
  23. local AbsActLogic = require("absAct.AbsActLogic")
  24. local SysParameter = require("common.SysParameter")
  25. local PanelDefine = require("broadcast.PanelDefine")
  26. local HeroGrid = require("hero.HeroGrid")
  27. local HeroUpLogic = require("absAct.HeroUpLogic")
  28. local AbsActExcel = require("excel.absAct")
  29. local HtmlUtil = require("common.HtmlUtil")
  30. local Json = require("common.Json")
  31. local YunYingDefine = require("yunying.YunYingDefine")
  32. local CommonDB = require("common.CommonDB")
  33. local MiddleConnect = require("middle.MiddleConnect")
  34. local InnerMsg = require("core.InnerMsg")
  35. local AbsReachRankDB = require("absAct.AbsReachRankDB")
  36. local OpenServerActPowerUp = require("present.OpenServerActPowerUp")
  37. local WeekendLoopActManger = require("WeekendLoopActivity.WeekendLoopActManager")
  38. local OpenServerActAddUpCharge = require("present.OpenServerActAddUpCharge")
  39. local ServerCommerceActManger = require("serverCommerce.ServerCommerceManager")
  40. ID2YYInfo = ID2YYInfo or { } -- 每个id是一个主界面上方运营活动大图标入口
  41. PANELID2OPENLV = PANELID2OPENLV or { }
  42. YYFUNCINFO = YYFUNCINFO or { } -- 活动列表 用于快捷查询
  43. BANNER_LIST_SERVER = {}
  44. YUNYING_POS_TYPE1 = 1 -- 运营活动
  45. YUNYING_POS_TYPE2 = 2 -- abs活动
  46. function inServerIndex(svrIndexs)
  47. for i = 1, #svrIndexs do
  48. local index1 = svrIndexs[i][1]
  49. local index2 = svrIndexs[i][2]
  50. if Config.SVR_INDEX >= index1 and Config.SVR_INDEX <= index2 then
  51. return true
  52. end
  53. end
  54. end
  55. -- 根据funcID确定配置文件
  56. function getFuncConfig(funcID)
  57. local funcConfig = YunYingExcel.func[funcID]
  58. if not funcConfig then
  59. funcConfig = AbsActExcel.absActivity[funcID]
  60. end
  61. return funcConfig
  62. end
  63. -- 根据funcID 确定modouleFn数据
  64. local function getYYFuncInfo(funcID)
  65. if not YYFUNCINFO then return end
  66. return YYFUNCINFO[funcID]
  67. end
  68. -- 是否是运营活动
  69. local function isYYfunc(funcID)
  70. if YunYingExcel.func[funcID] then
  71. return true
  72. end
  73. return false
  74. end
  75. -- 是否是Abs活动
  76. local function isAbsfunc(funcID)
  77. if AbsActExcel.absActivity[funcID] then
  78. return true
  79. end
  80. return false
  81. end
  82. -- 初始化数据
  83. local function initYYInfo(yyID, config)
  84. local YYInfo = ID2YYInfo[yyID] or { }
  85. YYInfo.yyID = yyID
  86. YYInfo.config = config
  87. local moduleList = nil
  88. local openLv = 0
  89. for i = 1, #config.funcs do
  90. local funcID = config.funcs[i]
  91. local funcConfig = getFuncConfig(funcID)
  92. if YYFUNCINFO[funcID] then
  93. assert(nil, "initYYInfo is error!!!!"..yyID.."-"..funcID)
  94. end
  95. if funcConfig then
  96. if funcConfig.moduleFn ~= "" then
  97. moduleList = moduleList or { }
  98. local moduleFn = load("return require(\"" .. funcConfig.moduleFn .. "\")")()
  99. moduleList[funcID] = moduleFn
  100. if moduleFn then
  101. moduleFn.funcID = moduleFn.funcID or {}
  102. moduleFn.funcID[funcID] = funcID
  103. moduleFn.YYInfo = moduleFn.YYInfo or {}
  104. moduleFn.YYInfo[funcID] = YYInfo
  105. moduleFn.pos = moduleFn.pos or {}
  106. moduleFn.pos[funcID] = config.pos
  107. moduleFn.yyID = moduleFn.yyID or {}
  108. moduleFn.yyID[funcID] = yyID
  109. funcConfig.funcID = funcID
  110. YYFUNCINFO[funcID] = moduleFn
  111. PANELID2OPENLV[funcConfig.panelID] = funcConfig.openLv
  112. end
  113. end
  114. -- 取子功能里面最低等级
  115. if openLv > funcConfig.openLv or openLv == 0 then
  116. openLv = funcConfig.openLv
  117. end
  118. end
  119. end
  120. YYInfo.moduleList = moduleList
  121. YYInfo.openLv = openLv
  122. ID2YYInfo[yyID] = YYInfo
  123. return YYInfo
  124. end
  125. -- 初始化
  126. function init()
  127. ID2YYInfo = ID2YYInfo or { }
  128. YYFUNCINFO = {}
  129. BANNER_LIST_SERVER = {}
  130. for yyID, noUse in pairs(ID2YYInfo) do
  131. if YunYingExcel.config[yyID] == nil then
  132. ID2YYInfo[yyID] = nil
  133. end
  134. end
  135. for funcID, info in pairs(YYFUNCINFO) do
  136. if YunYingExcel.func[funcID] == nil then
  137. YYFUNCINFO[funcID] = nil
  138. end
  139. if AbsActExcel.absActivity[funcID] == nil then
  140. YYFUNCINFO[funcID] = nil
  141. end
  142. end
  143. for yyID, config in pairs(YunYingExcel.config) do
  144. if inServerIndex(config.serverIndex) then
  145. initYYInfo(yyID, config)
  146. end
  147. end
  148. -- 广告
  149. for k, config in pairs(BannerExcel.banner) do
  150. if inServerIndex(config.serverIndex) then
  151. BANNER_LIST_SERVER[#BANNER_LIST_SERVER + 1] = k
  152. end
  153. end
  154. handleAbs()
  155. -- 活动初始化后 才能去实始化ABS排名活动
  156. AbsReachRankDB.init()
  157. OpenServerActPowerUp.Init()
  158. WeekendLoopActManger.WeekLoopACT_Init()
  159. OpenServerActAddUpCharge.Init()
  160. ServerCommerceActManger.CommerceAct_Init()
  161. end
  162. ABS_LOOP_TYPE1 = 1 -- 指定时间的活动
  163. ABS_LOOP_TYPE2 = 2 -- 指定时间的活动 指定间隔天数 循环一次
  164. ABS_LOOP_TYPE3 = 3 -- 按开服时间 指定间隔天数 一直循环 支持间隔时间设置
  165. ABS_LOOP_TYPE4 = 4 -- 按开服时间 指定间隔天数 循环一次
  166. ABS_LOOP_TYPE5 = 5 -- 按合服时间 指定间隔天数 循环一次
  167. ABS_LOOP_TYPE6 = 6 -- 每周周几开
  168. ABS_LOOP_TYPE7 = 7 -- 每月几号开
  169. DAY_SEC = 24 * 3600
  170. -- 指定时间的活动
  171. local function handleAbsInit(openDay, now, config, funcID)
  172. config.actId = config.actId or 0
  173. config.adIcon = 0
  174. config.realStartTime = 0
  175. config.realEndTime = 0
  176. end
  177. function handleAbs7MiddleReturn(fd,msg)
  178. if msg.isOpen == 0 then
  179. return
  180. end
  181. local config = getFuncConfig(msg.funcID)
  182. local openDay = CommonDB.getServerOpenDay()
  183. if openDay == nil then return end
  184. if config.loopType ~= ABS_LOOP_TYPE7 then return end
  185. local now = os.time()
  186. local days = config.days -- 持续几天
  187. local turns = config.turns --
  188. local ad = config.ad --
  189. local eachDays = config.eachDays -- 几号开
  190. local toOpenDay = openDay - config.openDay
  191. local endDay = days + eachDays -- 几号结束
  192. local actStart = false
  193. if days > 0 and #turns > 0 then
  194. local nowMidnight = Util.getDayStartTime(now)
  195. local d = os.date("*t",now)
  196. local monthDay = d.day
  197. -- 生效期
  198. if toOpenDay >= 0 and monthDay >= config.eachDays and monthDay < endDay then
  199. local subDays = monthDay - config.eachDays
  200. local handleBeginTs = nil
  201. handleBeginTs = nowMidnight - subDays * DAY_SEC
  202. config.realStartTime = handleBeginTs
  203. config.realEndTime = handleBeginTs + days * DAY_SEC - 3600 -- 活动23点结束
  204. if now >= config.realStartTime and now < config.realEndTime then
  205. config.actId = turns[1] or 0
  206. config.adIcon = ad[1] or 0
  207. print("handleAbs7 act is started!!",Config.SVR_INDEX,msg.funcID,config.actId)
  208. actStart = true
  209. end
  210. end
  211. else
  212. assert(nil, "handleAbs ABS_LOOP_TYPE7 days or turns err !!!" .. funcID)
  213. end
  214. if actStart then
  215. for _, human in pairs(ObjHuman.onlineUuid) do
  216. print("aaaa actStart")
  217. sendIcons(human)
  218. end
  219. end
  220. end
  221. -- 初始化abs活动 开启的时间
  222. function handleAbs()
  223. local openDay = CommonDB.getServerOpenDay()
  224. if openDay == nil then return end
  225. local mergeDay = CommonDB.getServerMergeDay()
  226. local now = os.time()
  227. for yyID, YYInfo in pairs(ID2YYInfo) do
  228. for i = 1, #YYInfo.config.funcs do
  229. local funcID = YYInfo.config.funcs[i]
  230. if isAbsfunc(funcID) then
  231. local config = getFuncConfig(funcID)
  232. if not config then
  233. assert(nil, "handleAbs config is nil !!!" .. funcID)
  234. end
  235. handleAbsInit(openDay, now, config, funcID)
  236. end
  237. end
  238. end
  239. end
  240. -- panel id -> id
  241. local PANELID_2_ACTID = nil
  242. local function getActIDByPanelID(panelID)
  243. if not PANELID_2_ACTID then
  244. PANELID_2_ACTID = { }
  245. for id, config in pairs(YunYingExcel.config) do
  246. if inServerIndex(config.serverIndex) then
  247. PANELID_2_ACTID[config.panelID] = id
  248. end
  249. end
  250. end
  251. return PANELID_2_ACTID[panelID]
  252. end
  253. function getOpenLvByPanelID(panelID)
  254. return PANELID2OPENLV[panelID] or 0
  255. end
  256. -- 是否开启活动,内部使用
  257. local function isBaseOpen(YYInfo, human)
  258. if not YYInfo then return end
  259. if human.db.lv < YYInfo.openLv then return end
  260. if not YYInfo.moduleList then return end
  261. for k, v in pairs(YYInfo.moduleList) do
  262. local funcConfig = getFuncConfig(k)
  263. if v.isOpen and v.isOpen(human, YYInfo, funcConfig) == true then
  264. return true
  265. end
  266. end
  267. end
  268. -- 未开放提示
  269. local function sendNoOpen(human, noSend)
  270. if noSend then return end
  271. Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  272. end
  273. -- 是否开启
  274. function isOpen(YYInfo, human, noSend)
  275. if not YYInfo then
  276. return sendNoOpen(human, noSend)
  277. end
  278. if not isBaseOpen(YYInfo, human) then
  279. return sendNoOpen(human, noSend)
  280. end
  281. return true
  282. end
  283. -- 是否显示红点
  284. function isRed(YYInfo, human)
  285. if not YYInfo then return false end
  286. if not YYInfo.moduleList then return false end
  287. for k, v in pairs(YYInfo.moduleList) do
  288. local funcConfig = getFuncConfig(k)
  289. -- 开启了才判断红点
  290. if not v.isOpen or v.isOpen(human, YYInfo, funcConfig) == true then
  291. if v.isRed and v.isRed(human, YYInfo, funcConfig) == true then
  292. return true
  293. end
  294. end
  295. end
  296. return false
  297. end
  298. -- 获得图标 主要是节日活动和绝对时间活动每周的图标都不一样
  299. function getIcon(YYInfo, human)
  300. if not YYInfo then return false end
  301. if not YYInfo.moduleList then return false end
  302. if YYInfo.config.pos ~= YUNYING_POS_TYPE1 then return false end
  303. for k, v in pairs(YYInfo.moduleList) do
  304. local funcConfig = getFuncConfig(k)
  305. if v.getIcon then
  306. return v.getIcon(human, YYInfo, funcConfig)
  307. end
  308. end
  309. end
  310. -- 缓存红点
  311. function setCacheRed(human, yyID, red)
  312. human.yunyings[yyID] = red
  313. end
  314. --
  315. function getCacheRed(human, yyID)
  316. return human.yunyings and human.yunyings[yyID]
  317. end
  318. function getLeftTime(YYInfo, human)
  319. if not YYInfo then return 0 end
  320. if not YYInfo.moduleList then return 0 end
  321. local leftTime = 0
  322. for k, v in pairs(YYInfo.moduleList) do
  323. local funcConfig = getFuncConfig(k)
  324. if v.getLeftTime and funcConfig.actId ~= 0 then
  325. local rest = v.getLeftTime(human, YYInfo, funcConfig)
  326. leftTime = leftTime < rest and rest or leftTime
  327. end
  328. end
  329. return leftTime
  330. end
  331. -- 封装结构体
  332. local function fontIcon(net, YYInfo, human)
  333. local config = YYInfo.config
  334. local red = isRed(YYInfo, human)
  335. net.id = YYInfo.yyID
  336. net.red = red and 1 or 0
  337. net.leftTime = getLeftTime(YYInfo, human) or 0
  338. net.icon = getIcon(YYInfo, human)
  339. if net.icon == nil or net.icon == 0 then
  340. net.icon = config.icon
  341. end
  342. net.sortID = config.sortID
  343. net.panelID = config.panelID
  344. net.pos = config.pos or 0
  345. setCacheRed(human, YYInfo.yyID, red)
  346. end
  347. -- 运营活动列表
  348. function sendIcons(human)
  349. human.yunyings = { }
  350. local msgRet = Msg.gc.GC_YUNYING_LIST
  351. msgRet.list[0] = 0
  352. local maxLen = #msgRet.list
  353. for _, YYInfo in pairs(ID2YYInfo) do
  354. if isOpen(YYInfo, human, true) and
  355. YYInfo.config.pos == YUNYING_POS_TYPE1 then
  356. print("[sendIcons] 发送的活动ID = "..YYInfo.yyID)
  357. if msgRet.list[0] >= maxLen then
  358. break
  359. end
  360. msgRet.list[0] = msgRet.list[0] + 1
  361. fontIcon(msgRet.list[msgRet.list[0]], YYInfo, human)
  362. end
  363. end
  364. Msg.send(msgRet, human.fd)
  365. end
  366. -- 刷新图标
  367. function updateIcon(YYInfo, human, nocheckred)
  368. if not YYInfo then return end
  369. if YYInfo.config.pos ~= YUNYING_POS_TYPE1 then return end
  370. if isOpen(YYInfo, human, true) then
  371. if nocheckred or(getCacheRed(human, YYInfo.yyID) ~= isRed(YYInfo, human)) then
  372. sendIconUpdate(YYInfo.yyID, human)
  373. end
  374. else
  375. if nocheckred or getCacheRed(human, YYInfo.yyID) ~= nil then
  376. sendIconDel(YYInfo.yyID, human)
  377. end
  378. end
  379. end
  380. -- 添加或者改变
  381. function sendIconUpdate(yyID, human)
  382. if not human.yunyings then return end
  383. -- 未初始不发
  384. local YYInfo = ID2YYInfo[yyID]
  385. if not YYInfo then return end
  386. if YYInfo.config.pos ~= YUNYING_POS_TYPE1 then return end
  387. local msgRet = Msg.gc.GC_YUNYING_UPDATE
  388. if human then
  389. fontIcon(msgRet.data, YYInfo, human)
  390. Msg.send(msgRet, human.fd)
  391. else
  392. for _, human in pairs(ObjHuman.onlineUuid) do
  393. if human.fd then
  394. fontIcon(msgRet.data, YYInfo, human)
  395. Msg.send(msgRet, human.fd)
  396. end
  397. end
  398. end
  399. end
  400. -- 删除
  401. function sendIconDel(yyID, human)
  402. if not human.yunyings then return end
  403. -- 未初始不发
  404. local YYInfo = ID2YYInfo[yyID]
  405. if not YYInfo then return end
  406. if YYInfo.config.pos ~= YUNYING_POS_TYPE1 then return end
  407. local msgRet = Msg.gc.GC_YUNYING_DEL
  408. msgRet.id = yyID
  409. if human then
  410. Msg.send(msgRet, human.fd)
  411. setCacheRed(human, YYInfo.yyID)
  412. else
  413. for _, human in pairs(ObjHuman.onlineUuid) do
  414. if human.fd then
  415. Msg.send(msgRet, human.fd)
  416. setCacheRed(human, YYInfo.yyID)
  417. end
  418. end
  419. end
  420. end
  421. -- 活动组信息
  422. function sendGroupList(human, panelID)
  423. -- 获取panel运营ID
  424. local actID = getActIDByPanelID(panelID)
  425. if (not actID or actID < 1 ) and panelID ~= PanelDefine.PANEL_ID_3101 then
  426. return
  427. end
  428. -- 通过运营ID获取运营信息
  429. local YYInfo = ID2YYInfo[actID]
  430. if not isOpen(YYInfo, human, true) then
  431. return
  432. end
  433. local msgRet = Msg.gc.GC_YUNYING_GROUP_LIST
  434. msgRet.panelID = panelID
  435. msgRet.list[0] = 0
  436. for i = 1, #YYInfo.config.funcs do
  437. local funcID = YYInfo.config.funcs[i]
  438. local funcConfig = getFuncConfig(funcID)
  439. local state = false
  440. local endTime = nil
  441. local startTime = nil
  442. local leftTime = nil
  443. if human.db.lv >= funcConfig.openLv then
  444. if YYInfo.moduleList[funcID] ~= nil and
  445. YYInfo.moduleList[funcID].isOpen ~= nil then
  446. state, endTime, startTime = YYInfo.moduleList[funcID].isOpen(human, YYInfo, funcConfig)
  447. if endTime then
  448. leftTime = endTime - os.time()
  449. end
  450. else
  451. state = true
  452. end
  453. end
  454. if state then
  455. msgRet.list[0] = msgRet.list[0] + 1
  456. if YYInfo.moduleList[funcID] ~= nil and
  457. YYInfo.moduleList[funcID].getLeftTime ~= nil then
  458. leftTime = YYInfo.moduleList[funcID].getLeftTime(human, YYInfo, funcConfig)
  459. end
  460. local net = msgRet.list[msgRet.list[0]]
  461. net.id = funcID
  462. net.icon = funcConfig.icon
  463. net.red = 0
  464. net.leftTime = leftTime or 0
  465. net.endTime = endTime or 0
  466. net.startTime = startTime or 0
  467. net.name = funcConfig.actName or ""
  468. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].isRed and YYInfo.moduleList[funcID].isRed(human, YYInfo, funcConfig) == true then
  469. net.red = 1
  470. end
  471. net.panelID = funcConfig.panelID
  472. net.effect = funcConfig.effect
  473. net.param = funcID
  474. end
  475. end
  476. Msg.send(msgRet, human.fd)
  477. end
  478. -- 刷新标签页红点
  479. function sendGroupUpdate(YYInfo, human, subPanelID, param)
  480. if not YYInfo then print(" not YYInfo param ", param, " panelID ", subPanelID) return end
  481. local msgRet = Msg.gc.GC_YUNYING_GROUP_UPDATE
  482. msgRet.panelID = YYInfo.config.panelID
  483. local state = false
  484. local endTime = nil
  485. local startTime = nil
  486. local id = nil
  487. local len = 0
  488. for i = 1, #YYInfo.config.funcs do
  489. local funcID = YYInfo.config.funcs[i]
  490. local funcConfig = getFuncConfig(funcID)
  491. if (not param and funcConfig.panelID == subPanelID) or
  492. (param and funcConfig.param == param and funcConfig.panelID == subPanelID) then -- 同一个 面板的 多期活动
  493. if YYInfo.moduleList[funcID] ~= nil and
  494. YYInfo.moduleList[funcID].isOpen ~= nil then
  495. state, endTime, startTime = YYInfo.moduleList[funcID].isOpen(human, YYInfo, funcConfig)
  496. else
  497. state = true
  498. end
  499. if not state then return end
  500. local leftTime = nil
  501. if YYInfo.moduleList[funcID] ~= nil and
  502. YYInfo.moduleList[funcID].getLeftTime ~= nil then
  503. leftTime = YYInfo.moduleList[funcID].getLeftTime(human, YYInfo, funcConfig)
  504. end
  505. len = len + 1
  506. msgRet.data.id = funcID
  507. msgRet.data.icon = funcConfig.icon
  508. msgRet.data.name = funcConfig.actName or ""
  509. msgRet.data.red = 0
  510. msgRet.data.leftTime = leftTime or 0
  511. msgRet.data.endTime = endTime or 0
  512. msgRet.data.startTime = startTime or 0
  513. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].isRed and YYInfo.moduleList[funcID].isRed(human, YYInfo, funcConfig) == true then
  514. msgRet.data.red = 1
  515. end
  516. msgRet.data.panelID = funcConfig.panelID
  517. msgRet.data.effect = funcConfig.effect
  518. msgRet.data.param = funcID
  519. break
  520. end
  521. end
  522. if len == 0 then return end
  523. Msg.send(msgRet, human.fd)
  524. end
  525. -- 推送开放等级
  526. function sendOpenLv(human, panelID)
  527. local openLv = getOpenLvByPanelID(panelID)
  528. if not openLv then return end
  529. local msgRet = Msg.gc.GC_YUNYING_OPEN_LV
  530. msgRet.openLv = openLv
  531. msgRet.panelID = panelID
  532. Msg.send(msgRet, human.fd)
  533. end
  534. -- 一次性广告面板
  535. function sendFirstBanner(human)
  536. local funcID = YunYingDefine.YUNYING_ID_101
  537. local moduleFn = getYYFuncInfo(funcID)
  538. if not moduleFn then return end
  539. local funcConfig = YunYingExcel.func[funcID]
  540. if not funcConfig then return end
  541. if not moduleFn.isOpen(human, moduleFn.YYInfo[funcID], funcConfig) then return end
  542. local dialogLv = SysParameter.getSysParameter(SysParameter.PARAMETER_14)
  543. local firstPanel = nil
  544. if human.db.lv >= dialogLv then
  545. if human.db.guide.firstPanel == nil then
  546. firstPanel = PanelDefine.PANEL_ID_3302
  547. human.db.guide.firstPanel = 1
  548. end
  549. end
  550. if not firstPanel then return end
  551. local msgRet = Msg.gc.GC_YUNYING_FIRST_BANNER_QUERY
  552. msgRet.panelID = firstPanel
  553. Msg.send(msgRet, human.fd)
  554. end
  555. -- 广告面板
  556. local function bannerCmp(a, b)
  557. return a[2] < b[2]
  558. end
  559. local function makeBannerNet(net, bannerID, dot, banner)
  560. print("#### bannerID: ", bannerID)
  561. local config = BannerExcel.banner[bannerID]
  562. if not config then return end
  563. local jSonParam = {}
  564. net.icon = config.icon
  565. net.panelID = config.panelID
  566. local moduleFn = getYYFuncInfo(config.funcID[1])
  567. if moduleFn then
  568. jSonParam.yyID = moduleFn.yyID[config.funcID[1]]
  569. jSonParam.tsStart = banner[4]
  570. jSonParam.tsEnd = banner[5]
  571. jSonParam.leftTs = banner[6]
  572. jSonParam.ad = 0
  573. jSonParam.dot = dot
  574. jSonParam.param = banner[10]
  575. if moduleFn.makeBanner then
  576. moduleFn.makeBanner(jSonParam, banner[9])
  577. end
  578. local funcConfig = getFuncConfig(config.funcID[1])
  579. net.panelID = funcConfig.panelID
  580. end
  581. net.param = Json.Encode(jSonParam)
  582. end
  583. function sendBanner(human)
  584. local bannerList = { }
  585. local len = 0
  586. for k, _id in ipairs(BANNER_LIST_SERVER) do
  587. local config = BannerExcel.banner[_id]
  588. local lenth = #config.funcID
  589. local dot = nil
  590. for i = 1,lenth do
  591. local moduleFn = getYYFuncInfo(config.funcID[i])
  592. if moduleFn and inServerIndex(config.serverIndex) then
  593. local YYInfo = moduleFn.YYInfo[config.funcID[i]]
  594. local funcConfig = getFuncConfig(moduleFn.funcID[config.funcID[i]])
  595. local active = nil
  596. if moduleFn.isActive and
  597. not moduleFn.isActive(human, YYInfo, funcConfig) then
  598. if dot ~= true then
  599. dot = moduleFn.isRed and moduleFn.isRed(human, YYInfo, funcConfig)
  600. end
  601. end
  602. end
  603. end
  604. if _id == 4 or _id == 34 then
  605. dot = nil
  606. end
  607. local moduleFn = getYYFuncInfo(config.funcID[1])
  608. if moduleFn and inServerIndex(config.serverIndex) then
  609. local YYInfo = moduleFn.YYInfo[config.funcID[1]]
  610. local funcConfig = getFuncConfig(moduleFn.funcID[config.funcID[1]])
  611. local active = nil
  612. if moduleFn.isActive and
  613. not moduleFn.isActive(human, YYInfo, funcConfig) then
  614. local leftTime, endTime, startTime = 0
  615. local state = false
  616. if isAbsfunc(moduleFn.funcID[config.funcID[1]]) then
  617. state, endTime, startTime = moduleFn.isOpen(human, YYInfo, funcConfig)
  618. if state then
  619. leftTime = endTime - os.time()
  620. end
  621. end
  622. len = len + 1
  623. bannerList[len] = { _id, config.sortID, dot, startTime, endTime, leftTime, state, YYInfo.yyID, funcConfig.funcID, funcConfig.param }
  624. end
  625. end
  626. end
  627. local bannerID = 1
  628. local dot = 0
  629. local sortID = 0
  630. if len > 0 then
  631. table.sort(bannerList, bannerCmp)
  632. sortID = bannerList[1][2]
  633. end
  634. local msgRet = Msg.gc.GC_BANNER_QUERY
  635. local count = 0
  636. for i = 1,len do
  637. if bannerList[i][2] == sortID then
  638. count = count + 1
  639. bannerID = bannerList[i][1]
  640. if not bannerList[i][3] then
  641. dot = 0
  642. else
  643. dot = 1
  644. end
  645. makeBannerNet(msgRet.bannerList[count], bannerID, dot, bannerList[i])
  646. end
  647. if count >= 9 then
  648. break
  649. end
  650. end
  651. if count == 0 then
  652. count = count + 1
  653. bannerID = 1
  654. dot = 0
  655. makeBannerNet(msgRet.bannerList[count], bannerID, dot, bannerList[1])
  656. end
  657. msgRet.bannerList[0] = count
  658. Msg.send(msgRet, human.fd)
  659. end
  660. -- 登陆处理
  661. function onLogin(human)
  662. AbsActLogic.onLogin(human)
  663. for yyID, YYInfo in pairs(ID2YYInfo) do
  664. for i = 1, #YYInfo.config.funcs do
  665. local funcID = YYInfo.config.funcs[i]
  666. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].onLogin then
  667. YYInfo.moduleList[funcID].onLogin(human, funcID)
  668. end
  669. end
  670. end
  671. sendIcons(human)
  672. sendBanner(human)
  673. sendFirstBanner(human)
  674. end
  675. -- 隔天处理
  676. function updateDaily(human)
  677. for yyID, YYInfo in pairs(ID2YYInfo) do
  678. for i = 1, #YYInfo.config.funcs do
  679. local funcID = YYInfo.config.funcs[i]
  680. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].updateDaily then
  681. YYInfo.moduleList[funcID].updateDaily(human, funcID)
  682. end
  683. end
  684. updateIcon(YYInfo, human, true)
  685. end
  686. sendBanner(human)
  687. end
  688. -- 充值接口
  689. function onCharge(human, price, buyID)
  690. for yyID, YYInfo in pairs(ID2YYInfo) do
  691. for i = 1, #YYInfo.config.funcs do
  692. local funcID = YYInfo.config.funcs[i]
  693. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].onCharge then
  694. YYInfo.moduleList[funcID].onCharge(human, price, funcID, buyID)
  695. end
  696. end
  697. end
  698. sendBanner(human)
  699. end
  700. -- 0点
  701. function onZeroHuman(human)
  702. for yyID, YYInfo in pairs(ID2YYInfo) do
  703. for i = 1, #YYInfo.config.funcs do
  704. local funcID = YYInfo.config.funcs[i]
  705. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].onZero then
  706. YYInfo.moduleList[funcID].onZero(human, funcID)
  707. end
  708. end
  709. end
  710. sendIcons(human)
  711. end
  712. -- 0点
  713. function onZero()
  714. for yyID, YYInfo in pairs(ID2YYInfo) do
  715. for i = 1, #YYInfo.config.funcs do
  716. local funcID = YYInfo.config.funcs[i]
  717. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].onZeroAll then
  718. YYInfo.moduleList[funcID].onZeroAll(funcID)
  719. end
  720. end
  721. end
  722. handleAbs()
  723. end
  724. -- 升级回调
  725. function onLevelUp(human, oldLv, newLv)
  726. for yyID, YYInfo in pairs(ID2YYInfo) do
  727. for i = 1, #YYInfo.config.funcs do
  728. local funcID = YYInfo.config.funcs[i]
  729. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID].onLevelUp then
  730. YYInfo.moduleList[funcID].onLevelUp(human, oldLv, newLv, funcID)
  731. end
  732. end
  733. end
  734. for yyID, YYInfo in pairs(ID2YYInfo) do
  735. if oldLv < YYInfo.openLv and YYInfo.openLv <= newLv then
  736. if isOpen(YYInfo, human, true) then
  737. sendIconUpdate(yyID, human)
  738. end
  739. end
  740. end
  741. end
  742. -- 购买礼包的回调
  743. function onBuy(human, buyConf, isFirst, cnt)
  744. for yyID, YYInfo in pairs(ID2YYInfo) do
  745. for i = 1, #YYInfo.config.funcs do
  746. local funcID = YYInfo.config.funcs[i]
  747. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID][buyConf.cmd] then
  748. YYInfo.moduleList[funcID][buyConf.cmd](human, funcID, buyConf, isFirst, cnt)
  749. end
  750. end
  751. end
  752. end
  753. function CG_YUNYING_UPDATE(human, yyID)
  754. if not human.yunyings then return end
  755. -- 未初始不发
  756. local YYInfo = ID2YYInfo[yyID]
  757. if not YYInfo then return end
  758. updateIcon(YYInfo, human, true)
  759. end
  760. function onServerOpenTime()
  761. handleAbs()
  762. for _, human in pairs(ObjHuman.onlineUuid) do
  763. sendIcons(human)
  764. end
  765. end
  766. ---
  767. --各个模块回调
  768. function onCallBack(human, cmd, parameter, bNoSend, parameter2)
  769. for yyID, YYInfo in pairs(ID2YYInfo) do
  770. for i = 1, #YYInfo.config.funcs do
  771. local funcID = YYInfo.config.funcs[i]
  772. local funcConfig = getFuncConfig(funcID)
  773. if YYInfo.moduleList[funcID] and YYInfo.moduleList[funcID][cmd] then
  774. local isStart = true
  775. if isAbsfunc(funcID) then
  776. isStart = AbsActLogic.isStarted(human, funcID)
  777. end
  778. if isStart then
  779. local result = YYInfo.moduleList[funcID][cmd](human, funcID, parameter, parameter2)
  780. if result then
  781. updateIcon(YYInfo, human)
  782. sendGroupUpdate(YYInfo, human, funcConfig.panelID)
  783. end
  784. if bNoSend then
  785. return result
  786. end
  787. end
  788. end
  789. end
  790. end
  791. if bNoSend then
  792. return 0
  793. end
  794. end