ObjHuman.lua 30 KB

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