ObjHuman.lua 29 KB

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