ObjHuman.lua 27 KB

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