ObjHuman.lua 27 KB

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