ObjHuman.lua 27 KB

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