ObjHuman.lua 29 KB

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