ObjHuman.lua 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  1. ----------------------------------
  2. -- 角色相关逻辑
  3. ----------------------------------
  4. local Config = require("Config")
  5. local Util = require("common.Util")
  6. local Log = require("common.Log")
  7. local Lang = require("common.Lang")
  8. local LogDefine = require("common.LogDefine")
  9. local CommonDefine = require("common.CommonDefine")
  10. local RoleExcel = require("excel.role")
  11. local Msg = require("core.Msg")
  12. local Obj = require("core.Obj")
  13. local Timer = require("core.Timer")
  14. local RoleAttr = require("role.RoleAttr")
  15. local RoleDBLogic = require("role.RoleDBLogic")
  16. local RoleDefine = require("role.RoleDefine")
  17. local Broadcast = require("broadcast.Broadcast")
  18. local BagLogic = require("bag.BagLogic")
  19. local HeroLogic = require("hero.HeroLogic")
  20. local VipLogic = require("vip.VipLogic")
  21. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  22. local BarTaskLogic = require("bar.BarTaskLogic")
  23. local CombatPosLogic = require("combat.CombatPosLogic")
  24. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  25. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  26. local OnlineRewardLogic = require("onlineReward.OnlineRewardLogic")
  27. local SettingLogic = require("setting.SettingLogic")
  28. local ChatHandler = require("chat.Handler")
  29. local FriendLogic = require("friend.FriendLogic")
  30. local UnionDBLogic = require("union.UnionDBLogic")
  31. local BuyLogic = require("topup.BuyLogic")
  32. local ReportManager = require("platform.ReportManager")
  33. local BattleLogic = require("battle.BattleLogic")
  34. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  35. local RoleLogic = require("role.RoleLogic")
  36. local FuwenLogic = require("fuwen.FuwenLogic")
  37. local EquipLogic = require("equip.EquipLogic")
  38. local TequanLogic = require("qqTequan.TequanLogic")
  39. local ShopLogic = require("shop.ShopLogic")
  40. local MailLogic = require("mail.MailLogic")
  41. local LianyuLogic = require("lianyu.LianyuLogic")
  42. local MiddleLogic = require("middle.MiddleLogic")
  43. local MiddleOption = require("middle.MiddleOption")
  44. local GuideLogic = require("guide.GuideLogic")
  45. local ItemDefine = require("bag.ItemDefine")
  46. local DrillLogic = require("drill.DrillLogic")
  47. local BRoleLogic = require("billboard.BRoleLogic")
  48. local BillboardDefine = require("billboard.BillboardDefine")
  49. local FcmLogic = require("fcm.FcmLogic")
  50. local CombatLogic = require("combat.CombatLogic")
  51. local SceneHandler = require("scene.Handler")
  52. local TuiSongLiBao = require("present.TuiSongLiBao")
  53. local CopyLogic = require("copy.CopyLogic")
  54. local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
  55. local UnionLivenessLogic = require("union.UnionLivenessLogic")
  56. local UnionDonateLogic = require("union.UnionDonateLogic")
  57. local RoleStrongLogic = require("role.RoleStrongLogic")
  58. local DailyTaskLogic = require("dailyTask.DailyTaskLogic")
  59. local LiLianLogic = require("dailyTask.LiLianLogic")
  60. local FirstChargeLogic = require("present.FirstChargeLogic")
  61. local JjcLadderLogic = require("jjcLadder.JjcLadderLogic")
  62. local RelationGiftLogic = require("present.RelationGiftLogic")
  63. local WelfareGiftLogic = require("present.WelfareGiftLogic")
  64. local GlobalWorld = require("core.GlobalWorld")
  65. local ChatRecord = require("chat.ChatRecord")
  66. local WarReportLogic = require("warReport.WarReportLogic")
  67. local ZhuanpanLogic = require("zhuanpan.ZhuanpanLogic")
  68. local UnionRedBagLogic = require("union.UnionRedBagLogic")
  69. local JjcGodWarLogic = require("jjcGodWar.JjcGodWarLogic")
  70. local JibanLogic = require("combat.JibanLogic")
  71. local YunYingLogic = require("yunying.YunYingLogic")
  72. local KingWorldLogic = require("present.KingWorldLogic")
  73. local CommonDB = require("common.CommonDB")
  74. local ZhanbuLogic = require("zhanbu.ZhanbuLogic")
  75. local TopupLogic = require("topup.TopupLogic")
  76. local HeroLogLogic = require("absAct.HeroLogLogic")
  77. local FanliLogic = require("platform.FanliLogic")
  78. local HeroGrowUp = require("absAct.HeroGrowUp")
  79. local MailManager = require("mail.MailManager")
  80. local MailExcel = require("excel.mail")
  81. local PfLogic = require("platform.PfLogic")
  82. local MoshouLogic = require("moshou.MoshouLogic")
  83. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  84. local LostTempleLogic = require("lostTemple.lostTempleLogic")
  85. fds = fds or {} -- fd->obj_id,包括创角中+游戏中
  86. onlineAccount = onlineAccount or {} -- account->human,包括创角中+游戏中
  87. onlineHuman = onlineHuman or {} -- name->human,仅包括游戏中
  88. onlineUuid = onlineUuid or {} -- uuid->human,仅包括游戏中
  89. function create(fd, account, db)
  90. local human = {}
  91. Obj.create(human, Obj.TYPE_HUMAN)
  92. fds[fd] = human.id
  93. human.fd = fd
  94. human.db = db or RoleDBLogic.loadRole(account)
  95. if human.db ~= nil then
  96. initHuman(human)
  97. else
  98. human.account = account
  99. end
  100. return human
  101. end
  102. function initHuman(human)
  103. local now = os.time()
  104. human.preLoginTime = human.db.lastLoginTime -- 上一次登录时间
  105. human.db.lastLoginTime = now -- 记录最近一次登录时间
  106. human.saveDBTime = Timer.now -- 人物数据库保存时间
  107. human.firstEnter = true -- 首次进入场景
  108. -- 角色信息初始化
  109. onlineAccount[human.db.account] = human
  110. onlineHuman[human.db.name] = human
  111. onlineUuid[human.db._id] = human
  112. end
  113. function destroy(human)
  114. local account = human.account or human.db.account
  115. if human.fd then fds[human.fd] = nil end
  116. if human.db then -- 已创角
  117. onlineAccount[account] = nil
  118. onlineHuman[human.db.name] = nil
  119. onlineUuid[human.db._id] = nil
  120. end
  121. Obj.destroy(human)
  122. end
  123. function doDisconnect(human, code)
  124. print("doDisconnect account:", human.account or human.db.account, " code:", code)
  125. if human.db then
  126. local now = os.time()
  127. if human.db.changeNameCnt ~= nil then
  128. Log.write(Log.LOGID_OSS_LOGOUT, human.db._id, human.db.account, human.db.name, human.db.lv, human.db.ip, code, now - human.db.lastLoginTime)
  129. end
  130. if human.fd then
  131. onLogout(human)
  132. end
  133. end
  134. if code ~= CommonDefine.DISCONNECT_NORMAL and code ~= CommonDefine.DISCONNECT_NORMAL_AFTER then
  135. if _G.is_middle ~= true then
  136. local mm = Msg.gc.GC_DISCONNECT
  137. mm.code = code
  138. mm.msg = CommonDefine.DISCONNECT_MSG[code] or ""
  139. Msg.send(mm, human.fd)
  140. end
  141. end
  142. if human.db then
  143. if code ~= CommonDefine.DISCONNECT_NORMAL then -- 正常断线先不销毁
  144. if code ~= CommonDefine.DISCONNECT_DUPLICATE then
  145. CombatLogic.forceFinish(human)
  146. end
  147. ReportManager.quit(human,code)
  148. destroy(human)
  149. if code == CommonDefine.DISCONNECT_DUPLICATE then
  150. else
  151. if _G.is_middle == true then
  152. -- 数据销毁 要把db数据发回给正常服
  153. MiddleLogic.sendWL_DB_BACK(human)
  154. else
  155. local ret, err = pcall(save, human)
  156. if not ret then
  157. Log.write(Log.LOGID_ERR_PCALL, "destroy account=" .. human.db.account, err)
  158. end
  159. end
  160. end
  161. return
  162. end
  163. else
  164. destroy(human) -- 未创角,立刻销毁对象
  165. return
  166. end
  167. if not human.fd then
  168. assert()
  169. end
  170. fds[human.fd] = nil
  171. human.fd = nil
  172. human.f5 = Timer.now
  173. end
  174. -- 下线回调
  175. function onLogout(human)
  176. local nowTime = os.time()
  177. human.db.lastLogoutTime = os.time() -- 记录最近登出时间
  178. local time = math.max(nowTime - human.db.lastLoginTime, 0)
  179. human.db.onlineTime = (human.db.onlineTime or 0) + time -- 记录在线时长
  180. local time2 = nowTime - math.max(human.db.lastLoginTime, Util.getDayStartTime(nowTime))
  181. human.db.onlineTimeDay = (human.db.onlineTimeDay or 0) + math.max(time2, 0) -- 记录本日在线时长
  182. LianyuLogic.onLogout(human)
  183. OnlineRewardLogic.onLogout(human, time)
  184. YunYingLogic.onCallBack(human, "onLogout")
  185. end
  186. function saveCharDB()
  187. local now = Timer.now
  188. local minn
  189. local ans
  190. for _, human in pairs(onlineUuid) do
  191. if human.fd then
  192. local t = human.saveDBTime
  193. if 300000 <= now - t and (not minn or t < minn) then
  194. minn = t
  195. ans = human
  196. end
  197. end
  198. end
  199. if not ans then
  200. return
  201. end
  202. ans.saveDBTime = now
  203. local ret, err = pcall(save, ans)
  204. if not ret then
  205. Log.write(Log.LOGID_ERR_PCALL, "saveCharDB rolename="..ans.db.name, err)
  206. end
  207. end
  208. function humanOfflineCheck()
  209. if _G.is_middle == true then
  210. local now = os.time()
  211. for account, human in pairs(onlineAccount) do
  212. if human.fd == nil then
  213. if human.f5 == nil or Timer.now - human.f5 > 30000 then
  214. doDisconnect(human, CommonDefine.DISCONNECT_NORMAL_AFTER, "")
  215. end
  216. end
  217. end
  218. for account, humanTempInfo in pairs(MiddleLogic.TRY_LOGIN_HUMAN) do
  219. if now - humanTempInfo.tsForMiddle > 30 then
  220. MiddleLogic.TRY_LOGIN_HUMAN[account] = nil
  221. end
  222. end
  223. else
  224. for uuid, human in pairs(onlineUuid) do
  225. -- 暂时不检测 不主动结束战斗 方便客户端调试 dxzeng debug
  226. if CombatLogic.COMBAT_CACHE[uuid] and not Config.IS_DEBUG then -- reyes test
  227. CombatLogic.checkFinish(human)
  228. else
  229. if human.fd == nil then
  230. if human.f5 == nil or Timer.now - human.f5 > 32000 then
  231. doDisconnect(human, CommonDefine.DISCONNECT_NORMAL_AFTER)
  232. end
  233. end
  234. end
  235. end
  236. end
  237. end
  238. function save(human)
  239. RoleDBLogic.saveRole(human.db)
  240. end
  241. -- 获得在线人数(包含停留在创角页)
  242. function getOnlineCnt()
  243. local onlineCnt = 0
  244. for _ in pairs(onlineAccount) do
  245. onlineCnt = onlineCnt + 1
  246. end
  247. return onlineCnt
  248. end
  249. function onZhandouliUpdate(human)
  250. -- 更新排行榜
  251. LiLianLogic.onCallback(human,LiLianLogic.LILIAN_OUTID22,human.db.zhandouli,nil,nil,true)
  252. YunYingLogic.onCallBack(human, "onZhandouli", human.db.zhandouli)
  253. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_203)
  254. end
  255. local old_attr = {}
  256. function doCalc(human)
  257. for k in pairs(old_attr) do
  258. old_attr[k] = nil
  259. end
  260. if human.attr then
  261. for k, v in pairs(human.attr) do
  262. old_attr[k] = v
  263. end
  264. end
  265. RoleAttr.doCalc(human)
  266. onZhandouliUpdate(human)
  267. local mm = Msg.gc.GC_ROLE_ATTR
  268. local len = 0
  269. local left = mm.attrs
  270. for k,v in pairs(human.attr) do
  271. if v ~= old_attr[k] then
  272. len = len + 1
  273. left[len].key = k
  274. left[len].value = v
  275. end
  276. end
  277. if 0 < len then
  278. left[0] = len
  279. Msg.send(mm, human.fd)
  280. --Msg.trace(mm)
  281. end
  282. end
  283. function sendAttr(human,key)
  284. if human.db.middleFlag and _G.is_middle ~= true then
  285. -- 这个时候的属性改变由跨服服计算
  286. return
  287. end
  288. if not human.attr[key] then return end
  289. local msgRet = Msg.gc.GC_ROLE_ATTR
  290. msgRet.attrs[0] = 1
  291. local attr = msgRet.attrs[1]
  292. attr.key = key
  293. attr.value = human.attr[key]
  294. Msg.send(msgRet, human.fd)
  295. --Msg.trace(msgRet)
  296. end
  297. function doCalcHero(human, bagIndex)
  298. RoleAttr.doCalcHero(human, bagIndex)
  299. doCalc(human)
  300. end
  301. function getHeroAttrs(human, bagIndex)
  302. if not human.heroAttrs or not human.heroAttrs[bagIndex] then
  303. RoleAttr.doCalcHero(human, bagIndex)
  304. end
  305. return human.heroAttrs[bagIndex]
  306. end
  307. function checkLevelUp(human)
  308. if human.db.lv > #RoleExcel.exp then
  309. return 0
  310. end
  311. local levelUp = 0
  312. while human.db.exp > 0 do
  313. local needExp = 0
  314. if human.db.lv < 200 then
  315. needExp = RoleExcel.exp[human.db.lv + 1].exp
  316. end
  317. if needExp <= human.db.exp then
  318. if human.db.lv >= #RoleExcel.exp then
  319. if human.db.exp > needExp then
  320. human.db.exp = needExp
  321. end
  322. break
  323. else
  324. human.db.exp = human.db.exp - needExp
  325. human.db.lv = human.db.lv + 1
  326. levelUp = 1
  327. JibanLogic.onCallback(human,4,human.db.lv)
  328. end
  329. else
  330. break
  331. end
  332. end
  333. return levelUp
  334. end
  335. function onLvUpCB(human, oldLv, newLv)
  336. doCalc(human)
  337. --升级判断钻石基金是否返钻
  338. --FundLogic.onLvUp(human, oldLv, newLv)
  339. GuideLogic.onLvUpCB(human, oldLv, newLv)
  340. RoleSystemLogic.onLvUp(human)
  341. YunYingLogic.onLevelUp(human, oldLv, newLv)
  342. TuiSongLiBao.tuiSongLiBaoOnTask(human,TuiSongLiBao.TUISONGLIBAOTASK_LV, newLv, oldLv)
  343. CombatPosLogic.onLvUp(human, oldLv, newLv)
  344. ChengjiuLogic.onLvUp(human)
  345. -- 更新等级排名数据
  346. if BRoleLogic.updateData(BillboardDefine.TYPE_LV, human.db) then
  347. -- 计算世界等级
  348. GlobalWorld.doCalcWorldLv()
  349. end
  350. -- 开服邮件
  351. local subDay = CommonDB.getServerOpenDay()
  352. human.db.sendPfEmail = human.db.sendPfEmail or {}
  353. for k, config in ipairs(MailExcel.openMail) do
  354. if subDay and
  355. subDay >= config.openDay[1] and
  356. subDay <= config.openDay[2] and
  357. PfLogic.isServerIndex(config.svrIndex) then
  358. if newLv >= config.lv and
  359. human.db.sendPfEmail[k] == nil then
  360. human.db.sendPfEmail[k] = 1
  361. local title = MailExcel.mail[config.mailID].title
  362. local content = MailExcel.mail[config.mailID].content
  363. local senderName = MailExcel.mail[config.mailID].senderName
  364. if #config.items > 0 then
  365. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, config.items, senderName)
  366. else
  367. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, nil, senderName)
  368. end
  369. end
  370. end
  371. end
  372. --升级日志
  373. Log.write(Log.LOGID_OSS_LEVELUP, human.db._id, human.db.account, human.db.name, oldLv, newLv)
  374. end
  375. function addExp(human, addExp)
  376. if human.db.lv > #RoleExcel.exp then return end
  377. if not addExp then return end
  378. addExp = math.floor(addExp)
  379. if addExp == 0 then return end
  380. local total = human.db.exp + addExp
  381. total = math.max(0, total)
  382. total = math.floor(total)
  383. if total == human.db.exp then
  384. return
  385. end
  386. local oldLv = human.db.lv
  387. human.db.exp = total
  388. local levelUp = checkLevelUp(human)
  389. if levelUp == 1 then
  390. onLvUpCB(human, oldLv, human.db.lv)
  391. else
  392. human.attr[RoleDefine.EXP] = human.db.exp
  393. sendAttr(human,RoleDefine.EXP)
  394. end
  395. end
  396. function canAddJinbi(human, d)
  397. if human.db.jinbi + d > ItemDefine.BAG_ITEM_MAX_JINBI then
  398. return Broadcast.sendErr(human, Lang.COMMON_ADD_JINBI_LIMIT)
  399. else
  400. return true
  401. end
  402. end
  403. function updateJinbi(human, d, logType,item_id, num)
  404. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["jinbi"] then
  405. assert()
  406. end
  407. d = math.floor(d)
  408. if d == 0 then
  409. return
  410. end
  411. local val = human.db.jinbi + d
  412. if val < 0 then
  413. assert()
  414. end
  415. if val > ItemDefine.BAG_ITEM_MAX_JINBI then
  416. val = ItemDefine.BAG_ITEM_MAX_JINBI
  417. Broadcast.sendErr(human, Lang.COMMON_ADD_JINBI_LIMIT)
  418. end
  419. --金币使用日志
  420. if item_id == nil then item_id = 0 end
  421. if num == nil then num = 0 end
  422. Log.write(Log.LOGID_OSS_JINBI, human.db._id, human.db.account, human.db.name, human.db.lv, d, LogDefine.DEFINE[logType] + LogDefine.TYPE["jinbi"], item_id or 0, num or 0, val)
  423. human.db.jinbi = val
  424. if human.fd then
  425. human.attr[RoleDefine.JINBI] = human.db.jinbi
  426. sendAttr(human,RoleDefine.JINBI)
  427. end
  428. MiddleOption.updateYinliang(human, d, logType)
  429. if d < 0 then
  430. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE4, -d)
  431. end
  432. return true
  433. end
  434. function addZuanshi(human, d, logType, item_id, num)
  435. d = math.floor(d)
  436. if d < 0 then assert(nil) end
  437. if d == 0 then return end
  438. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["zuanshi"] then
  439. assert()
  440. end
  441. local val = human.db.zuanshi + d
  442. --钻石使用日志
  443. Log.write(Log.LOGID_OSS_GOLD, human.db._id, human.db.account, human.db.name, human.db.lv, d, LogDefine.DEFINE[logType] + LogDefine.TYPE["zuanshi"] , item_id or 0, num or 0, val)
  444. human.db.zuanshi = val
  445. if human.fd then
  446. human.attr[RoleDefine.ZUANSHI] = human.db.zuanshi
  447. sendAttr(human, RoleDefine.ZUANSHI)
  448. end
  449. MiddleOption.updateYuanbao(human, d, logType)
  450. return true
  451. end
  452. function decZuanshi(human, d, logType, item_id, num, noSend)
  453. d = math.floor(d)
  454. if d > 0 then assert(nil) end
  455. if d == 0 then return end
  456. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["zuanshi"] then
  457. assert()
  458. end
  459. local val = human.db.zuanshi + d
  460. if val < 0 then
  461. assert()
  462. end
  463. human.db.zuanshi = val
  464. Log.write(Log.LOGID_OSS_GOLD, human.db._id, human.db.account, human.db.name, human.db.lv, d, LogDefine.DEFINE[logType] + LogDefine.TYPE["zuanshi"] , item_id or 0, num or 0, val)
  465. if human.fd then
  466. human.attr[RoleDefine.ZUANSHI] = human.db.zuanshi
  467. sendAttr(human, RoleDefine.ZUANSHI)
  468. end
  469. HeroLogLogic.finishTaskCB(human,HeroLogLogic.HERO_LOG_TYPE_6,-d)
  470. MiddleOption.updateYuanbao(human, d, logType)
  471. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE5, -d)
  472. YunYingLogic.onCallBack(human, "onDecZuanshi",-d)
  473. return true
  474. end
  475. -- 钻石不足时候的处理
  476. function checkRMB(human, need)
  477. local sum = human.db.zuanshi
  478. if sum < need then
  479. if _G.is_middle == true then
  480. Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
  481. else
  482. if not SceneHandler.canCharge(human) then
  483. Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
  484. else
  485. local msgRet = Msg.gc.GC_BAG_NORMB
  486. Msg.send(msgRet,human.fd)
  487. end
  488. end
  489. return false
  490. else
  491. return true
  492. end
  493. end
  494. function updateFriendHeart(human, d, logType,item_id, num)
  495. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["friendheart"] then
  496. assert()
  497. end
  498. d = math.floor(d)
  499. if d == 0 then
  500. return
  501. end
  502. local val = human.db.friendHeart + d
  503. if val < 0 then
  504. assert()
  505. end
  506. --好友爱心使用日志
  507. if item_id == nil then item_id = 0 end
  508. if num == nil then num = 0 end
  509. Log.write(Log.LOGID_OSS_FRIENDHEART, human.db._id, human.db.account, human.db.name, human.db.lv, d, LogDefine.DEFINE[logType] + LogDefine.TYPE["friendheart"], item_id or 0, num or 0, val)
  510. human.db.friendHeart = val
  511. if human.fd then
  512. human.attr[RoleDefine.FRIENDHEART] = human.db.friendHeart
  513. sendAttr(human,RoleDefine.FRIENDHEART)
  514. end
  515. return true
  516. end
  517. function sendHumanInfo(human)
  518. -- 处理称号被销毁的
  519. if human.db.chenghao then
  520. if not human.db.chenghaoList[human.db.chenghao] then
  521. human.db.chenghao = nil
  522. end
  523. end
  524. local subDay = CommonDB.getServerOpenDay()
  525. local mm = Msg.gc.GC_ZZ_HUMAN_INFO
  526. RoleLogic.getRoleBase(human, mm.roleBase)
  527. local union = UnionDBLogic.getUnion(human.db.unionUuid)
  528. mm.unionName = union and union.name or ""
  529. mm.unionIdentity = union and union.id or ""
  530. mm.bannerID = union and union.bannerID or 0
  531. mm.unionFrame = union and union.headFrame or 0
  532. mm.identity = human.db.identity
  533. mm.vipLv = VipLogic.getVipLv(human)
  534. mm.animation = human.db.animation or 0
  535. mm.background = human.db.background or 0
  536. mm.debug = Config.IS_USE_GM_CMD and 1 or 0
  537. mm.worldLv = GlobalWorld.getWorldLv()
  538. mm.openDay = subDay or 0
  539. mm.guideState= GuideLogic.checkAllFinish(human)
  540. Msg.send(mm, human.fd)
  541. end
  542. function enterCity(human)
  543. Msg.send(Msg.gc.GC_ENTER_CITY, human.fd)
  544. end
  545. -- 上线回调
  546. function onLogin(human, isNew)
  547. human.db.ip = human.ip
  548. human.db.phpChanelID = human.phpChanelID
  549. if human.db.changeNameCnt ~= nil then
  550. Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.account, human.db.name, human.db.lv, human.db.ip)
  551. end
  552. updateDaily(human)
  553. if not FcmLogic.checkFcm(human) then
  554. return -- 防沉迷 踢下线
  555. end
  556. TequanLogic.jihuopt(human)
  557. TequanLogic.setHumanTequan(human,human.pf_info)
  558. doCalc(human)
  559. sendHumanInfo(human)
  560. BagLogic.sendBagList(human)
  561. FuwenLogic.sendFuwenBagList(human)
  562. EquipLogic.sendEquipBagList(human)
  563. HeroLogic.sendHeroBagCap(human)
  564. HeroLogic.sendHeroBagList(human)
  565. CombatPosLogic.onLogin(human)
  566. VipLogic.onLogin(human)
  567. FriendLogic.onLogin(human)
  568. DailyTaskLogic.onLogin(human)
  569. OnlineRewardLogic.onLogin(human)
  570. SettingLogic.query(human)
  571. ChatHandler.onLogin(human)
  572. BattleLogic.onLogin(human)
  573. ChatPaoMaLogic.onLogin(human)
  574. MailLogic.cleanNilContent(human)
  575. YunYingLogic.onLogin(human)
  576. RoleStrongLogic.onLogin(human)
  577. RelationGiftLogic.onLogin(human)
  578. ChatRecord.sendAllNotRead(human)
  579. JjcGodWarLogic.onLogin(human)
  580. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE1, 1)
  581. if not isNew then
  582. ReportManager.login(human)
  583. end
  584. LostTempleLogic.onLogin(human)
  585. SettingLogic.onLogin(human)
  586. GuideLogic.onLogin(human)
  587. CombatLogic.onLogin(human) -- reyes test
  588. LianyuLogic.onLogin(human)
  589. MoshouLogic.onLogin(human)
  590. TopupLogic.checkKf(human)
  591. -- 最后执行离线发货
  592. BuyLogic.onLogin(human)
  593. HeroLogLogic.finishTaskCB(human,HeroLogLogic.HERO_LOG_TYPE_1,1)
  594. -- 红点 检测 需要放在通用的onLogin 后面 保持数据的正确性 再检测红点
  595. local pcallRet, pcallErr = pcall(RoleSystemLogic.onLogin, human)
  596. if not pcallRet then
  597. Log.write(Log.LOGID_ERR_PCALL, "RoleSystemLogic.onLogin err=" .. human.db.account, pcallErr)
  598. end
  599. enterCity(human)
  600. local day = Util.diffDay(human.db.createTime)
  601. if day == 2 or day == 7 then
  602. local msgRet = Msg.gc.GC_NOTICE_DADIAN
  603. msgRet.type = 2
  604. msgRet.param = day
  605. msgRet.param2 = 0
  606. Msg.send(msgRet,human.fd)
  607. end
  608. -- 注意 这个函数写在doLogin的最后
  609. MiddleLogic.onLogin(human)
  610. end
  611. -- 这里有个潜规则,凡是使用每天都需更新的数据时,都必须先调用这个方法。by cc
  612. function updateDaily(human, isGm)
  613. if not isGm then
  614. if human.db.update_daily_time and Util.isSameDay(human.db.update_daily_time) then
  615. return true
  616. end
  617. end
  618. -- 跨月
  619. if human.db.update_daily_time and Util.isSameMonth(human.db.update_daily_time) ~= true then
  620. human.db.topupAccountMonth = nil
  621. end
  622. YunYingLogic.updateDaily(human)
  623. BattleLogic.updateDaily(human)
  624. BarTaskLogic.refreshDailyTask(human)
  625. FriendLogic.refreshDailyTask(human)
  626. TequanLogic.cleanDaily(human)
  627. CopyLogic.updateDaily(human)
  628. HuanJingTowerLogic.updateDaily(human)
  629. VipLogic.updateDaily(human)
  630. WelfareGiftLogic.updateDaily(human)
  631. WarReportLogic.updateDaily(human)
  632. ZhanbuLogic.updateDaily(human)
  633. ZhuanpanLogic.updateDaily(human)
  634. LostTempleLogic.updateDaily(human)
  635. human.db.update_daily_time = os.time()
  636. human.db.dailyTask = nil
  637. human.db.dailyShareTask = nil
  638. human.db.jjcDailyFight = nil
  639. human.db.jjcWorship = nil
  640. human.db.personMail = nil
  641. human.db.topupAcountDaily = nil
  642. human.db.dailyLeiChong = nil
  643. human.db.onlineTimeDay = nil
  644. human.db.onlineTimeDayReport = nil
  645. human.db.heroResetCnt = nil
  646. human.db.dailyLibao = nil
  647. human.db.ectypeLike = nil
  648. human.db.ectypHurt = nil
  649. human.db.ectypeCnt = nil
  650. human.db.ectypLikeUuid = nil
  651. ShopLogic.updateDaily(human)
  652. LianyuLogic.updateDaily(human)
  653. DrillLogic.updateDaily(human)
  654. UnionLivenessLogic.updateDaily(human)
  655. UnionDonateLogic.updateDaily(human)
  656. FirstChargeLogic.updateDaily(human)
  657. JjcLadderLogic.updateDaily(human)
  658. UnionRedBagLogic.updateDaily(human)
  659. JjcGodWarLogic.updateDaily(human)
  660. -- 红点 发送 理论放最后
  661. RoleSystemLogic.onLogin(human)
  662. end
  663. -- 角色心跳
  664. function refresh()
  665. for _, human in pairs(onlineHuman) do
  666. --活动开启邮件提示
  667. RoleSystemLogic.checkMailTips(human)
  668. end
  669. end