ObjHuman.lua 26 KB

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