ObjHuman.lua 26 KB

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