ObjHuman.lua 29 KB

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