ObjHuman.lua 28 KB

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