ObjHuman.lua 27 KB

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