ObjHuman.lua 29 KB

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