ObjHuman.lua 24 KB

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