ObjHuman.lua 27 KB

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