ObjHuman.lua 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. ----------------------------------
  2. -- 角色相关逻辑
  3. ----------------------------------
  4. local Config = require("Config")
  5. local Util = require("common.Util")
  6. local Log = require("common.Log")
  7. local Lang = require("common.Lang")
  8. local LogDefine = require("common.LogDefine")
  9. local CommonDefine = require("common.CommonDefine")
  10. local RoleExcel = require("excel.role")
  11. local Msg = require("core.Msg")
  12. local Obj = require("core.Obj")
  13. local Timer = require("core.Timer")
  14. local RoleAttr = require("role.RoleAttr")
  15. local RoleDBLogic = require("role.RoleDBLogic")
  16. local RoleDefine = require("role.RoleDefine")
  17. local Broadcast = require("broadcast.Broadcast")
  18. local BagLogic = require("bag.BagLogic")
  19. local HeroLogic = require("hero.HeroLogic")
  20. local VipLogic = require("vip.VipLogic")
  21. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  22. local BarTaskLogic = require("bar.BarTaskLogic")
  23. local CombatPosLogic = require("combat.CombatPosLogic")
  24. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  25. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  26. local OnlineRewardLogic = require("onlineReward.OnlineRewardLogic")
  27. local SettingLogic = require("setting.SettingLogic")
  28. local ChatHandler = require("chat.Handler")
  29. local FriendLogic = require("friend.FriendLogic")
  30. local UnionDBLogic = require("union.UnionDBLogic")
  31. local BuyLogic = require("topup.BuyLogic")
  32. local GiftLogic = require("topup.GiftLogic")
  33. local ReportManager = require("platform.ReportManager")
  34. local BattleLogic = require("battle.BattleLogic")
  35. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  36. local RoleLogic = require("role.RoleLogic")
  37. local FuwenLogic = require("fuwen.FuwenLogic")
  38. local EquipLogic = require("equip.EquipLogic")
  39. local TequanLogic = require("qqTequan.TequanLogic")
  40. local ShopLogic = require("shop.ShopLogic")
  41. local MailLogic = require("mail.MailLogic")
  42. local LianyuLogic = require("lianyu.LianyuLogic")
  43. local MiddleLogic = require("middle.MiddleLogic")
  44. local MiddleOption = require("middle.MiddleOption")
  45. local GuideLogic = require("guide.GuideLogic")
  46. local ItemDefine = require("bag.ItemDefine")
  47. local DrillLogic = require("drill.DrillLogic")
  48. local BRoleLogic = require("billboard.BRoleLogic")
  49. local BillboardDefine = require("billboard.BillboardDefine")
  50. local FcmLogic = require("fcm.FcmLogic")
  51. local CombatLogic = require("combat.CombatLogic")
  52. local SceneHandler = require("scene.Handler")
  53. local TuiSongLiBao = require("present.TuiSongLiBao")
  54. local CopyLogic = require("copy.CopyLogic")
  55. local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
  56. local UnionLivenessLogic = require("union.UnionLivenessLogic")
  57. local UnionDonateLogic = require("union.UnionDonateLogic")
  58. local RoleStrongLogic = require("role.RoleStrongLogic")
  59. local DailyTaskLogic = require("dailyTask.DailyTaskLogic")
  60. local LiLianLogic = require("dailyTask.LiLianLogic")
  61. local FirstChargeLogic = require("present.FirstChargeLogic")
  62. local JjcLadderLogic = require("jjcLadder.JjcLadderLogic")
  63. local RelationGiftLogic = require("present.RelationGiftLogic")
  64. local WelfareGiftLogic = require("present.WelfareGiftLogic")
  65. local GlobalWorld = require("core.GlobalWorld")
  66. local ChatRecord = require("chat.ChatRecord")
  67. local WarReportLogic = require("warReport.WarReportLogic")
  68. local ZhuanpanLogic = require("zhuanpan.ZhuanpanLogic")
  69. local UnionRedBagLogic = require("union.UnionRedBagLogic")
  70. local JjcGodWarLogic = require("jjcGodWar.JjcGodWarLogic")
  71. local JibanLogic = require("combat.JibanLogic")
  72. local YunYingLogic = require("yunying.YunYingLogic")
  73. local KingWorldLogic = require("present.KingWorldLogic")
  74. local CommonDB = require("common.CommonDB")
  75. local ZhanbuLogic = require("zhanbu.ZhanbuLogic")
  76. local TopupLogic = require("topup.TopupLogic")
  77. local HeroLogLogic = require("absAct.HeroLogLogic")
  78. local FanliLogic = require("platform.FanliLogic")
  79. local HeroGrowUp = require("absAct.HeroGrowUp")
  80. local MailManager = require("mail.MailManager")
  81. local MailExcel = require("excel.mail")
  82. local PfLogic = require("platform.PfLogic")
  83. local MoshouLogic = require("moshou.MoshouLogic")
  84. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  85. local LostTempleLogic = require("lostTemple.lostTempleLogic")
  86. local DrawCardV2Excel = require("excel.drawCard").drawCardV2
  87. local WarOrder = require("shop.WarOrder")
  88. local OpenServerActPowerUp = require("present.OpenServerActPowerUp")
  89. local VoucherShopLogic = require("voucher.VoucherShopLogic")
  90. local RacialTrialLogic = require("racialTrial.RacialTrialLogic")
  91. local MaiDianDefine = require("MaiDian.MaiDianDefine")
  92. local MainDianLogic = require("MaiDian.MaiDianLogic")
  93. local OnlineAwardLogic = require("present.OnlineAwardLogic")
  94. local RoleHeadLogic = require("role.RoleHeadLogic")
  95. local TriggerLogic = require("trigger.TriggerLogic")
  96. local Json = require("common.Json")
  97. fds = fds or {} -- fd->obj_id,包括创角中+游戏中
  98. onlineAccount = onlineAccount or {} -- account->human,包括创角中+游戏中(弃用, 没删掉是防止有些有些暂时没修改的地方访问时报错)
  99. onlineNewUniqueTag = onlineNewUniqueTag or {} -- NewUniqueTag->human, 合服后可能存在多个角色account相同情况,所以用NewUniqueTag
  100. onlineHuman = onlineHuman or {} -- name->human,仅包括游戏中
  101. onlineUuid = onlineUuid or {} -- uuid->human,仅包括游戏中
  102. function create(fd, account, db, serverTag)
  103. local human = {}
  104. Obj.create(human, Obj.TYPE_HUMAN)
  105. fds[fd] = human.id
  106. human.fd = fd
  107. -- human.db = db or RoleDBLogic.loadRole(account)
  108. local uTag = RoleDBLogic.generateuuid(account, serverTag)
  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. end
  209. function saveCharDB()
  210. local now = Timer.now
  211. local minn
  212. local ans
  213. for _, human in pairs(onlineUuid) do
  214. if human.fd then
  215. local t = human.saveDBTime
  216. if 300000 <= now - t and (not minn or t < minn) then
  217. minn = t
  218. ans = human
  219. end
  220. end
  221. end
  222. if not ans then
  223. return
  224. end
  225. ans.saveDBTime = now
  226. local ret, err = pcall(save, ans)
  227. if not ret then
  228. Log.write(Log.LOGID_ERR_PCALL, "saveCharDB rolename="..ans.db.name, err)
  229. end
  230. end
  231. function humanOfflineCheck()
  232. if _G.is_middle == true then
  233. local now = os.time()
  234. -- for account, human in pairs(onlineAccount) do
  235. -- if human.fd == nil then
  236. -- if human.f5 == nil or Timer.now - human.f5 > 30000 then
  237. -- doDisconnect(human, CommonDefine.DISCONNECT_NORMAL_AFTER)
  238. -- end
  239. -- end
  240. -- end
  241. for _, human in pairs(onlineNewUniqueTag) do
  242. if human.fd == nil then
  243. if human.f5 == nil or Timer.now - human.f5 > 30000 then
  244. doDisconnect(human, CommonDefine.DISCONNECT_NORMAL_AFTER)
  245. end
  246. end
  247. end
  248. for account, humanTempInfo in pairs(MiddleLogic.TRY_LOGIN_HUMAN) do
  249. if now - humanTempInfo.tsForMiddle > 30 then
  250. MiddleLogic.TRY_LOGIN_HUMAN[account] = nil
  251. end
  252. end
  253. else
  254. for uuid, human in pairs(onlineUuid) do
  255. -- 暂时不检测 不主动结束战斗 方便客户端调试 dxzeng debug
  256. if CombatLogic.COMBAT_CACHE[uuid] and not Config.IS_DEBUG then -- reyes test
  257. CombatLogic.checkFinish(human)
  258. else
  259. if human.fd == nil then
  260. if human.f5 == nil or Timer.now - human.f5 > 32000 then
  261. doDisconnect(human, CommonDefine.DISCONNECT_NORMAL_AFTER)
  262. end
  263. end
  264. end
  265. end
  266. end
  267. end
  268. function save(human)
  269. RoleDBLogic.saveRole(human.db)
  270. end
  271. -- 获得在线人数(包含停留在创角页)
  272. function getOnlineCnt()
  273. local onlineCnt = 0
  274. -- for _ in pairs(onlineAccount) do
  275. -- onlineCnt = onlineCnt + 1
  276. -- end
  277. for _ in pairs(onlineNewUniqueTag) do
  278. onlineCnt = onlineCnt + 1
  279. end
  280. return onlineCnt
  281. end
  282. function onZhandouliUpdate(human)
  283. -- 更新排行榜
  284. LiLianLogic.onCallback(human,LiLianLogic.LILIAN_OUTID22,human.db.zhandouli,nil,nil,true)
  285. YunYingLogic.onCallBack(human, "onZhandouli", human.db.zhandouli)
  286. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_203)
  287. OpenServerActPowerUp.ActPowerUp_PowerChange(human, human.db.zhandouli)
  288. end
  289. local old_attr = {}
  290. function doCalc(human)
  291. for k in pairs(old_attr) do
  292. old_attr[k] = nil
  293. end
  294. if human.attr then
  295. for k, v in pairs(human.attr) do
  296. old_attr[k] = v
  297. end
  298. end
  299. RoleAttr.doCalc(human)
  300. onZhandouliUpdate(human)
  301. local mm = Msg.gc.GC_ROLE_ATTR
  302. local len = 0
  303. local left = mm.attrs
  304. for k,v in pairs(human.attr) do
  305. if v ~= old_attr[k] then
  306. len = len + 1
  307. left[len].key = k
  308. left[len].value = v
  309. end
  310. end
  311. if 0 < len then
  312. left[0] = len
  313. Msg.send(mm, human.fd)
  314. --Msg.trace(mm)
  315. end
  316. end
  317. function sendAttr(human,key)
  318. if human.db.middleFlag and _G.is_middle ~= true then
  319. -- 这个时候的属性改变由跨服服计算
  320. return
  321. end
  322. if not human.attr[key] then return end
  323. local msgRet = Msg.gc.GC_ROLE_ATTR
  324. msgRet.attrs[0] = 1
  325. local attr = msgRet.attrs[1]
  326. attr.key = key
  327. attr.value = human.attr[key]
  328. Msg.send(msgRet, human.fd)
  329. --Msg.trace(msgRet)
  330. end
  331. function doCalcHero(human, bagIndex)
  332. RoleAttr.doCalcHero(human, bagIndex)
  333. doCalc(human)
  334. end
  335. function getHeroAttrs(human, bagIndex)
  336. if not human.heroAttrs or not human.heroAttrs[bagIndex] then
  337. RoleAttr.doCalcHero(human, bagIndex)
  338. end
  339. return human.heroAttrs[bagIndex]
  340. end
  341. function checkLevelUp(human)
  342. local maxLevel = #RoleExcel.exp
  343. if human.db.lv > maxLevel then
  344. return 0
  345. end
  346. local levelUp = 0
  347. while human.db.exp > 0 do
  348. local needExp = 0
  349. if human.db.lv < maxLevel then
  350. needExp = RoleExcel.exp[human.db.lv + 1].exp
  351. end
  352. if needExp <= human.db.exp then
  353. if human.db.lv >= maxLevel then
  354. if human.db.exp > needExp then
  355. human.db.exp = needExp
  356. end
  357. break
  358. else
  359. human.db.exp = human.db.exp - needExp
  360. human.db.lv = human.db.lv + 1
  361. levelUp = 1
  362. JibanLogic.onCallback(human,4,human.db.lv)
  363. end
  364. else
  365. break
  366. end
  367. end
  368. return levelUp
  369. end
  370. function onLvUpCB(human, oldLv, newLv)
  371. doCalc(human)
  372. --升级判断钻石基金是否返钻
  373. --FundLogic.onLvUp(human, oldLv, newLv)
  374. GuideLogic.onLvUpCB(human, oldLv, newLv)
  375. RoleSystemLogic.onLvUp(human)
  376. YunYingLogic.onLevelUp(human, oldLv, newLv)
  377. TuiSongLiBao.tuiSongLiBaoOnTask(human,TuiSongLiBao.TUISONGLIBAOTASK_LV, newLv, oldLv)
  378. CombatPosLogic.onLvUp(human, oldLv, newLv)
  379. ChengjiuLogic.onLvUp(human)
  380. -- 更新等级排名数据
  381. if BRoleLogic.updateData(BillboardDefine.TYPE_LV, human.db) then
  382. -- 计算世界等级
  383. GlobalWorld.doCalcWorldLv()
  384. end
  385. -- 开服邮件
  386. local subDay = CommonDB.getServerOpenDay()
  387. human.db.sendPfEmail = human.db.sendPfEmail or {}
  388. for k, config in ipairs(MailExcel.openMail) do
  389. if subDay and
  390. subDay >= config.openDay[1] and
  391. subDay <= config.openDay[2] and
  392. PfLogic.isServerIndex(config.svrIndex) then
  393. if newLv >= config.lv and
  394. human.db.sendPfEmail[k] == nil then
  395. human.db.sendPfEmail[k] = 1
  396. local title = MailExcel.mail[config.mailID].title
  397. local content = MailExcel.mail[config.mailID].content
  398. local senderName = MailExcel.mail[config.mailID].senderName
  399. if #config.items > 0 then
  400. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, config.items, senderName)
  401. else
  402. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, nil, senderName)
  403. end
  404. end
  405. end
  406. end
  407. MainDianLogic.MaiDian_Begin(human, MaiDianDefine.MAIDIAN_TYPE_LV, {nValue = newLv})
  408. --升级日志
  409. --Log.write(Log.LOGID_OSS_LEVELUP, human.db._id, human.db.account, human.db.name, oldLv, newLv)
  410. Log.write(Log.LOGID_OSS_LEVELUP, human.db._id, human.db.newUniqueTag, human.db.name, oldLv, newLv)
  411. end
  412. function addExp(human, addExp)
  413. if human.db.lv > #RoleExcel.exp then return end
  414. if not addExp then return end
  415. addExp = math.floor(addExp)
  416. if addExp == 0 then return end
  417. local total = human.db.exp + addExp
  418. total = math.max(0, total)
  419. total = math.floor(total)
  420. if total == human.db.exp then
  421. return
  422. end
  423. local oldLv = human.db.lv
  424. human.db.exp = total
  425. local levelUp = checkLevelUp(human)
  426. if levelUp == 1 then
  427. onLvUpCB(human, oldLv, human.db.lv)
  428. else
  429. human.attr[RoleDefine.EXP] = human.db.exp
  430. sendAttr(human,RoleDefine.EXP)
  431. end
  432. end
  433. function canAddJinbi(human, d)
  434. if human.db.jinbi + d > ItemDefine.BAG_ITEM_MAX_JINBI then
  435. return Broadcast.sendErr(human, Lang.COMMON_ADD_JINBI_LIMIT)
  436. else
  437. return true
  438. end
  439. end
  440. function updateJinbi(human, d, logType,item_id, num)
  441. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["jinbi"] then
  442. assert()
  443. end
  444. d = math.floor(d)
  445. if d == 0 then
  446. return
  447. end
  448. local val = human.db.jinbi + d
  449. if val < 0 then
  450. assert()
  451. end
  452. if val > ItemDefine.BAG_ITEM_MAX_JINBI then
  453. val = ItemDefine.BAG_ITEM_MAX_JINBI
  454. Broadcast.sendErr(human, Lang.COMMON_ADD_JINBI_LIMIT)
  455. end
  456. --金币使用日志
  457. if item_id == nil then item_id = 0 end
  458. if num == nil then num = 0 end
  459. --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)
  460. 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)
  461. human.db.jinbi = val
  462. if human.fd then
  463. human.attr[RoleDefine.JINBI] = human.db.jinbi
  464. sendAttr(human,RoleDefine.JINBI)
  465. end
  466. MiddleOption.updateYinliang(human, d, logType)
  467. if d < 0 then
  468. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE4, -d)
  469. end
  470. return true
  471. end
  472. function addZuanshi(human, d, logType, item_id, num)
  473. d = math.floor(d)
  474. if d < 0 then assert(nil) end
  475. if d == 0 then return end
  476. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["zuanshi"] then
  477. assert()
  478. end
  479. local val = human.db.zuanshi + d
  480. --钻石使用日志
  481. --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)
  482. 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)
  483. human.db.zuanshi = val
  484. if human.fd then
  485. human.attr[RoleDefine.ZUANSHI] = human.db.zuanshi
  486. sendAttr(human, RoleDefine.ZUANSHI)
  487. end
  488. MiddleOption.updateYuanbao(human, d, logType)
  489. return true
  490. end
  491. function decZuanshi(human, d, logType, item_id, num, noSend)
  492. d = math.floor(d)
  493. if d > 0 then assert(nil) end
  494. if d == 0 then return end
  495. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["zuanshi"] then
  496. assert()
  497. end
  498. local val = human.db.zuanshi + d
  499. if val < 0 then
  500. assert()
  501. end
  502. human.db.zuanshi = val
  503. --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)
  504. 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)
  505. if human.fd then
  506. human.attr[RoleDefine.ZUANSHI] = human.db.zuanshi
  507. sendAttr(human, RoleDefine.ZUANSHI)
  508. end
  509. HeroLogLogic.finishTaskCB(human,HeroLogLogic.HERO_LOG_TYPE_6,-d)
  510. MiddleOption.updateYuanbao(human, d, logType)
  511. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE5, -d)
  512. YunYingLogic.onCallBack(human, "onDecZuanshi",-d)
  513. return true
  514. end
  515. -- 钻石不足时候的处理
  516. function checkRMB(human, need)
  517. local sum = human.db.zuanshi
  518. if sum < need then
  519. if _G.is_middle == true then
  520. Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
  521. else
  522. if not SceneHandler.canCharge(human) then
  523. Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
  524. else
  525. local msgRet = Msg.gc.GC_BAG_NORMB
  526. Msg.send(msgRet,human.fd)
  527. end
  528. end
  529. return false
  530. else
  531. return true
  532. end
  533. end
  534. function updateFriendHeart(human, d, logType,item_id, num)
  535. if not LogDefine.DEFINE[logType] or not LogDefine.TYPE["friendheart"] then
  536. assert()
  537. end
  538. d = math.floor(d)
  539. if d == 0 then
  540. return
  541. end
  542. local val = human.db.friendHeart + d
  543. if val < 0 then
  544. assert()
  545. end
  546. --好友爱心使用日志
  547. if item_id == nil then item_id = 0 end
  548. if num == nil then num = 0 end
  549. --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)
  550. 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)
  551. human.db.friendHeart = val
  552. if human.fd then
  553. human.attr[RoleDefine.FRIENDHEART] = human.db.friendHeart
  554. sendAttr(human,RoleDefine.FRIENDHEART)
  555. end
  556. return true
  557. end
  558. function sendHumanInfo(human,isNew)
  559. -- 处理称号被销毁的
  560. if human.db.chenghao then
  561. if not human.db.chenghaoList[human.db.chenghao] then
  562. human.db.chenghao = nil
  563. end
  564. end
  565. local subDay = CommonDB.getServerOpenDay()
  566. local mm = Msg.gc.GC_ZZ_HUMAN_INFO
  567. RoleLogic.getRoleBase(human, mm.roleBase)
  568. local union = UnionDBLogic.getUnion(human.db.unionUuid)
  569. mm.unionName = union and union.name or ""
  570. mm.unionIdentity = union and union.id or ""
  571. mm.bannerID = union and union.bannerID or 0
  572. mm.unionFrame = union and union.headFrame or 0
  573. mm.identity = human.db.identity
  574. mm.vipLv = VipLogic.getVipLv(human)
  575. mm.animation = human.db.animation or 0
  576. mm.background = human.db.background or 0
  577. mm.debug = Config.IS_USE_GM_CMD and 1 or 0
  578. mm.worldLv = GlobalWorld.getWorldLv()
  579. mm.openDay = subDay or 0
  580. mm.guideState= GuideLogic.checkAllFinish(human)
  581. mm.isFrist = isNew and 1 or 0
  582. for i = 1,#mm.warOrder do
  583. mm.warOrder[0] = i
  584. WarOrder.getWarOrderInfo(human,i,mm.warOrder[i] )
  585. end
  586. local drawCardRateList = {}
  587. -- if nil ~= DrawCardV2Excel then
  588. -- local drawCardV2Confs = DrawCardV2Excel
  589. -- local num = drawCardV2Confs and (#drawCardV2Confs) or 0
  590. -- for i = 0 , num do
  591. -- local drawCardV2Conf = drawCardV2Confs[i]
  592. -- drawCardRateList[i] = drawCardRateList[i] or {}
  593. -- for weightIndex = 1 , #drawCardV2Conf.weight do
  594. -- drawCardRateList[i][weightIndex] = drawCardRateList[i][weightIndex] or {}
  595. -- drawCardRateList[i][weightIndex] = drawCardV2Conf.weight[weightIndex][2]
  596. -- end
  597. -- end
  598. -- end
  599. mm.drawCardRateList = Json.Encode(drawCardRateList)
  600. mm.nSpeed[0] = 3
  601. mm.nSpeed[1] = 0
  602. mm.nSpeed[2] = 0
  603. mm.nSpeed[3] = 0
  604. if human.db.nSpeed then
  605. mm.nSpeed[1] = human.db.nSpeed[1] and human.db.nSpeed[1] or 0
  606. mm.nSpeed[2] = human.db.nSpeed[2] and human.db.nSpeed[2] or 0
  607. mm.nSpeed[3] = human.db.nSpeed[3] and human.db.nSpeed[3] or 0
  608. end
  609. Msg.send(mm, human.fd)
  610. end
  611. function enterCity(human)
  612. Msg.send(Msg.gc.GC_ENTER_CITY, human.fd)
  613. end
  614. -- 上线回调
  615. function onLogin(human, isNew)
  616. human.db.ip = human.ip
  617. human.db.phpChanelID = human.phpChanelID
  618. if human.db.changeNameCnt ~= nil then
  619. --Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.account, human.db.name, human.db.lv, human.db.ip)
  620. Log.write(Log.LOGID_OSS_LOGIN, human.db._id, human.db.newUniqueTag, human.db.name, human.db.lv, human.db.ip)
  621. end
  622. updateDaily(human)
  623. if not FcmLogic.checkFcm(human) then
  624. return -- 防沉迷 踢下线
  625. end
  626. TequanLogic.jihuopt(human)
  627. TequanLogic.setHumanTequan(human,human.pf_info)
  628. doCalc(human)
  629. sendHumanInfo(human,isNew)
  630. BagLogic.sendBagList(human)
  631. FuwenLogic.sendFuwenBagList(human)
  632. EquipLogic.sendEquipBagList(human)
  633. HeroLogic.sendHeroBagCap(human)
  634. HeroLogic.sendHeroBagList(human)
  635. CombatPosLogic.onLogin(human)
  636. VipLogic.onLogin(human)
  637. FriendLogic.onLogin(human)
  638. DailyTaskLogic.onLogin(human)
  639. OnlineRewardLogic.onLogin(human)
  640. SettingLogic.query(human)
  641. ChatHandler.onLogin(human)
  642. BattleLogic.onLogin(human)
  643. ChatPaoMaLogic.onLogin(human)
  644. MailLogic.cleanNilContent(human)
  645. YunYingLogic.onLogin(human)
  646. RoleStrongLogic.onLogin(human)
  647. RelationGiftLogic.onLogin(human)
  648. ChatRecord.sendAllNotRead(human)
  649. JjcGodWarLogic.onLogin(human)
  650. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE1, 1)
  651. if not isNew then
  652. ReportManager.login(human)
  653. end
  654. LostTempleLogic.onLogin(human)
  655. HuanJingTowerLogic.onLogin(human)
  656. SettingLogic.onLogin(human)
  657. GuideLogic.onLogin(human)
  658. CombatLogic.onLogin(human) -- reyes test
  659. LianyuLogic.onLogin(human)
  660. MoshouLogic.onLogin(human)
  661. TopupLogic.checkKf(human)
  662. VoucherShopLogic.onLogin(human)
  663. RacialTrialLogic.onLogin(human)
  664. ZhanbuLogic.onLogin(human)
  665. RoleHeadLogic.onLogin(human)
  666. -- 最后执行离线发货
  667. BuyLogic.onLogin(human)
  668. GiftLogic.onLogin(human)
  669. HeroLogLogic.finishTaskCB(human,HeroLogLogic.HERO_LOG_TYPE_1,1)
  670. -- 红点 检测 需要放在通用的onLogin 后面 保持数据的正确性 再检测红点
  671. local pcallRet, pcallErr = pcall(RoleSystemLogic.onLogin, human)
  672. if not pcallRet then
  673. Log.write(Log.LOGID_ERR_PCALL, "RoleSystemLogic.onLogin err=" .. human.db.newUniqueTag, pcallErr)
  674. end
  675. enterCity(human)
  676. local day = Util.diffDay(human.db.createTime)
  677. if day == 2 or day == 7 then
  678. local msgRet = Msg.gc.GC_NOTICE_DADIAN
  679. msgRet.type = 2
  680. msgRet.param = day
  681. msgRet.param2 = 0
  682. Msg.send(msgRet,human.fd)
  683. end
  684. -- 注意 这个函数写在doLogin的最后
  685. MiddleLogic.onLogin(human)
  686. end
  687. -- 这里有个潜规则,凡是使用每天都需更新的数据时,都必须先调用这个方法。by cc
  688. function updateDaily(human, isGm)
  689. if not isGm then
  690. if human.db.update_daily_time and Util.isSameDay(human.db.update_daily_time) then
  691. return true
  692. end
  693. end
  694. -- 跨月
  695. if human.db.update_daily_time and Util.isSameMonth(human.db.update_daily_time) ~= true then
  696. human.db.topupAccountMonth = nil
  697. end
  698. YunYingLogic.updateDaily(human)
  699. BattleLogic.updateDaily(human)
  700. BarTaskLogic.refreshDailyTask(human)
  701. FriendLogic.refreshDailyTask(human)
  702. TequanLogic.cleanDaily(human)
  703. CopyLogic.updateDaily(human)
  704. HuanJingTowerLogic.updateDaily(human)
  705. VipLogic.updateDaily(human)
  706. WelfareGiftLogic.updateDaily(human)
  707. WarReportLogic.updateDaily(human)
  708. ZhanbuLogic.updateDaily(human)
  709. ZhuanpanLogic.updateDaily(human)
  710. LostTempleLogic.updateDaily(human)
  711. human.db.update_daily_time = os.time()
  712. human.db.dailyTask = nil
  713. human.db.dailyShareTask = nil
  714. human.db.jjcDailyFight = nil
  715. human.db.jjcWorship = nil
  716. human.db.personMail = nil
  717. human.db.topupAcountDaily = nil
  718. human.db.dailyLeiChong = nil
  719. human.db.onlineTimeDay = nil
  720. human.db.onlineTimeDayReport = nil
  721. human.db.heroResetCnt = nil
  722. human.db.dailyLibao = nil
  723. human.db.ectypeLike = nil
  724. human.db.ectypHurt = nil
  725. human.db.ectypeCnt = nil
  726. human.db.ectypLikeUuid = nil
  727. human.db.adRewardCnt = nil
  728. human.db.adHatchRewardCnt = nil
  729. human.db.isTip = nil
  730. ShopLogic.updateDaily(human)
  731. LianyuLogic.updateDaily(human)
  732. DrillLogic.updateDaily(human)
  733. UnionLivenessLogic.updateDaily(human)
  734. UnionDonateLogic.updateDaily(human)
  735. FirstChargeLogic.updateDaily(human)
  736. JjcLadderLogic.updateDaily(human)
  737. UnionRedBagLogic.updateDaily(human)
  738. JjcGodWarLogic.updateDaily(human)
  739. RacialTrialLogic.updateDaily(human)
  740. OnlineAwardLogic.NewUpdateDaily(human)
  741. -- 红点 发送 理论放最后
  742. RoleSystemLogic.onLogin(human)
  743. end
  744. --- GM角色立即存库
  745. function GM_SaveDB(human)
  746. if not human then
  747. return
  748. end
  749. local now = Timer.now
  750. human.saveDBTime = now
  751. local ret, err = pcall(save, human)
  752. end
  753. -- 角色心跳
  754. function refresh()
  755. for _, human in pairs(onlineHuman) do
  756. --活动开启邮件提示
  757. RoleSystemLogic.checkMailTips(human)
  758. end
  759. end