ObjHuman.lua 27 KB

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