ObjHuman.lua 23 KB

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