ObjHuman.lua 30 KB

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